×
工业控制 > 工业自动化 > 详情

利用Visual Basic和PLC开发小型监控系统

发布时间:2021-01-20 发布时间:
|


一.前言
随着生产自动化程度的不断提高,可编程序控制器PLC得到了广泛的应用,特别是小型PLC具有编程简单、性能可靠和价格低的特点,被大量应用于单机控制系统中,如啤酒的稀释控制、离心机控制等。作为设备维修技术人员,一般都能掌握PLC和计算机PC的应用知识,但如何利用PLC和PC来设计小型自控系统,实现简单的数据采集和监控操作,从而满足生产需要,却是一个要深入学习研究的问题。
面向生产操作,设计简单有效的控制系统,涉及到三部分的软件编程:
第一:PC上人机操作界面的设计。PC作为上位机,一般都是运行在Windowsxa098/2000操作系统下,利用微软提供的可视化编程软件Visualxa0Basicxa06.0,设备维修技术人员就可设计出优美的人机操作界面,只需进行主要操作功能编程和少量界面控制编程。
第二:实现生产工艺要求的PLC控制程序设计。因为是小型控制系统,其生产控制过程并不复杂,技术人员只要充分了解了生产工艺和控制要求,运用PLC编程工具,此部分设计编程并不难。
第三:PC与PLC通讯程序的设计。此部分的开发设计较难,需要掌握PC和PLC的有关通讯硬件驱动和通讯协议的知识。但对于小型控制系统来说,主要通过PC串口来通讯,所以通讯程序设计的关键是如何利用Visualxa0Basicxa06.0中的串口通信控件——MSComm控件,并根据PLC的串口通信协议设计出上下位机的数据交换程序。
下面以啤酒稀释自控系统设计为例,主要讲解PC和PLC通讯程序的设计要点。

二.xa0啤酒稀释自控系统设计分析
1.xa0啤酒稀释控制要求
啤酒稀释是啤酒生产中一个重要环节,通过把高浓度的酒液与脱氧水按比例混合成稀释酒,从而提高啤酒产量和增加啤酒品种,稀释的控制过程很简单,主要步骤有:
1)xa0输入高浓度的浓度A和稀释后要达到的浓度Bxa0;
2)xa0计算出加水量的百分比xa0[(B-A)xa0/xa0A]*100%xa0;
3)xa0根据此百分比和高浓酒的瞬时流量,计算出脱氧水要达到的流量;
4)xa0比较水的瞬时流量和计算出的流量,来控制水调节阀的开度,使水瞬时流量等于计算流量。
由于酒和水的瞬时流量是变化的,所以3)、4)步要反复进行。以上所有的计算功能和PID调节功能都由PLC完成。
2.xa0啤酒稀释的人机操作界面:
人机操作主要用来输入啤酒浓度数据、操作命令,直观显示各种流量数据并记录偏差曲线,界面图如下:
3.xa0硬件配置
本例子中上位机PC选用联想奔腾Ⅱ品牌机,外加RS232转RS485通讯转换卡。下位机PLC选用三菱FX2N-16MR,另加模拟输入模块FX2N-2ADxa0和模拟输出模块FX2N-2DA各一块,外加一个485串口通讯模块PC-485BD。

三.xa0PC与PLC通讯程序设计分析
在分析具体的VB通讯程序之前,先要介绍有关VB串口通信控件MSComm的应用知识和三菱PLCxa0通讯协议。
1.xa0MSComm控件简介
如图所示是Mscomm控件的图标。

它可以用来提供简单的串行端口通信功能,也可以用来创建功能完备、事件驱动的高级通信工具。Mscomm控件提供了一系列标准通信命令的使用界面。使用它可以建立与串行端口的连接,通过串行端口再连接到其它设备(如调制解调器、PLC),发出命令,交换数据,以及监视和响应串行连接中发生的事件和错误。

2.xa0MSComm控件的基本属性
MSCommxa0控件有很多重要的属性,基本属性如下:

