前言
CAN通信广泛应用于汽车电子、电机控制等工业领域,最近在使用的电机驱动器支持CANopen协议,本文将对CANopen协议的基础知识进行分析总结,通过CANopen协议实现控制器与驱动器间的通信,并控制电机运动。
一、CANopen介绍
CANopen是一种架构在控制局域网路(Controller Area Network, CAN)上的高层通讯协定,包括通讯子协定及设备子协定常在嵌入式系统中使用,也是工业控制常用到的一种现场总线。
CANopen 实现了OSI模型中的网络层以上(包括网络层)的协定。CANopen 标准包括寻址方案、数个小的通讯子协定及由设备子协定所定义的应用层。 CANopen 支持网络管理、设备监控及节点间的通讯,其中包括一个简易的传输层,可处理资料的分段传送及其组合。一般而言数据链结层及物理层会用CAN来实现。除了 CANopen 外,也有其他的通讯协定(如EtherCAT)实现 CANopen 的设备子协定。
CANopen由非营利组织CiA(CAN in Automation)进行标准的起草及审核工作,基本的 CANopen 设备及通讯子协定定义在 CAN in Automation (CiA) draft standard 301中。针对个别设备的子协定以 CiA 301为基础再进行扩充。如针对 I/O 模组的 CiA401 及针对运动控制的 CiA402。
本文主要介绍的是Cia402协议,其在电机的运动控制方面有着广泛应用。
二、基本概念介绍
-
COB-ID
COB-ID是设备之间通过通信的CAN ID,每条报文中都具有COM-ID,其中不仅仅包含了设备ID,还可以表征报文类型。例如客户端发送SDO报文的COB-ID为0x601,其中0x600表征报文类型,0x01表示设备ID,0x600+0x01得到完整COB-ID。 -
对象字典
CANopen 设备都需要具备对象字典,用来设定设备组态及进行非即时的通讯。对象字典中每一个对象对应于一个16bit索引和8bit子索引(部分对象没有子索引,或者认为子索引为0),其属性包括是否可读以及是否可写,对象字典的长度可以是8bit、16bit和32bit。
对象字典可以类比STM32的寄存器,对象字典的索引对应寄存器地址,对象字典中的保存的数据就是驱动器的参数配置及状态,例如运动控制模式、当前位置、当前电流值等,可以通过写入对象字典对控制器的控制参数进行配置,也可以通过读取用户字典来获得当前驱动器的状态信息。 -
SDO通信
SDO,服务数据对象,用于读写其他节点的对象字典。在SDO通信中,发起数据的读取和写入的设备称为client,被读取和写入对象字典的设备称为server。SDO通信的功能就是向某个设备的对象字典中写入数据,或者读取设备对象字典的值,报文格式为:
SDO报文需要应答。当客户端发送报文,该报文以0x600+设备ID作为COB-ID,数据段的第0字节表示传输类型,如果是写对象字典请求,第0字节还应表示写入的数据长度,该长度应该与要写入的对象字典数据长度对应。第1、2字节为索引,第1字节中填充索引的低字节,第2字节填充索引的高字节(这和常用的数据记录规则是相反的,记数时通常高字节写在左侧),同时根据CAN协议可知,CAN在发送数据时先发送最高位。第3字节为子索引,后面4个字节用于填充需要写入字典的数据,没有使用到的字节建议填充0。当服务器接受到写字典的SDO报文后,会发送以0x580+设备ID为COB-ID的应答报文,根据回传报文的字节0可以判断通信是否正确。若服务器收到的是读字典请求,则应答SDO报文中的数据段为请求访问的对象字典数据。这里读取和写入用户字典的SDO报文。可类比CAN通信中的数据帧和远程帧。并且SDO支持区块传输,可以传输大量数据。 -
PDO通信
PDO,过程数据对象,用于快速访问对象字典,起作用和SDO类似,只是实现方法不同。SDO在每次发送报文时,都需要指定需要读写的对象字典的索引和子索引,以灵活地对任意对象字典进行访问,同时SDO应答报文保证了数据传输的准确性。PDO通信不需要应答,在使用PDO通信之前,需要实现配置PDO通信通道的参数对象和映射对象,其分别决定了PDO通信的参数配置和PDO访问的对象字典,配置好后使能PDO,就可以快速地按照配置好的规则,对指定的对象字典进行读写。可见,与SDO相比,PDO的灵活性较差,每次改变读写的对象字典之前都需要重新对PDO进行配置,但由于其不需要应答,且PDO传输的数据长度最多为8字节,其传输效率更高。PDO的通道配置如下:
由于PDO数据传输是单向的,所以根据传输方向分成了RxPDO和TxPDO,其中RxPDO用于服务端接收客户端的数据,对对象字典进行写入操作,TxPDO用于向服务端向客户端发送数据,读取服务端对象字典的数据。
上图中RxPDO和TxPDO各具有4个通道,并且每个通道具备独立的通信对象和映射对象。通信对象中存储有通信的配置,如该通道使用的COB-ID、是否为同步传输、禁止时间等,具体可见数据手册。映射对象为通道所访问的对象字典,其存储了1-8个对象字典中的对象,在进行PDO通信时,直接对该通道的映射对象中的对象进行读写操作。映射对象类似指针,指向了最终被读写的对象。注意在使用RxPDO对对象字典进行写入操作时,PDO报文的数据段需要与所配置的映射对象的数据长度相对应。 -
NMT网络服务
网络管理系统(NMT)负责初始化、启动及停止网络和网络中的设备,属于主从系统。
CANopen网络中有且只有一个NMT主机,可配置包括本身在内的CANopen网络。CANopen按照协议规定的状态机执行相应工作。其中,部分为内部自动转换,部分必须由NMT主机发送NMT报文实现转换,状态机转换具体如下图
CANopen设备在上电后会自动进行初始化、复位节点和复位通信的功能,进入预操作状态,需要使用NMT指令使设备进入运行状态,才可以正常工作。NMT报文格式为:
其中Node-ID为0时为广播,对所有总线设备均有效。
不同网络状态下,设备可以进行的操作也不同,如下图。注意在预操作状态下时不能进行PDO通信的。
-
同步对象
同步对象(SYNC)是控制多个节点发送与接收之间协调同步的一种特殊机制,用于PDO的同步传输。即当总线上某个设备配置了同步发生器后,其会以指定的时间周期发送同步报文,其他设备根据所收到的同步报文的个数决定是否进行PDO传输。
三、CIA402状态机
状态机定义了设别的多种状态以及状态之间的逻辑关系,其中Operation Enable是设备的正常工作状态。状态的改变是通过更改对象字典中0x6040控制字实现的。同时,随着对0x6040进行配置,设备的状态会更新到状态字,其索引为0x6041。所以可以通过PDO或SDO指令,修改控制字的值进行状态变更,并通过读取状态字的数据确定当前所处的状态。当控制字改变后,状态会进行更改并更新状态字。
四、例子
以下报文按照“COB-ID /Data”的格式进行展示,设备ID为1
- NMT管理,广播进入运行状态
000 / 0100 - SDO读取状态字(index 0x6041 sub-index 0x00)
601 / 40 41 60 00 00 00 00 00 - SDO读取控制字(index 0x6040 sub-index 0x00)
601 / 40 40 60 00 00 00 00 00 - SDO配置控制模式(index 0x6060 sub-index 0x00 数据长度1byte 模式数据4)
601 / 2f 60 60 00 04 00 00 00 - RxPDO2修改目标转矩为1(目标转矩的对象索引已经提前配置到RxPDO2的映射对象中 目标转矩对象数据长度为2byte)
301 / 01 00