1 引言
可编程控制器PLC是以微处理器为核心,综合计算机技术、自动控制技术和通信技术发展起来的一种通用工业自动控制装置,它具有可靠性高、体积小、功能强、程序设计简单、灵活通用、维护方便以及抗干扰能力强等优点,因而广泛应用于电力、冶金、能源、化工、交通等领域,但是大多数中小型PLC的显示功能较差,人机交互操作不便,管理人员不能及时了解现场情况,尤其是在现场调试中,为弥补PLC在这些方面的不足,在实际控制系统中,通常采用PLC作为下位机实现对生产过程的控制,以计算机作为上位机实现工艺流程参数显示、控制参数设置等功能,使PLC和计算机相互结合,充分发挥PLC在开关量、模拟量控制和计算机在管理、监控等方面的优势,以实现优势互补,极大提高控制系统的性价比。
实现计算机和PLC控制系统的关键是两者之间的通信,一般情况下,用户可以采用现有的组态软件实现监控,但该方法成本较高,为此本文介绍了在Visual Basic 6.0的环境下,实现计算机与三菱FX系列PLC的串行通信方法。
2 PLC与计算机的通信端口连接
FX系列PLC的编程
图1 FX-232AW接口引线连接图
引脚2、3:将引脚2、3交叉互连,使PLC与上位机之间能发送和接收数据。
引脚4、5:将引脚4、5反馈短接,对计算机发送数据来说,PLC总是处于数据准备就绪状态,计算机在任何时候都可以将数据送到PLC中。
引脚6、20:将引脚6、20交叉互连,对计算机来说就必须检测PLC是否处于准备就绪状态,即检测引脚6是否为高电平。当引脚6为高电平时,表示PLC准备就绪,可以接收数据,这时计算机就可以向PLC发送数据了;反之,当引脚6为低电平时,PLC与计算机则不能通信。
3 计算机与PLC之间的通信协议
FX系列PLC与计算机的通信模式有两种:
PLC与计算机采用专有协议(dedicated protocol)通信,这种方式无须编写梯形图,计算机直接读写PLC;
PLC与计算机无协议通信,这种方式需要编写梯形图,并使用串行数据传送指令RS。这里介绍专有通信协议。
FX系列PLC与计算机专有通信协议提供有数据读取、控制命令写入、控制PLC启/停和网络测试等功能,该协议有两种格式:format1和format4。两种协议的区别在于字符串中是否添加CR/LF码,采用哪种格式的协议由PLC中的特殊数据寄存器D8120决定,计算机向PLC传送的字符串格式如图2所示,在该字符串中,可由D8120来决定是否添加和校验码,此外format4需要在字符串末尾添加CR/LF。计算机与FX系列PLC之间采用主从应答通信方式,PLC内部不需要额外的通信程序,只要将所需数据放在数据寄存器中即可。每个数据寄存器都有相应的物理通信地址,通信时计算机直接对物理通信地址进行操作。
图2 字符串格式
控制代码(Control Code)主要用来控制每步数据的传送。以format 1为例,当要对PLC进行读操作时,计算机发出请求报文,该报文以ENQ码开头,并包括了报文中的所有字段,其中有字符域A。PLC对计算机的请求作出响应,以STX码开头,以ETX码结尾,该报文不包括操作指令字段和消息等待时间。当计算机收到PLC发出的响应报文,计算机发出确认报文或未确认报文,该报文只包括有控制代码、站号、PC号和错误码Error Code,如图3所示。
图3 计算机从PLC读操作报文协议
计算机与PLC间通过报文来交换信息,这些信息在交换过程中需要遵守一些约定。当要对PLC进行写操作时,计算机同样发出请求报文,该报文以ENQ码开头,包括了报文中的所有字符字段,其中有字符区域C,PLC对计算机的请求作出响应,返回确认报文或未确认报文,如图4所示:
图4 计算机向PLC写操作报文协议
站号(Station NO.)用来决定计算机访问哪一台PLC,在FX系列PLC中,站号范围从00H到0FH,特殊辅助寄存器D8121可用于设置站号。
PC号(PC NO.)用来识别PLC上的CPU,对于FX系列PLC,该值为FFH。
指令(Command)用来指定要进行的读写操作,每个命令字都由两个ASCII码表示。
消息等待时间(Message Wait)指从计算机发出指令到成为接收状态所需的时
间,以10ms为一单位,等待时间可达150ms,可通过一个0到F间的ASCII码来设定。消息等待时间主要用于半双工通信模式下读写操作间的切换。字符区域(Character)A为计算机要读取的存储区的开始位置和字节数。B为PLC返回的要读取的存储区的数值。C为计算机要写入的存储区的开始位置和数值。
和校验码(Sum Check Code)是从站号开始、和校验之前所有字节按位相加后取和的低两位数的ASCII码,和校验码主要用于校验数据传送过程中是否发生位错误。
4 计算机与PLC通信程序设计
在Windows操作系统中实现串行通信主要有三种途径:
利用一些编程工具如Delphi提供的通信控件SPComm,Visual Basic或Visual C++提供的特定通信控件MSComm,开发者通过对这些控件编程来实现对串口的操作。
调用Windows提供的API函数在Win32环境下,硬件设备被当作文件系统来访问,应用程序调用Create File()函数来读写数据。
通过C/C++语言将自己的程序编译链接为DLL,然后用Visual B
由于Visual Basic 6.0是Windows环境下简单高效的可视化编程语言开发系统,以其所见及所得的可视化界面设计风格和面向对象程序设计等特点,已广泛应用于各个领域,改编程语言不但提供了良好的界面设计能力,而且在计算机串口通信方面也有很强的功能,VB中的通信控件MSComm具有完善的串行数据收发和接收功能,不但包括有全部Windows API中关于串行通信的函数所具有的功能,还提供了更多的对象属性来满足不同用户的编程需要。
MSComm控件提供了两种处理通信的方法:
事件驱动法:当有数据到达端口,端口状态发生改变或有通信错误发生时,触发MSComm控件的OnComm事件,事件驱动实时性强,对外界情况可以作出快速响应,因而是处理串行端口交互作用的一种非常有效的方法。
查询法:用软件或在程序中设置定时器实现对端口周期性扫描,通过读取CommEvent属性值来查询通信事件和错误,并作出相应处理,查询法编程简单,调试方便,如果应用程序较小,并且是自保持的,这种方法是可取的。
由于MSComm控件隐藏了调用过程,屏蔽了通信过程中的底层操作,使用该控件只需定义相应的属性,调用Send方法发送数据或等待处理相应的事件接收数据,就可以轻松实现串行异步通信。MSComm控件支持如下主要属性和事件。
CommPort属性:设置(返回)控件对应的端口号,系统用端口号唯一标识每一个串行端口。
Settings属性:设置(返回)控件所用的传输协议,以字符串的形式定义控件使用的波特率、奇偶校验、数据位、停止位等参数。此设定应与PLC的设定相一致。
PortOpen属性:打开或关闭通信端口。
Input属性:从接收缓冲区接收并保存MSComm控件接收到的数据。
Output属性:向发送缓冲区发送数据。
InputLen属性:设置从接收缓冲区读取的字符数。
InbufferCout属性:返回接收到数据缓冲区中需要处理的数据长度。在查询方式中,该属性可用来判断输入缓冲区是否接收到所需的字符。
InputMode属性:设置(返回)Input属性传输的数据类型。
OnComm事件:MSComm控件产生动作(如接收数据)或错误时,触发该事件。
CommEvent属性:返回最近的通信事件或错误,可在OnComm事件中检测该属性的值后处理。
这里给出计算机与PLC采用查询法通信的部分程序。
'MSComm控件初始化
Private Sub Form_Load()
STX$=Chr$(2)
ETX$=Chr$(3)
ENQ$=Chr$(5)
NAK$=Chr$(&H15)
ACK$=Chr$(6)
MSComm1.Settings="9600,e,7,1"
MSComm1.InBufferSize=1024
MSComm1.CommPort=1
MSComm1.OutBufferSize=1024
MSComm1.OutBufferCount=0
MSComm1.PortOpen=True
MSComm1.InputLen=0
End Sub
'计算机与PLC的连结程序
Private Sub Command_Click()
Dim WaitTime As Long
Dim Star
tTime As LongMSComm1.Output=Chr(5)
WaitTime=5
StartTime=Timer
Do While Timer<StartTime+WaitTime
DoEvents
Loop
If MSComm1.InBufferCount>0 Then
If Asc(MSComm1.Input)=0 Then
MsgBox("连结成功,准备发送数据")
MsgBox("连结失败")
End If
Else
MsgBox("连结失败")
End If
End Sub
'计算机从PLC读函数程序
Function CmdRead(Rd As String) As String
Dim X As Integer
Dim Y As Integer
Dim Z As Integer
MSComm1.InBufferCount=0
Read$=Chr(5)&Rd&CheckSum(Rd) &n
'读数据帧由ENQ、命令串和和校验码组成
MSComm1.Output=Read$
Do
DoEvents
Loop Until MSComm1.InBufferCount>=9
Data$=MSComm1.Input
X=Val(Asc(Left(Data$,1)))
Y=CheckSum(Mid(Data$,2,Len(data$)-3))
'计算应答帧的和校验码
Z=Mid(Data$,Len(Data$)-1,2)
'计算接收到的应答帧的和校验码
If X="2" And Y="Z" then
'STX的ASCII码为02H
CmdRead=Mid(Data$,6,Len(Data$)-8)
MSComm1.Output=ACK$
Else
CmdRead='Error'
MSComm1.Output=NAK$
End If
End Function
计算机向PLC写函数程序与读函数程序类似。
5 结束语
文中给出了利用VB的MSComm控件实现计算机与PLC实时通信的基本思想和设计方法,该程序简单、可靠、实用,并可根据实际工矿要求灵活修改程序。现在火电厂输煤程控系统的电除尘设备中,有些系采用该系列的PLC,可采用上述方法来保证控制系统通信稳定、有效。