基于CAN2.0B的火灾报警应用层数据传输方法
【技术领域】:
本发明涉及一种基于CAN2.0B现场总线应用协议的数据传输方法,特别是一种应用在火灾报警控制领域中的应用层数据传输方法。
【背景技术】:
随着大型群体建筑越来越多地出现,在地理空间火警探测、消防设备联动控制等方面对自动火灾报警系统提出了越来越高的要求。大型建筑群使得地理描述信息变大,火灾探测点变多,设备联动控制变复杂。同时,由于通讯距离变得越来越远,使得通讯的延迟和环境的干扰加大,造成信息传输的实时性、准确性与可靠性降低。这些都需要报警主机能够驱动和管理更多的驱动回路板,报警主机和报警主机之间联网在快速准确可靠传输的前提下来满足通讯信息量的增加和通讯距离的增加。
传统的做法是使用R8485通讯方式实现通讯主机与通讯主机,通讯主机与驱动回路板之间的连接。RS-485标准是电子工业协会EIA于1983年制订并发布的。它只规定了平衡驱动器和接收器的电特性而没有规定接插件传输电缆和应用层通信协议,同时,在RS-485总线上只能有一个节点作为主机,其他节点只能作为从机,无优先级发送。这些本质因素导致RS-485协议存在总线效率低,系统的实时性差,通讯的可靠性低,后期维护成本高,网络工程调试复杂,传输距离不理想,单总线可挂接的节点少,应用不灵活等缺点。
控制器局域网(Controller area network简称CAN)是德国Bosch公司于1983年为汽车应用而开发的,能有效支持分布式控制和实时控制的串行通讯网络,1991年,该公司推出CAN2.0标准。1993年11月,国际标准化组织ISO正式颁布了控制器局域网CAN国际标准(ISO11898)。与其他总线相比有如下特点:①.它是一种多主总线,即每个节点机均可成为主机,且节点机之间也可进行通信;②.通信介质可以是双绞线、同轴电缆或光导纤维,通信速率可达1Mbps;③.CAN总线通信接口中集成了CAN协议的物理层和数据链路层功能,可完成对通信数据的整帧处理,包括位填充、数据块编码、循环冗余校验、优先级判别等项工作;④.CAN协议对通信数据块进行编码。数据块的标识码可由11位(CAN2.0A)或29位(CAN2.0B)二进制数组成,因此可以定义211或229个不同的数据块;⑤.数据段长度最多为8个字节;⑥.CAN协议采用CRC检验并可提供相应的错误处理功能,保证了数据通信的可靠性。
CAN技术规范(2.0B)将每帧的数据传输分层(数据链路层[逻辑链LLC子层、媒体访问控制MAC子层]和物理层)处理。LLC子层主要功能:为数据传送和远程数据请求提供服务,确认由LLC子层接收的报文实际已经被接收和为恢复管理、通知超载提供信息。MAC子层主要功能:保证传送规则(控制帧结构、执行仲裁、错误检测、出错标定、故障界定),它由一个称之为故障界定的一个管理实体监控。数据链路层由称之为CAN协议控制器的专用IC(如MCP2510,SJA1000、82C200等)或带有CAN协议控制逻辑单元的MCU(如8XC592)来完成;物理层由称之为CAN驱动器的专用IC(如82C250)来完成。
由于CAN2.0B标准规定一个数据帧最多传输8个字节,而在当前大型火灾报警系统中报警和联动信息的长度远远大于8字节;同时,节点的在线检测,系统时钟同步,状态同步等信息在火灾报警系统中也是必须的。因此,单靠CAN2.0B标准,无法适应当前火灾报警系统的需要,这就需要应用层协议来保证这些数据信息快速可靠传输。
【发明内容】:
本发明的目的就是为了解决以上问题,提供一种能适用于火灾报警系统,基于CAN2.0B的火灾报警应用层数据传输方法。
为实现上述目的,本发明提出一种基于CAN2.0B的火灾报警应用层数据传输方法,包括如下步骤:
A、计算本次自定义信息包或整个文件的长度,根据数据帧最大允许长度、信息层数据包最大允许长度、本次传输的数据长度,构建信息层数据包;
B、构建标识符,将数据帧ID标识符的29bit分成至少四个区域,分别为信息包类型域、发送源地址域、接收目的地址域、信息包数据帧号域;
C、确定本次数据包的发送方式;以每个不大于8字节的数据帧为单位根据上述标识符中的接收目的地址域向其提供的目的地址发送信息层数据包;
D、接收节点接收到完整的信息包后,在指定时间内,根据标识符中的发送源地址域向发送源地址发送响应信号,确认数据已接收,本次发送成功,进入下一个信息包发送状态。
上述的传输方法中,步骤C)中发送方式信息被构建在首个信息层数据包的信息数据包类别中,包括单帧发送和多帧发送方式。所述单帧发送方式的步骤:判断首个信息层数据包的信息包类别,当该值表明本次发送为单帧数据信息包时,根据上述标识符中的接收目的地址域向其提供的目的地址发送至少标示有信息包时间戳、用户自定义数据的信息层数据包。所述多帧发送方式的步骤为:判断首个信息层数据包的信息包类别,当该值表明当前数据包需要多帧发送时,则进一步判断当前信息包长度等信息;将信息层数据包分帧、分包发送。在多帧发送方式中,当整个文件的长度大于一个信息层数据包最大允许长度时,在信息包包号域标识为零的首个信息层数据包中还标示有整个数据文件长度信息和当前信息包包号信息;发送时将整个文件分成多个信息层数据包、每个数据包分成多帧数据帧传输。
上述的传输方法,还包括超时重发机制,即在指定时间内发送节点未接收到接收节点发送的确认接收信息时,发送节点自动启动重发,直至发送节点接收到接收节点发送的确认接收信息,或重发次数已达到预定的最大重发次数。所述重发机制还包括判断重复包的方法:接收节点判断发送节点发送来的信息包标示的信息包类型域和时间戳,当二者与已收到的某个信息包中的信息包类型域、时间戳分别相同时,则认为本次接收到的信息是重复包,丢弃该重复包。
上述的传输方法,还包括节点故障检测机制:总线上每个节点在其空闲时,定期向与之有联系的节点发送在线信号,每个节点都有一组与之相联系的节点在线计数器。每个计数器在上电和恢复的时候设置初值,当收到某个节点的在线信号数据包时,计数器执行一次正向运算,直至某个预定值;同时周期性地对计数器执行一次与前述正向运算方向相反的反向运算,当计数器的值为0时,则报出该节点通讯故障。节点故障检测机制的优选方案是:发送在线信号的时间间隔小于周期性减计数器的时间间隔,计数器在上电和恢复的时候设置非零初值,所述节点计数器收到某个节点的在线信号数据包时,执行一次正向运算加1,直至一个预定的最大值。同时周期性地对每个节点在线计数器执行一次反向运算减1,当计数器的值减到0时,报出该节点通讯故障。
上述的传输方法,还包括缓冲区重触发机制:对于在所述超时重发机制中发送失败的信息包,发送节点开辟一个新的缓冲区保存这些信息包,当该节点处于发送空闲状态时,该节点尝试重发这些信息包。
由于采用了以上的方案,可以根据传输信息的长度来构建信息层数据包,同时构建的数据帧标识符包括信息包类型域、发送源地址域、接收目的地址域和信息包数据帧号域,便于定义传输信息的优先级别,克服CAN协议中没有包含发送源地址和目的地址域的不足,可以适用于火灾报警控制系统;接收节点的应答机制保证数据传输的可靠性。
其次,采用多帧传输、或整个文件多个信息层数据包、多帧传输,满足系统中长度超过8个字节的信息层数据包、长度超过单个信息层数据包最大允许长度的文件的传输。在数据传输中还采用超时重发机制、节点故障检测机制、缓冲区重触发机制等,可以进一步保证数据传输的准确性、有效性。
【附图说明】:
图1为本发明的一种实施方法的CAN信息包在发送节点的发送流程图;
图2为本发明的一种实施方法的CAN信息包在接收节点的接收流程图;
图3为采用本发明方法的火灾报警系统中的联网示意图;
图4为应用本发明方法的火灾报警系统中回路驱动板与报警主机之间的数据结构示意图;
图5为本发明方法的火灾报警系统报警主机之间的数据结构示意图。
【具体实施方式】:
下面通过具体的实施例并结合附图对本发明作进一步详细的描述。
1.应用层协议数据包格式的构建:
CAN2.0技术规范中将数据帧ID分为标准(A)和扩展(B)两种方式。其中标准方式包括11Bit位,扩展方式包括29Bit位。总线发送仲裁由ID标识符的组成相关,ID的数值越小,则该数据帧的优先级越高,该发送节点在总线仲裁中越容易抢占总线,数据帧发送完成的延时越小。本火灾报警应用层协议采用CAN2.0B标准。将数据帧ID29bit位分成4个区域,信息包类型域、发送源地址域、接收目的地址域、信息包的包号域。定义数据帧ID标识符和节点地址如下:
ID28 |
ID27 |
ID26 |
ID25 |
ID24 |
ID23 |
ID22 |
ID21 |
ID20 |
ID19 |
ID18 |
ID17 |
ID16 |
ID15 |
ID14 |
ID13 |
ID12 |
ID11 |
ID10 |
ID9 |
ID8 |
ID7 |
ID6 |
ID5 |
ID4 |
ID3 |
ID2 |
ID1 |
ID0 |
基本ID标识符域 |
扩展ID标识符域 |
信息包类型域(8位)INFO_ID |
发送源地址域(8位)SRC_ADDR |
接收目的地址域(8位)DEST_ADDR |
信息包数据帧号域(5位)INFO_ORDER |
A |
A |
A |
A |
注:A表示该域目前已经使用,根据应用可填充不同的数值。 |
信息包类型域(INFO_ID):为了表示传输信息的优先级别,将数据帧ID的最高8位定义位信息包类型,比如火警信息、反馈信息、故障信息、握手信息、时钟同步信息,越重要的信息其信息包ID值越小;ID21=0表示发送节点向接收节点发送信息包,ID21=1表示接收节点对ID20=0的信息包的响应(成功),数据域为接收数据零帧的第一个字节-发送信息包的时间戳和信息包类别(后面将详细说明)。接收节点接收到ID21=1的信息包时,不再向发送节点发送响应信息(否则将产生递归)。由此可以看出,数据信息包的INFO_ID为偶数,它的ACK包的INFO_ID为奇数。比如,08为系统恢复ID,14为系统状态、时钟同步、节点在线ID,32为系统火警ID,64为系统故障ID等。
发送源地址域(SRC_ADDR)和接收目的地址域(DEST_ADDR):这两个地址域都占用8位,分别表示数据帧的发送节点和接收节点地址,所以在一条总线上最多256个节点。CAN协议中数据块中没有包含源地址和目的地址域,在火灾报警控制领域必须以地址区分各节点和分发数据流,所以在数据帧ID的该区间定义数据包的源地址和目的地址。接收节点CAN控制器每接收到一个CAN数据帧,都会向主微处理器申请中断。为了减少总线节点主微处理器和CAN控制器之间不必要的开销,提高主微处理器的使用效率,将CAN控制器的滤波和屏蔽寄存器设置成只允许发送到本节点的数据帧通过和向微处理器申请中断处理。
信息包的数据帧号域(INFO_ORDER):此域占用5bit位。许多数据信息都大于一个CAN数据帧最大传输的8字节,因此应用层协议是一种多帧传输协议。在应用层协议中,一个数据包的信息由多个CAN数据帧组成。 当此域为零时,具有特殊含义,1-31的意义相同,表示信息包的数据帧序号:
INFO_ORDER | 含义 |
0 |
表示本帧数据或后INFO_O |
DATA1 |
DATA2 |
DATA3 |
DATA4 |
DATA5 |
DATA6 |
DATA7 |
DATA8 |
备注 |
XXXX0000 | 用户自定义数据格式(如回路驱动板上报主机的火警、反馈、故障等小数据量信息)。 | 单帧数据信息包。含义 |
|
续帧的意义。 | XXXX0001 |
当前信息包长度 | | | | | | |
长度小于248字节的信息包。 |
XXXX0010 | 当前信息包长度 | 当前信息包包号 | 整个数据文件长度 | |
长度大于248字节的信息包(文件),非最后一个新信息包数据。 |
XXXX0011 | 当前信息包长度 | 当前信息包包号 | 整个数据文件长度 | |
长度大于248字节的信息包(文件),最后一个信息包数据。 |
1-31 |
只有在INFO_ORDER=0数据帧出现以后,这些数据帧才可能出现。DATA1-DATA8为用户自定义数据。 |
在上表中①.整个数据文件长度为文件大于一个信息包时的长度,当小于等于一个信息包时,若采用XXXX0011模式传送则其值等于当前信息包长度,并且当前信息包号为0。②.当前信息包数据帧号从0开始计数。③一个信息包的最大长度位248字节,各种应用可根据实际规定信息包的最大长度。
2.信息层数据包的构建:
在CAN数据帧数据准确传输的情况下,大于一个数据帧的数据需要用信息层协议来保证数据的可靠传输。大于一个数据帧的数据必须分成许多个数据帧来发送或接收。下面是具体协议:
每一个数据帧都有一个ID标识符,从上面的ID标识符的BIT位分配可知,ID4-ID0为信息层数据帧的帧序号,同时对数据帧序号为不同数值的含义作了说明:
INFO_ORDER=0XXXX为4Bit宽度,表示发送的信息包时间戳。当发送节点超时重发信息包时,该域的数据不变。当发送信息包成功后,发送下一个信息包时,此域加一,表示不同的信息包。 |
表示此数据帧为信息包数据的开始(信息包数据可以在一个数据帧结束),此帧数据的具体意义依赖DATA1的值:DATA1=xxxx0000 表示此信息包数据仅仅包含在此数据帧中,后面7字节的数据的含义由用户自己定义;DATA1=xxxx0001表示此信息包的数据大于7字节,必须由多个数据帧传输,同时此信息帧的最大长度小于8*31=248字节。DATA2的值表示此信息包的长度。发送程序和接收程序必须依靠此值来判断此信息包是否发送完成。DATA1=xxxx0010表示传送的数据量(文件传输)不能由一个信息包完成,必须由多个信息包来分段传输。DATA2的值为本信息包的数据长度。DATA3*256+DATA4为在此次文件传输中,当前信息包的包序号。DATA5*65536+DATA6*256+DATA7为此次文件传输的长度。当前信息包包序号从零开始计数。因此文件传输的最大长度为248*65536=16,252,928字节。此信息包类型用于传送大于信息包最大长度的数据,并且是非最后一个信息包。DATA1=xxxx0011表示传送的数据量(文件传输)不能由一个信息包完成,必须由多个信息包来分段传输。DATA2的值为本信息包的数据长度。DATA3*256+DATA4为在此次文件传输中,当前信息包的包序号。DATA5*65536+DATA6*256+DATA7为此次文件传输的长度。当前信息包包序号从零开始计数。因此文件传输的最大长度为248*65536=16,252,928字节。此信息包类型用于传送大于信息包最大长度的数据,并且是最后一个信息包。DATA1=其他保留。 |
INFO_ORDER=1-31 |
表示组成此信息包的各帧数据。DATA1-DATA8全部可用作有效数据的传输。接收节点可以根据Info_Order的值来判断当前帧是否为重复数据帧或者掉帧数据。同时由Info_Order=0的数据帧所带的信息包长度信息来判断是否信息包已发送完成。 |
3.接收节点应答机制:
应答和超时重发机制是控制流量和准确可靠传输的基础。接收节点接收到一个完整的信息包后,必须向发送节点发送ACK响应信号表示该信息包已被完整接收。ACK信息包的INFO_ORDER=0。数据长度为2,数据内容为接收信息包数据零帧的第一个字节DATA1(时间戳和信息包类别)。ACK信息包类型(INFO_ID)为接收信息包类型加1。比如,如果火警信息包的INFO_ID=10,则火警信息包的ACK包的INFO_ID=11。
INFO_ORDER | 含义 |
0 | |
DATA1 |
DATA2 |
ATA3-DATA |
备注 |
XXXX0000 |
时间戳和信息包类别(等于接收信息包数据Info_order=0的CAN数据帧的第一个字节) | |
单帧数据信息包。 |
4.超时重发机制:
当发送节点发送完一个信息包数据时,等待接收节点发送ACK确认接收信息。在指定的时间间隔内,如果没有收到接收节点的ACK信号包,发送节点启动超时重发机制。当重发次数达到最大重发次数时,发送失败。目前,发送超时间隔为2.5秒,最大重发次数为5。
接收节点收到同一发送节点发送来的INFO_ID相同并且时间戳也相同的信息包时,认为是发送节点由于重发机制发送的重复包,必须丢弃该重复信息包。否则,许多命令动作(如恢复、消声等)可能发生多次。
5.发送节点和接收节点对信息包发送和接收的处理:
发送节点1(数据优先级低,先启动数据发送) |
发送节点2(数据优先级高,后启动数据发送) |
接收节点 |
整理待发送数据 | | |
发送Info_order=0数据帧 |
接收发送节点1Info_order=0的数据帧 |
发送Info_order=1数据帧 | |
接收发送节点1的Info_order=1的数据帧 |
… |
… |
发送Info_order=N数据帧 |
整理待发送数据 |
接收发送节点1的Info_order=N的数据帧 |
微处理器向CAN控制器送Info_order=N+1数据 |
发送Info_order=0数据帧 |
接收发送节点2的Info_order=0的数据帧 |
|
发送Info_order=1数据帧 |
接收发送节点2的Info_order=1的数据帧 |
发送Info_order=N+1数据帧(可能由于发送节点2发送Info_order=2的数据帧而使该节点保持发送未决状态) |
微处理器向CAN控制器送Info_order=2数据(如果该操作足够快,也可能形成和发送节点1竞争总线的情况,由总线总裁机制保证Info_order=2的数据帧发送) |
接收发送节点1的Info_order=N+1的数据帧或接收发送节点2的Info_order=2的数据帧 |
… |
发送Info_order=N数据帧 |
接收发送节点2的Info_order=N的数据帧 |
发送完毕,等待接收节点的ACK确认数据帧 |
… |
向节点1发送ACK确认数据帧 |
… |
发送完毕,等待接收节点的ACK确认数据帧 |
向节点2发送ACK确认数据帧 |
①收到ACK确认,发送成功。进入下一个信息包发送状态。②超时为收到ACK确认,重新发送该信息包。 | … | … |
… |
①收到ACK确认,发送成功。进入下一个信息包发送状态。②超时为收到ACK确认,重新发送该信息包。 | … |
… |
… |
… |
6.握手信息包、状态信息包和时钟同步信息包-在线信息包:
这些信息包都是数据长度小于7字节的数据包,能够在一个CAN2.0B协议数据帧中传送完毕,发送和接收机制和其他一般的数据信息包相同。使用相同的Info_ID,其值为14。这三种信息包都属于在线握手信息包。每个节点根据自身的性质和系统的需要,向总线上的其他节点定期发送这三种信息包中的三种、二种或一种。下表为这三种信息包内容的具体含义:
|
信息包类别 |
信息包性质 | 信息包内容 | 备注 |
DATA1 |
DATA2 |
DATA3 |
DATA4 |
DATA5 |
DATA6 |
DATA7 |
DATA8 |
名称内容 | X0 | 00 | 年 | 月 | 日 | 时 | 分 | 秒 | 长度为8,由一个数据帧组成,时钟同步信号 |
字节长度 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
名称内容 | X0 | 01 | | | | | | | 长度为2,由一个数据帧组成,握手信号 |
字节长度 | 1 | 1 | | | | | | |
名称内容 | X0 | 02 |
隔离状态 |
一般联动 |
远音联动 |
手控联动 |
火警状态 |
故障状态 | 长度为8,由一个数据帧组成,状态信号 |
字节长度 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
由上表可知,所有的DATA1字节数据为X0,表示在线信息包由一个CAN2.0B数据帧组成。DATA2表示在线信息包的性质,并且根据系统的需要扩展出更多类型的在线信息包。
7.节点故障检测:
CAN2.0B协议规定,CAN控制器负责检测每一个数据帧的发送和接收错误。并且任何检测到错误的节点会标出该报文已损坏,该报文会失效并将自动开始重新传送,同时错误计数器的数值将增加。当错误计数器增加到一定的数值时,向主微处理器报告错误告警。这些机制保证了CAN报文的准确传送。但CAN协议对数据报文使用编码(11位或29位)标志,没有节点地址概念,如果一个节点发生故障(如掉电、分叉总线接触不好),其他节点有可能不知道该节点已发生故障,在消防规范中规定,在其他节点(主机)必须显示该节点故障。因此,必须使用更完善的节点故障检测机制。
本协议采用以下规则检测节点故障:总线上的每个节点在其空闲的时候定期向与之有联系的节点发送在线信号(前面的三种在线信号),每个节点都有一组与之相联系的节点在线计数器。每个计数器在上电和恢复的时候设置初值,当收到某个节点的数据包时,某节点计数器值加1,直至一个最大值(由检测故障的时间范围和间隔决定)。同时周期性地(比如500毫秒)对每个节点在线计数器值减1,当计数器的值减到0时,报出该节点通讯故障。发送在线信号的时间间隔要小于周期性减计数器的时间间隔。这样,每个节点都可以知道某个节点发生故障并显示。
8.缓冲区重触发机制:
对于发送(超时重发)失败的信息包,发送节点开辟一个新的缓冲区保存这些信息包,只要该节点处于发送空闲状态,该节点将尝试重发这些信息包。这样,对于那些重新上电或其他原因暂时不能接收的节点,一旦处于正常状态,仍然能够接收到这些信息包。缓冲区的大小可根据系统需要设置。
在图3中,列出了由两条CAN总线组成的火灾报警系统网络结构示意。在报警主机联网的CAN总线上,每台主机通过主板上的CAN驱动器82C250、CAN控制器MCP2510和中央处理器S3C44B0X和其他主机交换相互信息。在回路驱动板CAN总线上,回路驱动板通过CAN驱动器82C250、CAN控制器SJA1000和微处理器8051交互信息。当回路驱动板检测到一个火警发生时,将发生该火警的探测器物理地址和火警类型通过火警信息包1的形式传送给该回路驱动板的报警主机,然后报警主机收集整理更多的信息,组装成火警信息包2的形式,向其他主机转发。网络上的每台主机收到火警信息后,进行联动运算处理,结合联动使能状态,对相应的模块给出动作指令。
图4和图5分别为回路驱动板上报的火警数据结构(火警信息包1)和报警主机之间传输的火警数据结构(火警信息包2)。由图可知,回路驱动板上报的火警数据信息长度为4字节,小于7字节,该火警数据信息可以在一个CAN协议的数据帧中传输完毕,主机之间的火警数据长度为70字节,根据本发明的应用层数据传输方法上述实施例需要10个CAN协议数据帧才能传输完毕。
图1和图2分别为发送节点发送数据信息包和接收节点接收数据信息包主要流程示意图。回路驱动板向主机上报火警时,需要将火警数据打包成火警信息包1的形式:29位的帧标识符由INFO_ID,SRC_ADDR,DEST_ADDR,INFO_ORDER组成。该CAN协议数据帧的长度(DLC)设置为5,DATA1的数值为xxxx0000,其中xxxx表示信息包的时间戳,范围从0-15取值,发送节点每成功发送一个信息包,xxxx的数值将加1;0000表示信息包的类别,表示该信息包的数据长度小于7。4个字节的火警数据包含在随后的DATA2-DATA5中。DATA1-DATA5为CAN数据帧数据的有效内容,因此长度(DLC)设置为5。主机之间的火警信息包2的形式为:29位的帧标识符与火警信息包1构成基本相同,由于需要传输多个CAN协议数据帧,在INFO_ORDER的范围从0-9取值。DATA1的数值由于所传输的火警数据内容为70字节,大于7字节而需要设置成xxxx0001。当INFO_ORDER的数值为0时,CAN协议数据帧长度(DLC)为2,DATA2的数值为70,表示火警信息包2的长度。当INFO_ORDER的数值从1-8时,CAN协议数据帧长度(DLC)为8,DATA1-DATA8的数值依次由主机之间的火警数据填充。当INFO_ORDER的数值为9时,剩下的火警数据为6字节,为该信息包的最后一帧数据,CAN协议的数据帧长度(DLC)为6,将剩下的6字节火警数据填充到DATA1-DATA6。
发送节点根据发送流程将数据信息包发送到接收节点,接收节点根据接收流程接收数据信息包。接收节点的ACK应答机制、发送超时机制和缓冲区重触发机制将保证数据准确可靠的发送。