[CANopen]理清PDO映射

CANopen中发送/接收的数据称之为过程数据(PDO)。这里以发送为例,理清其中的映射关系。

配置

发送使用TPDOx,可以使用TPDOx如下:

项目通讯参数-字典Index映射参数-字典Index
TPDO10x18000x1A00
TPDO20x18010x1A01
TPDO30x18020x1A02
TPDO40x18030x1A03

使用首先就得配置TPDOx,其中通讯参数决定“怎么发送数据”,其定义及其作用如下:

typedef struct{
               UNSIGNED8      maxSubIndex;/*子索引数量=6*/                                
               UNSIGNED32     COB_IDUsedByTPDO;/*其实是Function Code(COB-ID = Funcode+NodeID)*/  
               UNSIGNED8      transmissionType;/*发送类型:SYNC触发(同步)、周期发送(异步)、远程请求、特定*/  
               UNSIGNED16     inhibitTime;/*X*100us 间隔时间;0-禁止功能*/  
               UNSIGNED8      compatibilityEntry;/*not used*/  
               UNSIGNED16     eventTimer;/*X*1ms 周期发送间隔;0-禁止功能*/  
               UNSIGNED8      SYNCStartValue;/*SYNC报文起始值*/  
               }OD_TPDOCommunicationParameter_t;

映射参数决定了“发送什么数据”,其定义及其作用如下:

typedef struct{
               UNSIGNED8      numberOfMappedObjects;/*实际使用几个映射*/  
               UNSIGNED32     mappedObject1;
               UNSIGNED32     mappedObject2;
               UNSIGNED32     mappedObject3;
               UNSIGNED32     mappedObject4;
               UNSIGNED32     mappedObject5;
               UNSIGNED32     mappedObject6;
               UNSIGNED32     mappedObject7;
               UNSIGNED32     mappedObject8;
               } OD_TPDOMappingParameter_t;

举例

TPDO1,对通讯参数Index=0x1800,映射参数Index=0x1A00进行配置:
在这里插入图片描述
“怎么发送数据”:发送的COD-ID =0x180+NodeID;采用周期发送(异步)的方式,周期为32ms。
在这里插入图片描述
“发送什么数据”:字典Index为0x6000,subIndex为0,数据长度为0x20(32)bits/4字节的位置上的数据。再加上字典Index为0x6100,subIndex为0,数据长度为0x20(32)bits/4字节的位置上的数据。刚好8字节填满了整个数据帧。

### CANopen 协议中 PDO 的使用说明 PDO (Process Data Object) 是 CANopen 中用于实时数据交换的重要机制。通过 TPDO 和 RPDO 对象,可以高效地实现节点间的数据传输。 #### 创建和配置 TPDO/RPDOCANopen 设备中,TPDO 负责发送数据给其他节点,而 RPDO 则负责接收来自其他节点的数据[^2]。为了使这些对象正常工作,需完成如下设置: - **COB-ID 配置**: COB-ID 定义了消息的优先级以及源/目标地址。对于 TPDO 来说,通常会包含本地节点 ID;而对于 RPDO,则应指向远程节点 ID。 - **映射参数至 PDO 数据域**: 将实际应用层变量映射到特定 PDO 报文中指定的位置。这一步骤决定了哪些内部寄存器或内存位置会被读取或写入。 ```c // 假设我们有一个温度传感器连接到了 CANopen 网络上, // 并希望将其测量值作为 TPDO 发送出去。 uint16_t temperature; // 存储测得的温度值 // 映射该变量到某个预定义好的 TPDO 结构体字段内 pdo_entry_mapping(0x607A, &temperature); // 0x607A 表示 PDO 映射表索引号 ``` #### 同步与触发条件设定 除了静态配置外,还需要考虑何时触发 PDO 更新操作。常见的策略有周期性和事件驱动两种方式: - **周期性更新**:适用于需要定期报告状态的应用场景; - **事件驱动模式**:当监测到某些变化时立即通知对方,比如开关动作、阈值跨越等情况。 ```python import canopen network = canopen.Network() node = network.add_node(node_id=5) # 设置为事件触发型 TPDO node.tpdo[1].trans_type = 'event' node.tpdo[1].inhibit_time = 0.1 # 最短重发间隔时间(s) node.tpdo[1].add_event_timer() # 开启定时检测功能 ``` #### 实际案例分析 假设在一个工业自动化环境中存在多个电机控制器相互协作完成任务。此时可以通过 LabVIEW 或者 Python 库来简化编程流程并提高开发效率。利用上述提到的方法论,在各台机器之间建立稳定可靠的通信链路就变得轻而易举了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值