CANopen工作原理详细讲解:对象字典、SDO与PDO
CANopen 的工作原理,一句话:它是跑在 CAN 总线之上的一套设备约定,用对象字典规定“数据放在哪”,用 SDO 配参数,用 PDO 搬实时数据,用 NMT 管状态。
很多人卡在第一步,是因为把 CAN 和 CANopen 当成一回事。CAN 只规定了物理层和帧格式,帧里最多 8 个字节,谁发、发什么、字节怎么排,全靠上层约定。CANopen 就是这份约定,它把工业设备常用的参数和过程数据,编成一套统一的地址表,让不同厂家的设备能互相听懂。
三样东西:对象字典、SDO、PDO
对象字典是一张表,每个条目有一个 16 位索引和一个 8 位子索引,比如设备信息在 0x1018,厂商参数在 0x2000 往后。谁想知道这个节点有什么能力,翻它的对象字典就行。
访问这张表有两条路。SDO 是慢速通道,一问一答,带确认,适合上电时配参数;PDO 是快速通道,一个报文直接把数据搬过去,没有额外的协议开销,适合周期性传位移值。
| 报文 | 常用 COB-ID | 干什么 | 要不要应答 |
|---|---|---|---|
| NMT | 0x000 | 主站管节点状态:启动、进运行、停止 | 不应答 |
| SYNC | 0x080 | 给同步型 PDO 打节拍 | 不应答 |
| EMCY | 0x080 + 节点号 | 节点报故障 | 不应答 |
| SDO 请求 | 0x600 + 节点号 | 读或写对象字典 | 一问一答 |
| SDO 响应 | 0x580 + 节点号 | 返回读值或写入结果 | — |
| TPDO | 0x180 + 节点号 | 节点往外发过程数据 | 不应答 |
| RPDO | 0x200 + 节点号 | 节点接收过程数据 | 不应答 |
| 心跳 | 0x700 + 节点号 | 节点报“我还活着” | 不应答 |
表里的 COB-ID 是出厂默认值,可以在对象字典里改。改之前先想清楚:同一网段里两个节点撞了同一个 COB-ID,两条报文会互相冲突,现象是偶尔丢数据,很难查。
上电到能用,节点要走四个状态
CANopen 节点上电后不是立刻干活,要经过初始化、预运行、运行、停止这四个状态。初始化是内部自检和读参数,完成后自动进预运行;预运行状态下只通 SDO,可以配参数,PDO 不发;收到主站的启动命令才进运行,PDO 开始工作;停止状态下除了 NMT 和心跳,其他通信都停。
这条状态链解释了现场一个常见困惑:参数都写进去了,为什么主站收不到位移值?节点还停在预运行。发一条 NMT 启动命令让它进运行,数据就出来了。
对象字典怎么看:索引加子索引
对象字典的地址是两段式:高 8 位和低 8 位合成 16 位索引,再跟一个 8 位子索引。比如 0x1018 是设备信息,里面的子索引 1 是厂商号、2 是产品代码、3 是版本号。
位移传感器常用的是两类对象:配置类放在 0x2000 以后的厂商区或标准区,位置值放在过程数据对象里,通过 PDO 映射指过去。SDO 读的时候报文里带索引和子索引,应答里带回数据类型和值,长度通常在 4 字节以内。
调试时最省事的做法是把要读的几个对象列成一张小表:索引、子索引、含义、数据类型、期望值。拿着这张表一条条读,比在软件里翻树状菜单快得多。

PDO 怎么搬数据:映射与传输类型
PDO 本身不带协议头,报文里就是裸数据。所以发送方和接收方必须事先约定好“第几字节到第几字节是什么”,这份约定就是 PDO 映射。
映射的做法是把对象字典里的条目按顺序填进映射表,每条占 1 到 4 个字节,最多 8 字节。一只位移传感器常见的映射是:位置值 4 字节,状态位 1 字节,剩下的留空或者放诊断。

传输类型决定什么时候发。同步型靠 SYNC 报文打节拍,收到一个 SYNC 就发一次;事件型由内部条件触发,可以配一个事件计时器,到点就发一次。位移传感器在液压缸上跟着动作走,用事件计时器更省带宽;在同步产线上,用同步型更好对齐。
心跳、EMCY 与常见误判
心跳是节点定期发的“我还活着”,主站超时没收到就可以报警。EMCY 是节点主动报故障,带一个错误码和错误寄存器。两者都不要和 PDO 混为一谈:心跳断说明节点或线路有问题,PDO 停但心跳正常,多半是状态不对或者映射错了。
现场最常见的误判是“总线断了”。实际上终端电阻少一只、波特率不一致、两个节点同 COB-ID,表现都像断线。区分办法是先只留一只节点通信,正常了再加第二只,一只只加回去,问题节点会自己暴露出来。


位移传感器接进总线:四个高频坑
| 坑 | 现象 | 处理 |
|---|---|---|
| 波特率不一致 | 通信时通时断,错误帧多 | 全网上电前统一,改完必须重新上电生效 |
| 终端电阻缺失 | 短距离正常,加长就丢帧 | 总线两端各一只 120Ω,中间节点不装 |
| 节点号重复 | 两只传感器读数互相串 | 逐个上电确认节点号,再做联调 |
| PDO 映射与主站不一致 | 数值明显不对,像放大了几十倍 | 按字节对齐核对映射长度与数据类型 |
本站 19 系列这类总线型产品,节点号、波特率、事件计时器都能通过 SDO 配置,配置项一次写不完就先写节点号和波特率,重新上电确认能通信,再配 PDO 映射。顺序反了,一旦波特率写错,后面就连不上了。

常见问题
问:CAN 和 CANopen 到底什么关系?
答:CAN 是底层总线和帧格式,单帧最多 8 字节;CANopen 是在 CAN 之上约定的一套通信规则,规定数据怎么编址、怎么传、怎么管状态。
问:为什么参数写进去了却收不到数据?
答:节点多半还在预运行状态。预运行只通 SDO,PDO 不发;发 NMT 启动命令进运行态,数据才会周期上来。
问:PDO 和 SDO 能不能互换使用?
答:能用但不划算。SDO 一问一答有开销,适合配置;周期性位移值走 PDO 才省带宽。用 SDO 轮询位置,节点一多总线就撑不住。
问:总线长度能拉多长?
答:跟波特率直接相关,速率越低能拉得越远。具体长度按所选波特率的总线规范取值,别按“反正能通”的经验硬拉。
CANopen 位移传感器的节点号、波特率、PDO 映射与事件计时器配置,把主站型号、传感器型号和现场节点数量发过来,易测电气的工程师可以提供对应的配置范例。易测电气位移传感器工程师欢迎您的咨询。
推荐文章
- LVDT位移传感器的寿命一般多久:三个会先坏的地方[2026-10-19]
- 磁致伸缩位移传感器原理:扭转波是怎么被听出来的[2026-09-29]
- 德敏哲CANopen位移传感器通讯配置范例详解[2026-09-24]
- 注塑机顶针电子尺震动问题与现场加固办法[2026-09-24]
- CANopen位移传感器事件计时器SDO配置详解[2026-09-24]

