CANopen 传感器的波特率可以通过 SDO 报文在线修改,不用拆机。这里以德敏哲 CANopen 磁致伸缩位移传感器为例,说明把波特率从 500kbps 改成 1000kbps 的完整过程。改完需要断电重启才能生效。


改之前先确认两件事
传感器当前的 node-id 是 0x7F,波特率是 500kbps,目标是把波特率改为 1000kbps。
两条 SDO:先改运行值,再写 eeprom
- 第 1 条 SDO 写入新波特率:索引
0x2010,子索引0x00,数据为新波特率值 1000,即0x03 E8。 - 第 2 条 SDO 存入 eeprom:索引
0x1010,子索引0x01,数据为0x73 61 76 65(即 ASCII 的 save)。不执行这一步,断电后新波特率会丢失。
逐帧对照
| 序号 | 发送者 | cob-id | dlc | data | 说明 |
|---|---|---|---|---|---|
| 1 | 控制器 | 0x67F(=0x600+node-id) | 8 | 0x2F 10 20 00 E8 03 00 00 | 向节点 0x7F 发出 SDO,数据 E8 03(低字节先行) |
| 2 | 传感器 | 0x5FF(=0x580+node-id) | 8 | 0x2F 10 20 00 00 00 00 00 | 节点 0x7F 回应 SDO。新波特率尚未生效,也未存储 |
| 3 | 控制器 | 0x67F(=0x600+node-id) | 8 | 0x2F 10 10 01 73 61 76 65 | 发出 SDO,把波特率存入 eeprom |
| 4 | 传感器 | 0x5FF(=0x580+node-id) | 8 | 0x60 10 10 01 00 00 00 00 | 回应 SDO,存储完成 |
控制器发送用的 cob-id = 0x600 + 传感器 node-id,传感器回应用的 cob-id = 0x580 + 传感器 node-id。两条 SDO 的数据都是低字节先行。
断电重启才生效
关闭传感器电源再重新上电,传感器会从 eeprom 中取出新波特率(1000kbps),并以此设定进行通讯。同时,控制器的 CAN 通讯设置必须和传感器保持一致,否则两边谈不起来。
可选波特率对照
| 波特率 | 十六进制 | SDO 指令(数据低字节先行) |
|---|---|---|
| 1000 kbps | 0x03 E8 | 2F 10 20 00 E8 03 00 00 |
| 500 kbps | 0x01 F4 | 2F 10 20 00 F4 01 00 00 |
| 250 kbps | 0x00 FA | 2F 10 20 00 FA 00 00 00 |
| 125 kbps | 0x00 7D | 2F 10 20 00 7D 00 00 00 |
只能使用表内列出的数值,填入表外数值会让传感器出现故障。
这台传感器的地址不是 0x7F 时
传感器如果是别的 node-id,改速率时把第 1 条与第 3 条 SDO 的 cob-id 一并换算成 0x600 加上这台传感器的实际 node-id 即可,数据段内容不用动。
手头没有 node-id 记录也不用拆机:给传感器断电再加电,上电瞬间它会主动送出一帧 EMCY 引导报文,拿这帧的 cob-id 减掉 0x80,差值就是它的 node-id。
相关问题另按安装、信号、干扰、通讯四类做了归类,可对照排查:位移传感器常见问题解答。
常见问题
CANopen 传感器怎么改波特率?
用两条 SDO:第 1 条写索引 0x2010、子索引 0x00,数据为新波特率值;第 2 条写索引 0x1010、子索引 0x01,数据为 0x73 61 76 65(save)存入 eeprom。不执行第 2 步,断电后新波特率会丢失。
CANopen 改波特率后要重启吗?
要。关闭传感器电源再重新上电,传感器会从 eeprom 中取出新波特率并以此设定进行通讯。同时控制器的 CAN 通讯设置必须和传感器保持一致,否则两边谈不起来。
CANopen 各档波特率的 SDO 指令是什么?
1000 kbps 写入值 0x03E8,指令 2F 10 20 00 E8 03 00 00;500 kbps 为 0x01F4,指令 2F 10 20 00 F4 01 00 00;250 kbps 为 0x00FA,指令 2F 10 20 00 FA 00 00 00;125 kbps 为 0x007D,指令 2F 10 20 00 7D 00 00 00。只能使用这几档数值,填入表外数值会让传感器出现故障。
CANopen SDO 的数据字节顺序是什么?
两条 SDO 的数据段都按低字节在前的顺序排列。以 1000 为例,写成十六进制是 0x03E8,填入数据段时低字节在前,所以 1000 kbps 那条指令就是 2F 10 20 00 E8 03 00 00;同样 500 kbps 是 0x01F4,写作 F4 01。存储命令的 0x73 61 76 65 按字符逐个填入,不涉及字节序换算。
换了一台 node-id 不同的传感器怎么改波特率?
把第 1 条与第 2 条 SDO 的 cob-id 一并换算成 0x600 加上这台传感器的实际 node-id 即可,数据段内容不用动。手头没有 node-id 记录也不用拆机:给传感器断电再加电,上电瞬间它会主动送出一帧 EMCY 引导报文,拿这帧的 cob-id 减掉 0x80,差值就是它的 node-id。

