目录
CANopen是基于CAN协议的高级通信协议和设备配置文件规范。该协议是为嵌入式网络应用(如车载网络)开发的。CANopen涵盖了网络编程框架,设备描述,接口定义和应用程序配置文件。CANopen使来自不同制造商的设备和应用程序之间实现通信标准化。它已被广泛用于各个行业,并在自动化和运动应用中具有突出的表现。
就OSI通信系统模型而言,CAN覆盖前两个级别:物理层和数据链路层。物理层定义了所使用的线路,电压,高速特性等。标准的CAN协议实现数据链路层,它是基于帧的(消息)协议。CANopen涵盖了上面五层:网络(寻址,路由),传输(端到端可靠性),会话(同步),表示(以标准方式编码的数据,数据表示)和应用。应用层描述了如何配置,传输和同步CANopen设备。
许多处理器都实现了CAN 总线接口和驱动程序。我们假设读者已经了解CANBUS 总线的基本知识,重点介绍应用程CANopen 协议。
每个新技术的出现,都会伴随着一大堆的技术术语和英文缩写,使初学者难以理解。一位日本人称为是“术语的洪流“。使用简单的语言将一个复杂的事情的基本框架讲明白,要比开头就劈头盖脑地抛术语,讲细节好的多。我写这篇博文也就是这种尝试。
CANBUS 是一种总线型通信网络。所有的节点都并联在两根通信线上。
CANBUS 和以太网类似,是基于帧传输方式,只是以太网一个帧可以是1500个字节,而CANBUS 的帧最多只能传输8个字节
以太网的帧结构
CANopen 的帧结构
不要以为数据帧短不好,短有短的优点,它将更可靠,实时性好。
11 位 进一步分成位 4个功能码和7位 ID。7位大小限制CANopen网络上的设备数量限制为127个节点。
在一个控制系统中,设备的ID 和 数据的格式都是由系统厂商规定的。例如笔者曾经开发过一个汽车上的方向盘角度传感器。就是由汽车厂提供的帧数据格式和ID 数据表,来设计的。与博世的同类产品不相同。
我们一直在讲,底层通信协议只是解决语法的问题,没有解决语法的问题-数据代表上面含义?
CANOpen 是建立在CANBUS链路层基础上的应用协议,解决语义的问题(8个字节什么代表意思?)。让不同厂商的产品能够真正的互联互通。
每个设备都有各种数据要和外界交换,例如方向传感器的角度,速度和加速度。这些参数具有名称,类型,长度等特征。访问这些参数的方式最简单的方式就是定义地址和长度。然后读取。PLC 中modbus 协议就是这么简单粗暴的方法。这种低级的方式显然比较容易出错。设置复杂。
控制协议越来越多地采纳了面向对象程序设计的思想。将每个参数定义成为一个数据对象。并且可以采样人类可读方式编写,例如采样XML 语言来描述。
CANopen 采用了类似的思想,它将参数定义为对象,每个设备中都有一个对象字典,对象字典可以一个文件描述,它叫做EDS(Electronic data sheet),它采用了INI 文件格式。
为了简化协议中的数据交换,CANopen 协议中只是自定对象的索引(index)和子索引(sub index)并不传递对象的所有信息。这就好比只交换字典中的的页码和行,列。通信双方各自去查字典。了解具体的含义。
于是,CANBUS 可怜的8个字节又分成了三个部分。一个字节用于说明符,三个字节用于节点索引和子索引,四个字节用于传输中的实际数据,真正的数据只有4个字节了。
当所有需要传输的数据都不能放入一条消息中时,将选择分段传输,因此必须使用多个消息或“段”来传输数据,说明符的第7 为1 表示有后续数据。
CANopen的中心主题之一是对象字典(OD),它实质上是一个存储配置和过程数据的表格。所有CANopen设备都必须实现对象字典。
CANopen标准定义了16位的位索引和8位的子索引。也就是说,允许每个索引最多包含65536个索引和256个子条目。
该标准定义某些索引和索引范围必须包含特定参数。例如,标准定义索引1008h(子索引00h)必须包含设备名称。这样,任何CANopen主站都可以从CANopen从站网络读取此索引,
有些对象字典索引(例如设备类型(1000h))是强制性的,而另一些则是可选的,例如制造商软件版本(100Ah)。强制性索引的集合表示最小对象字典,这是标记符合CANopen的设备所必需的。
访问对象字典的两种通信机制是服务数据对象(SDO)和过程数据对象(PDO)。
对象字典中包含的基本数据类型为:布尔值,void(占位符),无符号整数,有符号整数,浮点数和字符。可以从基本数据类型构造更复杂的数据类型,例如字符串,日期和时间。
前面提过,每个CANopen 兼容的设备,都需要提供一个EDS 文件,以便让其它访问该节点的设备形成对象字典。主站程序需要导入EDS文件。EDS 是采用了INI 文件格式。它最早是windows 配置文件的格式。也有厂家开发了EDS 的编辑工具。
在CANopen协议的网络上,每个节点必须实现一个服务器,该服务器处理对其对象字典的读/写请求。CANopen主站充当该服务器的客户端。直接访问(读/写)服务器对象字典的机制是服务数据对象(SDO)。访问了对象字典的节点称为SDO服务器,获取数据的节点称为SDO客户端。传输始终由SDO客户端启动。
通常,主CANopen节点将向网络发送请求,感兴趣的节点将以请求的数据进行响应。当SDO客户端要从服务器请求信息时,它将使用600h +节点ID的CAN-ID发送SDO请求。 然后,服务器将使用580h的CAN-ID +节点ID进行响应。节点ID指定消息来自哪个从节点。下面所示的示例,主节点(SDO客户端)将消息发送到网络的CAN-ID为603h。尽管所有节点都可以看到此消息,但目标节点以外的所有节点都将忽略该消息。目标节点知道ID为603h的消息意味着该消息是针对该节点的,这是SDO请求。消息的数据字段将指定主节点要访问数据的对象的索引和子索引。然后,目标节点以消息ID 583h进行响应。
过程数据表示可以随时间变化的数据,例如节点控制器的输入(即传感器)和输出(即电动机驱动器)。过程数据也存储在对象字典中。但是,由于SDO通信一次仅允许访问一个对象字典索引,因此访问不断变化的数据可能会有很多开销。此外,CANopen协议要求节点必须能够发送自己的数据,而无需由CANopen主站轮询。因此,使用一种称为“过程数据对象”(PDO)的通信方法来传输过程数据的方法也有所不同。
PDO有两种类型:传输PDO(TPDO)和接收PDO(RPDO)。TPDO是来自节点(产生的)的数据,而RPDO是到达节点(消耗的)的数据。另外,PDO有两种类型的参数:配置参数和映射参数。对象词典中保留给PDO配置和映射信息的部分是索引1400h-1BFFh。
配置参数指定COB-ID,传输类型,禁止时间(仅TPDO)和事件计时器,这将在本节中进行说明。有多种方法可以启动PDO传输。这些方法包括事件驱动,时间驱动,单独轮询和同步轮询。传输类型在PDO的配置参数中指定。在事件驱动的传输中,当其中的过程数据发生更改时,将启动PDO传输。在时间驱动的传输中,PDO传输以固定的时间间隔发生。在单独的轮询中,PDO传输是使用不常用的称为远程请求的机制启动的。在同步轮询中,使用SYNC信号启动PDO传输。同步信号经常用作全局计时器。例如,如果CANopen主站发出SYNC消息,则可以配置多个节点以查看并响应该SYNC。通过这种方式,主站可以同时获取多个过程对象的“快照”。
网络管理服务包括在初始化,运行前,运行和停止之间更改从站状态的能力。NMT协议允许CANopen网络控制各个节点的通信状态。操作前状态主要用于配置CANopen设备。因此,在预操作状态下不允许进行PDO通信。在操作状态下可以进行PDO通信。在停止状态下,节点只能执行节点保护或心跳,而不能接收或传输消息。某些类型的CANopen通信允许处于不同状态。例如,在操作前状态下允许SDO,但不允许PDO。这是因为SDO通常用于初始化对象字典参数,
CANopen规范要求节点必须使用某种方法来检查节点是否“活动”。可用的两种方法是:节点保护和心跳,后者是首选方法。
在心跳协议中,CANopen节点定期发送心跳消息,该消息使CANopen主设备或心跳使用者知道该节点仍处于活动状态。如果心跳消息在一定时间内未到达,则主机可以采取特定措施。此类操作可能是重置节点或向操作员报告错误。心跳消息由CAN-ID 0x700 +节点ID标识,其中第一个数据字节等于1110。
在节点保护协议中,CANopen主站轮询从站节点的当前状态信息。如果节点在特定时间段内未响应,则主服务器将认为该节点已死,并将采取措施。
心跳协议是首选方法,因为它的开销比节点保护少。
CANopen网络中的??每个节点都分配有一条紧急消息(EMCY),用于传达节点状态。请注意,心跳和节点保护协议旨在用于传达通信故障,而紧急消息则用于传达节点内的错误(即传感器故障)。EMCY消息由80h的COB-ID +节点ID标识。EMCY消息的数据部分包含有关发生的错误的信息。