4.2.3 实现50ms时限
在发送命令的过程中,程序利用Timer1控件定时,中断后通过调用信息发送子函数实现主机对各个从机的轮巡查询。在子函数中,程序利用Output属性发送查询命令,之后,不用检测CommEvent属性值,而是启动另一个定时器控件Timer2(间隔属性设置为10ms),直接利用Input属性从接收缓冲区读取字符串,每隔10ms读取一次,循环接收从机应答字符串,直至达到最大时限(50ms)。
该定时器事件是程序的核心,它不仅实现了50ms接收时限,而且在这里对接收到的响应数据帧进行有效性判别和应答。该段程序流程图如图5所示。
图5 定时器Timer2事件过程流程图
Fig.5 The event process flowchart of Timer2
图中,REVOK—处理mbEvent所代表的事件;mbEvent=0—正常接收并进行数据解析;mbEvent=1—地址错误;mbEvent=2—功能码错误;mbEvent=3—CRC16校验错误;i—循环变量。
4.2.4 安全数组实现循环接收
主机接收从机的响应数据时,通过启动定时器Timer2,每隔10ms对输入缓冲区中的数据进行一次读取,直至最大时限(50ms),实现了循环接收输入缓冲区中的数据。根据下位机的回送的数据信息,上位机解析所接收的数据,并进行必要的处理。一般而言从下位机发送的数据都有一定的帧长度,特别是对于一些固化好的智能仪表。因此最好的方法是按照通信回送的帧长度,在上位机程序中分别开辟两个数组。一个为安全数组,设为动态数组,用来循环接收串口缓冲区中的数据;另一个作为接收数组,长度为回送数据帧长度,用来复制接收安全数组中的数据并进行解析。这样可以提高整个系统的容错能力。具体代码(写在定时器事件中)如下:
Dim inputbuf(14) As Byte ’接收数组
Dim inputsafebuf() As Byte ’安全数组
Dim a As Integer
Dim index As Integer
a = 0
……
Private Sub Timer2_Timer()
Inputsafebuf = MSComm1.Input ’将输入缓冲区中的数据放入安全数组中
For index = LBound(inputsafebuf) To UBound(inputsafebuf)
inputbuf(index + a) = inputsafebuf(index)
Next index ’将安全数组中的数据放入接收数组中
a = UBound(inputsafebuf) + a + 1 ’循环变量,实现循环接收
……
End Sub
代码中的inputbuf()为接收数组,而inputsafebuf()就是另外开辟的安全数组。
4.3 窗体载入事件过程
窗体载入事件(Form_Load)在程序刚开始时被调用,负责设置通信端口参数,启动定时器Timer1。主要程序代码如下:
Pravite Form_Load()
MSComm.CommPort = 1 ’设定需要使用的串口,当然这里可以用输入方式灵活设定。暂定1号端口
MSComm.Settings = “9600,n,8,1” ’设定传输的波特率和校验方式
MSComm.InputLen = 0 ’一次全部读入所需要的数据
MSComm.InputMode = comInputModeBinary ’设定为二进制的数据流方式
……
MSComm1.Portopen = True ’打开通信串口
Timer1.Interval = 100 ’设定定时器1定时值为100ms
Timer1.Enable = True ’启动定时器1
Timer2.Interval = 10 ’设定定时器2定时值为10ms
Timer2.Enable = False ’关闭定时器2
End Sub
4.4 定时器Timer1事件过程
此事件会在每1个属性值的间隔内(前已设定为100ms)被调用一次,完成主机和从机之间的周期性轮巡通信。主要程序代码如下:
Dim j As Interger
Dim n As Interger
j = 0
Pravite Timer1_Timer()
j = j + 1
n = j
If j >= 10 Then j = 0 ’周期性轮巡
SendPackage n ’调用与n号从机通信的子程序
End Sub
5 结论
在本监控系统中,RS485总线上连有10台低压智能综合保护器,所选用的传输波特率为9600bps,保护器中的动态信息数据可以在PC机上实现每隔1s更新一次。对于保护器中的其他数据信息,发送与接收数据帧最大不超过60byte,因此,该通讯软件完全能够满足传输过程中的稳定性、可靠性和准确性。但在实际通讯的过程中,可根据工业现场的具体情况调整传输波特率和轮巡周期的长度。
本文设计的通信软件已应用于低压配电监控系统中,实践证明本系统能够正常运行,上位机与下位机的通信稳定可靠,软件使用方便,实现了对综合保护器DYZB-101A的智能化控制,有效地降低了工业现场的故障发生率。本通信协议和通信软件也有一定的通用性,提供了一个对于工厂、电厂、工业监控系统简单实用的通信软件。