APP下载

滑动窗口技术在智能仪表离线交易记录上传中的运用

2019-08-29

计算机测量与控制 2019年8期
关键词:离线气机字节

(中煤科工集团重庆研究院有限公司,重庆 400039)

0 引言

工业领域中,设备仪器仪表采用RS485通信协议进行通信时,报文大致可以分为三类,通信握手类、指令类和数据类。通信握手报文一般用于诊断设备是否在线,获取设备当前的状态等。而指令类报文则包含读、写两种指令,一般通过上位机发出,让设备完成相应的动作。数据类报文则包括关键的数据信息,如加气机的加气交易等等信息。数据类报文在以上三种报文中长度最长,优先级最高,传输中所占用的资源也最多。

1.1 加气机离线交易的存储及上传

加气机完整的离线交易信息包括交易流水号、IC卡卡号、气品种类(CNG/LNG)、加气枪号、加气时长、加气气量、单价、金额、折扣等信息。离线状态下,加气机加完一笔气将会存储以下信息如表1所示,交易信息是消费、记账、扣款的唯一依据,所以必须保证所有记录在加气机恢复通讯后立即上传至后台。

当链路恢复之后,主机PC会下发索取离线交易的命令,如表2所示。

由于交易流水号必须保证唯一性,所以这里引入了交易计数器的概念,是为了合理的利用存储区资源并且进行离线交易的管理。

以基于STM32处理器的加气机主板为例,用铁电保存交易计数器的值, 将W25的存储区按照交易数据的大小等量划分为1万个存储区,每个存储区存储1组如上表2中的交易信息,编号从0~9999,用NextRecord/SendRecord标识。NextRecord的值表示下一条交易缓存区的编号,而SendRecord的值表示未上传交易缓存区的位置。

表1 加气机离线交易格式

表2 PC机获取加气机离线交易格式

未有交易产生时,NextRecord/SendRecord初始化为0。当第一条交易记录产生后,NextRecord的值为1,当此条交易记录上传至加气机后,NoSdRecord的值加1递增,表示第0个缓存区的记录已经上传,第1个缓冲区的记录还未上传。第二个交易产生后NextRecord++,上传PC成功后NoSdRecord++,以此类推,待数值达到10000时归零,以前的交易将被覆盖,存储区循环利用。

这样当离线交易产生时,NextRecord会持续累加,而NoSdRecord会保持不变,所以离线交易数目N可以用如下公式计算出来。

N=|NextRecord - NoSdRecord|

这里NextRecord+1 ≠ NoSdRecord,若相等表示缓存区已满,必须停止加气交易,待交易记录上传,缓存区腾出空间后,才能继续存储交易记录。

以一台加气机存储的最多离线交易记录条数(2万条)为例,RS485通信中常规的波特率是9600 bps,那么传输万2万条离线交易的时间大约为1个小时。

以上是信道满负荷最优情况下理论计算出的数据传输时间,最优是指单个设备与单个主机进行通讯,设备持续发送,主机持续接收,无错误报文出现。

而实际设备与主机进行通信时,为了保障数据的有效传输,往往引入了应答机制。也就是主机每次正确接收设备传输来的数据后,都要回复ACK应答包,设备收到了主机传输来的ACK应答包后,才开始下一个报文的上送。

图1 RS485数据传输应答示例

按照上文所述加气机2万条交易记录为例,传输所占的时长大约为2个小时,信道的利用率(不含ACK应答)约为50%。所以,当批量传输数据的时候,RS485的这种简单询问应答的传输机制会产生大量的时间成本,严重影响系统的实时性和可靠性。然而,TCP的滑动窗口技术能有效的解决数据传输中的时间冗余,提高信道的利用率。

2 TCP滑动窗口技术

滑动窗口协议,是TCP使用的一种流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。发送方不必每发一个分组就停下来等待确认[1]。滑动窗口协议具有加速数据传输、纠错控制和流量控制功能。

2.1 滑动窗口原理分析

滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口[2]。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧[6]。

TCP是全双工协议,发送方和接收方是对等的。对于TCP会话的发送方,任何时候在其发送缓存内的数据都可以分为4类[3]:

(1)已经发送并得到对方ACK的数据包;

(2)已经发送但还未收到对方ACK的数据包;

(3)未发送但对方允许发送的数据包;

(4)未发送且对方不允许发送的数据包。

已经发送但还未收到对方ACK的数据包和未发送但对方允许发送的数据包这两部分数据称之为发送窗口。

TCP建立连接的初始,接收方会告诉发送方自己接收窗口大小,比如10。

图3 TCP滑动窗口数据收到正序的数据

