CANopen中发送/接收的数据称之为过程数据(PDO)。这里以发送为例,理清其中的映射关系。
配置
发送使用TPDOx,可以使用TPDOx如下:
项目 | 通讯参数-字典Index | 映射参数-字典Index |
---|---|---|
TPDO1 | 0x1800 | 0x1A00 |
TPDO2 | 0x1801 | 0x1A01 |
TPDO3 | 0x1802 | 0x1A02 |
TPDO4 | 0x1803 | 0x1A03 |
使用首先就得配置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字节填满了整个数据帧。