摘 要:结合工业测控通信系统的需求,设计了CAN的高层协议——CHP协议。通过初始化帧实现了地址的动态分配与帧格式的约定,采用节点分类和定期查询的方法实现了节点状态的监控。针对大块报文重传效率较低的问题,提出了集中应答和选择性重传错误帧的解决办法;针对大块报文可能导致较大延时的问题,设计了实时报文的抢占机制。
关键词:CAN;通信协议;地址分配;状态监控;大块报文
1、引 言
CAN即控制器局域网(Controller Area Network),属于多主工作方式的串行通信协议[1]。CAN以其卓越的性能和突出的优点,广泛应用于汽车通信控制[2]、工业测控系统、楼宇自动化、医疗设备等各个领域,被认为是最有前途的现场总线之一[3]。
但CAN只定义了物理层和数据链路层,故CAN本身不是一个完整的协议,在面向特定应用时,必须设计相应的高层协议。目前,基于CAN的高层协议有CANopen、J1939、DeviceNet等,这些协议较为庞大复杂[4],开发应用的难度较大,而且使用成本较高[5]。因此针对工业测控通信系统,很有必要设计简单高效的通信协议。
2、CAN的特点及运行机制
CAN具有如下特点:多主工作方式;传输速度快;抗干扰性强;高可靠性和低错误率[3];高效的短帧结构,如图1所示。其中SOF表示帧起始,为一显性位。根据仲裁域标识符的长度不同,可以将CAN帧分为标准帧(11位标识符)和扩展帧(29位标识符)两种格式[6],帧的数据域最多只能传输8字节的有效数据。
图1 CAN的帧结构
CAN的非破坏性仲裁规则:①总线值用显性位“0”或隐性位“1”表示[4]。②报文的优先级由标识符确定,优先级的比较通过标识符的逐位仲裁实现[6],标识符越小的报文具有越高的优先级[7]。
CAN通信系统通常由上位机和下位机两部分组成。上位机通过人机交互界面,实现参数配置与资源管理等功能。下位机为现场节点设备,接收上位机的数据,并执行相关的操作,完成数据的采集和简单的信息处理[8][9]。
3、CHP协议的设计
为了保证协议的兼容性,CHP以CAN2.0B扩展数据帧为基础。扩展数据帧的格式如图2所示:
图2 CAN2.0B扩展数据帧
根据图2所示的扩展帧格式,定义了CHP协议的报文格式,如表1所示:
表1 CHP协议的报文格式
序号7654321 0 B0 报文类型
MessType 2bit 优先权
Priority 6bit B1 目标地址 DestID 7bitRTR B2 源地址 SourceID 7bitFF B3 数据类型
DataType 3bitSF 数据长度码
DLC 4bit Data0 帧序号FrameSeq 4bit 保留Data1 DATA ... ........Data7 DATAa) 字段编码
i. 主要功能段
MessType表示报文的类级别,用于定义和区分不同实时程度的帧。即根据实时程度将报文分成不同级别的类。报文的实时性越强,报文的类级别越高。以MessType取2bit为例,可以用00表示最高级别的报文类,01表示次高级别的类,10表示最低级别的类。
Priority表示报文的优先权。MessType将报文分成不同级别的类之后,每个类就对应了一个子队列,然后在子队列中(即类内部)进行优先权排队,这样,所有的报文就形成了一个虚拟的全局有序队列。
DestID和SourceID分别表示报文的目标地址和源地址。此处使用7位地址标识符,可表示128个不同的节点地址,能够满足大多数的工业应用需求。
RTR为远程请求位,远程帧的RTR位为1,数据帧的RTR位为0。
DataType表示数据类型:常规数据、命令、参数或者它们的组合。以3bit表示数据类型为例,可以设该字段的第一位为常规数据标志,第二位为命令标志,第三位为参数标志。即其编码含义为:100表示常规数据,010表示命令,001表示参数,101表示同时传输数据与参数,011表示命令与参数,111表示数据、命令与参数的组合。
DLC表示报文携带数据的长度,取值为0~8字节。FF表示帧格式。
ii. 特殊功能段
FrameSeq表示大块报文的帧序号。大块报文通常为非实时性报文,时间要求相对宽松,而其传输的概率也较小。故为了有效利用空间,使用数据域首字节Data0的高4位作为帧序号FrameSeq的存储空间,能够表示16帧。帧序号FrameSeq只在传输大块报文时使用,临时借用数据域的Data0的空间,大块报文传输完后必须归还。在此过程中,只能传输7字节的数据。当这部分空间归还之后,仍能装载8个字节的数据。
b) 帧的类型
对CHP报文的各个字段进行不同的编码,即可实现各种功能的帧。
i. 广播帧
广播帧,用于实现消息的群发功能,网络中的所有节点都能收到此帧。只需将CHP报文的目标地址设置为全0,即DestID=0000 000表示该帧为广播帧。
ii. 初始化帧
初始化帧,专门用于请求上位机分配地址和约定帧格式,是一种特殊的广播帧,仅在系统初始化或新节点加入时使用。初始化帧以广播帧为基础,即目标地址DestID=0000000,其源地址为SourceID=1111111。
iii. 数据帧
数据帧,可用于传送常规数据、命令、参数及其组合,将RTR设为0,并设置分段标志SF。若为大块报文,则设置相应的帧序号FrameSeq。
另外,远程帧用于向远端节点请求数据,只需将RTR位设为1,同时填入相应的目标地址DestID和源地址SourceID即可。出错帧、超载帧的格式与CAN2.0规范定义的帧格式相同,此处不作介绍。
4、CHP协议的关键技术
a) 地址的动态分配与帧格式约定
传统的CAN在系统运行前分配静态地址,而CHP协议借鉴了DHCP的思想,采取动态分配地址的方法。在此过程中,上位机充当了一个类似于DHCP服务器的角色,当新节点加入时,自动为新节点分配地址,具体过程如下:
①新加入节点Si请求地址和帧格式。节点Si通过发送初始化帧的方式提交申请。
②上位机分配地址及约定帧格式。上位机收到Si的申请之后,查询地址池并选择一个未使用的地址,将其分配给Si,同时约定帧格式FF。
③地址和帧格式确认。节点Si收到上位机的回信后,立刻使用新地址和帧格式发送确认应答。上位机收到确认应答信息后,地址的分配和帧格式约定便已经完成。
b) 节点状态查询
为了有效地监控CAN通信系统的运行状态,设计了节点的状态查询功能。该功能通过上位机周期性地发送状态查询报文实现。具体的算法如下:
①节点分类。上位机将下位机节点分成
两个集合:集合Uyes表示状态已知的节点,即在时间T内与上位机有过通信的节点。集合Vno表示状态未知的节点,即在时间T内与上位机没有联络过的节点。
②发送状态查询报文。上位机每隔一定的时间T就执行一次查询。状态查询报文只发送给那些在时间T内与上位机没有通信过的节点Vno。在时间T内与上位机有过通信的节点Uyes一律视为状态正常节点。
③反馈状态信息。Vno节点收到查询报文后,必须及时反馈状态信息。上位机在发送状态查询报文的同时,启动计时器。如果在规定时间内,没有收到Vno节点的反馈信息,那么上位机将此节点标记为已失效节点,并回收其地址。
c) 大块报文的多帧传输
当数据的长度大于8个字节时,必须把报文分解成多帧进行传输。报文标识符中的分段标志SF和帧序号FrameSeq用于多帧的传输。
i. 分段标志与帧序号
SF为分段标志(Segment Flag),SF=0表示短帧报文,无需分成多帧。SF=1表示大块报文,必须分成多帧传输,相应地设置帧序号FrameSeq,对各个帧进行编号。
ii. 大块报文的应答与重传机制
对于大块报文的多帧传输,如果不进行帧编号,当其中的某帧或几帧发生传输错误时,将会导致频繁的应答和重传,这样的传输效率必然很低。
引入帧序号FrameSeq之后,就可以采用集中应答的方式有效地解决这一问题。当大块报文传输结束之后,接收端将应答信号和错误帧的序号一起发送给源节点。这样就可以避免接收端频繁地发送应答信号,并实现了选择性地重传错误帧,提高了大块报文的传输效率和带宽利用率。
iii. 预约——抢占机制
CAN总线本身属于非抢占式协议,如果当前时刻总线上有报文在传输,那么必须等待该报文传输完毕。对于大块报文的多帧传输,传统的CAN协议使用统一的优先级进行传输,而且不允许中断。这会导致一个很严重的问题:实时性报文不能及时发送。报文的延时将随着帧数的增多而大幅增加, 北京:国防工业出版社,2004,10.