如图3所示,滑动窗口包含已发送但未收到确认的字节和允许发送但尚未发送的字节[4]。当上图中红色的区域数据都被接收到之后,那么滑动窗口将会向右移动。窗口两个边沿的相对运动增加或减少窗口的大小从而让网络数据传输避免了拥堵。

数据的接收可以分为正序或者乱序,正序是指接收方按发送方正常的发送序列接收到数据,而乱序是指接收方没有按照发送方正常的发送序列接收数据,也就是存在丢包[5]。对于丢包的乱序数据,接收方暂时存储起来,避免网络重复传输。

图4 TCP滑动窗口收到乱序的数据

如图4所示,字节(序号6、7)比字节(序号5)先收到接收方的确认,那么待字节5收到接收方的确认后,滑动窗口才会右移。

3 滑动窗口技术在RS485数据通信中的应用

图5 RS485 OSI模型结构图

RS485协议的网络层和传输层是开放式的,没有统一的标准,需要根据实际的情况自定义。由于传输是PC和加气机点对点的通信,网络层和数据链路层比较简单。同时针对加气机离线交易数据量大,占用时间多的实际情况,将TCP滑动窗口的协议引入了RS485的传输层,主要是基于提高数据传输速率,保障数据传输可靠性的考虑。

在传统RS485通信协议中,物理层、数据链路层、网络层、传输层远没有TCP强大,因为没有强大的底层协议做支撑,RS485一般在传输层实现简单的单次数据包发送的停等协议。

如上图1所示,PC机索取加气机离线交易,加气机上传单条离线交易后随即进入等待PC机发回确认ACK包的状态。

对比TCP协议中的滑动窗口,RS485发送方和接收方同时维护了一个发送缓存和接收缓存,窗口大小可以看作为1,代表1个数据包。由于发送方接收到第N个数据包的响应后,才开始第N+1个数据包的发送,那么接收方接收到的数据包必定是正序的。为了提高数据的传输速率,减少停止等待的时间浪费,有必要提高窗口的大小。

3.1 RS485采用滑动窗口模式传输离线交易

假设RS485应用层的数据传输协议采用TCP滑动窗口的方式,窗口的大小调整为N,与TCP 不同的是这里的N指的是N个数据包,而非字节数。

图6 RS485数据传输采用TCP滑动窗口模式

还以加气机离线交易数据上传为例,假设在通信效率很高的情况下,也就是主机发出的数据包,设备都能够有效响应,并且响应一次主机就能收到ACK。

图6(1)中是设备连续收到N包数据后,回复N个ACK的示例。由于RS485常用的是半双工的通信方式,所以图6(1)中,主机在收到设备的离线交易数据之后,设备线程必须停止发送数据等待主机下发的ACK响应,这种模式与图2提到的发送应答模式在效率上并无多大区别。

实际的ACK应答包很短,有效数据很少,所以完全可以用一个ACK应答包来涵盖Data(0)至Data(N-1)N包数据的应答响应,如图5中(2)所示。这种模式下ACK响应的数量从N个减为1个,效率大大提高了[8]。

表1 RS485 采用TCP滑动窗口模式ACK报文格式包头主机ID设备IDACK(0), ACK(1),…,ACK(8)ACK(N-1)包尾。

设备在发送N个数据包至主机后,立即启动定时器等待主机返回的ACK,在定时器超时之前接收到ACK组合后便对ACK包进行解析。假设N个数据包的ACK全部收到,则滑动窗口右移,进行下一组数据包的发送。如果N个数据包中,有个别数据包没有收到,则发送相应的数据包,并启动定时器接收主机发送的下一个ACK组合。

3.2 RS485采用滑动窗口纠错与流控机制

同时为了保证RS485数据传输的可靠性,引入流控、纠错的机制。

图7 RS485数据传输采用的纠错和流控机

RS485数据传输受环境因素(闪电、电磁干扰)等的影响,传输过程中会出现错包、丢包现象,为了保障数据的完整性引入错误重传机制即纠错机制。如果窗口较大,同时有多个加气机上传离线交易,PC机疲于应付的情况下,则有必要进行流量的控制。

图7(a)为本文所阐述的RS485数据传输的纠错原理图,主机和设备同时维护一个数据包为N的窗口。

(1)主机请求设备上送数据,发出Req(Req包含当前窗口序列号Q,窗口大小N,需要设备发送的数据包序列号0…N-1等),当Req发出后立即启动数据接收超时定时器,当定时器超时时触发数据包接收机制,接收机制用来统计接收到的有效数据包的个数[7]。

(2)主机接收机制判断当前的窗口Q未接收到完整的数据包,丢失了其中D(N-2)、D(N-1)两个数据包,立即启动重传机制再次发出Req(此时的Req仅包含需要重传的数据包D(N-2)、D(N-1))。

