1、CANOpen简介
CANopen协议是在20世纪90年代末,由总部位于德国纽伦堡的CiA组织——CAN-in-Automation,在 CAL(CAN Application Layer)的基础上发展而来。CiA 在 CANopen 基础协议——CiA 301 之上,对各个行业不断推出设备子协议,使 CANopen 协议在各个行业得到更快的发展与推广。所谓的子协议,就是针对不同行业的应用对象,对CANopen 内部的数据含义进行重新定义,或者添加新的控制逻辑。
2、CANOpen组成
CANOpen的报文中包含信息有COB-ID、Data,其中COB-ID包含了功能码及对象设备节点号(Node-ID)、Data会包含命令符(CS)、索引号(Index)、子索引号(Sub-Index)、写入数据或反馈数据。(报文传输采用 CAN 标准帧格式,即 11bit 的 ID 域,以尽量减小传输时间)
对象字典(Object Dictionary)是 CANopen 最重要的特性,每一个对象字典由 16 位的索引(Index)和 8 位的子索引(Sub Index)来寻址。设备状态可通过读对应的对 象字典来查找,也可以通过写操作控制类的对象字典进行控制。一个节点的对象字典 Index 范围在 0x1000 到 0x9FFF 之间,标准结构如下表所示:
Index(hex) | 内容 |
0001-001F | 静态数据类型(标准数据类型,如 Boolean,Integer 16) |
0020-003F | 复杂数据类型(预定义由简单类型组合成的结构如 PDOCommPar) |
0040-005F | 制造商定义的复杂数据类型 |
0060-007F | 设备子协议定义的静态数据类型 |
0080-009F | 设备子协议定义的复杂数据类型 |
1000-1FFF | 通讯子协议区域(如设备类型,错误寄存器,支持的 PDO 数量) |
2000-5FFF | 制造商指定数据区域 |
6000-9FFF | 标准设备子协议区域(例如“DSP-402 驱动和运动控制子协议”等) |
A000-BFFF | 标准接口子协议区域 |
3、功能
3.1、紧急报文协议(Emergency protocol)
当设备内部发生错误,设备上报内部错误代码,提示 NMT主站。紧急报文属于诊断性报文,其COB-ID存储在 1014h的索引中,一般会定义为080h +node-ID。
COB-ID | Data | |||||||
080h +node-ID | byte0 | byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 |
紧急事件错误代码 | 错误寄存器 | 厂家自定义故障代码 |
3.2、过程数据对象PDO(Process data object)
PDO 属于过程数据用来传输实时数据,即单向传输,无需接收节点回应CAN报文来确认。使用PDO需要设置通讯参数及映射参数:
3.2.1、通讯参数
Index | Sub-Index | 描述 | 数据类型 | 备注 |
RPDO: 1400-15FF TPDO: 1800-19FF | 00 | 该Index参数数量 | unsigned8 | 有效参数数量 |
01 | COB-ID | unsigned32 | 通讯指定COB-ID | |
02 | 发送类型 | unsigned8 | PDO触发形式 | |
00 非循环同步 | ||||
01 循环同步 | ||||
FC 远程同步 | ||||
FD 远程异步 | ||||
FE 异步,厂商特定事件 | ||||
FF 异步,设备子协议特定事件 | ||||
03 | 生产禁止约束时间,单位0.1ms | unsigned16 | 此时间间隔被不允许重复发送 | |
05 | 时间定时器触发时间间隔,单位1ms | unsigned16 | ||
06 | 同步起始值 | unsigned8 |
3.2.2、映射参数
Index | Sub-Index | 描述 | 数据类型 |
RPDO: 1600-17FF TPDO: 1A00-1BFF | 00 | 有效映射数量 | unsigned8 |
01 | 映射数据 | unsigned32 | |
02 | 映射数据 | unsigned32 | |
03 | 映射数据 | unsigned32 | |
** | 映射数据 | unsigned32 |
映射数据由映射的目标索引号、子索引号以及其数据类型,如要映射“设备节点号为1,索引1003的子索引02的数据,该数据为16位数据"到RPDO1的第一段数据则发送:
COB-ID | Data | |||||||
0x601 | 0x23 | 0x00 | 0x16 | 0x01 | 0x10 | 0x02 | 0x03 | 0x10 |
COB-ID | 写入命令符 | RPDO1-索引号1600 | 第一段数据 | 映射数据的数据类型-16位 | 映射数据的子索引-02 | 映射数据的索引-1003 |
索引号在数据帧是低位在前高位在后,映射数据的数据类型中8位对应发送“0x08”、16位对应发送“0x10”、32位对应发送“0x20”。
3.3、服务数据对象SDO(Service data object)
主要用来访问节点的对象字典,主站问,从站答。主 要用来在设备之间传输低优先级的对象,典型是对从设备进行配置、管理,比如模式配 置、PDO 配置等,类似于 Modbus 的一问一答体系。指令/应答结构如下:
COB-ID | byte0 | byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | |
CS | Index | Sub-Index | DATAs | ||||||
问 | 0x600+ Node-ID | 0x23 写32位 | data1 | data2 | data3 | data4 | |||
0x2B 写16位 | 0x00 | 0x00 | |||||||
0x2F 写8位 | 0x00 | ||||||||
0x40 读数据 | 0x00 | ||||||||
答 | 0x580+ Node-ID | 0x43 上报32位 | data1 | data2 | data3 | data4 | |||
0x43 上报32位 | 0x00 | 0x00 | |||||||
0x43 上报32位 | 0x00 | ||||||||
0x60 写入成功 | data2 | data3 | data4 | ||||||
0x80 写入错误 |
3.4、网络管理(NMT)
NMT(Network Management)管理报文用来实现 CANopen 网络中主节点对从节点监控和管理,如初始化、启动和停止节点,侦测失效节点。这种服务主要采用主从通 讯模式来实现,此消息不需要应答。只有主节点能够发送 NMT Modual Control 报文。信息格式如下:
COB-ID | byte0 | byte1 | |
0x00 | 命令字 | 0x01 节点置于可操作状态 | Node-ID |
0x02 节点置于停止状态 | |||
0x80 节点置于预操作状态 | |||
0x81 节点置于应用重置状态 | |||
0x82 节点置于通讯重置状态 |
3.5、心跳报文(Heartbeat)
心跳报文(Hearbeat)实现 CANopen 网络中主节点与从节点之间的通讯保持。心跳报文格式如下:
COB-ID | byte0 | |
0x700+Node-ID | 状态字 | 0x00 启动状态 |
0x04 停止状态 | ||
0x05 可操作状态 | ||
0x7F 预操作状态 |