1. 引言
PLC(Programmable Logic Controller)作为高性能的微机化自动化设备,目前在国内外已广泛应用于钢铁、石油、电力、机械制造、交通运输、环保等各个行业 [1] 。随着其应用的推广,控制对象越来越复杂,使用的环境越来越复杂,控制要求也越来越高,传统的PLC设备程序调试模式已难以适应发展的需求 [2] 。
设备远程监视及控制已经成为自动化设备行业中不可或缺的部分,在多设备、多使用场景的情况下,及时对PLC进行监控排除故障是有效解决问题的关键。当设备出现客户无法排除的故障时,维护人员如能及时的对PLC进行远程数据和程序监控,则能及时解除故障,减少客户解决问题的时间,提高设备的利用率。为了保证远程监控调试程序的便利性及高效性,本文在本地程序调试模式的基础上探讨通过虚拟串口以及网络监控的模式来进行PLC程序的远程上传与下载。
本文以欧姆龙公司CP1H型PLC设备为控制对象。运行在PLC设备上的程序由PC端的欧姆龙编程软件Cx-programmer进行编译,生成的CXP程序文件可以通过USB和RS232串口两种方式下载至PLC [3] 。虽然USB的传输速度快,但受到成本高、开发复杂、需要驱动程序支持等因素限制;串口传输的速度相对较慢,但其开发成本较低、本地对接方便且无需驱动程序支持,故本文选择串口作为程序传输的接口。
2. 软件总体设计方案
2.1. 软件整体架构
PLC设备运行在各种工业环境中,通过安装在其上的HLK-RM04模块(串口—以太网—无线网模块)收集存储于PLC数据区的参数数据,进行回传以判断当前设备状态,当某参数超限时可判断设备出现某种故障。由于需要对多台设备进行监控,PLC远程监控软件采用C/S模式,通过服务器端的数据库做统一的数据存储及转发。远程监控客户端安装在本地PC上,通过虚拟串口对与Cx-programmer软件互连,编写好的程序经服务器通过网络发送至PLC。网络通信均采用TCP/IP协议,以保证传输数据的准确性。远程监控软件的架构如图1所示。
从结构上划分,PLC远程监控系统主要由以下4个部分组成:

Figure 1. Architecture diagram of the PLC remote monitoring software
图1. PLC远程监控软件架构图
1) PLC设备终端:包括1个欧姆龙CP1H系列PLC设备和1个HLK-RM04模块。PLC通过RS232串口外接HLK-RM04模块,HLK-RM04模块经过网络与服务器连接,进行数据的转发。
2) 服务器:由应用服务器和数据库组成,应用服务器负责收发数据、解析和存储数据,数据库主要是完成对用户信息、设备信息及PLC上传的部分数据进行存储,以供客户端访问。
3) 客户端:按照事先制定的通讯协议,和服务器以及PLC程序编译软件通信。客户端提供设备信息和用户信息显示及管理的功能,以及完成PLC程序的转发。
4) Cx-programmer编程软件:是一个用于对欧姆龙C系列PLC进行编程、测试和维护设备配置的工具 [4] ,客户端通过虚拟串口与CX-Programmer连接,完成程序指令的转发。
2.2. 软件功能结构
PLC远程监控软件采用C/S工作模式,服务器直接与PLC发射器相连,主要负责传输程序指令、定时收集设备参数以及存储数据。客户端软件是用户操作管理的直接接口,采用模块化思想设计,按层次可以分为网络通讯接口层、数据处理层和用户界面层。
网络通讯接口层主要负责客户端与服务器端交换数据,利用基于TCP/IP通讯协议的Socket编程实现;数据处理层用于解析服务器上传的数据和封装下发的程序命令等,定义了通讯单元类CCommUnit实现数据发送和等待接受数据线程;用户界面层为用户提供了良好的人机交互界面,用户通过操作菜单和各功能界面,满足监测、显示、设置、存储等应用需求,利用MFC编程技术完成操作界面的设计和各菜单、按钮的响应。远程监控软件功能结构如图2所示,程序传输主要由程序监控模块和数据处理、通讯接口层面完成。
3. 程序传输通讯方案
依据PLC程序下载与上传皆经过串口的特点,在通讯接口层面,客户端通过虚拟串口对来实现RS232转TCP/IP网络结构的构建,客户端与Cx-programmer编程软件通过串口连接,同时与服务器以网络传输;服务器端与客户端以及PLC的发射器均为网络连接,发射器完成网络数据和串口数据的转换,与PLC进行交互。程序传输路径如图3所示。

Figure 2. Function structure diagram of remote monitoring software
图2. 远程监控软件功能结构图

