比如说ethercat,他是一个环形的结构,根据从站顺序,然后一个一个交换数据。
但是 can 电机他不是这样。
CAN 的优先级仲裁 + CANopen 的 COB-ID(Communication Object Identifier)规则
这是整个的核心机制
电平分为 显性位(dominant, 0) 和 隐性位(recessive, 1)
如果总线上同时出现 0 和 1,最终表现是 0 占优(dominant wins)
发送节点的 CAN 控制器根据它要发送的报文标识符(COB-ID)和数据帧位,决定这一位是0(显性)还是1(隐性)
也就是说
| 节点1 (bit) | 节点2 (bit) | 节点5 (bit) | 总线电平 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 |
| 0 | 0 | - | 0 |
| 0 | 1 | - | 0 |
| 1 | - | - | 1 |
谁是 0 谁优先。其他的就等待。下一轮.
什么是 COB-ID(Communication Object Identifier)规则
理论上电机出厂就有设置,你也可以修改
| 通信对象类型 | COB-ID 起始值 (十六进制) | 组成 | 说明 | 优先级说明 |
|---|---|---|---|---|
| NMT (网络管理) | 0x000 | 固定值 0x000 | 网络管理消息,控制节点状态 | 最高优先级 |
| SYNC (同步消息) | 0x080 | 固定值 0x080 | 同步信号 | 非常高优先级 |
| EMCY (紧急消息) | 0x080 + 节点ID | 0x080 + 节点ID | 紧急错误消息 | 高优先级 |
| TPDO1 (发送PDO1) | 0x180 + 节点ID | 0x180 + 节点ID | 第1发送PDO | 中等偏高优先级 |
| TPDO2 | 0x280 + 节点ID | 0x280 + 节点ID | 第2发送PDO | 中等优先级 |
| TPDO3 | 0x380 + 节点ID | 0x380 + 节点ID | 第3发送PDO | 中等偏低优先级 |
| TPDO4 | 0x480 + 节点ID | 0x480 + 节点ID | 第4发送PDO | 较低优先级 |
| RPDO1 (接收PDO1) | 0x200 + 节点ID | 0x200 + 节点ID | 第1接收PDO | 低优先级 |
| RPDO2 | 0x300 + 节点ID | 0x300 + 节点ID | 第2接收PDO | 更低优先级 |
| RPDO3 | 0x400 + 节点ID | 0x400 + 节点ID | 第3接收PDO | 较低优先级 |
| RPDO4 | 0x500 + 节点ID | 0x500 + 节点ID | 第4接收PDO | 更低优先级 |
| SDO 服务器响应 | 0x580 + 节点ID | 0x580 + 节点ID | 从设备响应SDO请求 | 高优先级 |
| SDO 客户端请求 | 0x600 + 节点ID | 0x600 + 节点ID | 主设备发送SDO请求 | 中等优先级 |
| HeartBeat (心跳) | 0x700 + 节点ID | 0x700 + 节点ID | 定期心跳消息 | 低优先级 |
记住越小优先级越高.
每种不同的请求,他的优先级都是不一样的。
就是有些机器很重要,比如机器人某个重要关节,你需要重点照顾。
这个时候就需要自己去通过 SDO 去修改 COB-ID 了
然后通过他去影响显性和隐性
这个其实是最关键的。
其实源于他们接线的不一样。
因为 canopen 这种双绞线,你可以理解为一根线,他们是共享电平的。一条共享的差分总线
所以 canopen 的 controller 和 电机(从站) 其实每次都是广播。
在这种广播的机制下,就不可能采用 ethercat 这种进,出的循环,就需要有一个机制去决定优先级。
CANopen之LSS Node-ID节点管理_canopen lss-CSDN博客
这个玩起来比较麻烦,我后续跟厂商联系下,在学习下。
现在无非3种方式.
LSS. 最有用但是也最麻烦
一个一个上电,这个只能保证不冲突,但是如果你想设置某一个优先级高,很不确定。
通过厂商的软件解决。