关键字:智能仪表;Modbus协议;VB 6.0;分布式监控系统;串口通信
Monitoring System Based on VB
SHI Fei, CHEN Xing
Abstract: In the field of industry automation control system, in order to realize real-time control and management by communication of computer and intelligent instrument, on the basis of the analysis of Modbus-RTU protocol and the communication principle, this paper gives a method which uses the component MSComm and Timer provided by VB. This method establishes a low cost distributed monitoring system by integrating an application. This system is easy to use and good for compatibility and portability, also have some value on the communication realization in the systems which are control by intelligent instrument and host computer. Moreover, it has been used in petrochemical enterprise successfully and improved the level of intelligent control and the production efficiency of the enterprise effectively.
Key Words: intelligent instrument; Modbus protocol; VB 6.0; distributed monitoring system; serial communication
1 引言
分布式监控系统(DMS)已在工业领域得到广泛应用,许多企业对于中小规模的设备,出于硬件软件投资利润率和性能价格比的考虑,常常是自行开发或参与开发本企业的监控系统。分布式监控系统以微机为基础,用数据通信将微机连在一起实现数据共享,从而对工业过程进行集中监视管理和分散控制[1]。
本文的实例为低压配电监控系统,随着自动化大规模生产时代的到来,生产现场往往同时运转着上十台甚至数十台电动机,往往需要对这些电动机的运行参数进行集中监控,以便操作人员及时发现故障并进行处理。现采用计算机+智能仪表的方案,由上位机定时对下位机采用轮巡的方式进行数据采集。上位机和下位机之间采用RS485总线进行通信,现场智能Modbus仪表挂在RS485总线上,上位机通过RS232/485转换器与RS485总线相连,采用VB编程语言,通过Modbus协议用串口与智能仪表进行通信,在控制成本的情况下,组成一个小型分布式监控系统。
2 监控系统概述
系统采用主从式点对点的通讯方式,由现场智能仪表和1台PC机组成,其中现场智能仪表采用天津东泰科技发展有限公司生产的DYZB-101A型低压智能综合保护器。由于本系统的智能电子设备通讯是通过RS485总线的,因此采用特征阻抗为120Ω的屏蔽双绞线连接。PC机一般没有RS485接口,但都有RS232串行接口,因此采用一个RS232/485转换器,可将RS232串行接口直接转换成RS485接口,再通过RS485总线与智能仪表相连。在串行通讯中,主要借助VB开发平台下的MSComm、Timer控件来设计。其中智能仪表对所检测的电力系统进行在线检测,检测电网的电流、电压、视在功率、启动次数、运行时间、频率等状态信息。PC机通过网络可以实现对仪表的数据读取、诊断、测试、参数更新等,轻松实现遥测、遥信、遥控。
图1 监控系统结构图
Fig.1 The structure of monitoring system
3 Modbus通讯协议简介
Modbus协议是MODICON公司开发推行的通信协议,已经成为一种广泛应用于工业自动化控制器上的标准通信协议。通过该协议,不同厂商生产的控制设备可以进行工业网络互联,从而实现集散控制[2]。
Modbus协议采用主从工作方式,允许一台主机和多台从机通信,每台从机地址由用户设定,地址范围为1-255。通信采用命令/应答方式,每一种命令帧都对应一个应答帧。命令帧由主机发出,所有从机都将收到报文,但只有被寻址的从机才会响应相应命令,返回相应的应答帧。图2是一个完整的主从查询-回应周期。
图2 主从查询-回应周期表
Fig.2 The periodic table of master salve query-response
3.1 Modbus协议通讯模式
Modbus通讯协议有两种传送方式:RTU方式和ASCII方式,两种方式如下所示:
ASCII模式:当控制器设为在Modbus网络上以ASCII(美国标准信息交换代码)模式通信,在消息中的每个8Bit字节都作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。
RTU模式:当控制器设为在Modbus网络上以RTU(远程终端单元)模式通信,在消息中的每个8Bit字节包含两个4Bit的十六进制字符。这种方式的主要优点是:相对于ASCII模式,RTU模式表达相同的信息需要较少的位数,且在相同通讯速率下具有更大的数据流量。因此通常情况下,一般工业智能仪器仪表都是采用RTU模式的Modbus规约。本文采用的是Modbus RTU模式。
3.2 Modbus RTU消息帧格式
使用RTU模式时,消息发送至少要以3.5个字符时间的停顿间隔开始(如表1中的T1-T2-T3-T4所示)。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0-9,A-F。网络设备不断侦测网络总线,当第一个域(地址域)接收到,每个设备都进行解码以判断是否发给自己。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始[3]。
整个消息帧必须作为一连续的流传输。如果在帧完成之前有超过3.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前一消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC 域的值不可能是正确的。一典型的RTU模式的消息结构如表1所示。
表1 RTU模式的消息帧结构
Tab.1 The message frame structure of RTU mode
3.3 Modbus基本规则
(1) 所有RS485通讯回路都应遵照主/从方式,依照这种方式,数据可以在一台主机(如PC机)和多台从机(如DYZB-101A)之间传递,从机数量应限制在32个以内。
(2) 主机初始化和控制在RS485通讯回路上传递的所有信息。
(3) 任何一次通讯都不能从从机开始。
(4) 在RS485回路上的所有通讯都以“信息帧”方式传递。
(5) 如果主机或从机接收到含有未知命令的信息帧,则不予以响应。
主机为主动通信方式,通信开始后主机依次查询各从机并等待从机的应答,主机发出某一询问码后,必须在一段时间内接收到对应从机的应答。当通讯命令发送至仪表时,符合相应的地址码的设备接收通讯的命令,读取信息,如果没有出错,则执行相应的任务,然后把执行结果返送给主机。返送的信息中包括地址码,执行动作的功能码,执行动作后的数据以及错误校验码(CRC或LRC)。如果出错就不发送任何信息。如果主机在规定的接收时间内没有收到对应从机的任何有效的应答,则可以认为该从机通信故障,从下一个从机继续询问。
4 主机通信软件设计
DYZB-101A型低压智能综合保护器适用于交流400V低压电力系统,作为低压电动机的保护、检测设备。该智能仪表中的数据信息主要分为动态信息、查询信息和控制信息。动态信息包括电流、电压、功率等信息;查询信息包括启动次数、运行时间、开关状态、报警等信息;控制信息包括对时、启动、设置参数等信息。上位机监控系统在获取智能仪表中的各类信息时,主要是采用轮巡的方式,由于不同的数据信息对实时性的要求不同,因此上位机可针对各类不同的数据信息进行周期性轮巡和非周期性轮巡,其中周期性轮巡可根据实际需要设置不同的轮巡周期。本文将以对智能仪表中实时性要求较高的动态信息为例来讨论上位机通讯软件的实现[4]。
4.1 MSComm控件与串行通信
RS232/485转换器将RS232信号转换成RS485信号进行传输。对于主机来讲,通信软件就是对RS232串行通信端口进行编程。
主机通信软件采用Windows环境下的VB 6.0进行编程。Windows操作系统在底层实现了和串行通信有关的很多复杂的工作,它自动将所有接收到的字符放到接收缓冲区中,而所有发送的字符也都进入发送缓冲区中。程序可读取接收缓冲区的数据,或者向发送缓冲区发送数据。VB6.0是微软公司开发的一种可视化编程工具,具有界面友好、编程方便、简单易行等特点。VB6.0与Windows系统有着非常完美的接口,可据以设计系统的内建及外挂控件更是众多。同时,VB6.0还提供了一个非常方便的通信控件MSComm。应用程序嵌入MSComm控件,通过MSComm控件提供的事件驱动或查询方式来进行串行通信管理[5, 6]。
编写RS485网络通信程序很少用事件驱动方式,而多采用查询方式。本程序使用的方法对常用的查询方式进行了简化,不用检测CommEvent属性值,节省了程序运行时间。
4.2 编程要点
4.2.1 实现校验
主机发送查询命令或接收从机应答数据时,校验码的计算是通过调用函数fun_SerialCRC()实现的。函数fun_SerialCRC()放在程序模块中。
CRC校验的软件实现有两种方法:一种为计算法;另一种为查表法。计算法就是依据CRC校验码的产生原理来设计程序的。其优点就是:模块代码少,修改灵活,可移植性好。其缺点就是:计算量大。而查表法的优缺点正好与计算法相反,因为对于固定字节CRC校验计算的多项式因子,其CRC值是固定的,因而,采用查表法可以简化计算过程、节省应答时间、提高通信效率。本文采用的是查表法,程序流程图如图3所示。
图3 CRC16查表法实现流程图
Fig.3 The flowchart of CRC16 table lookup
4.2.2 实现周期性轮巡发送
为了保证主机不断地将查询命令下达到各个从机,程序使用一个定时器控件Timer1,将Timer控件的间隔属性设置为100ms,在定时器的Timer事件过程中写入主机向一台从机发送查询信息的子程序SendPackage()。这样每隔100ms调用一次子程序,主机向一台从机完成一次命令发送。如果有十台从机,这样依次每隔100ms便查询一台从机,1s钟就可以实现对十台从机的轮巡。
如果主机是对各个从机的同一个数据信息进行查询,查询信息帧的命令内容是完全相同的,除从机地址码不同外,其格式基本相同。发送命令子程序流程图如图4所示。
图4 发送命令子程序流程图
Fig.4 The subroutine flowchart of sending command
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的智能化控制,有效地降低了工业现场的故障发生率。本通信协议和通信软件也有一定的通用性,提供了一个对于工厂、电厂、工业监控系统简单实用的通信软件。
参考文献
[1] 范逸之. Visual Basic与分布式监控系统[M]. 北京:清华大学出版社,2002
[2] 马骅,张国勋. Modbus通讯协议在液位监测系统中的应用[J]. 邢台职业技术学院学报,2004,21(3):36-38
[3] 李喜东,刘涛,刘刚. Modbus-RTU串行通信协议在工业现场的应用[J]. 自动化技术与应用,2005,24(7):37-40
[4] DYZB-101A型低压智能综合保护器使用说明书. 天津东泰科技发展有限公司,2004
[5] 范逸之,陈立元. Visual Basic与RS-232串行通信控制[M]. 北京:清华大学出版社,2002:54-110
[6] 李湘江. Visual Basic串行通信技术[J]. 电气传动自动化,2004,20(6):9-11