一、CANopen基础(上)
1、CAN协议概述与基本原理
(1)CAN网络全称Controller Area Network,译为控制器局域网,是国际上应用最广泛的现场总线之一。
(2)CAN的OSI模型:
①七层模型,亦称OSI(Open System Interconnection),参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型
②从OSI网络模型的角度来看,现场总线网络一般只实现了第1层(物理层)、第2层(数据链路层)、第7层(应用层),因为现场总线通常只包括一个网段,因此不需要第3层(传输层)和第4层(网络层),也不需要第5层(会话层)和第6层(描述层)的作用。
③CAN只定义物理层和数据链路层,没有规定应用层。

(3)CAN的特性:
①CAN总线采用双线差分信号,两根线构成总线------CAN_High与CAN_Low,这两根线之间的电位差可以对应两个不同的逻辑状态进行编码。静态时,CAN_High与CAN_Low均是2.5V左右,此时状态表示为逻辑1,也可以叫做隐性位;用CAN_H比CAN_L高表示逻辑0,称为显性位,此时通常电压值为CAN_H=3.5V和CAN_L=1.5V,竞争(不同节点竞争总线资源)时显位优先。

②使用双绞线作为总线介质时,总线长度≤40米,传输速率可达1Mbps。

③CAN协议本身对节点的数量没有限制,实际应用中节点数目受网络硬件的电气特性所限制,总线上节点的数量可以动态改变,广播发送报文,报文可以被所有节点同时接收。

④CAN网络是多主站结构,每个报文的内容通过标识符识别,标识符在网络中是唯一的,它描述了数据的含义,也标识了报文的发送节点,甚至某些特定的应用对标识符的分配进行了标准化;另外,总线上的其它节点可以根据需要可进行相关性报文过滤,根据标识符滤出期望接收的报文。

(4)CAN的数据帧可简单认为由报文标识符(即CAN报文ID)、数据段长度(DLC)和数据段(Data)构成,实际中,CAN报文的格式较为复杂,具体可参考《STM32入门教程》中关于CAN的介绍,此处不再赘述。

(5)CAN协议本身没有定义应用层,但随着技术的发展,越来越多的应用层协议被设计出来,它们主要定义了CAN数据帧中的数据段。

2、CANopen概述
(1)CANopen的背景:
①CAL(CAN Application Layer)协议是目前基于CAN的高层通讯协议中的一种,最早由Philips医疗设备部门制定。
②CAL提供了所有的网络管理服务和报文传送协议,但并没有定义通讯对象的内容或者正在通讯的类型,而这正是CANopen的切入点。
③CANopen是在CAL的基础上开发的,使用了CAL通讯和服务协议子集,提供了分布式控制系统的一种实现方案。
④CANopsn的核心是设备对象字典(OD:Object Dictionary),在其它现场总线(如Profibus)系统中也使用这种设备描述形式。
⑤对象字典不是CAL的一部分,而是在CANopen中实现的。
⑥CANopen协议是免许可证的,任何组织和个人都可以开发支持CANopen协议的设备而不用支付版税。
(2)CANopen的网络模型:
CANopen协议沿用了CAN的物理层与数据链路层,在此基础上完善了应用层,应用层包含通讯子协议和设备子协议两部分,在通讯子协议中,有定义对象字典中对象的具体格式以及通信协议的具体格式(如SDO通讯、PDO通讯、网络管理)

(3)CANopen常见规范:
CANopen协议是CAN-in-Automation(CiA)定义的标准之一,在欧洲,CANopen协议被认为是在基于CAN的工业系统中占领导地位的标准,大多数重要的设备类型,例如数字和模拟的输入输出模块、驱动设备、操作设备、控制器、可编程控制器或编码器,都在称为 "设备描述"的协议中进行描述,"设备描述"定义了不同类型的标准设备及其相应的功能。
依靠CANopen协议的支持,可以对不同厂商的设备通过总线进行配置

(4)常用术语及含义:

3、CANopen对象词典
(1)对象词典(Object Dictionary)是CANopen设备里所有参数、功能、状态的集合,它相当于一个表格,里面给设备的每一个功能都分配了唯一的"地址",地址由16位index和8位sub-index组成,主站要读/写设备的某个参数,只需要发送"访问这个地址"的指令就行。下图是CANopen对象词典的示例。
|-----------------------|-------|-----------|------|----|---------|
| 名称 | Index | Sub_Index | Bits | 属性 | 含义 |
| Control_word | 6040H | 00H | 10H | RW | 设备状态控制字 |
| Modes of Operation | 6060H | 00H | 08H | RW | 工作模式 |
| Target_position | 607AH | 00H | 20H | W | 目标位置 |
| Target_velocity | 60FFH | 00H | 20H | W | 速度模式速度 |
| Profile_velocity | 6081H | 00H | 20H | W | 位置模式速度 |
| StatusWord | 6041H | 00H | 10H | R | 设备状态字 |
| Position actual value | 6063H | 00H | 20H | R | 实际位置 |
(2)不同厂商的设备,只要支持CANopen,就会遵循同一个对象字典规范,比如控制字的地址永远是6040H,主站不用管是谁家的电机,都能用同一套指令控制。
(3)对象字典里包含了设备的所有参数(比如通讯波特率、电机额定电流、运行状态),相当于把设备的功能全部"登记在册"。
(4)EDS(电子数据文档)就是对象字典的"电子版说明书",里面记录了设备支持的所有对象字典地址、含义、属性,主站软件导入EDS文件后,就能自动识别设备的所有功能。
(5)如下为CANopen对象词典的通用结构:

