CAN笔记(20) 过程数据对象
1. 过程数据对象
在 CAN笔记(17) 预定义报文ID 提及到:
过程数据对象 PDO 属于过程数据用来传输实时数据
即 单向传输,无需接收节点回应CAN 报文来确认
从通讯术语上来说是属于“生产消费”模型 PDO
其中数据长度被限制为 1~8 字节
最多只要 1 帧就可以把一条信息或者一个变量传递结束
就像食品销售柜台, 生产者摆出“食品”,“食品”有限制大小
但只有“需要” 的消费者才会来买, 没有指向性
2. CAN-ID定义
PDO 通信比较灵活
广义上只要符合 PDO 范围内的所有 CAN-ID 都可以作为节点自身的 TPDO 或者 RPDO 使用
也称为 COB-ID,但不受功能码和 Node-ID 限制
而在 PDO 预定义中
人为规定了 TPDO 和 RPDO,规定了 Node-ID 在 PDO 中的位置,规定了 PDO 的编号:
PDO 分为 TPDO(发送PDO)和 RPDO(接收PDO)
发送和接收是以 CANopen 节点自身为参考(如果 CAN 主站或者其他从站就相反)
TPDO 和 RPDO 分别有 4 个数据对象,每种数据对象就是 1 条 CAN 报文封装
这些都是数据收发的容器
筐为使用者准备好,就看使用者在里面放什么东西了
当然,如果某个节点需要传递的资源特别多
则有出现例如 TPDO5 之类的数据对象
而它们的 CAN-ID 定义就需要打破预定义的规则
3. 传输形式
PDO 的两种传输方式:同步传输和异步传输
- 异步传输:由特定事件触发
其触发方式可有两种:
第一种是由设备子协议中规定的对象特定事件来触发(例如,定时传输,数据变化传输等)
第二种是通过发送与 PDO 的 COB-ID 相同的远程帧来触发 PDO的发送
目前应用中的异步传输基本都采用第一种 - 同步传输:通过接收同步对象实现同步
同步传输就是通过同步报文让所有节点能在同一时刻进行上传数据或者执行下达的应用指令
可以有效避免异步传输导致的应用逻辑混乱和总线负载不平衡的问题
一般发送同步报文的节点是 NMT 主机
同步传输又可分为
- 周期传输(循环)
通过接收同步对象(SYNC)来实现,可以设置 1~240 个同步对象触发 - 非周期传输(无循环)
由远程帧预触发或者由设备子协议中规定的对象特定事件预触发传送
4. 通信参数
PDO 通信参数,定义了该设备所使用的 COB-ID、传输类型、定时周期 等
RPDO 通讯参数位于 对象字典索引 的 1400h ~ 15FFh
TPDO 通讯参数位于 对象字典索引 的 1800h ~ 19FFh
每条索引代表一个 PDO 的通信参数集,其中的子索引分别指向具体的各种参数:
-
Number of entries 参数条目数量:
即 本索引中有几条参数 -
COB-ID:
即这个 PDO 发出或者接收的对应 CAN 帧 ID -
发送类型:
即这个 PDO 发送或者接收的传输形式,通常使用 循环同步 和 异步制造商特定事件 较多 -
Inhibit time 生产禁止约束时间(1/10ms):
约束 PDO 发送的最小间隔,避免导致总线负载剧烈增加
比如数字量输入过快,导致状态改变发送的 TPDO 频繁发送,总线负载加大
所以需要一个约束时间来进行“滤波”,这个时间单位为 0.1ms -
Event timer 事件定时器触发的时间(单位 ms):
定时发送的 PDO,它的定时时间
如果这个时间为 0,则这个 PDO 为事件改变发送 -
SYNC start value 同步起始值:
同步传输的 PDO,收到诺干个同步包后,才进行发送,这个同步起始值就是同步包数量
比如设置为 2,即收到 2 个同步包后才进行发送
5. 映射参数
PDO 映射参数是一个难点, 它包含了一个对象字典中的对象列表
这些对象映射到相应的 PDO,其中包括数据的长度(单位,位)
对于生产者和消费者都必须要知道这个映射参数,才能够正确的解释 PDO 内容
就是将通信参数、应用数据和具体 CAN 报文中数据联系起来
RPDO 通讯参数 1400h ~ 15FFh, 映射参数 1600h ~ 17FFh, 数据存放为 2000h 之后厂商自定义区域
TPDO 通讯参数 1800h ~ 19FFh, 映射参数 1A00h ~ 1BFFh, 数据存放为 2000h 之后厂商自定义区域
为了更加直观地表现映射
模拟 TPDO1,将参数、应用数据、 CAN 报文数据联合起来展示,不同的映射采用不同的颜色:
通过在对象字典索引通讯参数配置数据长度、CAN-ID和发送类型等,然后通过映射参数找到需要发送的数据值
参考:
相关推荐:
CAN笔记(19) 网络管理
CAN笔记(18) 对象字典
CAN笔记(17) 预定义报文ID
CAN笔记(16) CANOpen简介
CAN笔记(15) STM32-M4 CAN通讯
谢谢!