基于VB的分布式监控系统Modbus通信设计与实现2008-11-178:45:00史非,陈星供稿摘要:在工业自动化监控系统中,为了通过上位机与智能仪表的通信达到实时控制管理的目的,在详细分析了ModbusRTU规约及其通信原理的基础上,结合一个应用实例,给出了VB6.0编程环境下利用MSComm通信控件和Timer定时器控件实现基于该规约的计算机与智能仪表之间的串口通信编程方法,建立了低成本的分布式监控系统。该系统简单、实用,具有良好的兼容性和可移植性,对类似的由其它类型智能仪表与上位机组成的控制系统的通信实现具有一定的参考价值,并在石化企业中得到了成功应用,有效地提高了智能化控制水平和企业的生产效率。关键字:智能仪表;Modbus协议;VB6.0;分布式监控系统;串口通信DesignandrealizationofModbusCommunicationintheDistributedMonitoringSystemBasedonVBSHIFei,CHENXingAbstract:Inthefieldofindustryautomationcontrolsystem,inordertorealizereal-timecontrolandmanagementbycommunicationofcomputerandintelligentinstrument,onthebasisoftheanalysisofModbus-RTUprotocolandthecommunicationprinciple,thispapergivesamethodwhichusesthecomponentMSCommandTimerprovidedbyVB.Thismethodestablishesalowcostdistributedmonitoringsystembyintegratinganapplication.Thissystemiseasytouseandgoodforcompatibilityandportability,alsohavesomevalueonthecommunicationrealizationinthesystemswhicharecontrolbyintelligentinstrumentandhostcomputer.Moreover,ithasbeenusedinpetrochemicalenterprisesuccessfullyandimprovedthelevelofintelligentcontrolandtheproductionefficiencyoftheenterpriseeffectively.KeyWords:intelligentinstrument;Modbusprotocol;VB6.0;distributedmonitoringsystem;serialcommunication1引言分布式监控系统(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.1Thestructureofmonitoringsystem3Modbus通讯协议简介Modbus协议是MODICON公司开发推行的通信协议,已经成为一种广泛应用于工业自动化控制器上的标准通信协议。通过该协议,不同厂商生产的控制设备可以进行工业网络互联,从而实现集散控制[2]。Modbus协议采用主从工作方式,允许一台主机和多台从机通信,每台从机地址由用户设定,地址范围为1-255。通信采用命令/应答方式,每一种命令帧都对应一个应答帧。命令帧由主机发出,所有从机都将收到报文,但只有被寻址的从机才会响应相应命令,返回相应的应答帧。图2是一个完整的主从查询-回应周期。图2主从查询-回应周期表Fig.2Theperiodictableofmastersalvequery-response3.1Modbus协议通讯模式Modbus通讯协议有两种传送方式:RTU方式和ASCII方式,两种方式如下所示:ASCII模式:当控制器设为在Modbus网络上以ASCII(美国标准信息交换代码)模式通信,在消息中的每个8Bit字节都作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。RTU模式:当控制器设为在Modbus网络上以RTU(远程终端单元)模式通信,在消息中的每个8Bit字节包含两个4Bit的十六进制字符。这种方式的主要优点是:相对于ASCII模式,RTU模式表达相同的信息需要较少的位数,且在相同通讯速率下具有更大的数据流量。因此通常情况下,一般工业智能仪器仪表都是采用RTU模式的Modbus规约。本文采用的是ModbusRTU模式。3.2ModbusRTU消息帧格式使用RTU模式时,消息发送至少要以3.5个字符时间的停顿间隔开始(如表1中的T1-T2-T3-T4所示)。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0-9,A-F。网络设备不断侦测网络总线,当第一个域(地址域)接收到,每个设备都进行解码以判断是否发给自己。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始[3]。整个消息帧必须作为一连续的流传输。如果在帧完成之前有超过3.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前一消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC域的值不可能是正确的。一典型的RTU模式的消息结构如表1所示。表1RTU模式的消息帧结构Tab.1ThemessageframestructureofRTUmode3.3Modbus基本规则(1)所有RS485通讯回路都应遵照主/从方式,依照这种方式,数据可以在一台主机(如PC机)和多台从机(如DYZB-101A)之间传递,从机数量应限制在32个以内。(2)主机初始化和控制在RS485通讯回路上传递的所有信息。(3)任何一次通讯都不能从从机开始。(4)在RS485回路上的所有通讯都以“信息帧”方式传递。(5)如果主机或从机接收到含有未知命令的信息帧,则不予以响应。主机为主动通信方式,通信开始后主机依次查询各从机并等待从机的应答,主机发出某一询问码后,必须在一段时间内接收到对应从机的应答。当通讯命令发送至仪表时,符合相应的地址码的设备接收通讯的命令,读取信息,如果没有出错,则执行相应的任务,然后把执行结果返送给主机。返送的信息中包括地址码,执行动作的功能码,执行动作后的数据以及错误校验码(CRC或LRC)。如果出错就不发送任何信息。如果主机在规定的接收时间内没有收到对应从机的任何有效的应答,则可以认为该从机通信故障,从下一个从机继续询问。4主机通信软件设计DYZB-101A型低压智能综合保护器适用于交流400V低压电力系统,作为低压电动机的保护、检测设备。该智能仪表中的数据信息主要分为动态信息、查询信息和控制信息。动态信息包括电流、电压、功率等信息;查询信息包括启动次数、运行时间、开关状态、报警等信息;控制信息包括对时、启动、设置参数等信息。上位机监控系统在获取智能仪表中的各类信息时,主要是采用轮巡的方式,由于不同的数据信息对实时性的要求不同,因此上位机可针对各类不同的数据信息进行周期性轮巡和非周期性轮巡,其中周期性轮巡可根据实际需要设置不同的轮巡周期。本文将以对智能仪表中实时性要求较高的动态信息为例来讨论上位机通讯软件的实现[4]。4.1MSComm控件与串行通信RS232/485转换器将RS232信号转换成RS485信号进行传输。对于主机来讲,通信软件就是对RS232串行通信端口进行编程。主机通信软件采用Windows环境下的VB6.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所示。图3CRC16查表法实现流程图Fig.3TheflowchartofCRC16tablelookup4.2.2实现周期性轮巡发送为了保证主机不断地将查询命令下达到各个从机,程序使用一个定时器控件Timer1,将Timer控件的间隔属性设置为100ms,在定时器的Timer事件过程中写入主机向一台从机发送查询信息的子程序SendPackage()。这样每隔100ms调用一次子程序,主机向一台从机完成一次命令发送。如果有十台从机,这样依次每隔100ms便查询一台从机,1s钟就可以实现对十台从机的轮巡。如果主机是对各个从机的同一个数据信息进行查询,查询信息帧的命令内容是完全相同的,除从机地址码不同外,其格式基本相同。发送命令子程序流程图如图4所示。图4发送命令子程序流程图Fig.4Thesubroutineflowchartofsendingcomman