CANopen是在CAN的基础上发展而来,是CAN的一个继承,使用了CAN的物理层和数据链路层,同时又在这个基础上完善了应用层。
应用层一般包含通讯子协议和设备子协议两部分,在通讯子协议中,定义了对象字典中对象的具体格式,另外还包含通讯协议的一些具体格式,比如说SDO通讯、PDO通讯管理、报文、节点保护、心跳报文等等,这些报文的一些具体结构和内容。
标准CAN的标识符长度是11位,而扩展格式CAN的标识符长度可达29位。CAN协议的2.0A版本规定CAN控制器必须有一个11位的标识符,同时在2.0B版本中规定CAN控制器的标识符长度可以是11位或29位。本协议遵循2.0A版本。
1、CANopen数据帧
每个CANopen帧都以COB_ID开头,COB_ID是数据帧的唯一标识符。
表 CANopen数据帧
COB_ID包括功能段(FUNCTION)和地址段(NODE-ID)Node-ID由系统集成商定义,例如通过拨码开关设置。Node-ID范围是1~127(0不允许被使用)。COB_ID越小报文优先级越高。CANopen的COB_ID范围从0-77F。
图 COB_ID结构
表 CANopen预定义主/从连接集CAN标识符分配表
CiA301协议中根据ID的不同,区分不同种类报文,主要划分了下面几类:
- SDO:服务器--客户端模式,用于通信,主要用于配制参数
- PDO:生产者--消费者模式用于通信
- NMT:网络管理.用于切换节点工作状态
- ... ...
上面的报文就是通信的基础,通信是为了改变参数。
传输过程中的数据,总要有个地方进行保存,CANopen一般把传输中的数据存到“字典”(即 OD)里。字典是CANopen另一个重要的概念,字典里面存有参数和状态。
字典可以看成是一个储物柜,储物柜里面有很多小格子,每个格子上面都有编号 (编号就是索引)。
(索引是索引,ID是ID,不能混淆)
2、Object Dictionary(OD 对象字典)
CANopen对象字典
设备的数据和配置都保存在字典里面。字典是CiA301协议里规定的概念,是一个核心概念。
字典类似于一个带有“管理员”的储物柜。这个储物柜有多个格子,每个格子都有一个编号(索引)。 如果想要取出格子里面的东西,需要知道格子的索引号。还需要与储物柜的管理员进行“通信”。
“通信”规则有两套,一种是SDO,效率较低,但稳定,有回复。另一种是PDO,效率很高,没有回复。比如“你”要存一个帽子到储物柜里:
- SDO 需要“你”说出全面的信息,比如,第3行、第4列的黑色格子,放一个帽子(数据)。“管理员”收到“你”说的信息之后,接过帽子放入第3行,第4列的黑色格子,并回复“你”已放好
- PDO 就不需要那么全面的信息,有点类似暗号。“你”和“管理员”熟悉之后,之间的沟通就不需要那么繁琐了,
- “你”直接扔给“管理员”一个帽子,其就自动放入第3行,第4列的黑色格
- “你”直接扔给“管理员”一个鞋子,其就自动放入第8行,第8列的灰色格子
- ... ...
为了避免忘记这么多的配置,“你”与“管理员”纪录了一个账册,这个账册里面写好了各个暗号(PDO配置)。并且账册也放入了“储物柜”的前面几个格子里,为了以后可以随时查看或更改(可读可写)。
从此“储物柜”分为了两部分:
- 一部分是放置账册的,账册里面的内容可以进行更改(PDO的配置可以进行更改)
- 另一部分是放置物品的,这里基本是不变的。柜子的大小,数量和放置各个物品的专用格子是不能更改的(遵从CiA402协议)。放帽子的格子只能放帽子,放鞋的格子只能放鞋。(驱动器厂家A或这驱动器厂家B都会遵循这个规则,放置速度和放置位置的索引是不会改变的)
“管理员”和“你”之所以有这么好的默契,是因为各自心里都有一个共同的储物柜(字典)。如果一个驱动器遵循CANopen协议,那么这个驱动器里面就有一个字典。这个字典里面存储着驱动器当前的配置(里面也包括 PDO 的配置)和参数。用PDO或者SDO进行通信,查看字典配置,读取或者写入驱动器里的速度,位置,电压,电流... ...
CANopen对象字典的通用结构
对设备的操作基于“Object Dictionary”,所有的参数、参数值和功能都是通过16位index和8位sub-index组成的地址来访问和存取。
表 电机控制CANopen常用对象字典举例
CANopen网络中每个节点都有一个对象字典。对象字典包含了描述这个设备和它的网络行为的所有参数。一个节点的对象字典(包含通讯功能、通讯对象、与设备相关的对象以及对象的缺省值等)是在电子数据文档(EDS:Electronic Data Sheet)中描述或者记录在纸上。
对象字典中描述通讯参数部分对所有CANopen设备(例如在OD中的对象是相同的,对象值不必一定相同)都是一样的。
图 CANopen对象字典的通用结构
对象字典容量65536,通过16位索引寻址,每个对象可包含多至256个子项,通过8位子索引号寻址。16位的索引可寻址对象字典的所有对象,简单的变量可由索引直接引用,RECORD和ARRAY可由索引寻址其数据的整体结构。
子索引00h值为索引支持最大子索引数,00h和FFh不计入。
3、CANopen状态机
图 CANopen状态机
注意:
- 图中括号内的字母表示处于不同状态时可以支持的报文服务:
a.NMT,b.Node Guard,c.SDO,d.Emergency,e.PDO,f.Boot-up
- 状态转移(1-5由NMT服务发起),NMT命令字(在括号中):
1:Start_Remote_node(0x01) 启动
2:Stop_Remote_node(0x02) 停止
3:Enter_Per-Operational_State(0x80) 进入预操作模式
4:Reset_Node(0x81) 复位节点(应用层)
5:Reset_Communication(0x82) 复位节点通信(用于防干扰)
6:设备初始化结束,自动进入Pre_Operational状态,发送Boot-up报文
4、NMT模块控制报文
只有NMT-Master节点能够传送NMT Module Control报文,所有从节点必须支持NMT模块控制服务。NMT Mouble Control报文不需要应答。NMT报文格式如下:
当Node-ID=0,则所有的NMT从站设备被寻址。CS是命令字,取值及含义如下:
5、心跳报文
一个节点还可被配置为产生周期性的被称为心跳报文(HeartBeat)的报文,从节点周期将该报文发送给消费者,消费者可以通过报文中的状态值得知从节点的状态。报文格式如下:
图 心跳报文
心跳报文(HeartBeat)的消费者通常是NMT-Master主节点,它为每一个HeartBeat节点设置一个超时时间,当超时时采取相应的动作。一个节点不能同时使用NODE-Guarding(节点保护报文)和HeartBeat(心跳报文)。
6、NMT BOOT-UP启动报文
NMT-slave节点发布Boot-UP报文通知NMT-Master节点它已经从initialising状态进入pre-operational状态,报文格式如下:
7、CANopen紧急报文
紧急报文当设备内部出现的致命错误触发,以最高优先级发送到其他设备。适用于中断类型的错误报警信号。一个紧急报文包含8个字节,报文格式如下:
16进制的应急错误代码表格说明此处不展示,详细请查阅《CiA 301 V4.2.0 CANopen application layer and communication profile》规范。应急错误代码中‘XX’部分由相应的设备子协议定义。
错误寄存器(Error Register)在设备的对象字典(索引0x1001)中,下表说明了错误寄存器的位定义。设备可以将内部错误映射到这个状态字节中,并可以快速查看当前错误。
8、SDO通讯
SDO(service data object,服务数据对象)主要用来在设备之间传输低优先级的对象,典型是用来对从设备进行配置、管理,比如用来修改速度环、位置环的PID参数,PDO配置参数等。通过使用索引和子索引SDO使客户机能够访问设备对象字典中的对象。通常情况下传输的数据长度不超过4个字节,当数据长度超过4个字节时分拆成几个报文。协议是确认服务类型:每个消息生成一个应答。SDO请求和应答报文总是包含8个字节。
8.1、SDO 的COB_ID
通讯对象标识符,使用中具体定义规则如下:
8.2、SDO读报文
- 发送报文
命令字:0x40
- 回应报文
**最大四字节数据
命令字:
如果数据为1个字节,则接收命令字为0x4F
如果数据为2个字节,则接收命令字为0x4B
如果数据为3个字节,则接收命令字为0x47
如果数据为4个字节,则接收命令字为0x43
如果失败,则接收命令字为0x80
8.3、SDO读报文示例
表 电机控制CANopen常用对象字典举例
举例:读取设备站号为1的伺服实际位置60630020,读到的数据是4个字节,CANopen数据低字节在前高字节在后(小端模式),所以数据为FFFFFD113HEX,转换成10进制为-12013。
- 发送报文
- 回应报文
8.4、SDO写报文
- 发送报文
命令字:
如果数据为1个字节,则接收命令字为0x2F
如果数据为2个字节,则接收命令字为0x2B
如果数据为3个字节,则接收命令字为0x27
如果数据为4个字节,则接收命令字为0x23
- 回应报文
命令字:
如果成功,则接收命令字为0x60
如果失败,则接收命令字为0x80
8.5、SDO写报文示例
举例:写设备站号为1的伺服目标位置
注意:CANopen数据低字节在前高字节在后
- 发送报文
- 回应SDO报文
8.6、SDO通讯失败
- 从站回复报文格式如下
- 错误代码
详细请查阅《CiA 301 V4.2.0 CANopen application layer and communication profile》规范。
中止代码 | 代码功能描述 |
05 03 00 00 | 触发位没有交替改变 |
05 04 00 00 | SDO协议超时 |
05 04 00 01 | 非法或未知的Client/Server命令字 |
05 04 00 02 | 无效的块大小 (仅Block Transfer模式) |
05 04 00 03 | 无效的序号 (仅Block Transfer模式) |
05 03 00 04 | CRC 错误 (仅Block Transfer模式) |
05 03 00 05 | 内存溢出 |
06 01 00 00 | 对象不支持访问 |
06 01 00 01 | 试图读只写对象 |
06 01 00 02 | 试图写只读对象 |
06 02 00 00 | 对象字典中对象不存在 |
06 04 00 41 | 对象不能够映射到PDO |
06 04 00 42 | 映射的对象的数目和长度超出PDO长度 |
06 04 00 43 | 一般性参数不兼容 |
06 04 00 47 | 一般性设备内部不兼容 |
06 06 00 00 | 硬件错误导致对象访问失败 |
06 06 00 10 | 数据类型不匹配,服务参数长度不匹配 |
06 06 00 12 | 数据类型不匹配,服务参数长度太大 |
06 06 00 13 | 数据类型不匹配,服务参数长度太短 |
06 09 00 11 | 子索引不存在 |
06 09 00 30 | 超出参数的值范围 (写访问时) |
06 09 00 31 | 写入参数数值太大 |
06 09 00 32 | 写入参数值太小 |
06 09 00 36 | 最大值小于最小值 |
08 00 00 00 | 一般性错误 |
08 00 00 20 | 数据不能传送或保存到应用 |
08 00 00 21 | 由于本地控制导致数据不能传送或保存到应用 |
08 00 00 22 | 由于当前设备状态导致数据不能传送或保存到应用 |
08 00 00 23 | 对象字典动态产生错误或对象字典不存在 |
9、PDO通讯
PDO(process data object,服务数据对象)用来传输实时数据,数据从一个生产者传到一个或多个消费者。1个PDO一次最多传输8个字节的数据。PDO通道理论上可以达到512个,PDO的发送方式是通信参数决定的,映射参数决定了发送的内容解析。
每个PDO在对象字典中用2个对象描述:
- PDO通讯参数,包含COB_ID,传输类型,禁止时间,定时器周期
- PDO映射参数,包含对象字典中对象列表,这些对象映射到PDO里,包含数据长度,生产者和消费者根据映射的地址解释PDO内容
报文内容是预定义的(或者在网络启动时由主站配置),由通讯的双方决定八个字节数据的具体含义。PDO通讯又分RX-PDO(接收PDO)和TX-PDO(发送PDO),接收和发送都是相对于从节点来说的。
PDO通讯和SDO通讯的区别就是,它是一种不需要回应的通讯方式,从节点根据收到的报文的COB_ID来判断这条报文是不是属于自己的,如果是自己的则解析报文,但是不需要对报文做出回应。从节点发出的报文,主节点收到之后也是根据COB_ID来做判断,并不需要对报文做出回应。
9.1、PDO参数
发送PDO通讯参数地址范围:1800h-19FFh
接收PDO通讯参数地址范围:1400h-15FFh
PDO通讯参数说明了PDO的基本特性,如COB_ID、传输类型、禁止时间和事件定时器等,它决定了PDO是以何种方式发送和接收数据。
PDO禁止时间:两个连续PDO传输的最小间隔时间,避免由于高优先级信息的数据量太大,始终占据总线,而使其它优先级较低的数据无力竞争总线的问题。禁止时间由16位无符号整数定义。
PDO定时周期:当超过定时时间后一个PDO可以被触发,周期由16位无符号定义,单位1ms。
图 PDO参数示例
9.2、PDO的COB_ID
表 第1到第4个PDO的COB_ID
9.3、PDO传输类型
- 同步(通过接收SYNC对象实现同步)
非周期:由远程帧预触发传送,或者由设备子协议规定中的对象特定事件预触发传送
周期:传送在每1到240个SYNC消息后触发
- 异步
由设备协议中规定的对象特定事件触发传送
表 PDO传输类型
9.4、PDO映射
PDO映射说明了PDO中所包含的通讯对象,决定了发送或接收的数据内容。
发送映射地址范围:1A00h-1BFFh,多至512个TPDO映射
接收映射地址范围:1600h-17FFh,多至512个RPDO映射
图 PDO映射示例
9.5、PDO报文
- 发送报文
- 接收报文
9.6、EDS(电子数据表格)
EDS(电子数据表格)文件是PLC所连接从站的标识文件,通过该文件来辨认从站所属的类型。该文件包含了从站的所有信息,比如生产厂家、序列号、软件版本、支持波特率种类、可以映射的OD及各个OD的属性等等参数,类似于Profibus的GSD文件。因此在进行硬件配置前,首先需要把从站的EDS文件导入到上位组态软件中。
10、同步报文
10.1、同步报文数据帧
10.2、同步报文的作用
同步报文用于控制TPDO的发送
同步报文用于控制RPDO的激活
同步报文用于同步各个节点的时钟
10.3、传输类型
0,非循环
1-240的传输类型就是指经过多少个同步报文后,发送TPDO
10.4、通讯参数
通讯循环周期:索引1006h,规定了同步帧的循环周期
同步窗口时间:索引1007h,约束了同步帧发送后从节点发送PDO的时效,即在这个时间内发送的PDO才有效,超过时间的PDO将被丢弃