设备通信与协议编程(八):CAN 与 CANopen 的报文、对象字典和实时性边界

CAN 与 CANopen 经常被连在一起说,但它们不是同一层:CAN 定义总线访问、帧和错误处理等机制;CANopen 在其上定义对象字典、通信对象、网络管理和设备配置。只会收发 CAN ID,不等于已经实现 CANopen 节点。

1. CAN 帧表达的是什么

经典 CAN 数据帧的有效载荷最多 8 byte,位速率上限为 1 Mbit/s;CAN FD 将单帧有效载荷扩展到最多 64 byte,并允许帧内切换到更快的位速率。设备、控制器、收发器和分析工具必须共同支持相应模式。

CAN 标识符用于仲裁并由系统赋予消息语义,它不是内建的节点地址。标准帧使用 11 bit 标识符,扩展帧使用 29 bit 标识符。

2. 非破坏性仲裁

多个节点同时发送时,标识符逐 bit 仲裁;显性位会覆盖隐性位,失去仲裁的节点停止发送而不破坏获胜帧。对同一帧格式而言,数值更小的标识符通常具有更高总线优先级。

这提供优先级调度,却不自动保证每条消息的截止时间。实时性还取决于:

  • 总线负载与最高优先级报文频率;
  • 位填充、错误帧和重传;
  • 驱动与应用调度延迟;
  • 网关转发和接收队列;
  • 标识符分配是否造成低优先级饥饿。

3. CAN 的可靠性不等于端到端成功

CAN 控制器提供 CRC、位监测、确认、错误计数和故障隔离等机制。它们提高链路可靠性,但应用仍需处理:

  • 消息过期或重复;
  • 接收队列溢出;
  • 节点复位后的状态恢复;
  • “帧已被总线确认”但业务未执行;
  • 网关另一侧的失败。

关键命令仍要定义序列、状态确认或幂等策略。

4. CANopen 的对象字典

对象字典(Object Dictionary,OD)是 CANopen 设备的核心数据模型。对象使用 16 bit index 和 8 bit sub-index 寻址,包含通信参数、设备参数和过程数据。与 Modbus 寄存器映射的对照见本系列第 7 篇。

1
2
3
4
5
Index 0x1000       Device type
Index 0x1018       Identity object
Index 0x1000-0x1FFF Communication profile area
Index 0x2000-0x5FFF Manufacturer-specific area
Index 0x6000-0x9FFF Standardized device-profile area

精确对象及访问权限应以设备 EDS/XDD 和适用的 CiA profile 为准,不能把示例索引当作所有设备都支持的寄存器表。

5. SDO 与 PDO

通信对象主要用途特点
SDO读取/写入对象字典、配置设备请求/响应,可传较长数据,开销较大
PDO交换实时过程数据映射预先配置的 OD 项,帧短、无逐条应用确认

PDO 可由事件、定时器或 SYNC 触发。它适合周期数据,不适合拿来临时读取任意对象。SDO 适合配置,但不应挤占高优先级实时流量。

6. NMT、Heartbeat 与 EMCY

CANopen Network Management(NMT)管理节点状态,例如 Initialization、Pre-operational、Operational 和 Stopped。节点进入 Operational 不代表机械系统已经安全 Ready;设备 profile 和应用状态机仍在更高层。

Heartbeat 用于观察节点是否持续存活,超时阈值应大于生产周期并考虑总线拥塞。Emergency(EMCY)用于报告紧急错误状态,但它不是可靠事件队列;上位机收到后应读取设备诊断对象并与状态机对账。

7. 上位机的软件边界

通用 PC 应用通常通过 USB-CAN、PCIe-CAN 或以太网网关接入。适配层至少应暴露:

1
2
3
Frame(timestamp, channel, id, flags, data)
BusState(error counters, bus-off, overflow)
SendAsync(frame)

不要只暴露 byte[]。时间戳来源、是否为硬件时间戳、接收溢出、错误帧和 bus-off 状态都关系到诊断结论。

CANopen 层再把 PDO/SDO/NMT 转成类型化能力,业务层不应直接拼 COB-ID 和字节偏移。

8. Bus-off 与恢复

错误计数达到协议条件后,节点可能进入 bus-off 并停止参与总线。自动恢复策略要符合控制器、设备和系统安全要求:

  1. 记录错误计数、总线状态与最近报文;
  2. 停止依赖该节点的流程并进入安全状态;
  3. 修复或等待物理故障消失;
  4. 按设备规则复位通信和应用状态;
  5. 重新确认节点身份、PDO 映射与运行状态。

反复自动复位可能掩盖终端、电磁干扰或波特率配置问题。

9. 验证与诊断

  • 用总线分析仪确认 nominal/data bitrate、帧格式与实际负载;
  • 验证高优先级流量下低优先级消息的最坏延迟;
  • 注入错误、断开终端、制造队列溢出并观察恢复;
  • 对照 EDS/XDD 验证对象类型、访问权限和 PDO 映射;
  • 区分适配器接收时间、驱动时间和硬件总线时间。

10. 小结

CAN 提供带优先级仲裁和错误隔离的共享总线,CANopen 提供可互操作的设备对象与通信模型。工程设计不能停留在“这个 CAN ID 是什么”,而要同时管理对象字典、网络状态、实时流量预算和故障恢复。

参考资料

Licensed under CC BY-NC-SA 4.0