属性描述
CommPort设置并返回通讯端口号。
Settings以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen设置并返回通讯端口的状态。也可以打开和关闭端口。
Input从接收缓冲区返回和删除字符。
Output向传输缓冲区写一个字符串。

如下程序打开串行端口COM1
MSComm1.CommPort=1使用COM1
MSComm1.Settings="9600,N,7,1"9600波特率,无奇偶校验,7位数据,一个停止位。
MSComm1.PortOpen=xa0True''''''''''''''''打开端口,开始通信。

3.xa0MSComm控件的通信方式
通信控件有2种不同的方式来处理和解决各类通信软件的开发和设计问题。
(1)事件驱动
事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如:当线路数据到达本端或CD线和RTS信号线状态发生变化时,要求我们使用相应的事件来跟踪和出理。在这些情况下,xa0Mscomm控件将触发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的通信命令字
命令字xa0注释
BRxa0以1点为单位,读出位元件的状态
WRxa0以16点为单位,读出位元件的状态,或以1字为单位,读出字元件的值
BWxa0以1点为单位,写入位元件的状态
WWxa0以16点为单位,写入位元件的状态,或以1字为单位,写入值到字元件
BTxa0以1点为单位,设置/复位xa0位元件
WTxa0以16点为单位,设置/复位xa0位元件,或以1字为单位,写入值到字元件
RRxa0控制PLC运行RUN
RSxa0控制PLC停止STOP
PCxa0读出PLC设备类型
TTxa0连接测试

PC发送给PLC的通信命令格式
约定说明:ENQ为请求标志,ASCII值5,VB中以chr(5)表示;
ACK为正确标志,ASCII值6,VB中以chr(6)表示;xa0
STX为请求标志,ASCII值2,VB中以chr(2)表示;
EXT为请求标志,ASCII值3,VB中以chr(3)表示;xa0
表格中粗体字为需要求和效验的部分;
和效验为每一项的ASCII值的总和转换成十六进制后,取其低两位;
站号、PLC号、元件数量、和效验都是以十六进制表示;
xa0xa0xa0xa0等待延时为0-150毫秒,以十六进制0H-FH表示,如100ms为AH。

1)批量读出位元件—BR指令格式

12345678151617
PC侧:xa0ENQxa0站号xa0PLC号xa0BRxa0延时xa0首地址xa0数量xa0和校验xa0xa0xa0xa0xa0xa0xa0ACKxa0站号xa0PLC号
PLC侧:xa0xa0xa0xa0xa0xa0xa0xa0xa0STXxa0站号xa0PLC号xa0数据xa0EXTxa0和校验xa0xa0xa0
xa0xa0xa0xa0xa0xa0xa0xa0xa09xa010xa011xa012xa013xa014xa0xa0xa0

例如:要读出站号为5的PLC的X40到X44共5点的状态值,延时100毫秒,假设PLC中X40与X43为OFF,其余为ON,则指令数据如下:


注释:xa0请求xa0站号xa0PLC号xa0命令xa0延时xa0元件首地址xa0元件数量xa0和校验
代码:xa0ENQxa00xa05xa0Fxa0Fxa0Bxa0Rxa0Axa0Xxa00xa00xa04xa00xa00xa05xa04xa07
ASCII码:xa005Hxa030Hxa035Hxa046Hxa046Hxa042Hxa052Hxa041Hxa058xa030Hxa030Hxa034Hxa030Hxa030Hxa035Hxa034Hxa037H

只要将以上代码以字符串形式(VB中可以表示为chr(5)&”05FFBRAX00400547”)发送到PLC,就会有正确的回应信息,如下:
注释:xa0头xa0站号xa0PLC号xa0位元件状态值xa0尾xa0和校验
代码:xa0STXxa00xa05xa0Fxa0Fxa00xa01xa01xa00xa01xa0EXTxa0Exa07
ASCII码:xa002Hxa030Hxa035Hxa046Hxa046Hxa030Hxa031Hxa031Hxa030Hxa031Hxa003Hxa045Hxa037H

2)xa0批量读出字元件—WR指令格式
1xa02xa03xa04xa05xa06xa07xa08xa0xa0xa0xa0xa0xa0xa015xa016xa017
PC侧:xa0ENQxa0站号xa0PLC号xa0WRxa0延时xa0首地址xa0数量xa0和校验xa0xa0xa0xa0xa0xa0xa0ACKxa0站号xa0PLC号
PLC侧:xa0xa0xa0xa0xa0xa0xa0xa0xa0STXxa0站号xa0PLC号xa0数据xa0EXTxa0和校验xa0xa0xa0
xa0xa0xa0xa0xa0xa0xa0xa0xa09xa010xa011xa012xa013xa014xa0xa0xa0
该命令使用与BR命令相同。
xa0xa0
3)xa0批量写入位元件—BW指令格式xa0xa0
1xa02xa03xa04xa05xa06xa07xa08xa09xa0xa0xa0
PC侧:xa0ENQxa0站号xa0PLC号xa0BWxa0延时xa0首地址xa0数量xa0写入值xa0和校验xa0xa0xa0
PLC侧:xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0ACKxa0站号xa0PLC号
xa0xa0xa0xa0xa0xa0xa0xa0xa0xa010xa011xa012

4)xa0批量写入字元件—WW指令格式
1xa02xa03xa04xa05xa06xa07xa08xa09xa0xa0xa0
PC侧:xa0ENQxa0站号xa0PLC号xa0WWxa0延时xa0首地址xa0数量xa0写入值xa0和校验xa0xa0xa0
PLC侧:xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0ACKxa0站号xa0PLC号
xa0xa0xa0xa0xa0xa0xa0xa0xa0xa010xa011xa012

6.xa0VB通讯功能块设计分析
根据三菱PLC的通讯指令格式,在PC中编写数据查询功能块RevData(xa0)和数据发送功能块SendData(xa0),就可以在定时中断处理块TIMER1(xa0)中调用查询功能块RevData(xa0),实现PC界面数据定时刷新;在每一次操作命令执行时,调用数据发送功能块SendData(xa0),把控制值写入PLC中,从而实现控制。下面给出这两个功能块的设计程序。
1)xa0查询数据函数RevData(xa0)
(没有和校验)
Subxa0xa0RevPLCxa0(iNoxa0Asxa0String,xa0iTypexa0Asxa0String,xa0iAddxa0Asxa0String,xa0iNumxa0Asxa0String)
''''''''''''''''xa0iNo为PLC站号,iType为元件类型,iAdd为首地址,iNum为元件数量
Dimxa0Stmpxa0Asxa0String
Dimxa0cha,xa0jxa0Asxa0Integer
Dimxa0ChaCountxa0Asxa0Integer
Dimxa0Commxa0Asxa0String
Selectxa0Casexa0xa0iType
Casexa0"D"xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0''''''''''''''''查询数据寄存器的值
Commxa0=xa0"WR"xa0xa0xa0xa0xa0xa0xa0''''''''''''''''命令类型:数据字读
chaxa0=xa0Val("&H"xa0&xa0iNum)xa0*xa04xa0xa0xa0xa0xa0xa0''''''''''''''''数据寄存器的值为十六进制表示,占4个字符
Casexa0"M",xa0"X",xa0"Y"xa0xa0xa0xa0xa0''''''''''''''''查询继电器触电的值
Commxa0=xa0"BR"xa0xa0xa0xa0xa0xa0''''''''''''''''命令类型:二进制位读
chaxa0=xa0Val("&H"xa0&xa0iNum)
Endxa0Select
iAddxa0=xa0Right$("000"xa0&xa0iAdd,xa04)
iNumxa0=xa0Right$("0"xa0&xa0iNum,xa02)
Stmpxa0=xa0Chr$(5)xa0&xa0iNoxa0&xa0"FF"xa0&xa0Commxa0&xa0"A"xa0&xa0iTypexa0&xa0iAddxa0&xa0iNumxa0xa0xa0xa0''''''''''''''''输出命令格式
ChaCountxa0=xa06xa0+xa0chaxa0xa0''''''''''''''''要返回字符个数
main.MSComm1.InBufferCountxa0=xa00xa0xa0''''''''''''''''输入缓冲区清零
main.MSComm1.Outputxa0=xa0Stmpxa0xa0''''''''''''''''设传送缓冲区内容为命令格式
Now=Second()
Do
DoEventsxa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0''''''''''''''''转让控制权,以便让操作系统进行数据传输
Ifxa0xa0Second()-Now>1xa0xa0Thenxa0xa0Exitxa0xa0Sub
Loopxa0Untilxa0main.MSComm1.InBufferCountxa0=xa0ChaCountxa0xa0''''''''''''''''当接收到规定字符时停止循环
RevDataTmpxa0=xa0Mid$(main.MSComm1.Input,xa06,xa0cha)xa0xa0xa0xa0xa0''''''''''''''''返回数据字符串保存在全局变量
''''''''''''''''RevDataTmp中
Endxa0Sub
2)xa0发送数据函数SendData(xa0)
(没有和校验)
Subxa0SendPLC(iNoxa0Asxa0String,xa0iTypexa0Asxa0String,xa0iAddxa0Asxa0String,xa0iNumxa0Asxa0String,xa0ivaluexa0Asxa0String)
''''''''''''''''xa0iNo为PLC站号,iType为元件类型,iAdd为首地址,iNum为元件数量,ivalue为写入值
Dimxa0Stmpxa0Asxa0String
Dimxa0Commxa0Asxa0String
Selectxa0Casexa0xa0iType
Casexa0"D"xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0''''''''''''''''写数据寄存器的值
Commxa0=xa0"WW"xa0xa0xa0xa0xa0xa0xa0xa0''''''''''''''''命令类型:数据字写
ivaluexa0=xa0Right$("0000"xa0+xa0Hex$(Val(ivalue)),xa04)xa0xa0''''''''''''''''写入值转换成十六进制表示
Casexa0"M"xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0''''''''''''''''写继电器触点的值
Commxa0=xa0"BW"xa0xa0xa0xa0xa0xa0xa0xa0''''''''''''''''命令类型:二进制位写
Endxa0Select

iAddxa0=xa0Right$("000"xa0&xa0iAdd,xa04)
iNumxa0=xa0Right$("0"xa0&xa0iNum,xa02)
Stmpxa0=xa0Chr$(5)xa0&xa0iNoxa0&xa0"FF"xa0&xa0Commxa0&xa0"A"xa0&xa0iTypexa0&xa0iAddxa0&xa0iNumxa0&xa0ivaluexa0xa0''''''''''''''''输出命令格式
MSComm1.Outputxa0=xa0Stmpxa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0''''''''''''''''输出命令到传送缓冲区
Now=xa0Second()
Do
DoEventsxa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0''''''''''''''''转让控制权,以便让操作系统进行数据传输
Ifxa0xa0Second()-Now>1xa0xa0Thenxa0xa0Exitxa0xa0Sub
Loopxa0Untilxa0main.MSComm1.OutBufferCountxa0=xa00xa0xa0xa0''''''''''''''''当命令传送完时停止循环
Endxa0Sub

四.xa0总结:
生产自控系统的设计要解决好三部分的问题:PC上人机操作界面的编制,PC与PLC的通信程序编写,PLC生产控制程序的编写。对于串行通信的单机自控系统,因为具有操作界面和生产工艺流程简单的特点,所以利用Visualxa0Basic设计操作界面和利用PLC编程语言设计生产控制程序都比较方便,但对如何编写通信程序就比较陌生,也没有许多相关资料可学习。本文介绍的方法简单、实用,供各位参考。利用通信控件MSComm的OnComm事件和CommEvent属性还可以设计出功能更完善的通信程序。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
绝缘电阻测试屏蔽环装设不同位置比较