目录#
- 概述
- 一、G 代码(G-codes)
- 二、M 代码(M-codes)
- 三、G 代码中的有效字符
- 四、实时命令(十六进制控制字符)
- 五、系统命令($ 命令)
- 六、参数设置
- 七、CAN / CANopen 通信(H743)
- 八、CANopen 协议命令
- 九、文件管理命令
- 十、Modbus 从站功能寄存器(H743)
- 十一、错误代码说明
概述#
本手册适用于博飞宇 F407、H743 两款控制卡产品。
两款产品硬件差异#
| 功能 | F407 | H743 |
|---|---|---|
| 串口 | USB、232、TTL | Type-C |
| 网口 | 无 | 有 |
| SD 卡(FatFS) | 有 | 有 |
| Flash(LittleFS) | 无 | 有 |
| 用户输入 IO | 5 | 3 |
| 用户输出 IO | 8 | 7 |
| CAN | 1 | 2(CAN FD) |
| 485 | 无 | 有 |
一、G 代码(G-codes)#
G 代码用于定义运动方式、坐标系、插补类型等。可分为模态指令(一旦设定持续生效,直到被同组指令改变)和非模态指令(仅在当前行生效)。需要进入正确的状态(IDLE 空闲、RUN 运行等)才能执行。
1.1 运动与插补#
| 指令 | 名称 | 说明 | 示例 |
|---|---|---|---|
G0 |
快速定位 | X~C 可选参数必须有 1 个,非插补运动 | G0 X Y Z A B C F |
G1 |
直线插补 | X~C 可选参数必须有 1 个,以指定 F 速度做插补运动 | G1 X Y Z A B C F |
G2 |
顺时针圆弧插补 (CW) | 以当前平面(G17/18/19)做顺时针圆弧 | G2 X50 Y0 I25 J0 |
G3 |
逆时针圆弧插补 (CCW) | 以当前平面做逆时针圆弧 | G3 X50 Y0 I25 J0 |
G4 |
延时(Delay) | 暂停指定时间 | G4 P1.5(停留 1.5 秒) |
G10 L2 |
设置工件坐标系 | 设定 G54~G59.3 的偏置值 | G10 L2 P1 X0 Y0 Z0(设 G54) |
G10 L20 |
设置当前位置为坐标系原点 | 将当前位置设为零点 | G10 L20 P1 X0 Y0 Z0 |
G61 |
精确停止模式 | 每个运动段精确停止,无拐角圆滑 | — |
详细说明#
G0 与 G1 的区别:
G0是"空行程"快速移动,不指定 F 以最大速运动,指定 F 以指定速度运动;G1"走轨迹"插补运动,速度由 F 决定。
G2/G3 圆弧:圆弧定义有两种方式,二选一:
- 圆心偏置法:
I/J/K为圆心相对于圆弧起点的偏移量(配合G91.1为增量模式,默认)。例:G2 X50 Y0 I25 J0表示从当前点画圆弧到(50,0),圆心在起点偏移(25,0)处。 - 半径法:用
R指定半径。正值/负值用于区分大于或小于半圆的圆弧。 - 圆弧所在平面由
G17/G18/G19决定(见 1.3)。
- 圆心偏置法:
G4 延时:
P后数值单位为秒(支持小数)。G10 L2 vs L20:
L2:直接写入目标坐标系的偏置值(绝对偏置)。L20:将当前实际位置定义为该坐标系的零点。P1~P9分别对应G54、G55、G56、G57、G58、G59、G59.1、G59.2、G59.3。
G61 精确停止:运动默认会在拐角处做速度前瞻与圆滑过渡;
G61强制每段精确停止,适合要求严格定位的轨迹动作,但会降低效率。
1.2 坐标系、单位与参考点#
| 指令 | 名称 | 说明 |
|---|---|---|
G20 |
英制单位(inch) | 所有坐标、F、IJK 等以英寸为单位 |
G21 |
公制单位(mm) | 所有坐标、F、IJK 等以毫米为单位(默认) |
G28 |
返回参考点 | 移动到 G28.1 预设的位置 |
G28.1 |
记录参考点 | 将当前位置记录为 G28 目标点 |
G30 |
返回第二参考点 | 移动到 G30.1 预设的位置 |
G30.1 |
记录第二参考点 | 将当前位置记录为 G30 目标点 |
G54 |
工件坐标系 1 | 默认工件坐标系(默认) |
G55 |
工件坐标系 2 | 第二工件坐标系 |
G56 |
工件坐标系 3 | 第三工件坐标系 |
G57 |
工件坐标系 4 | 第四工件坐标系 |
G58 |
工件坐标系 5 | 第五工件坐标系 |
G59 |
工件坐标系 6 | 第六工件坐标系 |
G59.1 |
工件坐标系 7 | 第七工件坐标系 |
G59.2 |
工件坐标系 8 | 第八工件坐标系 |
G59.3 |
工件坐标系 9 | 第九工件坐标系 |
G53 |
机械坐标 | 使用机械坐标(非模态),需单独一行 |
详细说明#
G20/G21 单位:切换后所有后续的尺寸、速度、圆弧 IJK 都会按新单位解释。建议全程保持
G21(mm),混用英制/公制极易导致尺寸错误。G28/G30 参考点:参考点是"安全高度"概念。先
G28.1/G30.1记录一个安全位置,之后G28/G30即可一键返回。注意G28/G30移动过程是快速移动(G0指令运动)。G54~G59.3 工件坐标系:允许保存 9 套工位偏置,用于在不同工位执行同样动作,无需重写程序坐标。配合
G10 L2在线修改。G53 机械坐标:临时使用绝对机械坐标,非模态——必须写在与运动同一行(如
G53 G0 X0 Y0),下一行自动恢复原坐标系。常用于回机械原点。
1.3 平面选择、缩放与模态#
| 指令 | 名称 | 说明 |
|---|---|---|
G17 |
XY 平面选择 | 圆弧和固定循环在 XY 平面执行(默认) |
G18 |
XZ 平面选择 | 圆弧和固定循环在 XZ 平面执行 |
G19 |
YZ 平面选择 | 圆弧和固定循环在 YZ 平面执行 |
G50 |
取消缩放 | 取消 G51 的坐标缩放 |
G51 |
坐标缩放 | 按比例缩放坐标 |
G65 |
宏调用 | 调用宏程序 |
G90 |
绝对坐标模式 | 坐标相对于工件原点(默认) |
G91 |
增量坐标模式 | 坐标相对于当前位置 |
G91.1 |
IJK 增量模式 | 圆弧中心 IJK 为增量值(默认) |
详细说明#
G17/G18/G19 平面选择:决定
G2/G3圆弧在哪个平面上绘制,以及I/J/K中哪两个作为圆心偏移。例如选G17(默认)时,圆心用I(X 偏移)和J(Y 偏移),K被忽略。G50/G51 缩放:
G51对后续坐标按给定比例缩放(常用于相似零件放大/缩小),G50取消。缩放仅影响编程坐标,不影响 F 率物理含义。G65 宏调用:调用外部宏程序文件(参见文件管理)。
P指定宏编号(查找/littlefs/Pxxxx.ngc),其余字母(A/B/C…)作为实参传入宏。*** 表示此为扩展/可选功能,依固件版本支持。G90/G91 绝对/增量:
G90下X10表示移动到绝对坐标 10;G91下X10表示从当前位置再移动 +10。- 两者均为模态,影响所有轴指令。建议全程
G90,增量模式易在复杂程序中出错。
G91.1 IJK 增量:指定圆弧圆心偏置
I/J/K为"相对于起点"的增量值(默认且推荐)。与之相对的是绝对圆心模式,本固件默认采用增量,无需额外设置。
二、M 代码(M-codes)#
M 代码用于控制程序流程、数字 I/O 等辅助功能。
2.1 程序流程控制与输入输出#
| 指令 | 名称 | 说明 | 示例 |
|---|---|---|---|
M0 |
程序暂停 | 暂停执行,需按 Cycle Start 继续 | M0 |
M30 |
程序结束 | 结束程序,返回程序开头 | M30 |
M62 |
同步输出 ON | 与运动同步开启输出 | M62 P1(P 值 0-8 对应 0-8 输出口) |
M63 |
同步输出 OFF | 与运动同步关闭输出 | M63 P1(P 值 0-8 对应 0-8 输出口) |
M64 |
立即输出 ON | 立即开启输出(不同步) | M64 P1(P 值 0-8 对应 0-8 输出口) |
M65 |
立即输出 OFF | 立即关闭输出(不同步) | M65 P1(P 值 0-8 对应 0-8 输出口) |
M66 |
等待输入 | 等待指定输入状态 | M66 P1 L3 Q5(P 值 0-8 对应 0-8 输出口) |
M99 |
宏返回 | 从宏程序返回 | M99 在宏/子程序中使用 |
M117 |
返回字符串 | 返回字符串到上位机 | M117 hello 上位机返回 hello |
详细说明#
M0 / M30:
M0是中途暂停(用于手动干预、检测);M30是程序正常结束并复位指针到开头。
M62/M63(同步)vs M64/M65(立即):
- 同步输出
M62/M63会在运动队列中该指令所在位置精确翻转输出,保证输出与位置严格同步。 - 立即输出
M64/M65一解析到就立刻翻转,不与运动同步,适合无需位置关联的开关。 P指定输出端口号(1、2、3…)。
- 同步输出
M66 等待输入:
P= 输入端口,L= 等待条件(如 3 表示等待高电平),Q= 超时(秒)。用于"到位后方可继续"的互锁场景。M99:在宏/子程序中使用,返回调用处。配合
O<name> SUB ... O<name> ENDSUB或G65使用。
三、G 代码中的有效字符#
3.1 参数字符#
以下字母可作为 G/M 代码中的参数(字),本身不是独立指令,但与指令组合使用:
| 字母 | 说明 | 备注 |
|---|---|---|
X |
X 坐标 | |
Y |
Y 坐标 | |
Z |
Z 坐标 | |
A* |
A 坐标/旋转 | 旋转轴(如转台) |
B* |
B 坐标/旋转 | 旋转轴 |
C* |
C 坐标/旋转 | 旋转轴 |
F |
运动速度 | 单位:mm/min 或 inch/min |
I |
圆弧中心 X 偏移 | 与 J、K 配合定义圆弧中心 |
J |
圆弧中心 Y 偏移 | |
K |
圆弧中心 Z 偏移 / 螺距 | 圆弧或螺纹 |
L |
参数/子程序号 | 用于 G10 等 |
N |
行号 | 程序行编号(如 N10) |
O* |
子程序号 | 宏/子程序编号 |
P |
参数/停留时间 | 用于 G4、G10、M62…等 |
R |
圆弧半径 / 循环 R 平面 | 用于 G2/G3 半径或固定循环 |
说明:带
*的字母(A/B/C/O)为扩展轴/功能,依固件配置启用。每个字母在同一程序行中一般只出现一次(重复会报error:25)。
3.2 注释#
;G1X100 F80000—— 注释内容不会执行;(G1X100 F80000)—— 注释内容不会执行;
四、实时命令(十六进制控制字符)#
这些命令是单字节控制字符,可在程序运行、暂停、甚至报警状态下直接发送,绕过 G-code 解析队列立即生效。常用于上位机/手持盒的实时交互。
| 字符 | 功能 | 说明 |
|---|---|---|
0x3F ? |
状态查询 | 立即返回当前状态报告(<...> 格式) |
0x7E ~ |
恢复运行 | 从暂停中恢复 |
0x21 ! |
暂停 | 运动减速停止 |
0x18 |
软复位 | 软复位控制器(等同于 Ctrl-X) |
0x03 |
取消点动 | 停止正在进行的点动(Jog)运动 |
0x90 |
速度 +10% | F 倍率 +10% |
0x91 |
速度 -10% | F 倍率 -10% |
0x92 |
速度 100% | F 倍率恢复 100% |
详细说明#
- 这些字符通常通过串口/网络直接发送 1 个字节,不要加换行符。例如发送
0x18即可软复位。 0x3F是调试与监控中最常用的命令,控制器会立即回传形如<0|MP:0,0,0|MJ:0,0...>的状态帧。0x21与0x7E配合实现"暂停/继续";它们不会丢失已规划的运动队列。0x90/0x91/0x92调整的是 F 倍率(override),仅影响G1运动的速度表现,不影响G0快速移动。
五、系统命令($ 命令)#
以 $ 开头的命令用于配置、查询与维护控制器。多数 $ 命令只能在 IDLE 状态下使用(否则报 error:8)。
| 命令 | 说明 |
|---|---|
$$ |
列出所有配置项(当前全部 $ 参数及值) |
$* |
恢复默认配置项(全部参数复位为出厂默认) |
$I |
查看固件版本与构建信息 |
$N |
查看/设置启动指令($N0= 设置上电自动执行的指令,$N1= 设置回零后自动执行的指令) |
$X |
解除报警 |
$H |
执行回零(Homing) |
$VH |
执行虚拟回零(只设置位置不动作) |
$C |
G-code 检查模式(解析但不输出脉冲,用于验证程序) |
$LIM |
限位开关状态 |
$PINS |
查看引脚功能 |
$PINSTATE |
查看引脚状态 |
$x=val |
写参数(如 $22=1),复位后生效 |
详细说明#
$$:最常用的查询命令,返回全部设置项列表,调试时用于记录/比对配置。$*:一键恢复出厂设置,会清除所有自定义参数,慎用。$I:显示固件版本、构建日期、排查兼容性时必备。$N:设置上电后打开输出 1。例:$N0=M64 P1(设置第 0 块)。可用$$或$I查看当前启动块。$X:触发限位/急停后控制器进入 ALARM 锁死,必须发送$X解除才能继续操作。解除前请确认已排除物理危险。$H回零:启动 6.3 配置的回零流程;若未启用回零会报error:5。$VH虚拟回零:不执行回零动作,直接建立坐标系,不依赖硬件触发,用于调试测试电机。$C检查模式:仅解析 G-code 验证语法/范围,不驱动电机,非常适合在上机前跑一遍程序排错。$LIM/$PINS/$PINSTATE:分别查看限位开关触发状态、引脚功能映射、引脚实时电平,接线调试时极为有用。$x=val:写入具体参数(如$22=1启用回零)。部分参数需重启/软复位生效,写入后注意提示。
六、参数设置#
参数以 $编号 形式读写(见 五、系统命令 的 $x=val)。以下按功能分组说明。
6.1 基本设置#
| 编号 | 名称 | 当前值 | 说明 |
|---|---|---|---|
$0 |
脉冲时长 | 5.0 μs | 步进脉冲的宽度,单位微秒 |
$3 |
方向反转 | 0 | 方向引脚反转掩码 |
$5 |
限位反转 | 0 | 限位开关反转(0=高电平触发,1=低电平触发) |
说明#
- $0 脉冲时长:步进驱动器需要的脉冲宽度,必须 ≥2 μs(否则报
error:6)。若电机丢步或驱动器不响应,可适当加大。 - $3 方向反转:位掩码,每一位对应一个轴的方向信号反相,用于纠正"指令正方向实际反向"的接线问题,无需改线。
- $5 限位反转:根据限位开关类型(常开/常闭、高/低有效)设置触发极性。接错会导致一上电就误报限位。
6.2 报告与单位($10)#
| 编号 | 名称 | 当前值 | 说明 |
|---|---|---|---|
$10 |
状态报告掩码 | 1 | 控制状态报告包含哪些信息 |
$10 状态报告详解#
状态报告格式为 <状态值|...>,$10 的位掩码决定报告里携带哪些字段:
| 值 | 报告字段 |
|---|---|
$10=1 |
<0 | MP:> |
$10=16385 |
<0 | MP: | MJ:>(机械臂需同时报告坐标 MP 和角度 MJ) |
状态值说明(报告格式:<状态值|...>)#
| 值 | 状态 |
|---|---|
| 0 | 空闲(Idle) |
| 1 | 报警(Alarm) |
| 2 | 检查(Check) |
| 4 | 回零(Homing) |
| 8 | 运行(Run) |
| 16 | 暂停(Hold/暂停) |
| 32 | 手动(Manual/Jog) |
| 64 | 电子围栏触发(Fence) |
| 128 | 睡眠(Sleep) |
| 256 | 急停(EStop) |
| 512 | 未知(Unknown) |
说明:
$10是位掩码。例如16385,表示同时报告坐标与角度。
6.3 回零参数#
| 编号 | 名称 | 当前值 | 说明 |
|---|---|---|---|
$22 |
回零启用 | 0 | 0=禁用回零功能 |
$23 |
回零方向 | 0 | 回零方向掩码(0=正方向) |
$24 |
二次回零速度 | 250.0 mm/min | 回零搜索速度 |
$25 |
一次回零速度 | 2500.0 mm/min | 回零定位速度 |
$26 |
回零退让延时 | 250 ms | 回零退让延时 |
$27 |
回零偏移 | 2.000 mm | 回零后离开限位开关的距离 |
$22 回零参数设置(位掩码)#
| 位 | 值 | 含义 |
|---|---|---|
| bit0 | 1 | 启用回零 |
| bit1 | 2 | 启用单轴回零命令($HX / $HY / …) |
| bit2 | 4 | 上电后必须先回零才能操作 |
功能组合示例
| 目标 | 计算 | 设置 |
|---|---|---|
| 仅启用回零 | 1 | $22=1 |
| 启用回零 + 启用单轴回零 | 1+2 | $22=3 |
| 启用回零 + 启用单轴回零 + 上电必须回零 | 1+2+4 | $22=7 |
$23 回零方向设置#
| $23 | 二进制 | 含义 |
|---|---|---|
| 0 | 000000 | 所有轴正方向回零 |
| 1 | 000001 | X 轴负方向,其余正方向 |
| 3 | 000011 | X、Y 轴负方向 |
| 7 | 000111 | X、Y、Z 轴负方向 |
| 63 | 111111 | 所有轴负方向 |
回零速度/偏移说明#
$24=100.0 (回零精确定位速度 mm/min,慢速接近,保证精度)
$25=2500.0 (回零快速搜索速度 mm/min,快速寻找限位)
$26=250 (回零去抖延时 ms,触发后消抖)
$27=2.0 (回零触发开关拉离距离 mm,脱离限位运动距离)
典型回零流程:快速 $25 向限位移动 → 触发限位 → 反向退让 $27 距离 → 慢速($24)向限位移动 → 精确触发限位。
回零顺序设置($44~$49)#
通过 $44~$49 分别配置第 1~6 个回零周期的参与轴:
| 命令 | 二进制 | 含义 |
|---|---|---|
$44= |
000001 | 周期 1 仅 X 回零 |
$45= |
000010 | 周期 2 仅 Y 回零 |
$46= |
000011 | 周期 3 X、Y 同时回零 |
$47= |
111111 | 周期 4 全部 6 轴同时回零 |
$48= |
000000 | 周期 5 |
$49= |
000000 | 周期 6 |
可按设备机械结构安排"先 Z 抬升再 XY"等安全顺序。
6.4 电机参数设置#
| 编号 | 名称 | 当前值 | 说明 |
|---|---|---|---|
$100 |
X 轴 | 250.000 | X 轴每毫米(度)脉冲数或 CANopen 位置缩放因子 |
$101 |
Y 轴 | 250.000 | Y 轴每毫米(度)脉冲数或 CANopen 位置缩放因子 |
$102 |
Z 轴 | 250.000 | Z 轴每毫米(度)脉冲数或 CANopen 位置缩放因子 |
$103 |
A 轴 | 250.000 | A 轴每毫米(度)脉冲数或 CANopen 位置缩放因子 |
$104 |
B 轴 | 250.000 | B 轴每毫米(度)脉冲数或 CANopen 位置缩放因子 |
$105 |
C 轴 | 250.000 | C 轴每毫米(度)脉冲数或 CANopen 位置缩放因子 |
说明#
该参数定义"脉冲数 ↔ 物理位移"的换算比例(步进模式);在 CANopen 模式下则作为位置缩放因子。设错会导致实际移动距离与命令值不符。
计算方式:
旋转关节 = (电机1圈脉冲数 / 360 × 传动比)
直线运动 =(电机1圈脉冲数 / 丝杆螺距 × 传动比)
6.5 最大速度#
| 编号 | 名称 | 当前值 | 说明 |
|---|---|---|---|
$110 |
X 轴 | 70000.000 mm/min | X 轴最大移动速度 |
$111 |
Y 轴 | 70000.000 mm/min | Y 轴最大移动速度 |
$112 |
Z 轴 | 70000.000 mm/min | Z 轴最大移动速度 |
$113 |
A 轴 | 70000.000 mm/min | A 轴最大移动速度 |
$114 |
B 轴 | 70000.000 mm/min | B 轴最大移动速度 |
$115 |
C 轴 | 70000.000 mm/min | C 轴最大移动速度 |
说明#
这是 G0 快速移动与 G1 插补运动的硬上限。实际速度不会超过此值。设得过高可能超出电机/驱动器能力导致丢步或报警(error:12)。
6.6 加速度#
| 编号 | 名称 | 当前值 | 说明 |
|---|---|---|---|
$120 |
X 轴 | 1000.000 mm/s² | X 轴加速度 |
$121 |
Y 轴 | 1000.000 mm/s² | Y 轴加速度 |
$122 |
Z 轴 | 1000.000 mm/s² | Z 轴加速度 |
$123 |
A 轴 | 1000.000 mm/s² | A 轴加速度 |
$124 |
B 轴 | 1000.000 mm/s² | B 轴加速度 |
$125 |
C 轴 | 1000.000 mm/s² | C 轴加速度 |
说明#
加速度决定加减速快慢。过小效率低;过大易冲击、丢步、损坏机械。
6.7 行程限制#
| 编号 | 名称 | 当前值 | 说明 |
|---|---|---|---|
$130 |
X 轴最大行程 | 2000.000 mm | X 轴允许运动最大值 |
$131 |
Y 轴最大行程 | 20000.000 mm | Y 轴允许运动最大值 |
$132 |
Z 轴最大行程 | 20000.000 mm | Z 轴允许运动最大值 |
$133 |
A 轴最大行程 | 20000.000 mm | A 轴允许运动最大值 |
$134 |
B 轴最大行程 | 20000.000 mm | B 轴允许运动最大值 |
$135 |
C 轴最大行程 | 20000.000 mm | C 轴允许运动最大值 |
说明#
需先回零才生效。超过行程的命令会被忽略(error:15)。旋转轴(A/B/C 设为旋转轴时,见 $376)通常不受此限制。
6.8 网络设置(仅适用于 H743 主板)#
| 编号 | 名称 | 当前值 | 说明 |
|---|---|---|---|
$300 |
主机名 | BFY | 网络主机名 |
$301 |
IP 模式 | 0 | 0=静态 IP,1=DHCP,2=AutoIP |
$302 |
IP 地址 | 192.168.1.100 | 静态 IP 地址 |
$303 |
网关 | 192.168.1.1 | 默认网关 |
$304 |
子网掩码 | 255.255.255.0 | 子网掩码 |
$305 |
TcpServer 端口 | 12121 | TcpServer 服务端口 |
$307 |
WebSocket 端口 | 81 | WebSocket 服务端口 |
说明#
用于让控制卡接入以太网,通过 TCP(端口 12121)或 WebSocket(端口 81)接收 G-code。静态 IP 模式下需正确填写 $302~$304,否则无法连接。修改网络参数后通常需重启生效。
6.9 其他设置#
| 编号 | 名称 | 默认值 | 说明 |
|---|---|---|---|
$376 |
旋转轴配置 | 0 | 标记哪些轴为旋转轴(可无限旋转) |
$398 |
规划器块数 | 300 | 规划器缓冲区块数,影响前瞻深度 |
$481 |
自动报告间隔 | 200 ms | 自动状态报告间隔,0=禁用,100-1000ms 有效 |
使用示例#
$376 旋转轴配置
| 命令 | 二进制 | 含义 |
|---|---|---|
$376= |
000001 | 配置 X 轴为旋转轴 |
$376= |
111000 | 配置 A、B、C 轴为旋转轴 |
旋转轴角度会自动归一化到 0-360°,适合无限旋转的转台。
$398 规划器块数
$398=50 ; 增大前瞻深度,适合复杂路径,但占用更多 RAM,F407 最大 400,H743 最大 1500
$481 自动状态报告间隔
$481=0 ; 禁用自动报告(默认)
$481=200 ; 每 200ms 自动发送一次状态报告
$481=1000 ; 每 1 秒发送一次,启用后控制器会主动推送状态
6.10 电机控制模式(仅 H743 主板支持 CANopen)#
| 编号 | 名称 | 默认值 | 说明 |
|---|---|---|---|
$450 |
设置控制模式,修改后需重启 | 0 | 0=脉冲模式,1=CANopen 总线模式 |
$453 |
设置机器类型,修改后需重启 | 0 | 0=直角坐标,1=Delta 机械手,2=SCARA 机械手,3=码垛机械手 |
说明#
$450决定驱动器接口方式——脉冲(步进/脉冲伺服)或 CANopen 总线(伺服)。切换为 CANopen($450=1)后需重启,并使用七/八的总线命令。$453选择运动学模型,机械手类型必须与实际结构匹配,否则逆解错误。
6.11 机械手参数设置#
| 编号 | 名称 | 默认值 | 说明 |
|---|---|---|---|
$640 |
设置最小分段 | 1 | 见示例图 |
$641 |
设置 L2 | 400 | 见示例图 |
$642 |
设置 L1 | 200 | 见示例图 |
$643 |
设置 L3 | 75 | 见示例图 |
$644 |
设置 L4 | 50 | 见示例图 |
$645 |
设置 L5 | 400 | 暂未使用 |
$646 |
设置 home 角度 | 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 | 设置回零角度,单位° |
$648 |
设置关节最小角度 | -90.0, -90.0, -90.0, -90.0, -90.0, -90.0 | 设置关节最小角度,单位° |
$649 |
设置关节最大角度 | 90.0, 90.0, 90.0, 90.0, 90.0, 90.0 | 设置关节最大角度,单位° |
$453=1Delta 尺寸示例、$453=2SCARA 尺寸示例、$453=3Palletizer 尺寸示例:参见原手册配图。
6.12 特殊命令#
| 编号 | 名称 | 说明 |
|---|---|---|
$JOINT=1 |
切换关节运动 | 关节运动模式运动 |
$JOINT=0 |
切换坐标运动 | 坐标运动模式运动 |
$JOINT |
查看运动模式 | 查看当前运动模式 |
$SDBTN=1 |
输入用于启动 SD 文件 | IN1 |
$SDBTN=0 |
输入作为普通输入 | IN1~IN5 作为普通输入 |
七、CAN / CANopen 通信(仅适用于 H743 主板)#
当使用 CAN/CANopen 总线驱动伺服电机时,需用以下命令进行底层总线与协议栈操作。先确认 $450=1(CANopen 模式)。
$CAN 命令组 —— CAN 总线底层操作#
| 命令 | 说明 | 示例 |
|---|---|---|
$CAN |
查询 CAN 通道状态与当前模式 | $CAN |
$CAN=0 CHx baudrate |
修改指定通道波特率 | $CAN=0 CH1 500000 |
$CAN=1 1/0 |
开启/关闭透传(CAN RX 帧输出到串口/网口) | $CAN=1 1 |
$CAN=2 0/1 |
临时切换电机模式(0=Pulse, 1=CANopen) | $CAN=2 1 |
$CAN=8 CHx ID DLC D0 D1 ... |
通过指定通道发送 CAN 帧 | $CAN=8 CH1 601 8 2B 40 60 00 06 00 00 00 |
$CANOPEN 命令组 —— CANopen 协议层操作#
| 命令 | 说明 | 示例 |
|---|---|---|
$CANOPEN |
查询 CANopen 通道和 NMT 状态 | $CANOPEN |
$CANOPEN=0 |
初始化 CANopen 双通道协议栈 | $CANOPEN=0 |
$CANOPEN=1 1/0 |
NMT 启动/停止所有节点 | $CANOPEN=1 1 |
$CANOPEN=3 |
NMT 进入 Pre-operational 状态 | $CANOPEN=3 |
$CANOPEN=4 |
NMT 复位所有节点 | $CANOPEN=4 |
$CANOPEN=5 |
查询所有电机状态(位置/状态字) | $CANOPEN=5 |
$CANOPEN=6 nodeId 1/0 |
使能/禁用指定电机(nodeId: 1-6) | $CANOPEN=6 1 1 |
$CANOPEN=7 nodeId |
配置节点的 TPDO+RPDO(0=所有节点) | $CANOPEN=7 0 |
$CANOPEN=8 1/0 |
开启/关闭静默模式(不发送心跳和 SYNC 帧) | $CANOPEN=8 1 |
$CANOPEN=10 W nodeId idx sub data... |
SDO 写入电机对象字典 | $CANOPEN=10 W 1 6060 00 08 |
$CANOPEN=10 R nodeId idx sub |
SDO 读取电机对象字典 | $CANOPEN=10 R 1 1000 00 |
$CANOPEN=11 1/0 |
开启/关闭位置反馈输出 | $CANOPEN=11 1 |
$CANOPEN=12 x |
设置位置反馈周期(10-5000ms) | $CANOPEN=12 100 |
$CANOPEN=20 nodeId |
重置指定电机位置为 0(0=所有电机) | $CANOPEN=20 0 |
$CAN=8 发送命令详解#
$CAN=8 CH1 601 8 01 02 03 04 05 06 07 08
│ │ │ └── 数据字节(十六进制,空格分隔)
│ │ └── 数据长度(1~8)
│ └── 标准帧 ID(十六进制),扩展帧前加 E,如 E12345
└── 通道:CH1 或 CH2
支持的波特率(BAUD)#
| 波特率 | 说明 |
|---|---|
| 125000 | CAN 125K |
| 250000 | CAN 250K |
| 500000 | CAN 500K |
| 1000000 | CAN 1M(默认) |
$CAN 返回示例#
[MSG:CAN CH1:ready CH2:ready Passthrough:OFF Mode:CANopen(6-axis) Feedback:OFF]
$CANOPEN=5 返回示例(查询所有电机状态)#
[MSG:CANopen Motor Status]
[MSG: X(Node1): SW=0x0237 Pos=10000 Vel=0 OK ENABLED]
[MSG: Y(Node2): SW=0x0237 Pos=5000 Vel=0 OK ENABLED]
[MSG: Z(Node3): SW=0x0237 Pos=0 Vel=0 OK ENABLED]
[MSG: A(Node4): SW=0x0211 Pos=0 Vel=0 -- READY]
[MSG: B(Node5): SW=0x0008 Pos=0 Vel=0 -- FAULT]
[MSG: C(Node6): SW=0x0000 Pos=0 Vel=0 -- DISABLED]
状态字(SW)解析#
| 状态 | 含义 |
|---|---|
| ENABLED | 电机已使能,可接收运动指令 |
| READY | 电机就绪,等待使能 |
| DISABLED | 电机未使能 |
| FAULT | 电机故障,需清除故障后才能恢复 |
状态字位定义(DS-402)#
| Bit | 名称 | 说明 |
|---|---|---|
| 0 | Ready to switch on | 准备好切换 |
| 1 | Switched on | 已切换 |
| 2 | Operation enabled | 操作使能 |
| 3 | Fault | 故障 |
| 4 | Voltage enabled | 电压使能 |
| 5 | Quick stop | 快停激活 |
| 6 | Switch on disabled | 切换禁用 |
| 7 | Warning | 警告 |
位置有效性#
- OK:位置数据有效(已收到电机反馈)
- --:位置数据无效(未收到反馈或通信中断)
透传输出格式#
开启透传后,CAN 总线接收到的帧以如下格式输出:
[CANFD:CH1 ID:0581 DLC:8 43 00 10 00 00 00 01 80]
扩展帧会附加 EXT 标识:
[CANFD:CH2 ID:E0001234 DLC:4 2A 1B 0C FF EXT ]
典型测试流程#
$CAN—— 确认双通道就绪$CAN=1 1—— 开启透传$CAN=8 CH1 601 8 40 00 10 00 00 00 00 00—— SDO 读节点 1 的0x1000- 观察返回:
[CANFD:CH1 ID:0581 DLC:8 43 00 10 00 ...]—— 设备应答 $CAN=1 0—— 关闭透传
八、CANopen 协议命令#
当 $450=1 启用 CANopen 总线模式后,可使用以下 CANopen 子命令控制 6 个伺服电机。
CANopen 系统命令#
| 命令 | 说明 | 示例 |
|---|---|---|
$CANOPEN=0 |
初始化 CANopen 协议栈 | $CANOPEN=0 |
$CANOPEN=1 1 |
NMT 启动所有节点(进入 Operational 状态) | $CANOPEN=1 1 |
$CANOPEN=1 0 |
NMT 停止所有节点(进入 Stopped 状态) | $CANOPEN=1 0 |
$CANOPEN=3 |
NMT 进入预操作状态 | $CANOPEN=3 |
$CANOPEN=4 |
NMT 复位所有节点 | $CANOPEN=4 |
$CANOPEN=6 nodeId 1 |
使能指定电机(DS402 状态机) | $CANOPEN=6 1 1 |
$CANOPEN=6 nodeId 0 |
禁用指定电机 | $CANOPEN=6 1 0 |
$CANOPEN=10 R nodeId idx sub |
SDO 读取从站对象 | $CANOPEN=10 R 1 1000 00 |
$CANOPEN=10 W nodeId idx sub data |
SDO 写入从站对象 | $CANOPEN=10 W 1 6040 00 06 00 |
SDO 命令详解#
SDO 读取#
$CANOPEN=10 R 1 1000 00
│ │ │
│ │ └── 子索引(十六进制)
│ └── 对象索引(十六进制)
└── 节点 ID(1~6)
返回示例:
[MSG:CANopen SDO read OK, len=4 data=00 00 00 00]
SDO 写入#
$CANOPEN=10 W 1 6040 00 06 00
│ │ │ │
│ │ │ └── 写入数据(十六进制,空格分隔)
│ │ └── 子索引
│ └── 对象索引
└── 节点 ID
返回示例:
[MSG:SDO write node=1 idx=0x6040 sub=0 = 0x0006]
DS402 电机状态机#
使能/禁用命令操作 DS402 状态机:
| 命令 | 状态转换 | 控制字 |
|---|---|---|
| ENABLE | SwitchOnDisabled → ReadyToSwitchOn → SwitchedOn → OperationEnabled | 0x06 → 0x07 → 0x0F |
| DISABLE | OperationEnabled → SwitchedOn → ReadyToSwitchOn → SwitchOnDisabled | 0x07 → 0x06 → 0x00 |
对象字典映射(本机主站)#
| 索引 | 名称 | 类型 | 说明 |
|---|---|---|---|
0x6000 |
目标位置 | int32[6] | 6 轴目标位置数组 |
0x6001 |
实际位置 | int32[6] | 6 轴实际位置数组(只读) |
0x6002 |
目标速度 | int32[6] | 6 轴目标速度数组 |
0x6003 |
实际速度 | int32[6] | 6 轴实际速度数组(只读) |
0x6004 |
状态字 | uint16[6] | 6 轴 DS402 状态字(只读) |
0x6005 |
控制字 | uint16[6] | 6 轴 DS402 控制字 |
0x6006 |
操作模式 | uint8[6] | 6 轴操作模式(1=Profile Position, 3=Profile Velocity) |
PDO 映射配置#
默认 PDO 配置(节点 ID=1 为例):
| PDO | COB-ID | 方向 | 映射对象 |
|---|---|---|---|
| RPDO1 | 0x200+NodeID |
主站→从站 | 0x6005:0, 0x6005:1(控制字) |
| RPDO2 | 0x300+NodeID |
主站→从站 | 0x6005:2, 0x6005:3 |
| RPDO3 | 0x400+NodeID |
主站→从站 | 0x6005:4, 0x6005:5 |
| TPDO1 | 0x180+NodeID |
从站→主站 | 0x6004:0, 0x6004:1(状态字) |
| TPDO2 | 0x280+NodeID |
从站→主站 | 0x6004:2, 0x6004:3 |
| TPDO3 | 0x380+NodeID |
从站→主站 | 0x6004:4, 0x6004:5 |
COB-ID 会随节点 ID 偏移(如 NodeID=2 时 RPDO1 =
0x202),多轴组网时需注意避免冲突。
典型 CANopen 启动流程#
$450=1—— 切换到 CANopen 模式(需重启)$CANOPEN=0—— 初始化协议栈$CANOPEN=1 1—— NMT 启动所有节点$CANOPEN=10 R 1 1000 00—— SDO 读取节点 1 设备类型(验证通信)$CANOPEN=6 1 1—— 使能电机 1$CANOPEN=10 W 1 6042 00 E8 03 00 00—— 设置目标位置(假设0x6042为目标位置)- 观察 TPDO 或 SDO 读取状态字确认运动完成
九、文件管理命令#
当启用文件系统支持(LITTLEFS_ENABLE=2 或 SD 卡)后,可使用以下命令管理宏程序文件。
基本文件操作#
| 命令 | 说明 | 示例 |
|---|---|---|
$FM |
初始化 SD 卡 | $FM |
$FU |
卸载 SD 卡 | $FU |
$650 |
$650=1/0 设置是否开机自动初始化 SD 卡 |
$650=1 是、$650=0 否 |
$F |
列出文件(仅显示支持的扩展名) | $F |
$F+ |
列出所有文件(包括非标准扩展名) | $F+ |
$FI |
显示文件系统挂载信息 | $FI |
$F<=<filename> |
输出文件内容 | $F<=test.ngc |
$F=<filename> |
运行文件 | $F=test.ngc |
$FD=<filename> |
删除文件 | $FD=test.ngc |
$FF=yes |
格式化文件系统(清除所有文件) | $FF=yes |
目录操作#
| 命令 | 说明 | 示例 |
|---|---|---|
$PWD |
显示当前工作目录 | $PWD |
$CWD=<path> |
设置工作目录 | $CWD=/macros |
支持的文件扩展名#
| 扩展名 | 说明 |
|---|---|
.nc |
Numerical Control 文件 |
.ngc |
LinuxCNC G-code 文件 |
.gcode |
通用 G-code 文件 |
.txt |
文本文件 |
.tap |
TAP 格式 G-code |
.macro |
宏程序文件 |
文件系统配置#
W25Q128 SPI Flash(LittleFS)(仅 H743 主板)#
| 配置项 | 值 | 说明 |
|---|---|---|
| 总容量 | 16 MB | W25Q128 = 128 Mb |
| 扇区大小 | 4 KB | LittleFS block_size |
| 页大小 | 256 字节 | Flash 编程单位 |
| NVS 占用 | 扇区 0 (4KB) | 系统参数存储区 |
| LittleFS 起始 | 扇区 1 | 宏文件存储区 |
| 可用空间 | ~15.996 MB | 扣除 NVS 后 |
| 根目录 | /littlefs/ |
/littlefs/test.ngc |
SD 卡(FatFS)#
| 配置项 | 值 | 说明 |
|---|---|---|
| 文件系统 | FatFS | FAT32/exFAT |
| 容量 | 取决于 SD 卡 | 建议使用 1GB~4GB |
| 根目录 | / |
/test.ngc |
命令返回示例#
$FI 挂载信息:
$FI
[FS:littlefs@/ size 16777216, free 16515072]
$F 列出文件:
$F
[FILE:test.macro|SIZE:256]
[FILE:safe_drill.macro|SIZE:512]
[FILE:homework.ngc|SIZE:1024]
$F<=/littlefs/test.ngc 查看内容:
$F<=/littlefs/test.ngc
O100 SUB
G0 X0 Y0 Z5
G1 Z-10 F100
G0 Z5
O100 ENDSUB
$F=/littlefs/test.ngc 运行文件:
$F=/littlefs/test.ngc
[MSG:File test.ngc opened for execution]
宏程序调用方式#
命名子程序调用:
O<safe_drill> CALL [50] [30] [-10]
; 自动查找 /safe_drill.ngc
G65 宏调用:
G65 P1001 A10 B20
; 查找 /littlefs/P1001.ngc,参数 A=10, B=20
注意事项#
- W25Q128 擦写寿命:典型 10 万次/扇区。LittleFS 有磨损均衡,但频繁修改同一文件会加速磨损。
- 写入速度:W25Q128 写入需先擦除 4KB 扇区(约 100-400ms)。
- 文件名限制:
- 最大长度:32 字节(YMODEM 上传)
- 路径最大:128 字符
- 不支持中文文件名(建议使用英文和数字)
- 格式化风险:
$FF=yes会清除所有文件,不可恢复! - 流程控制支持:
.ngc文件中的流程控制语句(IF/WHILE/SUB/CALL)仅在文件模式下可用,串口交互模式不支持。
十、Modbus 从站功能寄存器(仅适用于 H743 主板)#
控制卡作为 Modbus 从站,上位机(PLC/SCADA)可通过以下保持寄存器进行监控与控制。
| 寄存器地址 | 功能 | 读/写 | 说明 |
|---|---|---|---|
0x0000 |
状态查询 | 只读 | 返回当前系统状态码 |
0x0001 |
回零指令 | 只写 | 写入 1 触发回零($H) |
0x0002 |
运行程序 | 只写 | 写入程序编号 099 运行 ngc099.ngc 文件 |
1. 状态码定义(读取 0x0000 寄存器)#
0x00:空闲(Idle)0x01:运行(Run)0x02:暂停(Pause)0x03:点动(Jog)0x04:回零中(Homing)0x05:报警(Alarm)0x06:检查模式(Check Mode)0x07:休眠(Sleep)
2. 回零指令(写入 0x0001 寄存器)#
- 只有在**空闲或报警状态(Idle/Alarm)**下才能写入回零指令,否则返回 Modbus 功能码
0x86、异常码0x04(响应异常)。 - 写入值 ≤ 99:正常运行。
- 写入值 > 99:返回 Modbus 异常码
0x03(非法数据值)。
3. 运行程序规则(写入 0x0002 寄存器)#
- 只有在**空闲状态(Idle)**下才能写入程序编号,否则返回 Modbus 功能码
0x86、异常码0x04(响应异常)。 - 写入值 ≤ 99:正常运行
ngc{N}.ngc。 - 写入值 > 99:返回 Modbus 异常码
0x03(非法数据值)。
4. 支持的 Modbus 功能码#
0x03:读保持寄存器(Read Holding Registers)0x06:写单个寄存器(Write Single Register)
提示:通过 Modbus 触发回零/运行前,先读
0x0000确认状态为 Idle/Alarm,否则写操作会被拒绝并报异常。这与$H/$X的前置状态要求一致。
十一、错误代码说明#
当执行 G-code 或系统命令时,如果返回 error:N,N 为以下错误码之一:
基本错误(0-19)#
| 错误码 | 名称 | 含义 |
|---|---|---|
| 0 | OK | 成功,无错误 |
| 1 | ExpectedCommandLetter | G-code 由字母和数值组成,未找到字母 |
| 2 | BadNumberFormat | 缺少预期的 G-code 数值或数值格式无效 |
| 3 | InvalidStatement | $ 系统命令未识别或不支持 |
| 4 | NegativeValue | 收到负值,但预期为正值 |
| 5 | HomingDisabled | 回零失败,未通过设置配置回零功能 |
| 6 | SettingStepPulseMin | 步进脉冲时间必须 ≥2 微秒 |
| 7 | SettingReadFail | 设置读取失败,自动恢复为默认值 |
| 8 | IdleError | $ 命令只能在 IDLE 状态下使用 |
| 9 | SystemGClock | G-code 命令在 ALARM 或 JOG 状态下被锁定 |
| 10 | SoftLimitError | 启用软限位必须同时启用回零 |
| 11 | Overflow | 超过每行最大字符数,命令未执行 |
| 12 | MaxStepRateExceeded | 设置值导致速度超过最大支持值 |
| 14 | LineLengthExceeded | 启动行超过长度限制,未存储 |
| 15 | TravelExceeded | 点动目标超出机器行程,命令被忽略 |
| 16 | InvalidJogCommand | 点动命令无 = 或包含禁止的 G-code |
| 18 | Reset | 复位信号触发 |
| 19 | NonPositiveValue | 非正值 |
G-code 解析错误(20-58)#
| 错误码 | 名称 | 含义 |
|---|---|---|
| 20 | GcodeUnsupportedCommand | 不支持或无效的 G-code 命令 |
| 21 | GcodeModalGroupViolation | 同一模态组有多个 G-code 命令 |
| 22 | GcodeUndefinedFeedRate | 速度 F 未设置或未定义 |
| 23 | GcodeCommandValueNotInteger | G-code 命令需要整数值 |
| 24 | GcodeAxisCommandConflict | 多个需要轴参数的 G-code 命令冲突 |
| 25 | GcodeWordRepeated | 重复的 G-code 字 |
| 26 | GcodeNoAxisWords | 缺少轴参数字 |
| 27 | GcodeInvalidLineNumber | 行号无效 |
| 28 | GcodeValueWordMissing | 缺少必需的数值字 |
| 29 | GcodeUnsupportedCoordSys | 不支持 G59.x 工件坐标系 |
| 30 | GcodeG53InvalidMotionMode | G53 只能与 G0/G1 运动模式一起使用 |
| 31 | GcodeAxisWordsExist | 当前命令/模态不需要轴参数但存在 |
| 32 | GcodeNoAxisWordsInPlane | G2/G3 圆弧至少需要一个平面内轴参数 |
| 33 | GcodeInvalidTarget | 运动命令目标无效 |
| 34 | GcodeArcRadiusError | 圆弧半径值无效 |
| 35 | GcodeNoOffsetsInPlane | G2/G3 圆弧至少需要一个平面内偏移字 |
| 36 | GcodeUnusedWords | 存在未使用的数值字 |
| 39 | GcodeValueOutOfRange | 数值超出范围 |
| 43 | GcodeMaxFeedRateExceeded | 超过最大速度 |
| 45 | LimitsEngaged | 限位开关触发时只允许回零操作 |
| 46 | HomingRequired | 需要先回零才能继续 |
| 48 | ValueWordConflict | 数值字冲突 |
| 49 | SelfTestFailed | 上电自检失败,需要硬复位 |
| 50 | EStop | 急停激活 |
| 51 | MotorFault | 电机故障 |
| 52 | SettingValueOutOfRange | 设置值超出范围 |
| 53 | SettingDisabled | 设置不可用 |
| 55 | IllegalHomingConfiguration | 尝试同时对两个自动方正轴回零 |
| 56 | GCodeCoordSystemLocked | 坐标系被锁定 |
| 57 | UnexpectedDemarcation | 意外的文件分隔符 |
| 58 | AuxiliaryPortUnavailable | 端口不可用 |
文件系统错误(60-66)#
| 错误码 | 名称 | 含义 |
|---|---|---|
| 60 | SDMountError | SD 卡挂载错误 |
| 61 | FileReadError | 文件读取错误 |
| 62 | FsFailedOpenDir | 打开目录失败 |
| 63 | FSDirNotFound | 目录未找到 |
| 64 | SDNotMounted | SD 卡未挂载 |
| 65 | FsNotMounted | 文件系统未挂载 |
| 66 | FsReadOnly | 文件系统只读 |
其他错误(70-88)#
| 错误码 | 名称 | 含义 |
|---|---|---|
| 70 | BTInitError | 蓝牙初始化错误 |
| 71 | ExpressionUknownOp | 表达式中未知运算符 |
| 72 | ExpressionDivideByZero | 表达式除以零 |
| 73 | ExpressionArgumentOutOfRange | 表达式参数超出范围 |
| 74 | ExpressionInvalidArgument | 表达式参数无效 |
| 75 | ExpressionSyntaxError | 表达式语法错误 |
| 76 | ExpressionInvalidResult | 表达式结果为 NaN 或无穷大 |
| 77 | AuthenticationRequired | 需要认证 |
| 78 | AccessDenied | 访问被拒绝 |
| 79 | NotAllowedCriticalEvent | 关键事件激活时不允许此操作 |
| 80 | FlowControlNotExecutingMacro | 流控制语句只能在宏文件中使用 |
| 81 | FlowControlSyntaxError | 未知流控制语句 |
| 82 | FlowControlStackOverflow | 流控制语句执行时栈溢出 |
| 83 | FlowControlOutOfMemory | 流控制语句执行时内存不足 |
| 84 | FileOpenFailed | 无法打开文件 |
| 85 | FsFormatFailed | 文件系统格式化失败 |
| 86 | AuxiliaryPortUnusable | 端口不可用 |
排错建议#
- 遇到
error:9/45/46/50/51等状态类错误,先用$X解锁、$H回零,确认无急停/故障后再操作。 - 遇到 G-code 解析错误(20-39),多为程序语法问题,可用
$C检查模式预先验证。 - 文件系统错误(60-66)多为存储未挂载或只读,检查 SD/LittleFS 状态(
$FI)。
文档编写:博飞宇智能科技(吴飞)
版本:V1.1