利用VB实现PC与PLC的联机控制 点击:1711 | 回复:18



江湖再见-余辉

    
  • [管理员]
  • 精华:56帖
  • 求助:47帖
  • 帖子:3935帖 | 28219回
  • 年度积分:3686
  • 历史总积分:115599
  • 注册:2006年4月25日
发表于:2015-04-04 11:40:22
楼主

近年来,随着可编程控制器(以下简称PLC)技术的不断发展,速度、功能、可靠性和稳定性的不断提升,其在工业控制中的运用越来越广泛。个人计算机(以下简称PC)具有人机界面好,编程软件丰富,数据处理快,信息存储方便,图像功能完善等优点。以PLC为下位机,以PC机为上位机的联机控制模式,结合了PLC与PC各自的优点,提高了控制能力和可靠性,不仅操作使用方便,产品造价也较低,因而成为工业控制中应用较多的模式。本文以电动机正反转控制为实例,说明松下FP1系列PLC与PC实现联机控制的方法。

1. 松下FP1系列PLC与PC机的通信连接

松下FP1系列PLC均设有一个RS422串行通信接口。该接口既可用于PLC与PC机联机进行梯形图程序编程与调试,也可用于正常工作时的数据通信。PC机一般均设有一个以上的RS232C串行通信接口。由于RS232C和RS422属于不同的串行通信接口,通信信号的类型和工作方式不一样,因此,PLC与PC进行串行通信连接时,必须在中间安装一个RS422/RS232C适配器来完成信号的转换(部分PLC也具有RS232C口,此时可直接连接)。FP1系列PLC与PC机的通信连接如图1所示。

2. PLC控制电机正反转电路设计  

PLC控制电机正反转,其中SB0、SB1、SB2开关按钮分别用于控制电机的正转、反转和停止;KM1、KM2分别为电机正反转控制的接触器。由于PLC直接控制交流接触器,所以PLC应选择继电器输出型,并在接触器回路采用互锁来保证电路的安全。
3. PC与PLC的联机控制程序

按上述图1完成PLC与PC机的通信连接后,还需采用PLC联机编程软件或手持编程器对PLC内部通信参数专用的系统寄存器No.410~No.418进行设定,具体为:串口选择为COM1,波特率为9600bps,数据位长度为8位,停止位为1位,奇校验,单元号为1。
4.PLC控制程序
PLC的控制程序要既能现地控制,又能使PC机通过串口通信实现上位机对电动机的正反转控制和电机状态信息反馈。具体程序如图3所示。

程序中为实现PC机对电机的控制使用了R100、R101和R102三个内部继电器。内部继电器可由PC机按松下FP1系列PLC的NEWTOCOL专用通信协议(具体协议可参考厂家资料),以发送特定字符串的形式进行读写。为了仿效按钮操作的效果,三个内部继电器由上位机置位后启动对应的定时器,经0.8S后由定时器对内部继电器自动进行复位。

5. PC机控制程序与界面

作为上位机,PC机通过人机界面,将操作人员的操作指令转换成相应的通信字符串并经串口发送至PLC,实现对电机的控制;另一方面,PC机定时读取PLC寄存器的数据,从而可判断出PLC对电动机的控制状态并在人机界面上显示出来。
PC机的程序利用Visual Basic 6.0进行开发,首先,从菜单“工程”→“部件…”→“控件”中添加串行口通信控件Microsofc Comm Control 6.0到工具箱中,然后从工具箱中往窗体添加下表所列的控件。

序号

控件类型

控件名称

说  明

1

form

frmmain

程序主窗体

2

frame

Frame1

框架

3

MSComm

MSComm1

串口通信控件

4

Timer

Timer1

定时器

5

CommandButton

cmdzz

正转按钮

6

CommandButton

cmdfz

反转按钮
7

CommandButton

cmdtj

停机按钮
8

Label

Labdjzt

电机状态显示标签

添加上述控件后的程序窗体如图4所示。

PC机的控制程序如下:
Private Sub Form_Load()     '窗体加载过程
MSComm1.CommPort = 1    '通信控件选用PC机的串口1
MSComm1.Settings = "9600,o,8,1"      '设定串口1的波特率为9600bps,奇校验,8位数据位,1位停止位
MSComm1.PortOpen = True     '打开串口1
Timer1.Interval = 1000      '定时器1的定时值为1s
Timer1.Enabled = True       '启动定时器1   
End Sub

Function com(a As String, b As Integer) '向PLC读写寄存器内容函数
MSComm1.InBufferCount = 0   '清空串口的接收缓冲区
MSComm1.Output = a  '将要发送的字符串从串口发送出去
Do
DoEvents
Loop Until MSComm1.InBufferCount >= b   '等待PLC的响应字符至一定位数
com = MSComm1.Input     '读入串口接收到的字符串
End Function

Private Sub Timer1_Timer() '定时读取Y0、Y1的值以判断电机当前状态
a = "%01#RCP2Y0000Y0001**" + Chr(13)    '定义读Y0、Y1值的通信字符串
s = com((a), 9)     '读Y0、Y1的当前值
If Mid(s, 7, 1) = "1" Then '返回字符串中第7位为1表示Y0接通,电机正转
cmdzz.Enabled = False   '电机已正转,禁止操作正转按钮但可操作反转按钮
cmdfz.Enabled = True   
Labdjzt.Caption = "电机当前状态:正转"
ElseIf Mid(s, 8, 1) = "1" Then '反转
cmdfz.Enabled = False   '电机反转,禁止操作反转按钮但可操作正转按钮
cmdzz.Enabled = True
Labdjzt.Caption = "电机当前状态:反转"
ElseIf Mid(s, 7, 1) = "0" And Mid(s, 8, 1) = "0" Then '停机
cmdfz.Enabled = True    '电机已停止,可操作正转或反转按钮
cmdzz.Enabled = True
Labdjzt.Caption = "电机当前状态:停止"
End If
End Sub

