第 5 章 CANopen 与上层协议¶
CANopen 由 CAN in Automation(CiA)协会于 1995 年发布,是构建在 CAN 链路层之上的应用层规范;主文档 CiA DS 301(V4.2 现行版)定义通讯与设备模型,DS 401 等设备 profile 覆盖 I/O 模块、编码器、测量设备等,CiA DS 402 专管运动控制与驱动设备。机器人关节驱动器与协作机械臂普遍把 DS 402 当作事实标准。
本章按 CANopen 的四条主干展开:对象字典(数据结构)→ PDO / SDO(数据搬运)→ NMT / EMCY(网络与故障管理)→ DS 402 状态机与操作模式(驱动器语义)。与上位衔接:本章的 DS 402 CSP 模式与 CiA 402 从站实现,是 ROS2-note 第 6 章「自写 hardware_interface」的总线侧上游——控制器下发轨迹、读回关节状态最终落到 CANopen PDO 上。
四条主干与驱动器语义的落点:
flowchart LR
od["对象字典 OD<br/>索引 + 子索引"] --> pdo["PDO:过程数据<br/>周期映射"]
od --> sdo["SDO:参数读写<br/>请求 / 响应"]
nmt["NMT / EMCY<br/>网络与故障管理"] --> od
pdo --> d402["DS 402 状态机<br/>CSP 等操作模式"]
1. CANopen 分层与 CiA 301 定位¶
CANopen 建立三条与"裸 CAN"不同的抽象:
- 对象字典(Object Dictionary,OD):每个节点内所有可访问的数据项统一以
(索引, 子索引)二元组寻址,形成一张标准化的表;应用层读写、调试工具浏览、profile 定义都基于 OD。 - 通讯对象(Communication Object,COB):把 OD 里的条目按用途分组打包到 CAN 帧——TPDO/RPDO(周期性过程数据)、SDO(服务数据对象,参数读写)、NMT(网络管理)、EMCY(紧急)、SYNC(同步)、TIME(时间戳)。每类有独立的 CAN ID 空间与报文格式。
- 设备 profile:DS 301 定义通讯与基本设备模型、DS 402 在 DS 301 之上补齐运动控制语义(状态机、模式、轨迹缓冲)。
规范层次:CAN 链路层(ISO 11898-1)→ CANopen 应用层(CiA DS 301)→ 设备 profile(DS 402 / DS 401 等)→ 厂商扩展区(自定义索引 0x2000–0x5FFF)。跨厂商互通的共同契约是 DS 301 + DS 402 的强制对象部分;厂商扩展区互通性自担。
2. 对象字典 OD¶
对象字典是 CANopen 的核心数据结构——所有通讯对象、所有 profile 参数最终都指向 OD 里某一条目。
2.1 索引与子索引结构¶
OD 是16 位索引 + 8 位子索引的表:
- 索引(Index,0x0000–0xFFFF):定位"哪一组"数据,例如 0x1000 是 Device Type、0x1018 是 Identity Object、0x1400 起是 RPDO 通讯参数、0x6040 起是 DS 402 控制字。
- 子索引(Sub-index,0x00–0xFF):定位组内"哪一项";子索引 0 通常是该组元素个数(ARRAY / RECORD 类型时),从 1 起是具体数据。
- 三种条目类型:
VAR(单值,只有子索引 0)、ARRAY(同类型多值,子索引 0 是数量)、RECORD(异构多值,子索引 0 是数量)。
示例:TPDO1 的通讯参数在索引 0x1800 起,子索引 1 是 COB-ID、2 是传输类型、5 是 Inhibit Time;DS 402 操作模式选择 0x6060 是 VAR、位置实际值 0x6064 是 VAR。
2.2 强制区与制造商自定义区¶
DS 301 定义了索引空间的分段规约:
| 索引段 | 内容 |
|---|---|
| 0x0001–0x00FF | 数据类型定义 |
| 0x1000–0x1FFF | 通讯区(COB 参数、SYNC、TIME、NMT) |
| 0x2000–0x5FFF | 制造商自定义区(各厂商自由使用) |
| 0x6000–0x67FF | 标准 profile 区(DS 401 IO、DS 402 驱动等) |
| 0x6800–0x7FFF | 设备 profile 扩展 |
| 0xF000–0xFFFF | 用于 NMT 广播、服务入口(如 0xF000 是 Error Fieldlist) |
跨厂商设备"能对话"依赖通讯区与 profile 区的语义一致;制造商自定义区的互通性由用户自担。
2.3 数据类型与访问属性¶
OD 条目带数据类型(BOOLEAN / INTEGER8–64 / UNSIGNED8–64 / REAL32/64 / VISIBLE_STRING / OCTET_STRING / DOMAIN 等,以 DS 301 的数据类型表为准)与访问属性(ro / wo / rw / rww / wwr)。PDO 只允许映射"能在一个周期内读或写"的简单类型;DOMAIN 用于固件下载等大块数据走 SDO。
3. 通讯对象与 COB-ID¶
CANopen 用 CAN ID 空间把通讯对象分类,一套 7 位 Node-ID(1–127)与 4 位功能码拼成 11 位 CAN ID。
3.1 通讯对象分类¶
DS 301 规定的四类基本通讯对象,加上可选的 TIME 与厂商扩展:
| 类型 | 功能码 | COB-ID(默认) | 说明 |
|---|---|---|---|
| NMT | 0 | 0x000 |
主站广播给全网,命令字带 Node-ID |
| SYNC | 1 | 0x080 |
同步广播,触发同步 PDO |
| TIME | 2 | 0x100 |
网络时间戳(可选) |
| EMCY | 1 | 0x080 + Node-ID |
紧急/故障消息,一帧带错误码 |
| TPDO1 | 3 | 0x180 + Node-ID |
发射过程数据,PDO2–4 依次为 0x280/0x380/0x480 |
| RPDO1 | 4 | 0x200 + Node-ID |
接收过程数据,PDO2–4 依次为 0x300/0x400/0x500 |
| SDO 响应(Tx) | 11 | 0x580 + Node-ID |
从站对 SDO 请求的应答/上传数据 |
| SDO 请求(Rx) | 12 | 0x600 + Node-ID |
主站发起读写请求 |
| 心跳 / Node Guarding | 14 | 0x700 + Node-ID |
HB 生产者或守卫响应 |
Node-ID 是 1–127 的 7 位数,写入跳线、旋钮或 EEPROM;同一 CANopen 域内唯一。COB-ID 由 4 位功能码与 7 位 Node-ID 拼成,因此功能码越小、Node-ID 越小,帧在 CAN 位仲裁下优先级越高:NMT 0x000 最高,SYNC 0x080 次之,SDO、PDO、心跳依次靠后。
3.2 COB-ID 分配与 Node-ID¶
工程实践:
- Node-ID 冲突 → HB 帧在同一 COB-ID 上出现两个发送器,CAN 位仲裁让它们交替出现,
candump会看到相同 ID 但数据交替的两条 HB。检测办法:NMT 状态下逐个上线,看 HB 是否唯一。 - COB-ID 可改:DS 301 允许通过 SDO 写 OD 里的通讯参数(0x1400:1、0x1800:1 等)改 COB-ID,用于跨网段或复用同一物理总线。改后要先 NMT Reset Communication 让配置生效。
4. PDO 过程数据对象¶
PDO 是实时数据搬运通道:控制周期内的目标位置、实际速度、力矩、数字量 IO 都走 PDO。特点是无协议头开销(一帧 8 字节全是数据)、可预配置映射(哪几个 OD 条目打进同一帧)、支持同步/异步/事件触发。
4.1 TPDO / RPDO 与映射参数¶
每个 PDO 有两条参数:
- 通讯参数(Comm Parameter,索引 0x1400+ 对应 RPDO / 0x1800+ 对应 TPDO):COB-ID、传输类型、Inhibit Time、Event Timer、SYNC 起始计数等。
- 映射参数(Mapping Parameter,索引 0x1600+ 对应 RPDO / 0x1A00+ 对应 TPDO):子索引 1..N 每个条目是 32 位的
(索引 << 16) | (子索引 << 8) | 位长度,把 OD 里的若干 VAR 拼进同一帧。
例:TPDO1 映射四个 UNSIGNED16(角度、速度、电流、温度)到 0x1A00:1..4,共 64 位;帧长 8 字节刚好装满。DS 402 的 PDO 映射有默认约定(0x6040 控制字、0x6041 状态字、0x6064 实际位置等),跨设备直接对齐。
4.2 传输类型与触发方式¶
传输类型(Transmission Type)位于通讯参数子索引 2,按 DS 301 的定义:
0:同步、非周期——事件发生且收到下一个 SYNC 才发送。1–240:同步、周期——每 n 个 SYNC 发送一次(n 即该数值)。241–251:保留。252/253:分别由同步 / 异步远程帧(RTR)触发。254:厂商特定的异步事件触发。255:profile 特定的异步事件触发(数据变化即发)。
Inhibit Time(禁止时间,通讯参数子索引 3)是两次 PDO 发送的最小间隔,单位为 100 μs,用于抑制事件驱动下的发送风暴。Event Timer(子索引 5)给出"至少每隔多久发一次"的兜底间隔,单位为 ms。
5. SDO 伺服数据对象¶
SDO 用于非周期、大块、可靠性优先的读写:调试参数、profile 配置、固件下载。基于请求/应答(request/response),一次传输由一条 RSDO 请求与一条 TSDO 响应组成,可扩到多帧。
5.1 expedited / segmented / blocked¶
DS 301 §3.4.2 定义三种 SDO 传输模式:
- Expedited(一次帧内):经典 CAN 下最多 4 字节数据(一帧 8 字节减去命令字、16 位索引与 8 位子索引);FD 下上限随帧长扩展,以 DS 301 的 FD 版本为准。最快,用于读写单个参数。
- Segmented(分段):数据超过一帧容量时拆成多段,经典 CAN 每段 7 字节 + 段号与切换位(toggle bit)保序;用于字符串、DOMAIN、几百字节的配置。
- Blocked(块传输):主站下发块启动后,从站连续发送一组段帧、主站按块回确认,最后以块结束收尾;用于固件下载等大批量传输,比逐段握手的 segmented 少很多往返。
5.2 上传与下载命令字¶
SDO 命令字是帧首字节,高 3 位(bit 7–5)为命令说明符(Command Specifier,CS):
- 上传:主站发
0x40发起读请求;从站按数据形态回0x43(expedited,带长度)、0x41(expedited,不带长度)或0x42(segmented 起始)。 - 下载:主站发
0x23(expedited,带长度)、0x21(expedited,不带长度)或0x22(segmented 起始);从站回0x60表示成功,回0x80后跟 4 字节中止码表示失败。
常见中止码(Abort Code,32 位;完整枚举以 DS 301 的中止码表为准):0x06010000 不支持的访问、0x06010001 尝试读只写对象、0x06020000 对象不存在、0x06090011 子索引不存在、0x06090030 参数值超出范围。SDO 中止码在调试中很常见,逐码对照 DS 301 即可定位。
6. NMT 网络管理与状态机¶
NMT(Network Management)负责节点生命周期——初始化、上线、暂停、复位。CANopen 网络里 NMT 主站唯一(一般是 PLC 或工控机),其余节点是 NMT 从站。
6.1 三种节点状态与转换¶
DS 301 §7.3.1 定义的 NMT 状态机:
DS 301 定义的 NMT 状态机在四态间迁移:
Initialisation ──(自动)──> Pre-Operational ──(Start, 0x01)──> Operational
▲ │ │
│ └──(Stop, 0x02)──> Stopped ◀┘
└──────(Enter pre-op, 0x80)────┘
- Pre-Operational:可收发 SDO、NMT、SYNC、TIME 与 EMCY,PDO 尚未激活——这是配置阶段的状态。
- Operational:PDO 按配置正常收发,控制周期进入运行。
- Stopped:只保留 NMT 与心跳,其余通讯停止。
NMT 命令通过 COB-ID 0x000 广播,两字节组成:命令字 + Node-ID(Node-ID 为 0 时作用于全网)。常用命令字:0x01 Start、0x02 Stop、0x80 Enter Pre-Operational、0x81 Reset Node、0x82 Reset Communication。
- Reset Node(
0x81):复位整个节点,应用对象与通讯参数一起回到上电默认值。 - Reset Communication(
0x82):只复位通讯参数(COB-ID、PDO 映射等),应用对象保持。
6.2 心跳生产者与守护消费者¶
节点生命周期监视有两条替代路径:
- Heartbeat(HB,DS 301 V4.0 起):每个从站按配置周期(Producer Time,OD 0x1017:0)主动发一条 HB(状态字节 = 当前 NMT 状态)。主站只需监听,无需逐节点轮询。现代部署首选。
- Node Guarding(DS 301 早期):主站用 RTR(远程帧)周期性"点名",从站回一条含状态字节与 toggle 位的守卫帧。开销大、依赖远程帧,逐渐被 HB 取代。
HB 超时(Consumer Time,OD 0x1016 表内)超时未收到 → 主站判该节点丢失,触发应用层应急策略(禁用该轴、进安全态)。
7. EMCY 紧急消息¶
EMCY(Emergency,COB-ID 0x080 + Node-ID)是从站主动上报故障的通道,一帧 8 字节:
- 字节 0–1:错误码(Error Code,16 位),DS 301 的紧急对象错误码表定义 0x0000–0xFFFF;常用 0x1000(通用错误)、0x2310(连续过流)、0x3210(直流母线过压)、0x4210(器件过温)、0x8110(CAN 控制器 overrun)、0x8120(CAN 进入 error-passive)、0x8130(心跳/寿命守卫丢失)、0x8140(从 bus-off 恢复)、0x8150(CAN-ID 冲突)、0x8210(PDO 长度错误)、0x8220(PDO 长度超限)、0xFF00(厂商特定)。
- 字节 2:错误寄存器(Error Register,OD 0x1001),8 位通用状态标志。
- 字节 3–7:厂商错误字段(Manufacturer-Specific Error Field),DS 402 用它填故障字与状态字快照。
EMCY 是发送后立即进入新状态的异步告警;DS 301 规定 EMCY 优先级高于常规 PDO(在位仲裁下 COB-ID 更小),保证告警及时送达。
8. DS 402 伺服驱动 profile¶
CiA DS 402 在 DS 301 之上补齐运动控制设备的通用语义:状态机、控制字与状态字、操作模式、轨迹对象。多数机器人关节驱动器都实现 DS 402(具体型号的符合性声明与对象支持范围以厂商文档为准)。
8.1 状态机与控制和状态字¶
DS 402 为驱动定义了从"未就绪"到"运行使能"的驱动状态机(Drive State Machine),核心状态依次为 Not ready to switch on、Switch on disabled、Ready to switch on、Switched on、Operation enabled,另有 Quick stop active 与 Fault reaction active / Fault 两个异常分支:
Not ready to switch on ──(自检完成)──> Switch on disabled
│ Shutdown(0x0006)
▼
Ready to switch on
│ Switch on(0x0007)
▼
Switched on
│ Enable operation(0x000F)
▼
Operation enabled
│ Quick stop(0x0002) / 故障
▼
Quick stop active / Fault reaction → Fault
控制字(Controlword,0x6040,16 位)与状态字(Statusword,0x6041,16 位)是 PDO 循环里最常用的两个对象。控制字标准位分配:
- bit0 = Switch on、bit1 = Enable voltage、bit2 = Quick stop(0 触发快停)、bit3 = Enable operation、bit7 = Fault reset(上升沿复位故障)、bit8 = Halt;bit4–6 与 bit9–15 由操作模式定义(如 PP 模式下 bit4 = New set-point、bit5 = Change set immediately、bit6 = Abs/Rel)。
- 常用命令组合:Shutdown =
0x0006、Switch on =0x0007、Enable operation =0x000F、Disable voltage =0x0000、Quick stop =0x0002、Fault reset =0x0080。
状态字标准位分配:
- bit0 = Ready to switch on、bit1 = Switched on、bit2 = Operation enabled、bit3 = Fault、bit4 = Voltage enabled、bit5 = Quick stop、bit6 = Switch on disabled、bit7 = Warning;bit8 = 厂商特定。
- bit9 = Remote(控制字来自总线)、bit10 = Target reached、bit11 = Internal limit active;bit12–13 与 bit14–15 由操作模式或厂商定义(如 PP 模式下 bit12 = Set-point acknowledge、bit13 = Following error)。
工程惯例:控制字与状态字都通过 TPDO/RPDO 每周期搬运,SDO 只在配置阶段用;两者一起构成机器人关节的闭环握手语义。
状态迁移由控制字触发、由状态字回报:
stateDiagram-v2
state "Not ready to switch on" as NRSO
state "Switch on disabled" as SOD
state "Ready to switch on" as RTSO
state "Switched on" as SO
state "Operation enabled" as OE
state "Quick stop active" as QSA
state "Fault" as F
[*] --> NRSO
NRSO --> SOD: 自检完成
SOD --> RTSO: Shutdown 0x0006
RTSO --> SO: Switch on 0x0007
SO --> OE: Enable operation 0x000F
OE --> QSA: Quick stop 0x0002
OE --> F: 故障
F --> SOD: Fault reset 0x0080
8.2 PP / PV / PT / CSP 四种操作模式¶
DS 402 定义多种操作模式(Modes of Operation,0x6060);机器人常用的四种:
| 模式 | 编码 | 语义 | 每周期下发 | 用途 |
|---|---|---|---|---|
| PP(Profile Position) | 1 | 轨迹规划由驱动器做:主站下发目标位置与 profile 速度/加速度参数 | 目标位置、可选的 profile 参数 | 简单定位、上下料 |
| PV(Profile Velocity) | 3 | 主站下发目标速度、驱动器闭环稳速 | 目标速度 | 恒速轮、传送带 |
| PT(Profile Torque) | 4 | 主站下发目标力矩、驱动器闭环稳力矩 | 目标力矩 | 力位混合、柔顺控制 |
| CSP(Cyclic Synchronous Position) | 8 | 主站周期下发目标位置、驱动器只跟随;同步由 SYNC 触发 | 目标位置(每个 SYNC 周期一次) | 多轴插补、协作臂轨迹跟随 |
CSP 是协作机械臂与人形机器人关节的主流模式:主站做整机关节位置规划(常见 1 kHz),每周期把目标位置通过 RPDO 送到每个关节;从站收到 SYNC 后在配置的时间窗口内更新位置指令,保证多轴同步。插补周期由 0x60C2(Interpolation Time Period)配置,同步抖动应远小于一个插补周期——1 ms 周期下常按几十微秒量级要求,具体以驱动器手册与整机同步预算为准。
除这四种外 DS 402 还定义了 Homing(6)、Cyclic Synchronous Velocity(9)、Cyclic Synchronous Torque(10)等操作模式,以及 Touch Probe 功能(0x60B8 起);机器人上 CSP / PV / PT 用得最多。
9. 要点¶
- CANopen = OD + 通讯对象 + profile:DS 301 给通讯与设备模型基座、DS 402 补齐运动控制;跨厂商互通的边界在 profile 强制对象区。
- 对象字典:16 位索引 + 8 位子索引;索引段决定归属(通讯 / 制造商 / profile);类型与访问属性约束 PDO 映射合法性。
- COB-ID = 功能码 + Node-ID:NMT 0x000、SYNC 0x080、TIME 0x100、EMCY
0x080 + ID、TPDO0x180/0x280/0x380/0x480 + ID、RPDO0x200/0x300/0x400/0x500 + ID、SDO 响应0x580 + ID/ 请求0x600 + ID、心跳0x700 + ID;Node-ID 1–127。 - PDO 走周期、SDO 走配置:PDO 无协议头开销、映射 OD 条目到帧;传输类型决定 SYNC/异步/事件;SDO 三种传输(expedited / segmented / blocked)对应不同长度。
- NMT 状态机 + HB:Initialisation / Pre-Operational / Operational / Stopped;HB 让主站"订阅式"监视节点,取代旧 Node Guarding 的轮询。
- DS 402 = 状态机 + 控制/状态字 + 操作模式:Switch-on Disabled / Ready to Switch On / Switched On / Operation Enabled;PP / PV / PT / CSP 覆盖从简单定位到多轴同步插补,CSP 是协作臂主流,要求 < 1 ms 同步窗口。