控制板通信文档

运动控制卡完整通信指令参考,涵盖 G/M 代码、实时控制字符、系统 $ 命令、参数配置、CAN/CANopen 总线、文件管理、Modbus 寄存器及错误代码。

最近更新 2026-08-13 全文字数 21,879 89 个章节

目录#


概述#

本手册适用于博飞宇 F407H743 两款控制卡产品。

两款产品硬件差异#

功能 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 分别对应 G54G55G56G57G58G59G59.1G59.2G59.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 绝对/增量

    • G90X10 表示移动到绝对坐标 10;
    • G91X10 表示从当前位置再移动 +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> ENDSUBG65 使用。


三、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 参数/停留时间 用于 G4G10M62…等
R 圆弧半径 / 循环 R 平面 用于 G2/G3 半径或固定循环

说明:带 * 的字母(A/B/C/O)为扩展轴/功能,依固件配置启用。每个字母在同一程序行中一般只出现一次(重复会报 error:25)。

3.2 注释#

  1. ;G1X100 F80000 —— 注释内容不会执行;
  2. (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...> 的状态帧。
  • 0x210x7E 配合实现"暂停/继续";它们不会丢失已规划的运动队列。
  • 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=1 Delta 尺寸示例、$453=2 SCARA 尺寸示例、$453=3 Palletizer 尺寸示例:参见原手册配图。

6.12 特殊命令#

编号 名称 说明
$JOINT=1 切换关节运动 关节运动模式运动
$JOINT=0 切换坐标运动 坐标运动模式运动
$JOINT 查看运动模式 查看当前运动模式
$SDBTN=1 输入用于启动 SD 文件 IN1IN5 启动执行 ngc1.ngcngc5.ngc
$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 ]

典型测试流程#

  1. $CAN —— 确认双通道就绪
  2. $CAN=1 1 —— 开启透传
  3. $CAN=8 CH1 601 8 40 00 10 00 00 00 00 00 —— SDO 读节点 1 的 0x1000
  4. 观察返回:[CANFD:CH1 ID:0581 DLC:8 43 00 10 00 ...] —— 设备应答
  5. $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 0x060x070x0F
DISABLE OperationEnabled → SwitchedOn → ReadyToSwitchOn → SwitchOnDisabled 0x070x060x00

对象字典映射(本机主站)#

索引 名称 类型 说明
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 启动流程#

  1. $450=1 —— 切换到 CANopen 模式(需重启)
  2. $CANOPEN=0 —— 初始化协议栈
  3. $CANOPEN=1 1 —— NMT 启动所有节点
  4. $CANOPEN=10 R 1 1000 00 —— SDO 读取节点 1 设备类型(验证通信)
  5. $CANOPEN=6 1 1 —— 使能电机 1
  6. $CANOPEN=10 W 1 6042 00 E8 03 00 00 —— 设置目标位置(假设 0x6042 为目标位置)
  7. 观察 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

注意事项#

  1. W25Q128 擦写寿命:典型 10 万次/扇区。LittleFS 有磨损均衡,但频繁修改同一文件会加速磨损。
  2. 写入速度:W25Q128 写入需先擦除 4KB 扇区(约 100-400ms)。
  3. 文件名限制:
    • 最大长度:32 字节(YMODEM 上传)
    • 路径最大:128 字符
    • 不支持中文文件名(建议使用英文和数字)
  4. 格式化风险:$FF=yes 会清除所有文件,不可恢复!
  5. 流程控制支持:.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