Private Sub cmdzz_Click() '正转指令
a = "%01#WCSR01001**" + Chr(13) '定义将R100置1,启动正转的通信字符串
s = com((a), 7)    
End Sub

Private Sub cmdfz_Click() '反转指令
a = "%01#WCSR01011**" + Chr(13) '定义将R101置1,启动反转的通信字符串
s = com((a), 7)
End Sub

Private Sub cmdtj_Click() '停机指令
a = "%01#WCSR01021**" + Chr(13) '定义将R102置1使电机停转的通信字符串
s = com((a), 7)
End Sub
运行上述程序,既可在PC机上实现对电机正反转以及停止的控制,也可在现地通过SB0、SB1和SB2按钮实现对电机的控制;既可在现地启动或停止电机转动,也可在PC机上实现停机或电机转动控制。由于PC机定时读取PLC内部Y0、Y1的值,所以在现地操作改变电机的工作状态时,在PC机程序中可显示出当前电机的工作状态并禁止相应的操作,真正实现了PC与PLC的联机控制。

6. 结束语

上述设计已在实践中应用。经验证,可在此基础上,增加联机通信故障自动检测报警功能,利用数据读写命令实现联机大批量数据传送,根据现地来的状态信息增加PC机动画演示功能,从而使PC与PLC的联机控制程序更加完善,控制界面更加形象。根据上述原理,结合PC与PLC控制的特点,可在其它控制场合使用上述方法实现双机甚至多机联机控制。



楼主最近还看过



王者之师——小刀刀

  • 精华:1帖
  • 求助:0帖
  • 帖子:2帖 | 337回
  • 年度积分:0
  • 历史总积分:157
  • 注册:2013年3月01日
发表于:2015-04-04 12:04:10
1楼

哈哈哈,现在都用.net了

hyldg-工控人生

  • 精华:1帖
  • 求助:0帖
  • 帖子:3帖 | 242回
  • 年度积分:0
  • 历史总积分:1220
  • 注册:2011年3月26日
发表于:2015-04-04 14:57:31
2楼

谢谢分享........

zhu860423060

  • 精华:5帖
  • 求助:27帖
  • 帖子:272帖 | 3538回
  • 年度积分:79
  • 历史总积分:18638
  • 注册:2011年3月06日
发表于:2015-04-04 19:42:38
3楼

谢谢分享,好资料哦。 

fengenquan

  • 精华:0帖
  • 求助:9帖
  • 帖子:24帖 | 111回
  • 年度积分:2
  • 历史总积分:184
  • 注册:2009年3月22日
发表于:2015-05-10 22:59:27
4楼

非常感谢你的分享!我正好看懂了

hozi208m

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 109回
  • 年度积分:0
  • 历史总积分:67
  • 注册:2008年10月26日
发表于:2017-01-08 16:11:29
5楼

感谢分享 万分感谢!

junhong

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 76回
  • 年度积分:0
  • 历史总积分:0
  • 注册:2017年3月18日
发表于:2017-03-19 17:24:36
6楼

学习,谢谢分享!!!!

旦旦三剑

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 107回
  • 年度积分:986
  • 历史总积分:1469
  • 注册:2016年11月19日
发表于:2017-03-24 23:55:35
7楼

不知道用delphi能否做出这样的软件

ZHI_GOOD

  • 精华:0帖
  • 求助:1帖
  • 帖子:14帖 | 442回
  • 年度积分:131
  • 历史总积分:133
  • 注册:2015年10月04日
发表于:2017-03-29 08:42:52
8楼

谢谢楼主的分享!!!!!

CWK

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 78回
  • 年度积分:7
  • 历史总积分:29
  • 注册:2015年5月23日
发表于:2017-05-28 21:53:26
9楼

楼主厉害.............

zyuanlong11

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 155回
  • 年度积分:36
  • 历史总积分:152
  • 注册:2010年11月10日
发表于:2017-05-28 22:01:03
10楼

dingqi~﹉…1111111

李1990

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 55回
  • 年度积分:382
  • 历史总积分:483
  • 注册:2017年6月30日
发表于:2017-07-04 09:23:57
11楼

孤为何看不懂!我不会VB啊

花花公子@123

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 75回
  • 年度积分:0
  • 历史总积分:101
  • 注册:2016年11月14日
发表于:2018-05-28 16:11:41
12楼

这个资料很实用,要努力学习

zenguwyc

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 156回
  • 年度积分:348
  • 历史总积分:1469
  • 注册:2011年8月07日
发表于:2018-11-06 16:04:27
13楼

多谢楼主!

ACID

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 51回
  • 年度积分:0
  • 历史总积分:265
  • 注册:2018年7月22日
发表于:2018-12-24 16:16:31
14楼

出现错误,调试时,,,image.png

清南李生

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 147回
  • 年度积分:217
  • 历史总积分:217
  • 注册:2019年3月15日
发表于:2019-04-21 18:15:34
15楼

谢谢楼主分享

大花王

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 70回
  • 年度积分:1
  • 历史总积分:60
  • 注册:2015年11月14日
发表于:2019-08-07 09:52:39
16楼

正在学习,多谢分享

hfj1234

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 227回
  • 年度积分:0
  • 历史总积分:159
  • 注册:2013年5月06日
发表于:2019-08-08 18:36:38
17楼

谢谢,虽然看不懂

PLC123

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 16回
  • 年度积分:195
  • 历史总积分:240
  • 注册:2016年5月21日
发表于:2019-10-21 10:42:47
18楼

这个资料很实用,要努力学习



相关主题

官方公众号

智造工程师