工业组态软件接入非标准通信协议组件的实现

2013-04-25 02:17
电子科技 2013年10期
关键词:组态王监测仪通信协议

孙 超

(西安电子科技大学 电子工程学院,陕西 西安710071)

数据采集与监视控制系统(Supervisory Control and Data Aquisition,SCADA)广泛应用于电力、石油、化工等领域,其系统包括以下几个组成部分:人机界面(Human Machine Interface,HMI)、远程终端控制系统(RTU)以及通信网络。其中RTU通过连接传感器采集数据,并将采集的数据传送给HMI;操作员可以用HMI了解系统状态,并决定是否要调整RTU的控制;通信网络则提供HMI与RTU之间传输数据的管道。监控中心的HMI组态软件与RTU终端设备,采用少数几种标准的通信协议进行通信,如果RTU终端设备采用的是这几种标准通信协议之一,则可以直接接入系统与组态软件进行通信,但如果RTU终端使用的不是这几种标准的通信协议,则无法直接与组态软件连接,并且由于涉及到许多复杂的专业计算,又使得这些设备难以被替代。为此,可采用VC++串口通信技术编写一个协议转换软件,通过对非标准协议与标准协议的互相转换来实现非标准通信协议组件的接入。

1 标准协议与非标准协议

协议转换软件能实现组态软件接入非标准协议组件需要满足两个条件:组态软件所使用的标准协议与非标准协议组件使用的协议能互相转换;VC++编写的软件能与其它软件或设备进行串口通信。

方案中的组态软件是组态王,组态王使用ModBus-RTU标准协议与RTU终端设备通信。ModBus-RTU协议按主从方式通信,系统中只有一个主机,可以有一个或多个从机,每个从机有唯一的地址。主机和从机的通讯以查询/应答的方式进行,一次通信过程由主机构建并发送查询数据帧开始。所有的从机都将查看查询数据帧中的地址并与本机地址比较:如果与本机地址不一致,则不作处理;如果与本机的地址一致,则按功能码的要求完成操作并构建应答数据帧并发送给主机,从而结束一次通信过程[1-2]。

ModBus-RTU协议数据帧的格式如图11所示。

图1 ModBus-RTU协议数据帧的格式

对于查询帧,地址码表示主机要查询哪一个从机,功能码通知从机应该执行何种操作,数据提供了为执行该操作而需要的一些附加信息,对于正常情况下的应答帧,地址码是本机的地址,功能码与查询帧相同,数据是从机按要求提供给主机的数据信息。数据校验都采用16位CRC校验方式。

方案中非标准协议组件是成都某公司生产的雷电监测仪。该雷电监测仪使用的是企业自行定义的一种485通信协议[3],该通信方式只要雷电监测仪检测到雷击事件或跳闸事件,就会自动将相应的数据帧通过485串口发送给上位机,同时上位机也可以发送指令查询历史数据。该自定义协议数据帧的格式如图2所示。

图2 雷电监测仪自定义协议数据帧格式

帧头是两个固定的字节0xaa55,长度是除帧头外本数据帧的字节数,命令表示检测到的是什么事件,数据提供了所检测到事件的检测结果,数据校验采用累加和校验方式[3]。

对比以上两种协议的通信方式和数据帧格式可知,两种协议在数据帧上具有较好的对应关系,在通信方式上存在的主要问题是ModBus-RTU协议采取主从式通信,只有在组态软件发送查询帧时,从机才能向组态软件发送应答帧,而自定义协议规定雷电监测仪只要检测到相关事件就自动向上位机发送数据帧,不会等待上位机的查询帧。为此,可以在协议转换软件中设置一个数据缓冲区,用来暂时存放接收到的数据帧,等到被查询时再发送组态软件,这样就可以实现两种协议的互相转换。

2 VC++串口通信技术

使用VC++实现串口通信[4]的方法有3种:使用MSComm控件、使用CSerialPort类或者使用Windows API函数实现串口通信。MSComm控件由微软提供,编程过程较容易,但控件内部函数不开放不透明。Windows API是所有Windows应用程序的基础,但编程过程比较繁琐。CSerialPort类是一个免费开放的串口通信类,不仅编程过程较容易,而且类函数均开放透明,允许使用者进行改造。因此,本方案的串口通信使用CSerialPort类来实现。

CSerialPort是一个基于多线程的串口通信类,其工作流程如下:首先设置好串口参数,再开启串口监测工作线程,串口监测工作线程检测到串口接收到的数据、流控制事件或其他串口事件后,就以消息方式通知主程序,激发消息处理函数来进行数据处理,这是对接收数据而言的;发送数据可以直接向串口发送[4]。

CSerialPort类定义了多个消息,但在一般的串口通信编程中只需要处理WM_COMM_RXCHAR这一个消息。WM_COMM_RXCHAR消息的功能是表示串口接收到一个字符并已放入接收缓冲区。

CSerialPort类还定义了多个函数,但在一般的串口通信编程中经常用到的是InitPort()、StartMonitoring()、StopMonitor()、CloseMonitor()和WriteToPort()。

InitPort()在串口通信过程中首先被调用。此函数的作用是初始化串口,即设置串口的通信参数:需要打开的串口号、波特率、奇偶校验方式、数据位、停止位。这里还可以用来进行事件的设定,如果串口初始化成功,就返回true,若串口被其它设备占用、不存在、或存在其它故障,就返回false,编程者可以提示串口操作是否成功。

