1 引言 随着计算机通讯技术的日益成熟及企业对工业自动化程度要求的提高,自动控制系统从传统的集中式控制向多级分布式控制方向发展,构成控制系统的PLC也就必须具备通信联网功能。在具体应用过程中,若要监视PLC内部的数据与运行状况,选用市场上的人机界面或组态软件,虽然功能丰富,但大都价格昂贵,尤其在一些中小规模的生产场合。所以许多企业希望能自己用高级语言开发一个简易实用的通信程序,通过面向对象的可视化编程语言VB6.0很容易地实现分布式监控。PLC等下位机控制生产过程,本地计算机进行实时监测或参与控制生产现场的参数。本文通过对OMRON的CPM1A小型机与上位计算机通信原理和通信方法的研究,介绍了如何用VB6.0实现上位计算机对PLC的实时监控,并取得了良好的效果。 2 监控原理 2.1 通信方法 上位机作为主站要能够通过PLC监控下层设备的状态,首先要实现上位机与PLC间的通信。由于串行通信具有线路简单、应用灵活、可靠性高等优点,并且普通计算机均带有串行口,所以PC与PLC间通常采用串行通信方式。串行通信可以通过Windows的API函数实现,也可以串行通信控件实现,但后者较容易,本文采用VB的通信控件。如果只实现对一台CPM1APLC的监控,需要CPM1-CIFO1(OMRON提供的专用的RS232适配器)形成RS232C口与上位机通信;如果是实现对多台PLC的监控,则需用RS232—RS422/RS485转换器ADAM-4520和CPM1-CIF11(OMRON提供的专用RS422适配器)与上位机通信,最多可连接32台PLC,连接方式如图1所示。 图1 系统通信原理 在通信过程中上位机始终处于主动方,PLC则处于从动方,所有的数据交换只能在主站和从站之间进行,从站之间不能直接交换数据,如果从站之间需要交换数据,必须通过主站中转1。首先上位机向PLC发送指令帧,PLC接收了上位机的指令后,先进行FCS校验,看其是否正确,如果正确,则接收并向上位机传送响应帧(包含首尾校验字节),否则,PLC拒绝向上位机传送数据。需要说明的是,整个通信过程中因PLC中配有通信机制,一般不需要对PLC进行编程。上位机接收到PLC传送的数据,也要判断正确与否,如果正确,则接收,完成一次正常通信,否则,通信需重新开始。
2.2 通讯协议 (1)通讯条件设计。要使上位机与下位机正确地交换数据,必须确保以下几点: ● 双方在初始化时要使波特率、数据位数、停止位数、奇偶校验均保持一致; ● 要严格按照PLC的通信协议的规定及帧格式编写PC的通信程序。 (2)通讯的命令帧设计。OMRON公司的CPMIA小型PLC的传输协议的一般格式为: (3)通讯的响应帧设计 其中,@为前导字符,表示开始;设备号为00-31(本例限设到10),共可设置32个站号,用来识别所连接的PLC,可通过PLC的DM6653的低8位来设定,默认站号为00;命令码为CPMIA小型PLC规定的对其操作的命令代码;正文为需要读或写的数据地址以及数据;FCS为帧校验代码,用于及时发现通信过程中的错误,以备处理;*和CR表示命令结束[2]。 命令帧为PC机传向PLC的帧格式,响应帧为PLC传向PC机的帧格式,其命令帧与响应帧中的各个部分除数据区不同外,其他部分的含义是相同的。 2.3 MSComm控件介绍 VB中的MSComm控件具有功能完善的串口数据发送和接收功能。 MSComm控件具有两种通信方式:事件驱动方式和查询方式[3]。因为查询方式占用CPU时间太多,我们采用事件驱动方式。要完成通信,必需正确设置MSComm控件的相关属性,本设计在窗体中对其进行初始化,主要包括端口设置,波特率设置,奇偶设置等。主要属性如表1所示。 表1 MSComm控件属性 3 通信程序设计 本系统以PC对基于PLC的交通灯控制系统的监控为例,在上位机与PLC正常通信的前提下,设计如下界面。窗体的内容主要包括,四大区:端口、站号选择区,设定时间输入区,监控显示区,控制按纽区。从站号选择区选择不同站号即不同PLC,实现对多个PLC的实时监控。 3.1 串口初始化程序 If MSComm1.PortOpen <> True Then MSComm1.PortOpen=True End If MSComm1.Settings=“9600,E,7,2” MSComm1.InputLen=0 MSComm1.InBufferCount=0 MSComm1.InputMode=comInputModeText MSComm1.Handshaking=comNone
3.2 计算机与PLC通信的VB程序 Public Function ReadData(ByVal InputStr As String, ByVal Num1 As Integer, ByVal Num2 As Integer) As String Dim OutputStr As String Dim InString As String Dim ReturnStr As String Dim EndString As String Dim FCSString As String Dim ReturnFCSString As String Form1.MSComm1.InBufferCount=0 OutputStr=InputStr+FCS(InputStr)+“*” If Form1.MSComm1.PortOpen=True Then Form1.MSComm1.Output=OutputStr+Chr$(13)’按照PLC帧格式输出 End If Do DoEvents Loop Until Form1.MSComm1.InBufferCount >=Num2’返回帧的长度 InString=Form1.MSComm1.Input EndString=Mid$(InString,6,2)’取返回帧的响应码 If EndString <> “00”Then ReadData=“Error” Exit Function End If EndString=Mid$(InString,1,Len(InString)-4) ReturnFCSString=Mid$(InString, Len(InString) -3,2)’取返回帧校验码 FCSString=FCS(EndString) If FCSString <> ReturnFCSString Then ReadData=“Error” Exit Function End If If Len(InString)>=Num2 Then ReturnStr=Mid$(InString, Len(InString)-Num1-3, Num1)’取返回帧的数据,其度为Num1 ReadData = ReturnStr End If End Function 4 结束语 本文给出了利用VB中的MSCOMM控件实现上位机与多个PLC之间的通信方法,实现了上位机对多个PLC的实时监控。对于分布是控制系统大幅度地减小了通讯成本,具有一定的推广价值。
|