CANopen 传感器的“CAN 事件计时器”决定了它多久上报一次数据,默认是 1ms。对刷新率要求没那么高的场合,把这个周期放长可以降低总线负载。这里以德敏哲 194 系列 CANopen 磁致伸缩位移传感器为例,说明把事件计时器从 1ms 改为 50ms 的完整过程。

本次改动的起点与目标
传感器 node-id 为 0x7F(十进制 127,工厂设置),目标是把 CAN 事件计时器由默认的 1ms 改为 50ms。
先改运行值,再落 eeprom
- 第 1 条 SDO 写入新周期:索引
0x1800,子索引0x05,数据为0x32(十进制 50)。 - 第 2 条 SDO 存入 eeprom:索引
0x1010,子索引0x01,数据为0x73 61 76 65(ASCII 的 save)。不执行这一步,传感器掉电后事件计时器会回到更改前的设置。
报文全文
| 序号 | 发送者 | cob-id | dlc | data | 说明 |
|---|---|---|---|---|---|
| 1 | 控制器 | 0x67F(=0x600+node-id) | 8 | 0x2F 00 18 05 32 00 00 00 | 向节点 0x7F 发出 SDO,数据 0x32(十进制 50),即 50ms |
| 2 | 传感器 | 0x5FF(=0x580+node-id) | 8 | 0x60 00 18 05 00 00 00 00 | 节点 0x7F 的事件计时器已更改,向控制器回应 SDO |
| 3 | 控制器 | 0x67F(=0x600+node-id) | 8 | 0x23 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;传感器回答的那一帧用 0x580 叠加同一个 node-id。两帧的数据段都按低字节在前排列。
生效与掉电
第 1 条 SDO 完成后,事件计时器立即生效,但还没有写入 eeprom。这个状态下如果传感器掉电,重新上电后事件计时器会恢复成更改前的设置。只有执行完第 2 条 SDO,变更才会长期保留。
这台传感器已改过地址时
如果这台传感器之前被改过地址,把两条报文里的 cob-id 换成 0x600 加上它的现有 node-id 就行,其余字节原样保留。
不确定它当前的地址,可让传感器断电后重新上电,它会先发一帧 EMCY 引导报文,用该帧 cob-id 减去 0x80 就能反推出 node-id。
我们在问答页里按现象把同类问题排在了一起,方便逐条比对:位移传感器常见问题解答。
常见问题
CANopen 的 CAN 事件计时器是什么?
它决定传感器多久上报一次数据,默认是 1ms。对刷新率要求没那么高的场合,把这个周期放长可以降低总线负载。
CANopen 事件计时器怎么从 1ms 改成 50ms?
第 1 条 SDO 写索引 0x1800、子索引 0x05,数据为 0x32(十进制 50);第 2 条 SDO 写索引 0x1010、子索引 0x01,数据为 0x73 61 76 65 存入 eeprom。
CANopen 事件计时器改完为什么掉电就丢?
第 1 条 SDO 完成后事件计时器立即生效,但还没有写入 eeprom。这个状态下如果传感器掉电,重新上电后事件计时器会恢复成更改前的设置。只有执行完第 2 条 SDO,变更才会长期保留。
CANopen 事件计时器的报文是什么?
控制器发 0x67F 数据 0x2F 00 18 05 32 00 00 00,传感器回 0x5FF 数据 0x60 00 18 05 00 00 00 00;随后控制器发 0x67F 数据 0x23 10 10 01 73 61 76 65 存储,传感器回 0x5FF 数据 0x60 10 10 01 00 00 00 00。两帧的数据段都按低字节在前排列。
CANopen 传感器改过地址后事件计时器怎么改?
把两条报文里的 cob-id 换成 0x600 加上它的现有 node-id 就行,其余字节原样保留。不确定它当前的地址,可让传感器断电后重新上电,它会先发一帧 EMCY 引导报文,用该帧 cob-id 减去 0x80 就能反推出 node-id。