①对象字典中描述通讯参数的部分,对所有CANopen设备都是一样的。
②对于使用者来说,主要关注通讯子协议区域、制造商特定子协议区域、标准的设备子协议区域。通讯子协议区域中,主要包含设备类型、错误寄存器、参数地址等内容;制造商特定子协议区域,针对不同的厂家,即使是同类型的设备,定义可能也是不一样的;标准的设备子协议区域,针对不同类型的设备,定义可能是不一样的。
4、CANopen通讯标识符
(1)CANopen通讯标识符全名Communication Object Identifier,简写为COB_ID,它由CAN报文ID演化而来,每个CANopen帧都以COB_ID开头,它是数据帧的位移标识符。
(2)COB_ID包括功能段(FUNCTION)和地址段(NODE_ID),NODE_ID由系统集成商定义,范围是1~127(0不允许被使用),也就是说,一个CANopen网络最多有127个节点。

(3)和CAN协议一样,COB_ID越小,CANopen报文的优先级越高。
5、CANopen网络管理
(1)CANopen状态机如下图所示。

①上图中,括号内的字母表示处于不同状态时,支持的报文服务:
a.NMT(网络管理):所有状态都支持,是控制设备状态的核心指令
b.Node Guard(节点保护):用于监控设备在线状态,运行状态下支持
c. SDO(服务数据对象):用于读写设备参数(如配置对象字典),预操作、运行状态都支持
d..Emergency(紧急报文):设备故障时主动上报,初始化结束后就支持
e.PDO(过程数据对象):用于实时控制(如发目标位置、读状态),只有运行状态才支持
f.Boot-up(启动报文):设备初始化完成后自动发送,仅在初始化跳变至预操作状态时触发
②状态转移条件共6个,其中1-5由NMT发起:
1:Start_Remote_Node(NMT命令字0x01):让设备从预操作/停止状态进入运行状态,PDO开始工作,设备可正常控制
2:Stop_Remote_Node(NMT命令字0x02):让设备进入停止状态,只响应NMT,停止所有业务通讯
3:Enter_Pre-Operational_State(NMT命令字0x80):让设备从运行/停止状态回到预操作状态,可配置参数,但PDO停止工作
4:Reset_Node(NMT命令字0x81):设备完全复位,回到初始化状态,相当于重启设备
5:Reset_Communication(NMT命令字0x82):仅复位通讯相关配置(如波特率、节点ID),不复位设备参数,回到初始化状态
6:设备初始化结束,自动进入Pre-Operational状态,发送Boot-up报文(启动报文)通知主站
(2)NMT模块控制报文:
①只有NMT-Master节点能够传送NMT Module Control报文,所有从节点必须支持NMT模块控制服务。

②NMT Module Control报文不需要应答。
③NMT报文格式如下:

当Node-ID为0时,所有的NMT从站设备被寻址(也就是说,所有从站设备都要接收这帧报文)
CS是命令字,取值及含义如下

(3)NMT节点保护报文:
①通过节点保护报文,NMT主节点可以监视每个从节点的当前状态。

②主节点周期性地发送报文去询问从节点的状态,从节点收到主节点的问询后,将自己的状态回复给主节点,在设定的时间内,如果主节点没有收到从节点的信息,或信息错误,都会判断从节点通讯故障。
③主节点发送的远程帧格式如下,只有COB-ID,没有数据段。

④从节点应答的数据帧格式如下,Bit7为触发位,在每次节点保护应答中交替置位"0"和"1",在第一次节点保护时置0。

Bit6-0的状态表如下,其中带"*"的状态需要支持扩展Boot-up的节点才提供,状态0不在节点保护中出现,因为从节点在初始化状态中是不会应答报文的

⑤需要注意的是,在CAN网络中,同一时间、同一方向的报文不能用相同的ID,但这里的两个NMT节点保护报文是方向相反、类型不同的,主站发的是远程请求帧(RTR),从站回复的是数据帧(Data Frame),它们的CAN标识符(COB-ID)可以相同,且这正是节点保护的标准设计。
(4)NMT心跳报文:
①一个节点还可被配置为产生周期性的被称作心跳报文(Heartbeat)的报文,从节点周期性地将该报文为发送给消费者,消费者可以通过报文中的状态值得知从节点的状态。
②心跳报文(HeartBeat)的消费者通常是NMT-Master主节点,它为每一个HeartBeat节点设置一个超时时间,当超时未收到某从节点的心跳报文时,主节点将采取相应的动作。

③心跳报文的格式如下:

其中状态的定义如下表所示

④在同一个CANopen节点上,节点保护和心跳报文是互斥的,设备只能启用其中一种,不能同时工作,所以不会遇到"两种报文同时出现在同一个ID上"的情况,这是标准规定的。
(5)NMT Boot-up启动报文:
①NMT-slave节点发布Boot-UP报文通知NMT-Master节点,它已经从初始化状态进入预操作状态。
②Boot-up启动报文的格式如下:

③Boot-up启动报文的唯一性特征:
1数据段固定为 0x00:这是标准规定的,启动报文的唯一数据就是0x00,表示"初始化完成,现在进入预操作状态了"。
2只发送一次:设备上电或复位后,只会在初始化完成时发送一次启动报文,之后不会再主动发0x00的0x700+Node-ID报文。
3时序上和其它报文完全错开:启动报文发送时,设备还没进入正常工作状态,主站也还没开始节点保护轮询或心跳监控,所以不会和节点保护及心跳报文混淆。