CANopen 入门:对象字典与 PDO/SDO 分工
CANopen 的全部通信行为,都可以归结为一句话:所有可访问的数据都放在"对象字典"里,用 PDO 高速搬运过程数据,用 SDO 慢速读写参数。总线型磁致伸缩位移传感器遵循 CiA DSP 406 编码器行规,位置值位于对象字典的 0x6000 区,以 INT32 格式通过 TPDO 周期上报;节点号、分辨率、零偏等配置参数则通过 SDO 读写。理解这两条通道的分工,是把传感器接进 CAN 网络的前提。本文承接总线接线基础篇 CANopen 与 EtherCAT 实操指南,对应产品为 194 CANopen 系列。
对象字典:CANopen 的数据地图
对象字典(Object Dictionary,OD)是每个 CANopen 从站内部的一张标准化数据表。表中每一项由索引(Index)与子索引(Sub-index)唯一定位,索引区段按 CiA 规范划分:通信参数区、制造商自定义区、以及由具体行规(Device Profile)规定的标准设备参数区。
对位移传感器而言,关键一点是它走的是 DSP 406 编码器行规。这意味着不同厂家、不同型号的 CANopen 位移传感器,其位置值对象都落在同一区段(0x6000 区),数据类型统一为 32 位有符号整数。主站侧因此可以按标准方式解析,无需为每个品牌单独写解析代码——这正是行规存在的意义。位置值为绝对位置,掉电重启后无需回零,原理见 绝对位置 vs 增量位置。
需要注意:INT32 读到的是"计数值"而不是毫米。实际位移 = 计数值 × 分辨率步长。分辨率档位按 1 / 2 / 5 / 10 / 20 / 50 / 100 μm 供货,若主站未按实际档位换算,读数就会整体差一个倍率——这是新手最常见的"数值看着不对"来源。分辨率档位与精度的关系见 分辨率、重复精度、非线性度的区别。
PDO:周期搬运位置值的高速通道
PDO(Process Data Object,过程数据对象)用于传输实时过程数据,特点是无协议开销、单帧直达、生产者-消费者模型。传感器向主站发送位置值使用 TPDO(Transmit PDO,从从站视角"发出")。
PDO 有三个关键配置维度:
- PDO 映射:规定这一帧里装了哪些对象、各占几个字节。位置值 INT32 占 4 字节,标准 CAN 数据帧负载最大 8 字节,因此单个 TPDO 最多装两个 INT32 位置值——多磁环场景的配置约束由此而来,详见 CANopen 多磁块读取配置。
- 传输类型:常见有事件触发(位置变化即发)、周期定时发送、以及 SYNC 同步触发(收到主站 SYNC 报文后统一发送)。多轴系统应优先选 SYNC 触发,使各轴采样时刻对齐。
- 报文标识符(COB-ID):CANopen 预定义连接集按"基地址 + 节点号"自动分配,因此节点号一改,报文 ID 就跟着改,主站侧的接收过滤必须同步更新。
SDO:读写参数的点对点通道
SDO(Service Data Object,服务数据对象)是客户端-服务器模式的确认式访问:主站发一条请求(指明索引/子索引与数据),从站回一条应答。它可以访问对象字典中的任意条目,支持任意长度数据,但每次访问都要一问一答,效率低、延迟不确定。
SDO 的正确用途是组态阶段:写节点号与波特率、设定分辨率档位、写零位偏置、配置 PDO 映射与传输类型、执行参数保存(store)命令。绝对不要用 SDO 轮询位置值——一次 SDO 交互至少两帧,多轴轮询会迅速吃满总线带宽,并使位置数据的时间戳失去确定性。这是 CANopen 现场负载失控的头号原因。
PDO 与 SDO 对比
| 维度 | PDO(过程数据对象) | SDO(服务数据对象) |
|---|---|---|
| 通信模型 | 生产者-消费者,广播 | 客户端-服务器,点对点 |
| 是否确认 | 不确认,发完即走 | 每次读写均有应答 |
| 单次数据量 | ≤ 8 字节(单帧) | 不限长度,可分段传输 |
| 实时性 | 高,延迟确定 | 低,延迟不确定 |
| 典型用途 | 位置值周期上报(0x6000 区 INT32) | 节点号、分辨率、零偏、PDO 映射配置 |
| 触发方式 | 事件 / 定时 / SYNC 同步 | 主站按需发起 |
| 使用阶段 | 运行阶段 | 组态阶段 |
| 误用后果 | 映射错则数据错位 | 用于轮询位置会导致总线过载 |
NMT 状态机:为什么上电后收不到数据
CANopen 从站有一套 NMT(网络管理)状态机:上电后进入初始化,随后自动转入预运行(Pre-Operational)状态。此状态下 SDO 可用、PDO 不发送。只有主站下发 NMT 启动命令、从站进入运行(Operational)状态后,TPDO 才开始上报位置值。
现场"SDO 能读到位置、但 PDO 一直没数据",九成是主站未把节点切到 Operational,或主站的自动启动选项未开启。此外还有两类周期性报文需要了解:心跳(Heartbeat)用于节点存活监视,主站据此判断掉站;EMCY 紧急报文在从站检测到内部错误(如磁环丢失、内部自检异常)时主动发出,是最有价值的诊断入口,主站侧应记录而不是丢弃。
接入一台传感器的标准顺序
- 物理层先做对:CAN_H / CAN_L 差分对 + 屏蔽,线形拓扑,网段两端各一只 120 Ω 终端电阻,中间节点不装。原理见 终端电阻与总线长度:为什么必须 120 Ω。
- 设定节点号与波特率:节点地址范围 1–127,全网唯一;波特率支持 10 / 20 / 50 / 125 / 250 / 500 / 800 / 1000 kbps,全网必须一致。配置方法见 CANopen 节点地址与波特率配置实战。
- 导入 EDS 文件:主站据此识别对象字典条目,省去手工填索引。
- 配置 PDO 映射与传输类型:确认位置值已映射进 TPDO,多轴系统选 SYNC 触发。
- 切换到 Operational:确认 TPDO 周期上报,并核对计数值 × 分辨率是否与实际行程一致。
协议之间怎么横向取舍,见 总线型全系对比;主站体系与协议的对应关系见 选型指南:我的 PLC 支持哪种总线;产品参数与接线定义见 194 CANopen 系列详解。
常见问题
Q:CANopen 的 PDO 和 SDO 有什么区别?
PDO 是生产者-消费者模式的过程数据通道,单帧不确认、延迟确定,用于位置值周期上报;SDO 是客户端-服务器模式的确认式访问,可读写对象字典任意条目但延迟不确定,用于组态阶段写参数。位置值必须走 PDO,用 SDO 轮询位置会导致总线负载失控。
Q:CANopen 位移传感器读到的 INT32 就是毫米值吗?
不是。读到的是计数值,实际位移等于计数值乘以分辨率步长。分辨率档位按 1/2/5/10/20/50/100 μm 供货,主站未按实际档位换算时读数会整体差一个倍率。
Q:为什么上电后 SDO 能读数据但收不到 PDO?
CANopen 从站上电后进入预运行(Pre-Operational)状态,此状态下 SDO 可用但 PDO 不发送。必须由主站下发 NMT 启动命令使节点进入运行(Operational)状态,TPDO 才会开始上报位置值。
Q:改了节点号后为什么主站读不到数据了?
CANopen 预定义连接集按功能码基地址加节点号生成报文标识符,节点号一改所有报文 ID 随之改变。主站侧的接收过滤与映射表必须同步更新,否则表现为设备在线却无数据。
Q:DSP 406 行规对位移传感器意味着什么?
DSP 406 是 CiA 的编码器行规,规定位置值对象统一落在 0x6000 区且为 INT32 类型。不同厂家的 CANopen 位移传感器因此可被主站按标准方式解析,无需为每个品牌单独编写解析逻辑。





