Skip to content

6. Gcode

UFactory Gcode兼容LinuxCNC gcode:http://linuxcnc.org/
参考RS-274标准,支持新建、导入、下载GCode文件。通过发送GCode指令,控制手臂。

6.1 页面简介

  1. 运行:运行当前Gcode项目。
  2. 暂停:暂停正在运行的Gcode项目。
  3. 保存:保存对Gcode的更改。
  4. 撤销:撤销上一步操作。
  5. 文件操作:新建、导入、下载、重命名、删除。
  6. 单步运行:单击选中一行,左侧出现运行按钮,可单独运行此行代码,方便调试。

6.2 G指令

G指令格式说明
G0   G0 X Y Z A B C固定速度为240mm/s
G1G1 X Y Z A B C FXYZ单位mm,ABC对应roll/pitch/yaw,单位°,F为速度,单位mm/min
G2G2 X Y Z R P FG2 X Y Z I J K P F半径格式圆(顺时针),XYZ表示目标位置,R表示圆半径,P表示整圆圈数,F表示速度中心格式圆弧(顺时针),XYZ表示目标位置,IJK对应圆心,P表示整圆圈数,F表示速度
G3G3 X Y Z R P FG3 X Y Z I J K P F半径格式圆(逆时针),参数同G2.
G4G4 P休眠指令,P为要休眠的秒数
G17圆弧指令设置XY平面,G2/G3默认使用该平面
G18圆弧指令设置XZ平面
G19圆弧指令设置YZ平面
G20单位为英寸,影响G0/G1
G21单位为毫米,影响G0/G1
G90绝对定位,影响G0/G1/G2/G3。G0/G1默认用该模式,G2/G3的XYZ默认用该模式
G90.1圆弧指令使用绝对定位,影响G2/G3
G91相对定位,影响G0/G1/G2/G3
G91.1圆弧指令使用相对定位,影响G2/G3G2/G3的IJK参数默认使用该模式

6.3 M指令

M指令格式说明
M2/M30停止程序,收到该指令重置参数 单位使用毫米(G21),绝对定位(G90),圆弧平面为XY(G17),G1默认速度为100mm/s
M62M62 P设置COx为高电平,队列执行,P为0-150-7:CO0-CO7, 8-15:DO0-DO7
M63M63 P设置COx为低电平,队列执行,P为0-150-7:CO0-CO7, 8-15:DO0-DO7
M64M64 P设置COx为高电平,立即执行,P为0-15
M65M65 P设置COx为低电平,立即执行,P为0-15
M67M67 E Q设置AOx,队列执行,E为0-1,Q为0-10V
M68M68 E Q设置AOx,立即执行,E为0-1,Q为0-10V
M100M100 P QP1为使能,P0为断使能Q为关节ID(缺省为8,即所有关节)
M101清除错误
M102清除警告
M103M103 P设置模式,P为要设置的模式
M104M104 P设置状态,P为要设置的状态
M115M115 P Q设置TOx的数字输出,P为0-4,Q为0/1/10/11Q0设置低电平,队列执行。Q1设置高电平,队列执行Q10设置低电平,立即执行。Q11设置高电平,立即执行
M116M116 P Q控制末端设备P1为xArm机械爪,Q表示机械爪位置P2为xArm真空吸头,Q0吸取Q1释放(队列执行)Q10吸取Q11释放(立即执行)P3为BIO机械爪,Q0闭合,Q1张开P4/P5为Robotiq机械爪,Q表示位置(0~255)P11为Lite6机械爪,Q0闭合Q1张开(队列执行Q10闭合Q11张开(立即执行)P12为Lite6真空吸头,Q0吸取Q1释放(队列执行)Q10吸取Q11释放(立即执行)

6.4 固件要求

  • 固件版本:v2.2.0+
  • 使用端口:504
  • 回复数据:5字节
    1)字节0:Gcode解析返回值(非0表示格式不对或命令不支持)
    2)字节1:高4位表示模式,低4位表示状态
    3)字节2:控制器错误码,Cxx
    4)字节3和字节4:缓存数(大端字节序)
  • 建议每次发一行非空数据(带换行符),固件按行回复
python
sock.send(b'G0 X300\n')
  • 要接收回复,否则缓冲区可能会满
python
sock.recv(5)
  • 最多同时缓存2000条队列指令(G0/G1/G2/G3/G4/M62/M63/M67),一旦缓存满了,处理进程会阻塞直到缓存指令被消耗至少1条,阻塞过程无法处理任何Gcode指令。

示例:

python
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setblocking(True)
sock.connect(('192.168.1.67', 504))

def send_and_recv(data):
    for line in data.split('\n'):
        line = line.strip()
        if not line:
            continue
        sock.send(line.encode('utf-8', 'replace') + b'\n')
        ret = sock.recv(5)
        code, mode_state, err = ret[0:3]
        state, mode = mode_state & 0x0F, mode_state >> 4
        cmdnum = ret[3] << 8 | ret[4]
        if code != 0 or state >= 4 or err > 0:
            print('code: {}, mode: {}, state: {}, err: {}, cmdnum: {}, cmd: {}'.format(code, mode, state, err, cmdnum, line))

# move x to x=500mm, speed= 10000 mm/min
send_and_recv('G1 X500 F10000')