Figure 3. Program transmission path diagram
图3. 程序传输路径图
3.1. 通讯方式选择
本软件系统利用串口与网络来完成整个组网方案,因此选择串口通信与Socket通讯方式来支持。串口通信技术是基于串行通信接口标准的数据通信技术,本文采用MSComm控件进行串口通信的编程。服务器与客户端支持标准的TCP/IP通讯格式,使用Socket编程规范实现。
3.2. 虚拟串口配对
虚拟串口是用操作系统的虚拟驱动技术产生的串口(COM口),相对于计算机本身的硬件串口(COM1等)来说,虚拟串口并不对应一个物理上的串口,而是为软件应用提供一个类似串口硬件设备的系统调用接口,以兼容原本使用本地串口的应用软件 [5] 。对于串口软件来说虚拟串口和硬件串口并没有区别。
3.2.1. 虚拟串口驱动
本文利用VSPD(Virtual Serial Port Driver)软件进行串口的配对,它是由软件公司Eltima制作的一款本地虚拟串口软件,可以方便地实现多对串口的配对。在传输程序之前,需要先利用VSPD勾选所需的两个串口加入配对,Cx-programmer软件与客户端所用串口应与配对的串口名称相对应。
3.2.2. 串口参数配置
一般而言,配对的两个串口参数应相同,即使用相同的波特率、奇偶校验位、停止位以及数据位,同时Cx-programmer软件和客户端的串口名称应与VSPD软件中配对的串口名称一致。PLC与发射器之间以物理串口相连,但仍需设置统一的串口参数。其中,Cx-programmer软件的串口参数配置如表1所示。

Table 1. Serial port parameter configuration information of Cx-programmer
表1. Cx-programmer软件的串口参数配置信息
3.3. 通讯协议制定
在程序传输过程中,服务器的主要功能是转发,即拼接指令与透明传输;而客户端则是联系Cx-programmer程序软件和PLC设备的桥梁,涉及串口通信和网络通讯两种通讯方式。
3.3.1. 基于串口通信的通讯协议
Cx-programmer软件与PLC设备之间是一问一答式,先由程序软件发起连接,PLC设备回复并成功连接后开始频繁的程序数据交互。在串口之间传输的皆是PLC程序指令,串口一个字符一个字符地传输。
串口通信指令格式为:数据—结束符,数据是具体的PLC程序,结束符为回车
,以结束符作为判断一条指令的间隔符。
3.3.2. 基于网络通讯的通讯协议
客户端与服务器之间通过网络通讯,通讯指令有三种:控制指令和程序指令,以及保证连接状态的心跳包。其中,控制指令用于控制对某台具体编号设备传输程序的启动及停止,程序指令是对串口接收到的程序数据再封装成网络传输格式。
指令格式为:开始符—命令码—结束符,开始符为“@@”,结束符是“FEEF”,用以间隔一条指令。下面进行详细说明。
1) 控制指令:有两条指令,分别是通知服务器开始向某台设备传输程序的指令和断开连接的指令。启动指令的命令码为PLC设备的编号,即先告知服务器传输对象,服务器回复所指向PLC的状态,来判断当下是否可开始传输。停止指令的命令码是ED,即停止程序传输,断开与服务器下载端口的连接。
2) 程序指令:是将串口传输来的指令(包括结束符
)加上开始符和结束符。
3) 心跳:为了确保程序传输的稳定,保证客户端与服务器在传输过程中一直为连接状态,客户端需定时向服务器发送心跳。
4. 串口传输通讯设计
如前所述,客户端与Cx-programmer程序软件各开一个串口,通过虚拟串口配对连接,其与物理串口连接无异。串口通信的方式有多种,最常见的主要有两种:调用API函数和MSComm控件。利用MFC (Microsoft Foundation Classes)开发环境本身已有的控件进行开发设计,不仅可以减少开发时间,节约开发投资,而且有利于保证系统的稳定性和可靠性[6] ,因此本文采用MSComm控件进行串口通信的编程。
4.1. 基于MSComm控件的事件驱动通信
MSComm控件具有完善的串行数据发送和接收功能,它屏蔽了通信过程中的底层操作,用户只需通过设置并监视其属性和事件, 即可实现与被控制对象的串行通信。为了保证程序传输的高效性,控件选择实时性强、可靠性高的事件驱动通信方式,利用OnComm串口响应事件捕获通讯事件:当串口的接收缓存区中有字符时,OnComm事件响应并开始一个一个字符读取缓存区中的数据,读至回车符时为一条完整的数据。
串口通信的基本步骤如下:1) 打开进行通讯的串口;2) 初始化串口:设置串口参数,设置接收区、传输缓存区大小,设置缓存区可接收字符数,以及读取数据的模式;3) 根据通讯事件对数据进行发送和接收;4) 通讯结束关闭串口。
4.2. 多线程收发处理
对于PLC程序传输这种需要同时进行快速数据收发以及串口、网口转发的应用程序来说,创建多线程是比较理想的选择 [7] 。
从网口接收到的程序要从串口发送给编程软件,从串口接收到的数据要从网络端口发送至服务器。网络通讯采用发送指令线程和接收数据线程来共同处理收发数据,当接收数据线程接收到数据时,立即调用串口发送函数将接收到的数据转为字符发送到编程软件的串口。串口发送即在网络接收处理线程中完成,不另外开辟线程。
对于串口接收,由于串口事件响应函数的调用是同步阻塞的,所以开辟一条串口接收处理线程,用以等待串口响应接收以及向网口发送数据。在处理接收前,设立一个串口接收事件g_OnComEvent标志接收是否完成,初始为无信号,接收线程一直挂起。当串口响应函数OnComm从缓存区中读取串口接收的数据,并读到回车符,即读完一条数据时,将g_OnComEvent置为有信号,接收信号退出阻塞,调用网络发送函数将数据发送至服务器。接收数据线程的处理流程如图4所示。
5. 网络通讯设计
远程监控的重点是实现数据的远程传输,现场的PLC设备数据采集处理后经过局域网或广域网即可与监控软件互联起来,从而实现远程状态检测和远程程序的传输。远程监控的关键在于如何保证数据传