(3)当主机收到当前窗口Q所有的数据包后,发出Ack(ALL)指令,表明当前的数据包全部被有效接收,此时当前的窗口传输完成。

PC端和DEVICE同时维护一个值相同的Receive_map和Send_map[9],PC端不断查询Receive_map并把值发给DEVICE端,DEVICE端查询接收到的Receive_map(这里等于Send_map),并发送给DEVICE端[10]。当所有bitmap里面代表的当前窗口的数据包发送完成后,当次数据传输完成。为了方便起见,本例的bitmap设置为0xFFFFFFFF,每位代表一个数据包,共标志32个数据包的发送接收状态。此时的窗口大小也为32。

图7(b)为流量控制机制,当主机收到加气机发送的三个离线数据包后,出现了网络拥堵的紧急情况,主机立即发出Flow(4)流控包让对应的加气机停止上传离线交易数据,待网络恢复之后,重新发送请求报Req恢复离线交易的上传。

为了更好地阐述RS485应用滑动窗口的思想,用状态机表示以上的算法如图8所示。

图8 状态机表示RS485滑动窗口技术

这样传输N个数据包,只有1个ACK总应答包,在通信良好的情况下,信道的利用率大大提高了[11]。主机接收从机发送数据等待的时间大大减少了。并且该机制引入了纠错以及流控机制,有效避免了差错引起的拥堵以及冗余时间成本的浪费[12]。

3.3 RS485采用滑动窗口上传离线交易效率分析

RS485采用滑动窗口模式上传离线交易的协议与传统单数据包的停等协议相比,在效率上具有较大的优势,且滑动窗口越大效率愈发明显。

滑动窗口大小为Wn,数据包大小为S(字节),波特率为Boud(字节/秒)。如图9所示:

T1:主机发送数据包的等待时间

T2:数据包的传输时间

T3:数据包ACK的发送准备时间

T4:设备应答ACK的传输时间

按照图9(a)传统停等协议下,发送N个数据包,所需要的时间为:

TL=N*(T1+T2+T3+T4)

(1)

其中:T1远小于T2,而T3又远小于T4。T2和T4按照实际传输的字节数计算时间。9 600 bps波特率下,1秒钟传输1200字节数据。

按照图9(b)滑动窗口模式下,发送N个数据包所需要的时间为:

图9 两种模式离线交易上传时间统计

TH=N*(T1+T2) +T3'+T4'

(2)

其中:T1远小于T2,而T3又远小于T4',随着窗口的增大,由于T4'包含了窗口所有数据包的ACK,所以T4'将会远大于T2。

RS485信道优良的理想情况下(传输无错包或者丢包),滑动窗口模式与传统停等应答模式对比,节省的时间大约T' =TH-TL:

T'=N*(T3+T4)-(T3'+T4')

(3)

单片机一个while(1)大循环约为12 ms,每次大循环都发送一次离线交易(数据通过DMA传送)且系统其他部件需要占用的时间至少为10 ms,等待ACK占用的时间大约为10 ms。那么T3至少应该为20 ms。

在滑动窗口模式下,无需等待ACK响应,系统可以以最快的速度发送数据包,省去了中间ACK的响应时间,最后一个ACK响应包包含了之前所有的数据包的响应。

由于波特率较低,RS485的数据包一般不易过长,过长在传输中势必影响整个系统的可靠性,离线交易每条大约120字节,传输时间为100 ms。传输数据包的个数N与节省的时间T'函数曲线如图10所示。

图10 传输数据包个数N与节省时间T'坐标图

如图10所示,T'≈0.8 N,每发送一个数据包节省大概8 ms 的时间(DMA缓存开的足够大),可见数据包个数越多系统的效率就越高。

4 结束语

综上所述,可见工业设备数据通信领域,特别是RS485协议上层应用借鉴TCP滑动窗口协议可以极大地提高数据传输效率,有效的解决因通信速率低引起的数据堵塞,数据冗余,以及传输时间成本过高的问题。本文在TCP滑动窗口协议的基础上将纠错流控机制加入到RS485的传输协议当中,可以有效的提高数据传输的可靠性以及实时性。

猜你喜欢

离线气机字节
基于卷积神经网络的离线笔迹鉴别系统
No.8 字节跳动将推出独立出口电商APP
异步电机离线参数辨识方法
新版Windows 10补丁离线安装更简单
No.10 “字节跳动手机”要来了?
便携电子打气机
浅析LNG加气机工作原理及现场检定方法
寓意于气 意与气合
人类进入“泽它时代”
离线发文件 不是会员也能用