PDO 是什么: PDO(Process Data Object,过程数据对象)是 CANopen/CiA‑402 用于实时传输小量数据(最多 8 字节)的报文,几乎无协议开销,适合周期/事件驱动的控制与反馈。与之相对,SDO 用于配置与参数下载,非实时。
PDO 简单说就是 SDO 的映射
| 对象 | 比喻 | 用途 |
|---|---|---|
| SDO | 客户服务柜台 | 配置参数,读写对象字典,准确但慢 |
| PDO | 大喇叭广播 | 实时数据,传输位置/速度,快但无确认 |
| NMT | 系统管理员 | 控制网络,启动/停止/复位设备 |
| SYNC | 节拍器 | 同步动作,让所有设备步调一致 |
| EMCY | 急救警报 | 报告故障,设备主动上报严重错误 |
实时数据用 PDO. 需要快速交换的
PDO 分为 RPDO和TPDO 通道与索引区间
RPDO(主站发给驱动):通信参数在 0x1400..0x1403,映射在 0x1600..0x1603
TPDO(驱动发给主站):通信参数在 0x1800..0x1803,映射在 0x1A00..0x1A03
NrOfRXPDO=4
NrOfTXPDO=4
这是是 YIyou 的, 支持4路,一般也是支持4路,本质上 PDO 几路功能都一样。只是优先级不一样导致的使用方式不一样
工程惯例(为了优先级/实时性分工,非必须):
RPDO1(最高优先级):0x6040 控制字(可加 0x6060 模式)
RPDO2(主设定量):0x607A/60FF/6071 等(同步=1 常见)
RPDO3(偏置/辅助):0x60B2/60B1/60B0、轮廓参数微调
RPDO4(低频/自定义):回零参数、限位等(很多场景用 SDO 更合适)
RPDO(主站→从站)
TPDO(从站→主站)
TPDO1: 0x180 + NodeID(通信参数 0x1800,映射 0x1A00)
TPDO2: 0x280 + NodeID(通信参数 0x1801,映射 0x1A01)
TPDO3: 0x380 + NodeID(通信参数 0x1802,映射 0x1A02)
TPDO4: 0x480 + NodeID(通信参数 0x1803,映射 0x1A03)
这个时候我们就需要发送PDO了。
CAN 标识符(COB‑ID)
DLC(0..8)
Data[0..DLC‑1]
CAN-ID 他等于你选择的通道地址 + NodeID
DLC 游戏扩展包。 哈哈哈哈,Data Length Code 表示该 CAN 帧携带的数据字节数, 最多8个字节
Data 就是“映射对象的值”按顺序小端拼起来
之前讲 SDO 的时候大概讲了一下 SDO => PDO 怎么对应。这里就不赘述了
1 | cansend can0 205#0F0008 |
需要自己用的是这里都是用小端传的。
DLC 也需要注意下,我这里是cansend,他自己处理了,其实本质上如果自己去实现也是需要传的。
这些其实是需要SDO来做配置或者做映射的. 在SDO那里大概说了下
先说一下流程
| PDO 编号 | Communication Parameter Index | Mapping Parameter Index |
|---|---|---|
| RPDO1 | 0x1400 | 0x1600 |
| RPDO2 | 0x1401 | 0x1601 |
| RPDO3 | 0x1402 | 0x1602 |
| RPDO4 | 0x1403 | 0x1603 |
首先先禁用
1 | cansend can0 605#2300140105020080 # 0x1400:1 = 0x80000205 |
Bit 31 = 0 表示启用,1表示禁用 , 然后 205 表示 CAN-ID
1 | 禁用 TPDO1 |