Figure 4. Flow-process diagram of receive data thread
图4. 接收数据线程处理流程图
输的实时性和准确性[8] ,因此本文选择面向连接、提供可靠的全双工数据通信的TCP/IP协议族进行主从问答式的实时传输。
5.1. 基于Socket的TCP/IP网络通讯
Socket是面向客户端/服务器模型而设计的,针对客户端与服务器程序之间的相互通信而提供的通信机制[9] ,采用Windows Sockets可以编写出基于TCP/IP协议的网络通信应用程序。
Socket本身独立于TCP/IP通信协议,是工作在IP通信报文以及计算机应用层之间的网络编程接口,其中包含三种套接字:流式套接字,数据包套接字和原始套接字。流式套接字为应用层提供了一个面向连接的可靠的数据传输服务,可使网络层的传输报文向应用层无差错、无重复地按照顺序接收。因此为了能够及时并准确地传输设备的运行状况和程序,采用流式套接字(SOCK_STREAM)来实现服务器与客户端以及服务器与PLC发射器之间的数据收发。
根据通讯协议设计了底层通讯接口TCPSocket类,分配了发送数据和接收数据线程。封装好的通讯类在客户端进行网络发送时只需创建连接和调用SendClient函数;接收数据定义了状态回调函数OnStatusChange反馈网络连接状态,以及数据回调函数OnDataArrived返回服务器的数据。
5.2. 程序网络传输的设计
客户端与PLC设备的发射器之间的程序数据经过服务器通过网络传输。为了确保在程序调试过程中,能够稳定、安全地向某个确定的设备进行程序传输,客户端与PLC设备之间需要建立一对一的配对关系,此匹配由服务器完成。
当某台PLC接入服务器时,服务器先问询其设备编号(区分每台PLC的唯一标识符),PLC返回设备编号后注册加入服务器的设备队列。程序传输必须是对指定的设备进行,客户端首先连接服务器的下载端口,发送指令问询某编号的设备是否已注册,注册过的设备即匹配可建立连接。发送指令的格式为“@@” + 设备编号 + “FEEF”,服务器回复的数据如表2所示。
如表2所示,客户端发起连接时,设备未注册或已与其他客户端匹配时,不可连接。传输过程中可由客户端主动断开与服务器的连接,也可由PLC下线通知客户端断开连接,避免连接占用。客户端建立与设备的连接并进行传输的流程如图5所示。
6. 软件运行测试
6.1. 测试平台
测试时,Cx-programmer程序软件需与客户端安装在同一台PC上,它们通过VSPD进行串口配对,并做统一的串口设置。CP1H型欧姆龙PLC通过串口连接发射器,发射器通过网络接入PC,PC上可同时搭载客户端与服务器,也可以用一台PC做服务器,一台做客户端,构建起如图1所示的测试网络拓扑结构。
6.2. 测试结果
PLC设备在上传或下载时一般是打包传输程序、I/O设置及其他一些参数的配置信息,整体大小大约在几十Mb的范围内;而进行在线编程时,只向设备下载改动部分,程序包会更小,大概几十Kb。程序传输速度主要受到串口波特率大小以及网络状况的影响。测试中,我们将波特率调至CP1H型PLC的最大波特率115200,网络采用GPRS接入。客户端软件和Cx-programmer程序软件运行效果如图6和图7所示,可以看出,即使在网络传输较慢的情况下,Cx-programmer程序软件也运行稳定,上载程序成功,软件设计达到预期的要求。

Table 2. Reply messages list of sever
表2. 服务器回复消息列表

Figure 5. Flow-process diagram of connection between client and PLC
图5. 客户端与设备建立连接的流程图

Figure 6. Running effect diagram of client
图6. 客户端软件运行效果图
7. 结语
本文对基于虚拟串口的PLC远程监控软件的程序传输模块进行了详细设计,介绍了利用虚拟串口配对进行串口通信,以及基于TCP/IP协议的网络通讯方法,并进行了联机程序传输测试。远程监控程序传

Figure 7. Program upload page of Cx-programmer
图7. Cx-programmer软件程序上载页面
输为PLC设备编程人员提供了一套稳定便利的传输程序方法,提高了设备程序调试和维护的效率。本方法对其他有类似要求的监控系统有一定的借鉴作用。