一种CAN总线系统中的应用层通讯方法 技术领域:
本发明涉及CAN(Controller Area Network,控制器领域网络)总线,具体涉及一种CAN总线系统及其中的应用层通讯方法。
背景技术:
CAN总线最初是由德国Bosch公司为了解决汽车中众多控制器与测量设备之间的数据交换而开发的一种串行数据通信总线(可参见Bosch.CAN Specification,version 2.0,1991,9),后发展为国际标准ISO11898。CAN总线的最大特点在于数据链路层采用了消息优先性仲裁、自动应答,CRC(Cyclical Redundancy Check,循环冗余码校验)自动校验、错误重发等机制。由于CAN总线具有可靠性高,传输速率快,通信距离较远,易于使用、维护和网络扩展,目前已广泛应用于各种工业现场控制领域。
但是,CAN只定义了ISO/OSI中的物理层和数据链路层规范,这种设计要求用户在应用CAN协议时,必须自行定义应用层协议。实践表明,即使最简单的CAN分布式系统,仅仅靠两层协议规范是不够的,要进行高效率的通讯还需要进一步明确应用层协议。目前,CAN总线应用层协议种类很多,但这些协议或者是非常复杂的通用型协议,比如CANopen,DeviceNet,或者是基于特定应用领域的专用协议,如J1939标准。使用复杂的通用性协议,一般会增加CAN总线节点的开销,增加开发周期和成本。而特定的协议一般会使得应用存在较大的局限性,增加了修改和移植的成本。
发明内容:
本发明的目的是提供一种CAN总线系统中的应用层通讯方法,它根据对CAN总线应用层设计在工业现场应用中需求出发,结合CAN总线数据链路层的特点,CAN总线通讯模式以及CAN节点寄存器模型提出了一套完整通用的CAN总线应用层通讯方案,效率高,协议代价小,简单实用,便于推广和移植,可以适合于很多使用CAN总线的工业自动化设备或移动设备上。
为了解决背景技术中所存在的问题,本发明是采用以下技术方案:将设备内部的功能分成若干个通道,每个功能通道都有自己的属性,这样就能清晰地将CAN总线上的数据对象,按照功能划分开来。结合CAN总线通讯的特点,再将设备的功能及其属性进行编号,某个虚拟数据对象,将由一个通道号和一个属性值完全对应。因此,一个通道号和一个属性值被称为虚拟数据对象的索引。在发送应用层消息是,虚拟数据通道的索引信息,被直接放置在了ID之上,直接提高了通讯效率。不同的设备具有不同的通道和属性,因此,需要有一个对应的虚拟数据对象表来记录虚拟数据对象的索引。每个虚拟数据对象的实际物理意义,数据类型,读写权限,都将记录在虚拟数据表中。
本发明主要针对工业现场与移动设备中广泛使用的主从式CAN总线拓扑结构,提出了一个完整的基于虚拟数据对象的一般性应用层通讯方案,易于推广和移植,适用性强。本发明的技术方案在基于ARM的系统级集成运动控制系统中得到了应用和验证。实验结果表明本通讯方案具有使用简明,资源占用少等优点。
附图说明:
图1是本发明基于CAN总线的应用层协议的结构示意图;
图2是本发明应用层协议读取虚拟数据对象的流程图;
图3是本发明应用层协议写入虚拟数据对象的流程图;
图4是本发明应用层协议使用BOOST方式读取虚拟数据对象的流程图。
具体实施方式:
参看图1,本具体实施方式采用以下技术方案:它包括CAN总线虚拟数据对象、虚拟数据对象表、虚拟数据对象的读写操作。所述CAN总线应用层协议的数据通讯过程,是通过向CAN总线上发送扩展帧格式的数据帧或远程帧来完成的。
CAN总线系统的链路层协议是一个面向CAN ID的一种通讯方式,CAN总线数据通信的对象是CAN ID,而不是某个设备的地址,因此,如何分配CAN ID来实现不同设备之间的数据交互就是所述虚拟数据对象所解决的问题。
虚拟数据对象是所述CAN总线应用层协议通讯的最小单元,其表示了设备的某个功能属性。每个遵循所述应用层协议的设备都必须有一个数据对象表,该表中保存了每个虚拟数据对象的索引、含义、数据类型、数据长度,从这个意义上来讲,每个虚拟对象是被事先定义好的。
所述虚拟数据对象的索引值是由通道和属性来完成的。通道值表示了一个设备的某个功能,通道属性表示了该通道功能地不同的属性。每个属性具有不同的数据类型和读写权限。设备通过检索通道号以及属性值,即可访问到指定的虚拟数据对象。
每个遵循所述CAN总线应用层协议的设备都必须有一个特殊的通道,即系统通道,该系统通道用于表示设备和应用层协议的各种配置与状态属性。这些通用属性中,某些属性是强制执行的,某些是可选的。
当设备需要对CAN总线上的虚拟数据对象进行读操作或者写操作时,需要向CAN总线上发送一个应用层消息,应用层消息是由一个CAN的数据帧或者远程帧来承载的。应用层消息包含了虚拟数据对象所在的设备地址,消息的优先级,虚拟数据对象的索引(通道号和属性值)以及携带的数据(用来作数据请求的远程帧不携带数据)。为了充分利用CAN总线链路层所提供的功能,减小协议开销,应用层消息中的设备地址,消息优先级,虚拟数据对象的索引,被直接放置在了CAN总线数据帧或者远程帧的ID上。优先级被放置在了ID的高位,值越小,优先级越高,这种设计,直接使用了CAN总线链路层优先级仲裁机制。
进一步地,所述的虚拟数据对象所在的设备地址,包含普通设备地址和广播设备地址。设备地址为普通地址时,应用层消息只对设备地址所指定的设备有效。设备地址为广播地址时,应用层消息对CAN总线网络上所有的设备有效。
所述虚拟数据对象的写操作需要使用CAN数据帧来承载数据,同时要求所写入的虚拟数据对象所在的CAN节点根据系统通道中的配置信息来决定是否发送应答信息,应答信息用来指示该次写操作的成功是否,如图3所示。
所述虚拟数据对象的读操作可分为两种形式,即查询模式与BOOST模式。
查询模式,如图1所示,即需要读取虚拟数据对象的节点向CAN总线上发送一个应用层消息(CAN总线的远程帧),该消息中包含了消息的优先级,待读取数据对象所在的设备地址,通道号,属性值。被读取的设备收到了该应用层消息之后,根据所请求的通道号与属性值,生成一个数据帧(该数据帧具有与请求数据的远程帧相同的CANID值),并将该数据帧发送到CAN总线上。
在查询模式下,每次读取虚拟数据对象时,需要先发送一个远程帧,再等待被读取设备发送应答的数据帧,整个过程需要一个来回,总线利用率并不高,比较适合小数据量低速读取。
BOOST模式,如图4所示,即要读取虚拟数据对象的节点,向CAN总线上发送一个携带BOOST请求的应用层消息(CAN数据帧),该消息中包含了消息的优先级,待读取数据对象所在的设备地址,通道号,属性值,以及对被读取设备BOOST通道的配置信息。
进一步地,BOOST通道的配置信息,包括发送间隔时间,发送次数,待发送的虚拟数据对象的索引,以及通道的使能信息。
被读取设备收到了携带BOOST请求的应用层消息之后,根据所请求的配置信息的内容,向总线上以一定的时间间隔,发送一定数目的指定虚拟数据对象的数据。
在BOOST模式下,读取方只需要在开始的时候发送一个BOOST请求到被读取方,被读取方在收到请求之后将按照BOOST请求所设置的方式来主动向CAN总线上发送数据帧。这种方式对总线带宽的利用率较高,适合高速的数据传输。
实施例一:一种CAN总线系统中的应用层通讯方法,所述CAN总线系统包括CAN总线、若干个CAN节点;各CAN节点之间通过所述CAN总线,根据CAN应用层协议收发应用层消息,以进行应用层通讯;下面将具体描述所述CAN应用层协议。
首先,CAN总线协议支持四种通讯帧:数据帧,远程帧,错误帧,以及超载帧。其中数据帧实现发送节点到接收节点的数据传递,本实施例中,所述CAN节点在进行应用层通讯时,写入虚拟数据对象使用的是数据帧,以查询方式读取虚拟数据对象使用的是远程帧请求,数据帧返回。在实际应用时,也不排除用其它帧进行承载。根据CAN协议版本的不同,通讯帧的格式分为扩展帧和普通帧,本实例中,所有的通讯帧均使用扩展帧格式。在实际应用时,也不排除使用普通帧以及两者混用的方式进行传输。
如表1所示,所述CAN节点在进行应用层通讯时,所收发的CAN通讯帧的29位ID号的各位的含义进行了定义。
表一、CAN总线ID含义表
Bit 29 28~25 24~17 16~8 7~0 含义 R Priority Device ID Channel Property
其中:
R:执行标准定义。长度:1bit
R=0,表示该ID遵守所述应用层协议。
R=1,表示该ID不遵守所述应用层协议。
Priority:消息优先级。长度:4bits
该字段用于标明消息的优先级。优先级越大,字段值越小,如Priority=0时优先级最高。
Device ID:设备ID。长度:8bits
用于标识总线中的某个设备。该字段一般由设备本身决定,如设备上的拨码开关,或者固化在设备内部。Device ID值为0xFF时,为广播ID。
Channel:通道号。长度:8bits
用于表示器件内部各个功能模块的通道值。
Property:通道属性值。长度:8bits
用于标识某个功能通道的属性。
在所述应用层协议通讯中,最小通讯单元是某个设备的某个通道的某个属性值。这个属性类似于存储器中断的某个地址,有些是只读的,有些是只写的,有些是可读写的。
每个遵守所述应用层协议的设备,都需要提供一个属性分配表,用来说明每个属性所表示的意义以及其数据类型和长度。也就是说,这里提到的每个属性都是事先定义好的。
当Device ID值为0xFF时,为广播消息,总线上所有设备都应该可以响应该消息。
当Channel值为0是,表示系统通道,系统通道用来表示系统的通用属性,这些通用属性中,某些属性是强制执行的,某些是可选的。
在所述应用层协议通讯中的属性值通过远程帧进行读取,通过数据帧进行写入。如想要读取某个电机控制器中当前电机的转速,这里假设器件ID为0x01,电机通道0的通道值为1,转速属性的值为3,则需要向CAN总线上发送ID为0x00010103的远程帧。电机控制器收到该远程帧的请求之后,将回复一个与发送ID相同的数据帧,该数据帧中包含了当前通道0上电机的转速。数据帧中电机的转速的数据长度,数据类型可以通过属性分配表来查得。
在某些应用场合,需要不停地读取数据,或者需要较高的采样频率。在所述应用层协议中提供一种叫做Boost读取的方式可以有效满足上面提到的要求。通过Boost读取方式可以使得CAN总线设备在没有收到远程请求的情况下自动的按照一定的时间间隔,发送若干次指定的属性值。
Boost读取方式是通过发送一个系统类中的Boost属性的数据帧来启动或者停止的。一个设备中可以支持最多8个Boost通道,每个通道都可以单独地进行打开,关闭和配置。Boost数据帧中的数据格式如下:
BIT数 4 3 1 8 16 32
其中:
On/Off:表示是否使能指定Boost通道号。0关闭,1使能
Boost通道号:用来指定待操作的Boost通道号。
重复次数:取值范围1~255,该Boost通道需要自动向CAN总线上发送待读取ID的次数。当Boost通道完成指定的发送次数之后,将自动关闭。当重复次数取值为:0xFF时,表示无限次。
发送间隔:取值范围1~65535,单位是ms,表示每次发送数据之间的间隔时间。
待读取ID:表示需要设备向CAN总线上发送数据的ID。