FC0001 V2.0报错代码&SDO读取
| 项目 | 信息 |
|---|---|
| 文档编号 | FC0001 |
| 文档版本 | Rev. 1.1 |
| 适用产品 | JxServo 模组 |
| 适用固件 | V2.0 及以上版本 |
| 语言 | 简体中文 |
| 最后更新 | 2026-06-24 |
本文说明通过 CANopen SDO 读取 JxServo 模组告警和故障信息的方法,并补充 0x80 + NodeID 紧急报文的解析方式。V2.0 版本的模组报错代码采用统一编码规则,因此同一个新版报错代码在不同模组上表示相同故障类型。不同产品或定制版本可能会根据功能配置屏蔽部分报错,或增加少量定制报错项,但已定义的报错代码含义保持一致。
本文以 R68LITE 项目故障表为例说明解析方式。该示例用于说明 V2.0 通用编码和 4 字节现场数据的解析方法,实际使用时应以对应产品发布资料为准。
定位到具体 V2.0 诊断 ID 后,如需继续确认触发条件、保护动作、清除方式和排查步骤,请参阅 FC0002 关节模组故障报警与保护逻辑教程。
0x603F:00 读取的是当前活跃/实际发送的 CANopen 错误码。该值也会放在 0x80 + NodeID 紧急报文的 byte0..1。
0x4500:00 读取的是最近一次告警/故障的新版诊断 ID 低 16 位,也就是 [故障域][子项],更适合用于 V2.0 以后精确定位故障来源。
0x80 + NodeID 紧急报文除了错误码以外,还会携带严重度和 4 字节现场数据,可用于查看实际触发值、阈值、计数或状态标志。
1. 快速查找
1.1 读取方式对比
| SDO 对象 | 名称 | 数据长度 | 返回内容 | 推荐用途 |
|---|---|---|---|---|
0x603F:00 | errorCode | 2 字节 | 当前活跃/实际发送的错误码 | 兼容旧版上位机、既有解析逻辑或只需要当前活跃故障分类的场景 |
0x4500:00 | currentErrorID | 2 字节 | 最近一次告警/故障的新版诊断 ID 低 16 位 [故障域][子项] | V2.0 新软件、售后诊断、日志记录和精确定位故障来源 |
0x603F:00 用于读取当前活跃或实际发送给主站的报错码;0x4500:00 用于读取最近一次告警/故障的新版报错码。若对应对象当前没有可读取的报错,返回值为 0x0000。
1.2 推荐排查入口
| 目的 | 优先使用 | 说明 |
|---|---|---|
| 只想知道当前是否有活跃故障 | 0x603F:00 | 返回当前活跃/实际发送错误码,适合快速轮询 |
| 想定位最近一次具体故障来源 | 0x4500:00 | 返回新版诊断 ID 低 16 位,按故障域和子项定位 |
| 想查看触发现场值或阈值 | 0x80 + NodeID 紧急报文 | byte4..7 携带 4 字节现场数据 context |
| 收到旧兼容码后无法区分具体故障 | 0x4500:00 + 产品故障表 | 旧兼容码可能把多个新版故障折叠到同一分类 |
如需调整故障项开关、清除覆盖或保存故障项,可通过 0x4500:01 写控制命令操作故障表。该功能不属于故障码读取流程,使用方法请参考 TN0002 CANopen 通信功能扩展说明。
2. 故障码速查表
以下列出 R68LITE 示例配置中的 0x4500 返回值与完整 32 位故障 ID。不同模组或不同固件版本可能包含不同条目,应以对应产品发布资料为准。
完整 32 位故障 ID 可直接用于查询严重度;0x4500 只返回同一 ID 的低 16 位。
| 序号 | 0x4500 返回值 | 完整 32 位故障 ID | 严重度 | 故障域 | 说明 |
|---|---|---|---|---|---|
| 1 | 0x0100 | 0x02000100 | 故障 | 电源 | 母线电压过高 |
| 2 | 0x0101 | 0x02000101 | 故障 | 电源 | 母线电压过低 |
| 3 | 0x0102 | 0x03000102 | 跳闸 | 电源 | 母线硬件过压跳闸 |
| 4 | 0x0103 | 0x03000103 | 跳闸 | 电源 | 母线硬件过流跳闸 |
| 5 | 0x0200 | 0x02000200 | 故障 | 驱动 | 软件过流 |
| 6 | 0x0201 | 0x03000201 | 跳闸 | 驱动 | U 相硬件过流跳闸 |
| 7 | 0x0203 | 0x03000203 | 跳闸 | 驱动 | V 相硬件过流跳闸 |
| 8 | 0x0204 | 0x01000204 | 告警 | 驱动 | 驱动过温告警 |
| 9 | 0x0205 | 0x02000205 | 故障 | 驱动 | 驱动过温故障 |
| 10 | 0x0206 | 0x03000206 | 跳闸 | 驱动 | U 相软件过流 |
| 11 | 0x0207 | 0x03000207 | 跳闸 | 驱动 | V 相软件过流 |
| 12 | 0x0302 | 0x01000302 | 告警 | 电机 | 电机过温告警 |
| 13 | 0x0303 | 0x02000303 | 故障 | 电机 | 电机过温故障 |
| 14 | 0x0400 | 0x03000400 | 跳闸 | 传感器 | 编码器超时未更新 |
| 15 | 0x0401 | 0x01000401 | 告警 | 传感器 | 编码器读取失败 |
| 16 | 0x0406 | 0x01000406 | 告警 | 传感器 | 编码器状态告警 |
| 17 | 0x0407 | 0x02000407 | 故障 | 传感器 | 编码器状态错误 |
| 18 | 0x0408 | 0x02000408 | 故障 | 传感器 | 电流偏置校准失败 |
| 19 | 0x0500 | 0x02000500 | 故障 | 控制 | 位置跟踪误差过大 |
| 20 | 0x0507 | 0x02000507 | 故障 | 控制 | 速度跟踪误差过大 |
| 21 | 0x0508 | 0x02000508 | 故障 | 控制 | 软件堵转 |
| 22 | 0x0509 | 0x01000509 | 告警 | 控制 | 速度指令超出上限 |
| 23 | 0x050A | 0x0200050A | 故障 | 控制 | 飞车或超速保护 |
| 24 | 0x0600 | 0x01000600 | 告警 | 通信 | 通信心跳丢失 |
| 25 | 0x0603 | 0x01000603 | 告警 | 通信 | CAN 通信 BusOff |
| 26 | 0x0705 | 0x02000705 | 故障 | 安全 | 正向光电限位超出 |
| 27 | 0x0706 | 0x02000706 | 故障 | 安全 | 负向光电限位超出 |
| 28 | 0x0707 | 0x02000707 | 故障 | 安全 | 正向软件限位超出 |
| 29 | 0x0708 | 0x02000708 | 故障 | 安全 | 负向软件限位超出 |
3. SDO 查询帧格式
3.1 基本约定
以下示例以节点 ID 为 1 的设备为例:
- 主站发送 COB-ID:
0x600 + NodeID,即0x601 - 设备响应 COB-ID:
0x580 + NodeID,即0x581 - SDO 读取命令字:
0x40 - 2 字节读取响应命令字:
0x4B
3.2 读取当前活跃/实际发送报错码 0x603F:00
主站发送:
ID: 0x601
DLC: 8
Data: 40 3F 60 00 00 00 00 00
设备响应:
ID: 0x581
DLC: 8
Data: 4B 3F 60 00 LL HH 00 00
解析方式:
0x603F 当前错误码 = 0xHHLL
示例:
4B 3F 60 00 00 01 00 00
表示 0x603F = 0x0100。在 R68LITE 标准 CANopen 示例中,该值可直接按新版低 16 位解析为“母线电压过高”。部分产品线为了兼容旧上位机,可能会把多个新版故障折叠到同一个旧兼容码,具体见本文后面的兼容说明。
3.3 读取最近一次告警/故障码 0x4500:00
主站发送:
ID: 0x601
DLC: 8
Data: 40 00 45 00 00 00 00 00
设备响应:
ID: 0x581
DLC: 8
Data: 4B 00 45 00 LL HH 00 00
解析方式:
新版诊断 ID 低 16 位 = 0xHHLL
高字节 HH = 故障域
低字节 LL = 子项
示例:
4B 00 45 00 05 02 00 00
表示 0x4500 = 0x0205,其中:
0x02表示驱动类故障。0x05表示该故障域下的第0x05个子项。- 按 R68LITE 示例故障表解析,该值对应“驱动过温故障”。
4. 80+ID 紧急报文解析
4.1 报文格式
设备触发当前活跃的故障或跳闸时,会尝试发送一帧由 0x603F 驱动的紧急报文:
ID: 0x80 + NodeID
DLC: 8
Data: EC_L EC_H 00 SEV C0 C1 C2 C3
字段解析:
| 字节 | 字段 | 说明 |
|---|---|---|
| byte0..1 | EC_L EC_H | 当前 0x603F 错误码,小端;EC_L 为低字节,EC_H 为高字节 |
| byte2 | 00 | 固定为 0x00 |
| byte3 | SEV | 诊断严重度:0x02=故障,0x03=跳闸 |
| byte4..7 | C0 C1 C2 C3 | 32 位现场数据 context,小端 |
4.2 现场数据 context 拆包
context 的通用拆包方式:
context = C0 + (C1 << 8) + (C2 << 16) + (C3 << 24)
low16 = C0 + (C1 << 8)
high16 = C2 + (C3 << 8)
如果某个字段按有符号 int16 解释,0x8000 到 0xFFFF 需要按二补码还原为负数。例如 0xFF38 应解析为 -200。
常见缩放规则:
| 标记 | 解析 |
|---|---|
x1 | 原始整数值 |
x10 | 原始整数值 ÷ 10 |
x100 | 原始整数值 ÷ 100 |
x1000 | 原始整数值 ÷ 1000 |
raw bits | 按位标志解释,不做数值缩放 |
4.3 发送规则
- 紧急报文只由当前活跃的
FLT/TRIP级故障驱动,WARN级告警不会通过该路径发送80+ID紧急报文。 - 当多个
FLT/TRIP同时活跃时,当前时间戳最新的一条用于更新0x603F并尝试发送紧急报文。 - 同一故障在一次激活周期内最多上报一次;故障消失后再次触发,会重新具备上报条件。
- 若项目使用旧兼容映射且某个新版故障没有映射到
0x603F,该故障不会通过80+ID报文发送。
4.4 示例 1:母线过压
节点 ID 为 1,R68LITE 触发母线电压过高,实际母线电压 72.34 V,触发阈值 68.00 V。R68LITE 标准示例中 0x603F = 0x0100,严重度为 0x02。
ID: 0x081
DLC: 8
Data: 00 01 00 02 42 1C 90 1A
解析:
错误码 = 0x0100 -> 母线电压过高
严重度 = 0x02 -> 故障
low16 = 0x1C42 = 7234 -> 72.34 V
high16 = 0x1A90 = 6800 -> 68.00 V
4.5 示例 2:母线硬件过流
节点 ID 为 1,触发母线硬件过流跳闸,比较器标志 bit0 置位:
ID: 0x081
DLC: 8
Data: 03 01 00 03 01 00 00 00
解析:
错误码 = 0x0103 -> 母线硬件过流跳闸
严重度 = 0x03 -> 跳闸
context = 0x00000001
bit0=1 -> IDC/母线电流比较器触发
5. V2.0 新版诊断 ID
5.1 32 位 ID 结构
设备内部使用 32 位诊断 ID:
[严重度][预留ID][故障域][子项]
1B 1B 1B 1B
0x4500:00 只返回后 2 字节:
[故障域][子项]
1B 1B
这意味着 0x4500:00 不直接返回严重度字段。需要严重度时,应优先看 80+ID 紧急报文的 byte3,或结合对应产品的诊断说明。
5.2 故障域定义
| 故障域 | 名称 | 说明 |
|---|---|---|
0x00 | 系统 | 参数、配置、内部状态等系统类问题 |
0x01 | 电源 | 母线电压、电源输入和母线硬件保护 |
0x02 | 驱动 | 功率驱动、驱动温度、相电流和驱动侧保护 |
0x03 | 电机 | 电机温度、电机观测和电机侧状态 |
0x04 | 传感器 | 编码器、电流采样、母线采样等传感器状态 |
0x05 | 控制 | 位置、速度、轨迹、设定点和运动控制状态 |
0x06 | 通信 | 心跳、指令流、CAN 通信等链路状态 |
0x07 | 安全 | 软件限制、限位、状态机安全保护 |
0x08 | 应用 | 标定、应用流程和应用层安全检查 |
6. R68LITE 80+ID 解析表
R68LITE 标准 CANopen 示例未使用旧兼容折叠映射,因此 80+ID 报文 byte0..1 与 0x4500 低 16 位一致,均为小端。例如新版码 0x0507 在报文中写作 07 05。
6.1 会通过 80+ID 发送的 FLT/TRIP 项
| 新版码 | byte0..1 | byte3 | 说明 | byte4..7 现场数据解析 |
|---|---|---|---|---|
0x0100 | 00 01 | 0x02 | 母线电压过高 | low16/100=母线实际电压 V;high16/100=过压阈值 V |
0x0101 | 01 01 | 0x02 | 母线电压过低 | low16/100=母线实际电压 V;high16/100=欠压阈值 V |
0x0102 | 02 01 | 0x03 | 母线硬件过压跳闸 | 事件直报项;当前参考实现未定义固定现场字段,通常按项目实现或 0 处理 |
0x0103 | 03 01 | 0x03 | 母线硬件过流跳闸 | raw bits:bit0=IDC/母线电流比较器;bit1=V 相比较器;bit2=U 相比较器 |
0x0200 | 00 02 | 0x02 | 软件过流 | 通常按 int16 low/100=实际电流 A,high16/100=阈值 A |
0x0201 | 01 02 | 0x03 | U 相硬件过流跳闸 | raw bits:bit2=U 相比较器触发;也可同时带 bit0/bit1 组合标志 |
0x0203 | 03 02 | 0x03 | V 相硬件过流跳闸 | raw bits:bit1=V 相比较器触发;也可同时带 bit0/bit2 组合标志 |
0x0205 | 05 02 | 0x02 | 驱动过温故障 | low16/10=驱动温度 °C;high16/10=故障阈值 °C |
0x0206 | 06 02 | 0x03 | U 相软件过流 | 事件直报项;当前参考实现未定义固定现场字段,通常按项目实现或 0 处理 |
0x0207 | 07 02 | 0x03 | V 相软件过流 | 事件直报项;当前参考实现未定义固定现场字段,通常按项目实现或 0 处理 |
0x0303 | 03 03 | 0x02 | 电机过温故障 | low16/10=电机温度 °C;high16/10=故障阈值 °C |
0x0400 | 00 04 | 0x03 | 编码器超时未更新 | low16=连续错误次数;high16=接收超时计数低 16 位 |
0x0407 | 07 04 | 0x02 | 编码器状态错误 | 项目编码器状态字;当前 R68LITE 参考路径未定义固定拆包字段 |
0x0408 | 08 04 | 0x02 | 电流偏置校准失败 | low16/1000=U 相偏置电压 V;high16/1000=V 相偏置电压 V |
0x0500 | 00 05 | 0x02 | 位置跟踪误差过大 | int16 low/1000=位置误差 rad;high16/1000=触发阈值 rad |
0x0507 | 07 05 | 0x02 | 速度跟踪误差过大 | low16/10=速度误差 rpm;high16/10=触发阈值 rpm |
0x0508 | 08 05 | 0x02 | 软件堵转 | low16/10=当前绝对速度 rpm;high16/10=当前绝对 Iq 电流 A |
0x050A | 0A 05 | 0x02 | 飞车或超速保护 | low16=当前绝对速度 rpm;high16=触发阈值 rpm |
0x0705 | 05 07 | 0x02 | 正向光电限位超出 | low16=正限位输入状态,1 表示触发;high16=0 |
0x0706 | 06 07 | 0x02 | 负向光电限位超出 | low16=负限位输入状态,1 表示触发;high16=0 |
0x0707 | 07 07 | 0x02 | 正向软件限位超出 | low16=原因位 reason_bits;high16=状态位 status_bits |
0x0708 | 08 07 | 0x02 | 负向软件限位超出 | low16=原因位 reason_bits;high16=状态位 status_bits |
6.2 不会通过 80+ID 发送的 WARN 项
以下 R68LITE 条目严重度为 WARN,可通过 0x4500:00 或诊断日志看到故障类型,但不会由当前 0x603F 紧急报文路径发送 80+ID:
| 新版码 | 说明 | 可用现场数据说明 |
|---|---|---|
0x0204 | 驱动过温告警 | 告警日志中可按 low16/10=驱动温度 °C,high16/10=告警阈值 °C 解释 |
0x0302 | 电机过温告警 | 告警日志中可按 low16/10=电机温度 °C,high16/10=告警阈值 °C 解释 |
0x0401 | 编码器读取失败 | 当前 R68LITE 参考路径未定义固定拆包字段 |
0x0406 | 编码器状态告警 | 当前 R68LITE 参考路径未定义固定拆包字段 |
0x0509 | 速度指令超出上限 | 告警日志中可按 int16 low=速度指令 rpm,high16=最大允许速度 rpm 解释 |
0x0600 | 通信心跳丢失 | low16=距离最近 CAN 帧的时间 ms,high16=超时阈值 ms |
0x0603 | CAN 通信 BusOff | GD32 平台常用 context 记录 BusOff 次数;STM32 平台常用 low16=PSR 低 16 位,high16=ECR 低 16 位 |
7. 兼容码与新版码的关系
7.1 R68LITE 标准示例
0x603F 是当前活跃/实际发送的错误码。对 R68LITE 标准 CANopen 示例,0x603F 直接使用新版诊断 ID 的低 16 位,因此可按前面的故障码速查表解析。
7.2 旧兼容分类示例
部分产品线为了兼容旧上位机,会将多个新版故障折叠到同一个旧兼容分类。例如:
新版 0x4500 示例 | 新版含义 | 旧兼容分类示例 |
|---|---|---|
0x0100 / 0x0102 | 母线电压过高 / 母线硬件过压跳闸 | 0x0001 母线过压 |
0x0101 | 母线电压过低 | 0x0002 母线欠压 |
0x0205 / 0x0303 | 驱动或电机过温故障 | 0x0004 过温 |
0x0508 | 软件堵转 | 0x0008 堵转 |
0x0507 | 速度跟踪误差过大 | 0x0020 速度误差 |
0x0408 | 电流偏置校准失败 | 0x0400 电流采样异常 |
0x0500 | 位置跟踪误差过大 | 0x1000 位置误差 |
7.3 判断建议
如果收到的是旧兼容分类码,单靠 80+ID 报文 byte0..1 可能无法唯一判断具体新版故障项。此时应结合 0x4500:00、诊断日志或产品发布资料确认实际故障。
8. 上位机解析建议
- 需要追溯最近一次告警/故障或精确定位故障来源时,读取
0x4500:00。 - 需要读取当前活跃/实际发送报错,或兼容旧版故障码和既有逻辑时,读取
0x603F:00。 - 需要查看实际触发值、阈值、计数或标志位时,监听
0x80 + NodeID紧急报文,并按本文的 byte4..7 解析context。 0x0000表示对应对象当前无可读取的报错;读取0x603F:00时也可能表示该故障未配置兼容映射。- 报文中的多字节数值均为小端,响应
LL HH需要还原为0xHHLL,现场数据C0 C1 C2 C3需要还原为0xC3C2C1C0。 - 对 R68LITE 标准示例,
0x603F与0x4500的低 16 位一致;对使用旧兼容映射的产品,不建议只依赖0x603F或80+IDbyte0..1 做精确定位。