一. 前言
随着生产自动化程度的不断提高,可编程序控制器PLC得到了广泛的应用,特别是小型PLC具有编程简单、性能可靠和价格低的特点,被大量应用于单机控制系统中,如啤酒的稀释控制、离心机控制等。作为设备维修技术人员,一般都能掌握PLC和计算机PC的应用知识,但如何利用PLC和PC来设计小型自控系统,实现简单的数据采集和监控操作,从而满足生产需要,却是一个要深入学习研究的问题。
面向生产操作,设计简单有效的控制系统,涉及到三部分的软件编程:
第一:PC上人机操作界面的设计。PC作为上位机,一般都是运行在Windows 98/2000操作系统下,利用微软提供的可视化编程软件Visual Basic 6.0,设备维修技术人员就可设计出优美的人机操作界面,只需进行主要操作功能编程和少量界面控制编程。
第二:实现生产工艺要求的PLC控制程序设计。因为是小型控制系统,其生产控制过程并不复杂,技术人员只要充分了解了生产工艺和控制要求,运用PLC编程工具,此部分设计编程并不难。
第三:PC与PLC通讯程序的设计。此部分的开发设计较难,需要掌握PC和PLC的有关通讯硬件驱动和通讯协议的知识。但对于小型控制系统来说,主要通过PC串口来通讯,所以通讯程序设计的关键是如何利用Visual Basic 6.0中的串口通信控件——MSComm控件,并根据PLC的串口通信协议设计出上下位机的数据交换程序。
下面以啤酒稀释自控系统设计为例,主要讲解PC和PLC通讯程序的设计要点。
二. 啤酒稀释自控系统设计分析
1. 啤酒稀释控制要求
啤酒稀释是啤酒生产中一个重要环节,通过把高浓度的酒液与脱氧水按比例混合成稀释酒,从而提高啤酒产量和增加啤酒品种,稀释的控制过程很简单,主要步骤有:
1) 输入高浓度的浓度A和稀释后要达到的浓度B ;
2) 计算出加水量的百分比 [(B-A) / A]*100% ;
3) 根据此百分比和高浓酒的瞬时流量,计算出脱氧水要达到的流量;
4) 比较水的瞬时流量和计算出的流量,来控制水调节阀的开度,使水瞬时流量等于计算流量。
由于酒和水的瞬时流量是变化的,所以3)、4)步要反复进行。以上所有的计算功能和PID调节功能都由PLC完成。
2. 啤酒稀释的人机操作界面:
人机操作主要用来输入啤酒浓度数据、操作命令,直观显示各种流量数据并记录偏差曲线,界面图如下:
3. 硬件配置
本例子中上位机PC选用联想奔腾Ⅱ品牌机,外加RS232转RS485通讯转换卡。下位机PLC选用三菱FX2N-16MR,另加模拟输入模块FX2N-2AD 和模拟输出模块FX2N-2DA各一块,外加一个485串口通讯模块PC-485BD。
三. PC与PLC通讯程序设计分析
在分析具体的VB通讯程序之前,先要介绍有关VB串口通信控件MSComm的应用知识和三菱PLC 通讯协议。
1. MSComm控件简介
如图所示是Mscomm控件的图标。
它可以用来提供简单的串行端口通信功能,也可以用来创建功能完备、事件驱动的高级通信工具。Mscomm控件提供了一系列标准通信命令的使用界面。使用它可以建立与串行端口的连接,通过串行端口再连接到其它设备(如调制解调器、PLC),发出命令,交换数据,以及监视和响应串行连接中发生的事件和错误。
2. MSComm控件的基本属性
MSComm 控件有很多重要的属性,基本属性如下:
属性 描述
CommPort 设置并返回通讯端口号。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。
Input 从接收缓冲区返回和删除字符。
Output 向传输缓冲区写一个字符串。
如下程序打开串行端口COM1
MSComm1.CommPort = 1 使用 COM1
MSComm1.Settings = "9600,N,7,1" 9600波特率,无奇偶校验,7位数据,一个停止位。
MSComm1.PortOpen = True ''打开端口,开始通信。
3. MSComm控件的通信方式
通信控件有2种不同的方式来处理和解决各类通信软件的开发和设计问题。
(1) 事件驱动
事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如:当线路数据到达本端或CD线和RTS信号线状态发生变化时,要求我们使用相应的事件来跟踪和出理。在这些情况下, Mscomm控件将触发OnComm事件,CommEvent属性值也将被改变。所以在OnComm事件中读取CommEvent属性值就可以检测和处理通信错误等方面的问题。
(2)查询方式
利用定时器控件Timer,我们可以设计程序每隔一段时间去读取CommEvent的值并处理所发生错误和事件。
4. 本实例中采用的通讯方式
在本例子中,PC与PLC 采用无握手协议的串行通信,它们只用两根数据线 TD和RD、一根信号地线连接,数据通信采用查询方式。根据系统功能要求,PC需发送两种类型的命令:
(1) 周期性命令,它由定时器触发引起,每隔0.5秒发送一次。用它来向PLC查询实时显示的数据。如酒、水的瞬时流量,调节阀开度等。
(2) 非周期性命令,它由操作者按动命令按钮引起,非周期性发送。用它来传送输入参数、操作命令给PLC 。
在啤酒稀释的人机操作界面中,有运行时不可见的通信控件(MSComm1)一个、定时器控件一个Timer1。通信控件(MSComm1)用于初始化串口数据并打开串口;定时器控件(Timer1)用于每隔0.5秒执行通讯命令,把查询命令从PC发送到PLC,同时接收PLC返回的应答数据。设计通讯数据的发送和查询功能,必须掌握PLC所遵循的通讯协议。
5. 三菱FX系列PLC通讯协议
三菱FX系列PLC共有四种通信模式,本实例采用的是PLC与计算机专用协议通信方式(无须PLC编程,电脑直接读写操纵PLC),其通讯命令字和通讯格式介绍如下:
PC发送给PLC的通信命令字
命令字 注释
BR 以1点为单位,读出位元件的状态
WR 以16点为单位,读出位元件的状态,或以1字为单位,读出字元件的值
BW 以1点为单位,写入位元件的状态
WW 以16点为单位,写入位元件的状态,或以1字为单位,写入值到字元件
BT 以1点为单位,设置/复位 位元件
WT 以16点为单位,设置/复位 位元件,或以1字为单位,写入值到字元件
RR 控制PLC运行RUN
RS 控制PLC停止STOP
PC 读出PLC设备类型
TT 连接测试
PC发送给PLC的通信命令格式
约定说明:ENQ为请求标志,ASCII值5,VB中以chr(5)表示;
ACK为正确标志,ASCII值6,VB中以chr(6)表示;
STX为请求标志,ASCII值2,VB中以chr(2)表示;
EXT为请求标志,ASCII值3,VB中以chr(3)表示;
表格中粗体字为需要求和效验的部分;
和效验为每一项的ASCII值的总和转换成十六进制后,取其低两位;
站号、PLC号、元件数量、和效验都是以十六进制表示;
等待延时为0-150毫秒,以十六进制0H-FH表示,如100ms为AH。
1) 批量读出位元件—BR指令格式
1 2 3 4 5 6 7 8 15 16 17
PC侧: ENQ 站号 PLC号 BR 延时 首地址 数量 和校验 ACK 站号 PLC号
PLC侧: STX 站号 PLC号 数据 EXT 和校验
9 10 11 12 13 14
例如:要读出站号为5的PLC的X40到X44共5点的状态值,延时100毫秒,假设PLC中X40与X43为OFF,其余为ON,则指令数据如下:
注释: 请求 站号 PLC号 命令 延时 元件首地址 元件数量 和校验
代码: ENQ 0 5 F F B R A X 0 0 4 0 0 5 4 7
ASCII码: 05H 30H 35H 46H 46H 42H 52H 41H 58 30H 30H 34H 30H 30H 35H 34H 37H
只要将以上代码以字符串形式(VB中可以表示为chr(5)&”05FFBRAX00400547”)发送到PLC,就会有正确的回应信息,如下:
注释: 头 站号 PLC号 位元件状态值 尾 和校验
代码: STX 0 5 F F 0 1 1 0 1 EXT E 7
ASCII码: 02H 30H 35H 46H 46H 30H 31H 31H 30H 31H 03H 45H 37H
2) 批量读出字元件—WR指令格式
1 2 3 4 5 6 7 8 15 16 17
PC侧: ENQ 站号 PLC号 WR 延时 首地址 数量 和校验 ACK 站号 PLC号
PLC侧: STX 站号 PLC号 数据 EXT 和校验
9 10 11 12 13 14
该命令使用与BR命令相同。
3) 批量写入位元件—BW指令格式
1 2 3 4 5 6 7 8 9
PC侧: ENQ 站号 PLC号 BW 延时 首地址 数量 写入值 和校验
PLC侧: ACK 站号 PLC号
10 11 12
4) 批量写入字元件—WW指令格式
1 2 3 4 5 6 7 8 9
PC侧: ENQ 站号 PLC号 WW 延时 首地址 数量 写入值 和校验
PLC侧: ACK 站号 PLC号
10 11 12
6. VB通讯功能块设计分析
根据三菱PLC的通讯指令格式,在PC中编写数据查询功能块RevData( )和数据发送功能块SendData( ),就可以在定时中断处理块TIMER1( )中调用查询功能块RevData( ),实现PC界面数据定时刷新;在每一次操作命令执行时,调用数据发送功能块SendData( ),把控制值写入PLC中,从而实现控制。下面给出这两个功能块的设计程序。
1) 查询数据函数RevData( )
(没有和校验)
Sub RevPLC (iNo As String, iType As String, iAdd As String, iNum As String)
'' iNo为PLC站号,iType为元件类型,iAdd为首地址,iNum为元件数量
Dim Stmp As String
Dim cha, j As Integer
Dim ChaCount As Integer
Dim Comm As String
Select Case iType
Case "D" ''查询数据寄存器的值
Comm = "WR" ''命令类型:数据字读
cha = Val("&H" & iNum) * 4 ''数据寄存器的值为十六进制表示,占4个字符
Case "M", "X", "Y" ''查询继电器触电的值
Comm = "BR" ''命令类型:二进制位读
cha = Val("&H" & iNum)
End Select
iAdd = Right$("000" & iAdd, 4)
iNum = Right$("0" & iNum, 2)
Stmp = Chr$(5) & iNo & "FF" & Comm & "A" & iType & iAdd & iNum ''输出命令格式
ChaCount = 6 + cha ''要返回字符个数
main.MSComm1.InBufferCount = 0 ''输入缓冲区清零
main.MSComm1.Output = Stmp ''设传送缓冲区内容为命令格式
Now=Second()
Do
DoEvents ''转让控制权,以便让操作系统进行数据传输
If Second()-Now>1 Then Exit Sub
Loop Until main.MSComm1.InBufferCount = ChaCount ''当接收到规定字符时停止循环
RevDataTmp = Mid$(main.MSComm1.Input, 6, cha) ''返回数据字符串保存在全局变量
''RevDataTmp中
End Sub
2) 发送数据函数SendData( )
(没有和校验)
Sub SendPLC(iNo As String, iType As String, iAdd As String, iNum As String, iValue As String)
'' iNo为PLC站号,iType为元件类型,iAdd为首地址,iNum为元件数量,iValue为写入值
Dim Stmp As String
Dim Comm As String
Select Case iType
Case "D" ''写数据寄存器的值
Comm = "WW" ''命令类型:数据字写
iValue = Right$("0000" + Hex$(Val(iValue)), 4) ''写入值转换成十六进制表示
Case "M" ''写继电器触点的值
Comm = "BW" ''命令类型:二进制位写
End Select
iAdd = Right$("000" & iAdd, 4)
iNum = Right$("0" & iNum, 2)
Stmp = Chr$(5) & iNo & "FF" & Comm & "A" & iType & iAdd & iNum & iValue ''输出命令格式
MSComm1.Output = Stmp ''输出命令到传送缓冲区
Now= Second()
Do
DoEvents ''转让控制权,以便让操作系统进行数据传输
If Second()-Now>1 Then Exit Sub
Loop Until main.MSComm1.OutBufferCount = 0 ''当命令传送完时停止循环
End Sub