CANopenNode 简介
CANopenNode 是一个开源的免费的开源 CANopen 协议栈。
- 对象字典为任何变量提供清晰灵活的组织。可以直接或通过读/写函数访问变量。
- NMT从设备启动、停止、复位设备 。
- 监控 CANopen 设备的心跳生产者/消费者错误控制。
- 对象字典中的变量可以动态映射到 TPDO,然后根据通信规则进行传输。传输的数据被其他设备当作 RPDO 进行接收。
- SDO服务器支持对 CANopen 设备内所有对象字典变量的快速、分段和块传输访问。
- SDO客户端可以访问网络内任何 CANopen 设备上的任何对象字典变量。
- 紧急报文生产者/消费者。
- 同步生产者/消费者,启用 PDO 对象的网络同步传输。
- 时间戳生产者/消费者,以毫秒分辨率实现日期和时间同步。
- LSS CANopen 节点ID和比特率设置、主站和从站、LSS 快速扫描。
- CANopen 网关,CiA309-3 NMT 主站、LSS 主站和 SDO 客户端的 ASCII 命令接口。
- CANopen Safety、EN 50325-5、CiA304、安全相关网络中的“类 PDO”通信。
CANopenNode 主栈
- CANopenNode 通常作为从设备的协议栈使用,也可以作为主栈使用。
- 在CANopen协议中,我们常用的功能是SDO和PDO,其中SDO分为服务器和客户端两种角色,而PDO是没有主从之分的。
SDO Client
- 在 CANopenNode 中包含了SDO Client的功能,当需要作为主栈使用时,可通过修改配置中的 CO_CONFIG_SDO_CLI 开启 SDO Client 功能,通过相应的函数即可读写从设备的任意对象。
PDO 通讯参数
无论是作为从设备还是主设备使用,接受数据都是使用RPDO,发送使用TPDO。
RPDO 通讯参数
typedef struct{
UNSIGNED8 maxSubIndex;
UNSIGNED32 COB_IDUsedByRPDO;
UNSIGNED8 transmissionType;
}OD_RPDOCommunicationParameter_t;
- 在RPDO中只使用了前2个通讯参数
- maxSubIndex
- 该变量此处为2,三个子索引对应的含义如下
- 0 maxSubIndex
- 1 COB-ID
- 2 transmissionType
- COB_IDUsedByRPDO
- transmissionType
- 当值小于等于240时接收方式为同步接收,即产生特定个同步对象之后该RPDO才会处理接收到的数据。其他时候即使收到对应的RPDO也不会处理。
- 每一个对象即代表一个RPDO,单个RPDO可以映射的最大长度为8字节
- 作为主栈使用时,主栈的RPDO所使用的 COB-ID 与从栈的 TPDO 一致
- 主栈的传输类型通常为 254,采用异步接收方式处理 RPDO
RPDO 通信参数设置实例
- 图中包含一个主节点和4个从节点
- 从节点的 NODE-ID 分别为1,2,3,4
- 每一个节点都包含了一个TPDO,其TPDO所用COB_ID为 0x180 + NODE-ID
- 主节点的 RPDO 与从节点的 TPDO 之间,传输类型和 COB_ID 配置相同。
- 主节点配置的 RPDO,对应的节点会添加到过滤器设置中,从而允许该报文被接收处理。
- 当主节点中查找找到对应的 RPDO 之后,再根据 RPDO 中的映射参数将数据复制到对象字典中。
TPDO 通讯参数
typedef struct{
UNSIGNED8 maxSubIndex;
UNSIGNED32 COB_IDUsedByTPDO;
UNSIGNED8 transmissionType;
UNSIGNED16 inhibitTime;
UNSIGNED8 compatibilityEntry;
UNSIGNED16 eventTimer;
UNSIGNED8 SYNCStartValue;
}OD_TPDOCommunicationParameter_t;
- RPDO 通讯参数只使用了前面2个,而TPDO中除了COB_ID和传输类型之外,还需要设置 inhibitTime、eventTimer 和 SYNCStartValue。
- 主设备中的 TPDO 所使用的 COB-ID 应与从设备中的 RPDO 一致,传输类型也需要保持相同。
TPDO 通信参数设置实例
PDO 映射参数
typedef struct {
UNSIGNED8 numberOfMappedObjects;
UNSIGNED32 mappedObject1;
UNSIGNED32 mappedObject2;
UNSIGNED32 mappedObject3;
UNSIGNED32 mappedObject4;
UNSIGNED32 mappedObject5;
UNSIGNED32 mappedObject6;
UNSIGNED32 mappedObject7;
UNSIGNED32 mappedObject8;
} OD_RPDOMappingParameter_t;
- 映射参数的用于描述一个 PDO 中的数据与本地对象字典中对象之间的映射关系
- TPDO 将对象字典中的对象映射到 TPDO 后,通过触发 TPDO 传输,可将对象字典中的数据按照映射的格式发送出去。
- RPDO 将对象字典中的对象映射到 RPDO 后,在接收到RPDO数据时,会将接收到的数据更新到对象字典中。
- 下面是各参数的含义:
- numberOfMappedObjects
- mappedObject1 ~ mappedObject8
- 对应一个映射项
- bit31-bit16 索引
- bit15-bit8 子索引
- bit7-bit0 数据长度,其单位为bit,在CANopenNode中,该值必须是 8 的整数,即以字节为基本单位
RPDO 映射参数设置实例
- 假设需要将从设备如下几个对象映射到 TPDO中,从设备TPDO使用的 COB-ID为 0x181 :
index | sub-index | len (byte) |
---|
0x2001 | 0x00 | 0x1 |
0x2002 | 0x00 | 0x1 |
0x2004 | 0x00 | 0x1 |
0x2008 | 0x00 | 0x1 |
| byte0 | byte1 | byte2 | byte3 |
---|
TPDO1 | 0x2001-0x00 | 0x2002-0x00 | 0x2004-0x00 | 0x2008-0x00 |
- 而主设备除了通讯参数与从设备一致,其映射关系与从设备无关,是由主设备自身决定的,例如可将从设备通过TPDO发出的数据映射到下面几个对象中:
index | sub-index | len (byte) |
---|
0x2008 | 0x00 | 0x1 |
0x2009 | 0x00 | 0x1 |
0x200a | 0x00 | 0x1 |
0x200b | 0x00 | 0x1 |
- 当主设备接收到 ID 为 0x181 的数据帧后,便会根据 RPDO 的映射关系,将4字节的数据拷贝到映射的对象中去。
TPDO 映射参数设置实例
- 假设需要将从设备如下几个对象映射到 RPDO中,从设备RPDO使用的 COB-ID为 0x201 :
index | sub-index | len (byte) |
---|
0x2001 | 0x00 | 0x1 |
0x2002 | 0x00 | 0x1 |
0x2004 | 0x00 | 0x1 |
0x2008 | 0x00 | 0x1 |
| byte0 | byte1 | byte2 | byte3 |
---|
TPDO1 | 0x2001-0x00 | 0x2002-0x00 | 0x2004-0x00 | 0x2008-0x00 |
- 而主设备除了通讯参数与从设备一致,其映射关系与从设备无关,是由主设备自身决定的,例如可将需要发送给从设备的数据映射到下面几个对象中:
index | sub-index | len (byte) |
---|
0x2008 | 0x00 | 0x1 |
0x2009 | 0x00 | 0x1 |
0x200a | 0x00 | 0x1 |
0x200b | 0x00 | 0x1 |
- 当主设备触发相应的事件之后,便会将数据从对象字典中拷贝到TPDO中进行发送,从设备通过RPDO接收后,根据映射关系将数据拷贝到从设备的对象字典中。
所有评论(0)