6. Gcode
UFactory Gcode兼容LinuxCNC gcode:http://linuxcnc.org/
参考RS-274标准,支持新建、导入、下载GCode文件。通过发送GCode指令,控制手臂。
6.1 页面简介
- 运行:运行当前Gcode项目。
- 暂停:暂停正在运行的Gcode项目。
- 保存:保存对Gcode的更改。
- 撤销:撤销上一步操作。
- 文件操作:新建、导入、下载、重命名、删除。
- 单步运行:单击选中一行,左侧出现运行按钮,可单独运行此行代码,方便调试。
6.2 G指令
G指令 | 格式 | 说明 |
---|---|---|
G0 | G0 X Y Z A B C | 固定速度为240mm/s |
G1 | G1 X Y Z A B C F | XYZ单位mm,ABC对应roll/pitch/yaw,单位°,F为速度,单位mm/min |
G2 | G2 X Y Z R P FG2 X Y Z I J K P F | 半径格式圆(顺时针),XYZ表示目标位置,R表示圆半径,P表示整圆圈数,F表示速度中心格式圆弧(顺时针),XYZ表示目标位置,IJK对应圆心,P表示整圆圈数,F表示速度 |
G3 | G3 X Y Z R P FG3 X Y Z I J K P F | 半径格式圆(逆时针),参数同G2. |
G4 | G4 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 | |
M62 | M62 P | 设置COx为高电平,队列执行,P为0-150-7:CO0-CO7, 8-15:DO0-DO7 |
M63 | M63 P | 设置COx为低电平,队列执行,P为0-150-7:CO0-CO7, 8-15:DO0-DO7 |
M64 | M64 P | 设置COx为高电平,立即执行,P为0-15 |
M65 | M65 P | 设置COx为低电平,立即执行,P为0-15 |
M67 | M67 E Q | 设置AOx,队列执行,E为0-1,Q为0-10V |
M68 | M68 E Q | 设置AOx,立即执行,E为0-1,Q为0-10V |
M100 | M100 P Q | P1为使能,P0为断使能Q为关节ID(缺省为8,即所有关节) |
M101 | 清除错误 | |
M102 | 清除警告 | |
M103 | M103 P | 设置模式,P为要设置的模式 |
M104 | M104 P | 设置状态,P为要设置的状态 |
M115 | M115 P Q | 设置TOx的数字输出,P为0-4,Q为0/1/10/11Q0设置低电平,队列执行。Q1设置高电平,队列执行Q10设置低电平,立即执行。Q11设置高电平,立即执行 |
M116 | M116 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')