文献标识码:A
DOI:10.16157/j.issn.0258-7998.179019
中文引用格式:王毅璇,丰大军,王皓,等. 跨平台的上位机监控系统中数据通信的实现[J].电子技术应用,2017,43(10):94-98.
英文引用格式:Wang Yixuan,Feng Dajun,Wang Hao,et al. Implementation of data communicationin cross-platform supervisory control and data acquisition system[J].Application of Electronic Technique,2017,43(10):94-98.
0 引言
目前国产PLC上位机监控软件厂家有西门子、施耐德、欧姆龙、三菱、横河、台达等,各类软件均有各自的优势,在国内PLC市场占有较大的份额。然而针对不同系统平台和开发软件所开发出的上位机监控系统之间兼容性较差,不能实现跨平台的数据通信。这是由于系统平台和开发软件之间的耦合性较强造成的。
在上位机监控软件系统的最底层(即网络层),通信子系统负责与控制器间的数据通信以及操作员站之间的数据同步。通信子系统根据上位机监控软件系统中配置子系统提供的系统构成信息,通过以太网完成系统中各个站点之间的状态监控、组态同步、进程控制、文件维护等工作。而不同的PLC上位机监控系统中配置子系统提供的系统构成信息却因系统平台和开发软件的不同而不同。
数据通信子系统接管上位机监控软件系统内部上层应用软件需要的所有数据通信和文件传输,并能够以消息方式通知上层应用软件。如果系统的构成信息有差异,则会导致上位机之间传输数据的紊乱。
对此,文献[1]、[2]均通过在不同上位机软件之间建立公共的Modbus协议来实现上位机之间通信数据的兼容。虽然Modbus在上位机通信当中使用较多,但中间需将数据转换成公共“可识别”的数据,降低了通信效率。文献[3]则是在不同的上位机之间建立以太网,把每个上位机系统当作自己的下层系统,从而实现数据的兼容转换和传输。此种方法对以太网的传输效率和系统架构要求较高,不易实现。文献[4]是在每个上位机监控系统中加装GPRS通信模块来实现快平台的通信。GPRS由于其传输距离和本身可靠性的限制,在跨平台的通信中较少应用。文献[5]提出使用第三方监控软件作为公共数据转换平台,这种方法和文献[2]的方法类似,对第三方的系统要求较高且网络架构较为复杂。
本文采用面向对象设计的方法实现跨平台开发的上位机监控软件系统中的数据通信子系统。首先对数据通信子系统进行了功能分析,然后进行了整体设计,并对子系统进行化整为零的模块拆分,最后对各模块的实现方式、方法提出参考方案,并进行较为详细的阐述。
1 系统功能分析
数据通信子系统需要完成监控软件系统中上层应用软件需要的所有数据通信和文件传输,并能够以消息方式通知上层应用软件。数据通信内容包括站间状态数据包、实时数据表数据包、历史数据数据包、命令包、请求包等所有需要网络传输的数据包,文件传输包含组态文件、配置文件、日志文件等所有需要网络传输和同步的文件。
数据通信子系统通过进程控制命令包方式,对其他站的进程进行带参数启动、定时启动、定时停止、监视等操控,通过站点控制命令包方式,对其他操作员站进行启动在线、定时启动在线、定时停止在线等操控。支持一对一和一对多的点对点通信,根据需要,分别提供可靠的TCP传输方式和非连接的UDP传输方式。TCP方式用于大数据块的复制和同步,UDP用于少量数据的传输。原则是周期性数据用UDP,事件性的数据用TCP。支持优先级控制,不同的优先级数据包发送时按照高优先级先发送原则进行处理,保证重要数据优先发送。当数据包很大时,需分包处理,并自行控制以太网的网络负荷。以太网网络负荷最高不超过20%,以10%以下为佳。
2 系统总体设计
如图1所示,数据通信子系统总体划分为3个模块:数据交互模块、网络操作模块和网络通信模块。数据交互模块管理数据的发送和接收,负责完成站与站之间TCP/UDP数据和文件的传送,发送队列管理和接收数据,并通知进程;网络通信模块用于上位机监控软件站间各应用程序与传送数据时的网络通信接口,主要是发送接口函数、接收接口函数;网络操作模块主要完成提供远程登陆、获取网络地址、指定站状态功能,该模块主要提供两个接口函数,分别是获取指定站的网络连接状态和获取网络地址。由于数据通信子系统同时支持Windows平台和Linux平台,为了解决平台差异性和实现系统的低耦合性,网络操作模块和网络通信模块均采用动态链接库形式实现。
当应用程序有数据、文件或者命令要发送到目的站时,先调用网络操作动态库中的相关函数,打通路径;再调用网络通信动态库的相关函数将数据按照优先级放到不同的队列中。数据交互模块按照优先级算法查询各个队列,将各个队列的数据发送到目的地址;当数据通信收到来自上位机监控系统的网络数据时,先辨别是哪一类,如果是输出型模拟量、输出型数字量等数据,则将数据放到接口输入队列;如果是命令,则即刻通知目标应用程序;如果是给应用程序的内存数据,则将数据放到接收内存队列,并马上通知上层应用程序来接收处理。校时数据由历史站主站周期发送给全网,其他站被动接收数据并修改自身的时钟与历史站主站保持一致。
当上位机监控软件系统出现错误时,数据交互模块会调用整个系统错误管理程序提供的接口函数显示错误提示。发送和接收错误信息一律记入日志文件。为了保证整个系统的安全性,如果发生数据包太多、超过处理能力时,则依据数据包中的重要性信息丢弃一部分不重要的数据,但用于操作PLC的数字量信息包永远不被丢弃。
3 数据交互模块
该模块主要接管上位机监控软件系统与计算机之间数据的交互工作,包括命令、内存、文件的传送。对TCP/UDP通信的发送和接收端口进行管理,进行点对点的通信。
接收到内存数据后,判断数据类型再做处理:需要写到共享内存队列的,发送消息通知实时数据处理进程,包括操作数据包;如果是操作包,并且本机是历史站的主站,则加上时间标签放到操作数据队列,通知实时数据处理模块处理数据,另外还要将这个操作包放到数字量、模拟量输出队列,等待PLC驱动模块处理,并调用数据通信模块将其分发到其他机器上;需要写到共享内存的数据,不需要通知应用程序;其他内存数据,送到后,先放到一个缓存,并通知对方接收数据;对于消息和命令,传送至目标后直接发送到应用程序。接收到命令后先放到程序内部缓存,然后直接用消息通知给应用程序。
文件传输直接采用Linux/Windows平台的文件拷贝命令或者文件序列化的方法。超过一定大小的文件需要先进行文件压缩,然后再发送压缩后的文件,并由目标机在其本地解压缩。为防止变更集数据丢失,对重要数据传输采用TCP方式。全网传送使用UDP组播或广播方式。管理远程登录连接,文件传送完毕要关闭连接,但为了防止反复的打开和关闭连接,使用超时机制,超时时间到才关闭连接。连接信息放在共享内存中。传送以字节为单位进行,不修改数据包原来的数据精度。对于PC间内存同步数据,采用UDP传送,数据包有可能丢失,但是同步数据每秒同步,下一秒的数据到来可以弥补丢失数据[6-8]。
4 网络通信模块
提供本机进程间的消息通信机制,调用公共函数可以在进程间任意发消息通知。该模块提供发送通知、发送文件、发送内存、发送操作数据表、通知目标任务接收数据、接收数据的接口函数。如果数据发送失败,采用消息方式通知调用任务(此功能在数据交互模块中)。UDP数据包分为大包、中包和小包。TCP数据包没有这些限制。数据通信与上位机监控软件系统其他应用程序的接口包括3种:消息、内存和动态库[9-12]。
4.1 本地消息实现
鉴于上位机监控软件系统既要运行在Linux下又要运行在Windows下,但是两个操作系统对消息的定义不同,所以采用Qt的本地Socket技术封装上位机监控软件自己的消息机制,实现进程间的消息通信,其对外接口形式采用近似Windows的消息方式。
本地消息通知分两种,一种是传递消息值及消息参数,另一种是传递消息值及一小块内存数据。实现时采用QlocalSocket类,封装上述两个函数并提供类对象,上位机监控软件系统的所有进程都可以加载网络通信动态库,即可具备本地进程间的消息通知功能。发送通知的进程调用类对象的发送命令的函数发送通知,接收通知的进程只需定义本地接收通知的信号及对应信号处理函数即槽函数,即可收到并处理通知。通知传送处理流程如图2所示。
4.2 机器间的消息实现
机器间的消息通知亦采用Qt的Socket技术封装上位机监控软件自己的消息机制,实现不同机器进程间的消息通知。机器间消息通知亦分两种,一种是传递消息值及消息参数,另一种是传递消息值及一小块内存数据。实现时采用QUdpSocket类,封装上述两个函数并提供类对象,上位机监控软件系统的所有进程都可以加载网络通信动态库,即可具备机器间进程的消息通知功能。发送通知的进程调用类对象的发送命令的函数发送通知,接收通知的进程只需定义远程接收信号及对应槽函数,即可收到并处理通知。通知传送处理流程如图2所示。
4.3 机器间文件的发送实现
因为上位机监控软件系统既要运行在Linux下又要运行在Windows下,所以机器间的文件传送采用操作系统自身的远程文件拷贝功能,需要根据操作系统的不同,采用不同的实现机制。在Windows平台下,在上位机监控软件系统安装配置时,就创建上位机监控软件专用的管理员账户,此账户所有计算机都一样,利用系统默认的CS、DS等默认共享,如同操作本机文件一样在各台机器之间拷贝文件。在Linux平台下,在上位机监控软件系统中设置相同的root用户密码,并在系统启动时,利用脚本打通各个机器之间的访问路径,然后如同操作本机文件一样在各台机器之间拷贝文件[13]。
4.4 机器间内存同步实现
机器间的共享内存同步,采用Qt的QUdpSocket技术封装,实现不同机器间共享内存数据的同步。实现时采用QUdpSocket类,封装上述函数并提供类对象,上位机监控软件系统的所有进程都可以加载网络通信动态库,即可具备机器间共享内存的同步功能。需要同步共享内存的进程调用类对象的发送内存接口函数发送内存数据,函数根据数据区的大小,在最短的时间内分包发送数据,并且每个分包中都带有此数据包内数据相对于原始共享内存头部的偏移地址及分包的大小。接收发送内存通知的进程只需定义发送内存通知信号及对应信号处理函数(即槽函数)就能收到并处理内存数据,收到的内存数据根据偏移地址和大小,可以直接覆盖本机的共享内存中对应部分的数据,实现内存的同步[14]。
4.5 机器间发送操作数据包实现
机器间发送操作数据包,采用Qt的QUdpSocket技术封装并提供类对象,可以实现不同机器间操作数据包的发送。待发送操作数据包的进程调用类对象的发送操作数据接口函数来发送操作数据包。网络上接收计算机上的进程只需定义接收操作数据的信号及该信号对应的信号处理函数即槽函数,即可收到并处理操作数据包。模拟量的画面下发操作的数据包和数字量的置数操作的数据包采用不同的结构[15-16]。
其中包类型可以用于让通信模块识别来决定放到输入接口队列还是输出接口队列,数字量操作队列有两种:即画面数字量操作包类型和非画面数字量操作包类型,非画面数字量操作包类型指的是人工置数数字量点。画面操作包需要为之做输出型数字量清零处理,非画面操作包不能清零。这两个数据包由操作员所在的操作员站写入,但是时间标签由历史站主站打包数据时写入,过程如图3所示。
5 结论
本文主要介绍了基于国产PLC、支持跨平台的上位机监控软件系统中数据通信的实现方法。在实验中对系统进行模块拆分,并应用对每个模块提出的新方法,实现了跨平台的上位机数据通信。在对系统进行的长时段高负荷的运行验证中,整个通信网络表现出较强的稳定性、实时性和可靠性。
参考文献
[1] 王雪艳.基于PLC和工控机的监控系统设计[J].煤炭技术,2012,31(1):63-64.
[2] 韩令斗,赵亮,张栗,等.基于PLC重铺机组远程监控系统的设计和实现[J].物联网技术,2017,7(2):92-94.
[3] 高雪莲,张国平,林光源,等.基于以太网的智能库房监控系统上位机设计[J].电气自动化,2017,7(2):92-94.
[4] 蔡桂龙,刘海燕,李勇.GPRS网络通信与配变远程监控系统[J].电力需求侧管理,2017(1):92-94,112.
[5] 张涛,陈志军.第三方软件与监控系统远程数据交互的应用[J].自动化仪表,2005,7(5):52-55.
[6] 徐忠.地铁综合监控系统中的数据交互共享方案研究[J].信息安全与技术,2012(3):79-81.
[7] 廖备水.流域梯级电站多监控系统数据交互模型的研究[D].西安:西安理工大学,2003.
[8] 蒋俊俊.基于信息智能联盟的监控实时数据交互研究[D].南昌:华东交通大学,2015.
[9] 赵丹丹.无人驾驶智能车远程监控系统[D].西安:西安工业大学,2014.
[10] 任海科.基于无线网络通信的视频监控系统终端数据业务软件设计[D].杭州:浙江大学,2013.
[11] 王志晓.内网中网络通信行为监控系统的设计与实现[D].西安:西安电子科技大学,2008.
[12] 方晓楠.基于网络通信的JRU远程监控系统[D].北京:北京邮电大学,2014.
[13] 李潮,员天佑.基于Modbus协议的监控系统网络通信的实现[J].微计算机信息,2010,26(34):58-59.
[14] 毛建一,陈渊睿,伍堂顺.基于Modbus协议的电能监控系统网络通信的实现[J].工业控制计算机,2008,1(4):78-79.
[15] 荣建军.基于ACE架构的网站信息监控系统[D].成都:电子科技大学,2008.
[16] 许伦辉,邝先验.网络通信与数据库技术在交通监控系统中的应用研究[J].计算机与现代化,2005,1(12):35-38.
作者信息:
王毅璇,丰大军,王 皓,张晓莉
(华北计算机系统工程研究所,北京100083)