CANopen 传感器的 node-id 同样可以通过 SDO 在线修改。这里以德敏哲 194 系列 CANopen 磁致伸缩位移传感器为例,说明把 node-id 从 0x7F(127)改成 0x7E(126)的完整过程。

假设条件
传感器原本的 node-id 是 0x7F(十进制 127),目标值是 0x7E(十进制 126)。
两条 SDO 完成修改
- 第 1 条 SDO 写入新 node-id:索引
0x300B,子索引0x00,数据为新 node-id,即0x7E。 - 第 2 条 SDO 存入 eeprom:索引
0x1010,子索引0x01,数据为0x73 61 76 65(ASCII 的 save)。
完整的通讯报文
| 序号 | 发送者 | cob-id | dlc | data | 说明 |
|---|---|---|---|---|---|
| 1 | 控制器 | 0x67F(=0x600+node-id) | 8 | 0x2F 0B 30 00 7E 00 00 00 | 向节点 0x7F 发出 SDO,数据第 5 字节是 0x7E |
| 2 | 传感器 | 0x5FF(=0x580+node-id) | 8 | 0x60 0B 30 00 00 00 00 00 | 节点 0x7F 的 node-id 已改为 0x7E,向控制器回应 SDO |
| 3 | 控制器 | 0x67E(=0x600+node-id) | 8 | 0x2F 10 10 01 73 61 76 65 | 向节点 0x7E(不是 0x7F)发出 SDO,存储 node-id 至 eeprom |
| 4 | 传感器 | 0x5FF(=0x580+node-id) | 8 | 0x60 10 10 01 00 00 00 00 | 节点 0x7E 回应 SDO |
改动之后要注意的地方
第 1 条 SDO 执行完,传感器的 node-id 就已经变了。因此第 3 条 SDO 不能再发给 0x7F,而要发给新地址 0x7E,对应的 cob-id 变成 0x600 + 0x7E = 0x67E。这一点是实际操作中最容易出错的地方——如果继续按旧地址发存储指令,新的 node-id 不会写入 eeprom,下次上电又回到 0x7F。
改成别的值怎么算
| 要改的项 | 怎么算 |
|---|---|
| 第 1 条 SDO 的数据 | 把数据第 5 个字节换成新 node-id 的值 |
| 第 3 条 SDO 的 cob-id | 0x600 + 新 node-id,否则新 node-id 不会存入 eeprom |
| 后续通讯地址 | 控制器侧按新 node-id 重新配置 |
完成以上通讯后,node-id 已改为 0x7E 并存入 eeprom。即使掉电,传感器也能从 eeprom 取回这个值,之后它的 node-id 一直是 0x7E。
如果原 node-id 不是 0x7F,把第 1 条 SDO 的 cob-id 按 0x600 + 原 node-id 改掉即可。不确定原 node-id 时,把传感器掉电再启动,用 EMCY 报文的 cob-id 减去 0x80 就能得到。
如果这一页没覆盖你的工况,可以先翻问答合集里是否已有同类情形:位移传感器常见问题解答。
常见问题
CANopen 传感器怎么修改 node-id?
用两条 SDO 完成:第 1 条写索引 0x300B、子索引 0x00,数据为新 node-id;第 2 条写索引 0x1010、子索引 0x01,数据为 0x73 61 76 65(即 ASCII 的 save),把新值存入 eeprom。
CANopen 修改 node-id 后为什么上电又变回去了?
因为存 eeprom 那一帧发错了地址。第 1 条 SDO 执行完,传感器的 node-id 就已经变了,因此第 2 条不能再发给旧地址,要发给新地址,即 cob-id 改为 0x600 加新 node-id。如果继续按旧地址发存储指令,新的 node-id 不会写入 eeprom,下次上电又回到原值。
CANopen 的 cob-id 怎么算?
控制器发送用的 cob-id = 0x600 加传感器 node-id,传感器回应用的 cob-id = 0x580 加传感器 node-id。改完地址后,控制器侧要按新 node-id 重新配置。
CANopen 传感器不知道 node-id 怎么办?
把传感器掉电再启动,用 EMCY 报文的 cob-id 减去 0x80 就能得到它的 node-id。
CANopen 把 node-id 改成 0x7E 的完整报文是什么?
控制器发 0x67F 数据 0x2F 0B 30 00 7E 00 00 00,传感器回 0x5FF 数据 0x60 0B 30 00 00 00 00 00;随后控制器发 0x67E 数据 0x2F 10 10 01 73 61 76 65 存储,传感器回 0x5FF 数据 0x60 10 10 01 00 00 00 00。存入 eeprom 后即使掉电,传感器也能从 eeprom 取回这个值。

