- 什么是CANopen?
CANopen是一个基于CAN总线的“高层协议”,这意味着CAN总线(ISO 11898)就像集装箱的卡车一般作为CANopen信息的“运输工具”。 CAN只是实现了带有11位CAN ID、远程传输(RTR)位和64个数据位(与更高层的协议相关)的字段的帧的传输。CAN总线在CANopen中的作用与在J1939协议相同。而CANopen则实现了OSI模型的第七层,并能够适应除CAN以外的其他数据链路层协议。
- CANopen 设备结构
下图为 CANopen 设备结构。 CANopen 协议通常分为用户应用层、对象字典以及通信三个部分。其中最为核心的是对象字典,描述了应用对象和 CANopen 报文之间的关系。CANopen 通信其定义了 CANopen 协议通信规则以及与 CAN 控制器驱动之间对应关系。用户应用层是用户根据实际的需求编写的应用对象,
3.对象字典 OD
所谓的对象字典就是一个有序的对象组, 描述了对应 CANopen 节点和它的网络行为的所有参数。每个对象采用一个 16 位的索引值来寻址,为了避免数据大量时无索引可分配,所以在某些索引下也定义了一个 8 位子索引值。对象字典索引区域定义如下:
4.CANopen报文
CANOpen协议报文分类:
NMT 网络管理报文,作用是管理网络,切换节点的状态。一般由主站发送NMT网络管理报文。
SDO 服务数据对象报文,作用是设置设备参数,或者是一些关键数据的传输。一般由主站发起SDO报文,从站应答SDO报文。从站也可以发起SDO,主站响应,比如关键数据的传输。
PDO 过程数据对象报文,作用是传输一些设备的过程数据,比如传输温度,速度等等。主站和从站都会发送。
EMCY 紧急报文,作用是传输设备的故障信息。主站和从站都会发送。
SYNC 同步报文,作用是同步数据,用来同步从站的TPDO数据。一般由主站发送。比如从站的TPDO传输类型是在同步模式下,当从站收到设定次数的SYNC报文后,从站会发送TPDO。这个在后续的文章中详细阐述。
NODE GUARDING 节点保护报文,作用是主站请求从站的状态,主站询问,从站应答。这种模式逐渐已被淘汰,因为太占CAN总线网络带宽。
HeartBeat 心跳报文,作用是设备主动发送心跳,表示自己在线。主站和从站都可以发送。
我们今天主要讨论网络管理报文、SDO报文、心跳包文.
CANopen 预定义了强制性的缺省标识符(CAN-ID)分配表。 将11位 帧ID其划分为 4 位的功能码(Function-ID) 和 7 位的节点号(Node-ID)。如下图所示
4.1 NWT网络管理
canopen从机由主机进行网络管理,NMT 管理涉及到一个 CANopen 节点从上电开始的 6 钟状态,状态转换如下图所示.,包括初始化,硬复位,软复位,预操作状态,操作状态,停止状态.
网络管理系统(NMT)负责初始化、启动及停止网络和网络中的设备,属于主从系统。
CANopen网络中有且只有一个NMT主机,可配置包括本身在内的CANopen网络。CANopen按照协议规定的状态机执行相应工作。其中,部分为内部自动转换,部分必须由NMT主机发送NMT报文实现转换,状态机转换具体如下图
NMT报文格式 |
COB ID= 0,即function code,nodeid都为o |
DLC,2,两个字节数据 |
Data0,状态命令数据;Data1,要操作NodeID |
心跳报文,实时发送设备的状态.
SDO报文:
- 加速SDO报文(Expedited SDO)
| |||||||
| |||||||
SDO Function Code | |
SDO TX | 1011b |
SDO RX | 1100b |
- Segment SDO报文
segment SDO传输,可以传输大于4个字节的数据,需要多条指令传输进行读写,可以将指令分为启动指令和segment传输指令.
segment SDO启动指令读写Controlbye说明:
segment sdo初始化读写指令的Data0,CmdByte每一位定义如下:
分段传输数据段8个字节中,data0为控制字节,data1~data7为数据字节,每次最多传输7个字节,控制字节定义如下:
以下示例,向地址0x3051:00写入18个字节数据
向地址0x3051:00读取18个字节数据,“Segmented-transfer”