StartMonitoring()函数一般紧跟在InitPort()之后调用。此函数的作用是启动串口监测线程,如果线程启动成功,则函数返回true。在调用InitPort()函数和StartMonitoring()函数后,串口就被打开,各种串口状态和事件就可以被检测到了。

在串口通信过程中,当需要通过串口发送数据时,可调用WriteToPort()函数。该函数的功能是写串口,即向串口发送字符。

在串口通信过程中,当需要暂停或停止串口监测时,可调用StopMonitor()函数。调用该函数后串口被暂停或停止,但串口资源仍被占用。

CloseMonitor()函数的功能是关闭串口,释放串口资源。调用该函数后,如果要继续使用串口,需要重新调用InitPort()和StartMonitoring()函数。

3 协议转换软件的实现

3.1 软件的总体结构

协议转换软件有3个线程,主线程显示主界面,用来设置参数及显示串口通信数据,两个串口通信线程分别用来与组态王和非标准协议组件通信。软件各部分功能采用模块化处理,使程序简洁易懂,便于移植。

(1)线程间数据传输模块。用于主线程与两个子线程之间传递数据。主界面上设置的参数通过全局变量传递给子线程,子线程中对参数的修改也通过全局变量反映到主界面。子线程之间的线程同步使用互斥对象(CMutex)来实现。

(2)串口通信模块。用于与组态王和雷电监测仪进行通信。监听并接收来自于组态王和雷电监测仪的数据帧,并将转换后的数据帧发送给这两个设备。

(3)协议转换模块。用于ModBus-RTU协议数据帧与雷电监测仪非标准协议数据帧的转换。将接收到的ModBus-RTU协议数据帧中的数据提取出来,按照非标准协议构造成新的数据帧,然后发送给雷电监测仪。同理,将接收到的非标准协议数据帧中的数据提取出来,按照ModBus-RTU协议生成新的数据帧,然后在被查询时发送给组态软件。

(4)数据校验模块。用于对串口接收和发送的数据帧进行校验。ModBus-RTU协议数据帧所使用的是16位CRC校验,非标协议数据帧所使用的是累加和校验。对于接收到的数据帧通过比较按照相应协议的校验方式计算的校验码与接收到数据帧中的校验码是否相同来判断接收到的数据帧是否有效;对于待发送的数据帧则按照相应协议的校验方式来计算生成该数据帧的校验码。

3.2 串口通信模块

串口通信分为串口接收和串口发送。串口发送,只要在需要发送时调用写串口函数WriteToPort()就可以将数据帧发送出去了。由于串口接收到数据帧的时间是随机的,所以需要对串口进行持续监测,以便接收到数据帧后能及时处理。串口通信线程的接收处理流程如图3所示。

图3 串口通信接收处理流程图

3.3 协议转换模块

串口接收到数据帧后将数据帧存放在数据缓存区中。当软件检测到数据缓存区中有新的数据帧时,就会启动协议转换过程。协议转换的流程如图4所示。

图4 协议转换流程图

3.4 软件的界面

软件编写好之后和组态软件一起运行于Windows平台。默认状态下软件是在后台运行的,只有在需要查看时才调出如图5所示的协议转换软件运行主界面。图5中485串口和ModBus串口用于设置协议转换软件与雷电监测仪和组态王进行通信的串口号。485接收窗口和ModBus接收窗口用于显示接收到的数据帧,以便查看软件与组态王和雷电监测仪的通信是否正常。

软件工作流程为:首先设置485串口和ModBus串口的串口号,然后打开串口开始对串口进行持续监测,如果监测到来自组态王的数据帧,则将其显示在ModBus接收窗口,然后根据组态王数据帧的指令或直接到数据缓冲区中取出新接收到的雷电监测仪数据帧,转换为应答帧发送给组态王,或者将组态王数据帧转换为符合非标准协议的数据帧后发送给雷电监测仪。如果监测到来自雷电监测仪的数据帧,则将其显示在485接收窗口,然后存放到数据缓冲区中,等待组态王的查询。

图5 协议转换软件界面

4 结束语

组态软件广泛应用于各领域的监控系统中,需要与各种使用非标准通信协议的设备互连。本文介绍了一种采用VC++串口通信技术编写一个协议转换软件来解决工业组态软件接入非标准通信协议组件的方案。该协议转换软件已在某智能化电力监控系统中得到应用,为解决组态软件接入非标准通信协议组件的问题提供了一个参考。

[1] 吕国芳,唐海龙,李进.基于ModBus RTU的串口调试软件的实现[J].计算机技术与发展,2009,19(9):236-238.

[2] 颜河恒,王晓华,佟为明.Modbus关键技术分析及节点开发[J].自动化技术与应用,2006,25(5):49-51.

[3] 四川中光防雷科技股份有限公司.ZGLF-2通信协议[M].成都:四川中光防雷科技股份有限公司,2012.

[4] 龚建伟,熊光明.Visual C++/Turbo C串口通信编程实践[M].北京:电子工业出版社,2007.

猜你喜欢
组态王监测仪通信协议
自我血糖监测仪对糖尿病患者治疗护理依从性分析
基于物联网的电压监测仪自诊断系统研究及应用
基于STM32F207的便携式气井出砂监测仪设计
一种基于数据可视化技术的便携式物联网环境监测仪
基于Z-Stack通信协议栈的红外地温采集电路设计
基于组态王软件和泓格PIO-D64 板卡的流水灯控制
液压系统电气控制虚拟实验系统的开发
基于DMX512通信协议的多路转发器设计与研究
基于NS-3的PLC多频通信协议仿真平台设计与实现
MATLAB实现组态王中TCP/IP读卡器监控方法