




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 VB与PLC之实时控制系统 詹金万、陈嘉龙一、 前言随着IT产业的进步及因特网的发展,传统工业控制所使用之PLC控制器,具有高度的稳定性及抗噪声的特性且配线容易及价格便宜,因此被大量应用在自动化的场所,已由单机操作朝向网络控制化发展,本文在探讨网络控制化的核心技术,使PC藉由RS-232通讯协议(注)控制PLC(如图一),并透过VB程序语言,达到远程控制及网络自动化控制的功能。本文以手动/自动红绿灯控制为主题,所使用之PLC为国内永宏电机公司所制FB-PLC,内含通讯模块,因此不需额外增购,且可由该公司网站免费下载及更新阶梯图发展软件(Winproladder)。二、 FB-PLCPC主系统
2、(Master)PLC仆系统(Slave)命令讯息RS-232响应讯息图一通讯协议FB-PLC藉由RS-232与PLC取得接口的传输,其传输格式(注)如图二所示,以起始字符(ASCII 02H)与结束字符(ASCII 03H)作为整个命令传输及响应讯息的传输封包,FB-PLC总计提供15种命令格式(ASCII 40H4EH),当主系统将命令传至PLC后,PLC将依据命令自动回传所对应的讯息,如图三所示起始字符仆站号码命令号码本文资料侦误值checksum结束字符0500个ASCII字符图二范例:将PLC启动(RUN)Master命令STX(02H)0(30H)1(31H)4(34H)1(31H
3、)1(31H)F(46H)9(39H)ETX(03H)PLC回应STX(02H)0(30H)1(31H)4(34H)1(31H)0(30H)F(46H)8(38H)ETX(03H)图三三手动/自动 红绿灯控制阶梯图程序利用缓存器R0,R4作为绿灯时间的计数器,R1,R2作为绿灯闪烁次数及闪烁时间的计数器,R3作为黄灯停留时间计数器,Y0、Y1、Y2分别代表东西向红、黄、绿三个灯,Y3、Y4、Y5分别代表南北向红、黄、绿三个灯。利用输入X2作手动自动的切换控制。当PLC处于自动模式时,绿灯交换分别由缓存器R0、R4控制;当PLC处于手动模式时,由输入X1决定绿灯交换程序。红绿灯阶梯图的设计程序如
4、图四所示。 图四手动自动红绿灯控制阶梯图程序四、 VB 实时监程序架构及程序设计PC藉由RS232与PLC取得联机,传送速度设定为9600bps,整个联机设定请参考VB程序Form_Load()段。实时监控画面设计如图五所示,当执行实时侦测状态按钮时,桌面将呈现如图六图九所示实时状态图,状态的侦测采用轮询(polling)方式,依序读取PLC输出及输入的实时状态,程序执行请参考VB程序SendFrame(Data, No)段;执行参数传递按钮时,桌面将呈现如图十画面,当使用者修改参数后,执行传递参数按钮,PLC 将依据新的数据执行其程序,程序执行请参考VB程序Send_Ref_Click()段
5、。另传送命令按钮提供个别参数的读取和设定及PLC执行程序的加载和存盘等多项功能,桌面呈现如图十一画面,程序执行请参考VB程序SendCmd_Click()段。 图五 实时监控画面设计 图六东西向绿灯Y0监控状态 图七东西向黄灯Y1监控状态 图八南北向绿灯Y3监控状态 图十参数设定传递画面 图九南北向黄灯Y4监控状态 图十一 个别参数命令的传送选择画面五、结论随着因特网的普及,远程监控已是必然的趋势,本专题所提供PC与FB-PLC间的联机,仅需在VB程序中加入因特网对象即可达到Internet的远距控制,亦可透过RS485接口达到远程实时监控。六、参考数据:“Vb与 8051串行传送之研制”国立
6、瑞芳高工90年教师专题研究:“FB-系列RS-232通讯协议”永宏电机股份有限公司七、VB 程序代码Form1程序代码如下:Dim Status1(15) 'Input X接点的状态Dim Status2(12) 'Output Y接点的状态Dim bx(15) 'X接点状态Dim by(12) 'Y接点状态Dim RegDim flag '启动旗号Dim flag1 '由计算机读出PLC缓存器程序旗号 命令"4A"程序Dim flag2 '由计算机写入PLC缓存器程序旗号 命令"4B"程序Dim
7、page_no '缓存器页数Public Sub SendFrame(Data, No) '传送通讯讯息格式()子程序 Select Case No Case 0: Check = Calculate_LRC(Data, 0) '计算LRC值 sendtxt = Chr$(&H2) & Trim(ClientNo) & Trim(CmdNo) & Trim(Data) & Trim(Check) & Chr$(&H3) '开头字符+仆站号码+命令号码+本文数据+侦误值+结尾字符 Case 1: Check
8、= Calculate_LRC(Data, 1) '计算LRC值 sendtxt = Chr$(&H2) & Trim(ClientNo) & Trim(Data) & Trim(Check) & Chr$(&H3) '开头字符+仆站号码+本文数据+侦误值+结尾字符 Case 2: sendtxt = Chr$(&H2) & Trim(ClientNo) & Trim(Data) & Trim(Check_RegText) & Chr(&H3) '开头字符+本文数据+结尾字符
9、 End Select MSComm.Output = sendtxt '透过RS-232送出End SubPublic Function Calculate_LRC(Data, No) As String '计算LRC值()子程序 Select Case No Case 0: LRC = 2 + Asc(Left(ClientNo, 1) + Asc(Mid(ClientNo, 2, 1) + Asc(Left(CmdNo, 1) + Asc(Mid(CmdNo, 2, 1) '包含开头字符Chr$(&H2)、仆站号码与命令码 Case 1: LRC = 2
10、+ Asc(Left(ClientNo, 1) + Asc(Mid(ClientNo, 2, 1) End Select For i = 1 To Len(Data) LRC = LRC + Asc(Mid(Data, i, 1) '将Data一次取一字符加入LRC中 Next LRC_Remain = LRC Mod 16 '取余数 LRC的个位数 LRC_Quotient = LRC 16 '取商数 LRC_Quotient = LRC_Quotient Mod 16 'LRC的十位数 Calculate_LRC = Hex(LRC_Quotient) &a
11、mp; Hex(LRC_Remain) '回传十六进制值End FunctionPrivate Sub B_Y_Click(Index As Integer) 'Y按钮()子程序If Index = 0 Then '如果是第0个按钮 If by(Index) = 1 Then '原先是High,就让它变Low sendtxt = "424Y0000" '传送字符串多补一个0 by(Index) = 0 '更改by(Index)内容为Low的状态 Y接点状态 Else '原先是Low,就让它变High sendtxt =
12、 "423Y0000" by(Index) = 1 '更改by(Index)内容为High的状态 End IfElse '如果是第1第11个按钮 If by(Index) = 1 Then sendtxt = "424Y000" & Format(Hex(Index), "#") '传送字符串为两位数,不须补一个0 by(Index) = 0 Else sendtxt = "423Y000" & Format(Hex(Index), "#") by(Ind
13、ex) = 1 End IfEnd IfSendFrame sendtxt, 1 '传送命令数据至RS-232End SubPrivate Sub CmdList_Click() '命单清单选择()子程序 Select Case CmdList.ListIndex '依据命令清单来选择命令 Case 0: CmdNo = "40" Case 1: CmdNo = "41" Case 2: CmdNo = "42" Case 3: CmdNo = "43" Case 4: CmdNo = &q
14、uot;44" Case 5: CmdNo = "45" Case 6: CmdNo = "46" Case 7: CmdNo = "47" Case 8: CmdNo = "48" Case 9: CmdNo = "49" Case 10: CmdNo = "4A" Case 11: CmdNo = "4B" Case 12: CmdNo = "4C" Case 13: CmdNo = "4D" Case
15、 14: CmdNo = "4E" End SelectEnd SubPrivate Sub CmdNo_Change() '命令号码改变()子程序 Select Case CmdNo.Text '依据选择命令显示命令清单 Case "40": CmdList.ListIndex = 0 Case "41": CmdList.ListIndex = 1 Case "42": CmdList.ListIndex = 2 Case "43": CmdList.ListIndex =
16、3 Case "44": CmdList.ListIndex = 4 Case "45": CmdList.ListIndex = 5 Case "46": CmdList.ListIndex = 6 Case "47": CmdList.ListIndex = 7 Case "48": CmdList.ListIndex = 8 Case "49": CmdList.ListIndex = 9 Case "4A": CmdList.ListIndex =
17、 10 Case "4B": CmdList.ListIndex = 11 Case "4C": CmdList.ListIndex = 12 Case "4D": CmdList.ListIndex = 13 Case "4E": CmdList.ListIndex = 14 Case Else: MsgBox "无此命令!", vbCritical, "错误!" End SelectEnd SubPrivate Sub Command1_Click() Form1.Hid
18、e Form2.ShowEnd SubPrivate Sub Connect_Click() '同步状态侦测()子程序 flag = 1 '设定启动旗号 Connect.Enabled = False '同步状态侦测按钮失效 Do DoEvents SendFrame "440CY0000", 1 '要求回传Y0000Y000B共12个接点状态 For i = 0 To 10 '延迟时间 DoEvents Next SendFrame "4410X0000", 1 '要求回传X0000X0010共16个接点
19、状 Loop While (flag = 1) '重复执行回传X与Y接点状态,直到启动旗号被停止为止End SubPrivate Sub Form_Activate() '窗体启用()子程序 CmdList.ListIndex = 1 '预设命令为"PLC执行控制"End SubPrivate Sub RegText_Change() 'RegText改变()子程序 Check_RegText = Calculate_LRC(RegText, 1) '计算LRC值显示在Check_RegText上End SubPrivate Sub
20、SendCmd_Click() '传送()子程序 If SendData = "" Then MsgBox "传送数据不可空白!", vbCritical, "错误!" Else CheckText = Calculate_LRC(SendData, 0) '计算LRC值显示在检查码上 SendFrame SendData, 0 '传送数据 End IfEnd SubPrivate Sub ClearData_Click() '清除()子程序 For i = 0 To 15 bx(i) = 0 InpX
21、(i).BackColor = RGB(255, 255, 255) '接点全部OFF,显示白色 Next For i = 0 To 11 by(i) = 0 OutY(i).BackColor = RGB(255, 255, 255) '接点全部OFF,显示白色 NextEnd SubPrivate Sub EndCmd_Click() '结束()子程序 If MSComm.PortOpen = True Then MSComm.PortOpen = False '关闭通讯端口 End If End '程序结束End SubPrivate Sub Fo
22、rm_Load() '窗体加载()子程序 MSComm.CommPort = 1 '指定COM1作为通讯端口 MSComm.Settings = "9600,e,7,1" '设定通讯协议的格式 MSComm.PortOpen = True '开起通讯端口 MSComm.RThreshold = 1 '设定输入缓冲区接到一个字,即起动接收事件(OnComm) MSComm.InputLen = 0 '设定每次读取输入缓冲区的数据的长度,0表示每次读取所有数据 MSComm.RTSEnable = True '使 Requ
23、est To Send (RTS) 线有效。 '一般情况下,由计算机传送 RTS 信号到调制解调器,以请示准许传送数据 flag = 1 '启动旗号 flag1 = 0 '设定读出PLC缓存器程序旗号 flag2 = 1 '设定写入PLC缓存器程序旗号End Sub Public Sub MSComm_OnComm() 'RS-232接收()子程序 Do buffer = buffer & MSComm.Input '一直接收字符串,直到收到结尾字符为止 Loop Until InStr(buffer, Chr(&H3) If I
24、nStr(buffer, Chr(&H2) Then buffer = Right(buffer, Len(buffer) - 1) '去除开头字符 End If If InStr(buffer, Chr(&H3) Then buffer = Mid(buffer, 1, InStr(1, buffer, Chr(&H3), 1) - 1) '去除结尾字符 End If Select Case Mid(buffer, 3, 2) '判别命令码 Case "40": ' "PLC系统状态" Case
25、"41": ' "PLC之RUN/STOP控制" Case "42": ' "单一个单点之运作控制" Case "43": ' "连续多个单点之抑/致能状态读取" Case "44": ' "连续多个单点之状态读取" '显示状态值 XStatus = "" '清除XStatus内容 YStatus = "" '清除YStatus内容 If L
26、en(buffer) = 23 Then '接收到 Input X 的内容 For i = 0 To 15 '015共16个输入端 XStatus = XStatus & Mid(buffer, 6 + i, 1) '将16个接点的ON/OFF状态显示在XStatus上 If Mid(XStatus, i + 1, 1) = 1 Then InpX(i).BackColor = RGB(255, 0, 0) '如果接点为ON,显示红色 bx(i) = 1 Else InpX(i).BackColor = RGB(255, 255, 255) '如
27、果接点为OFF,显示白色 bx(0) = 0 End If Next ElseIf Len(buffer) = 19 Then '接收到 Output Y 的内容 For i = 0 To 11 '011共12个输出端 YStatus = YStatus & Mid(buffer, 6 + i, 1) '将12个接点的ON/OFF状态显示在YStatus上 If Mid(YStatus, i + 1, 1) = 1 Then OutY(i).BackColor = RGB(255, 0, 0) '如果接点为ON,显示红色 by(i) = 1 Else O
28、utY(i).BackColor = RGB(255, 255, 255) '如果接点为OFF,显示白色 by(i) = 0 End If Next End If Case "45": ' "连续多个单点之状态写入" Case "46": ' "连续多个缓存器之数据读取" Case "47": ' "连续多个缓存器之数据写入" Case "48": ' "任意单点/缓存器混合之状态/数据读取" C
29、ase "49": ' "任意单点/缓存器混合之状态/数据写入" Case "4A": ' "程序存盘" Reg = buffer '显示缓存器内容存入Reg flag1 = 1 '设定读出缓存器旗标,以利Read_PLC_Click()子程序执行 Case "4B": ' "程序加载" flag2 = 1 '设定写入缓存器旗标,以利Write_PLC_Click()子程序执行 Case "4C": '
30、; "缓存器数据存盘" Case "4D": ' "缓存器数据加载" Case "4E": ' "测试回传" Case Else: ' "未知命令" & Mid(buffer, 3, 2) & vbCrLf & buffer End SelectEnd SubPrivate Sub Read_PLC_Click() '读取PLC()子程序 FileDlg.Filter = "*.txt" '预
31、设扩展名为*.txt FileDlg.ShowSave '显示储存档案对话盒 fn = FileDlg.FileName '指定檔名fn On Error GoTo err '如有错误发生,跳至错误处理 Open fn For Append As #1 '将读出的缓存器内容存盘 For page_no = 0 To 127 '缓存器共128页 RegTxt = "" '每次清除转换后要存档的Reg内容 SendFrame "4A" & Format(Hex(page_no), "#&quo
32、t;), 1 Do Until flag1 = 1 '直到计算机读出PLC缓存器程序旗号为止 DoEvents Loop For i = 3 To Len(Reg) - 2 '从头开始至侦误码前结束 If i = 4 Then RegTxt = RegTxt & "B" '将命令"4A"改成"4B" ElseIf i = 5 Then If page_no < 16 Then RegTxt = RegTxt & "0" & Hex(page_no) '少
33、于两码的,补一位数的"0" Else RegTxt = RegTxt & Hex(page_no) '本来就是两码的,不须补"0" End If Else RegTxt = RegTxt & Mid(Reg, i, 1) '将读取进来的RegText转换成要存档的Reg End If Next RegText = RegTxt '显示在RegText上 Write #1, RegText '写入档案 flag1 = 0 '清除旗号,等待下次再执行 Nexterr: '错误处理 Close #
34、1 '关闭档案End SubPrivate Sub RunCmd_Click() '执行()子程序If MSComm.PortOpen = False Then MSComm.PortOpen = TrueEnd If RunCmd.Enabled = False '执行按钮失效 StopCmd.Enabled = True '停止按钮有效 Connect.Enabled = True '同步状态侦测按钮有效 SendFrame "411", 1 '传送命令 flag = 1 '设定启动旗号,执行循环 End SubP
35、rivate Sub SendData_Change() '传送数据改变()子程序 CheckSum = Calculate_LRC(SendData, 0) '计算检查码显示在CheckSum上End SubPrivate Sub StopCmd_Click() '停止()子程序 RunCmd.Enabled = True '执行按钮有效 StopCmd.Enabled = False '停止按钮失效 Connect.Enabled = False '同步状态侦测按钮有效 flag = 0 '停止启动旗号,跳离执行循环 For i =
36、0 To 4 SendFrame "410", 1 '为防止无法立即关闭,传送三次命令,强迫停止 Next For i = 0 To 11 by(i) = 0 OutY(i).BackColor = RGB(255, 255, 255) '接点全部OFF,显示白色 NextEnd SubForm2程序代码如下:Dim R0, R1, R2, R3, R4Private Sub BackMain_Click() Unload Me Form1.ShowEnd SubPrivate Sub Default_Ref_Click() EW_GreenTime = 2
37、5 GreenFlashCount = 2 GreenFlashTime = 4 YellowTime = 20 SN_GreenTime = 25End SubPrivate Sub EW_GreenTime_Change() VScrollGT_EW.Value = EW_GreenTime End SubPrivate Sub Form_Activate() Default_Ref_ClickEnd SubPrivate Sub Form_Load() VScrollGFT = GreenFlashTime VScrollGFC = GreenFlashCount VScrollYT = Yel
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 渝北石纹地板施工方案
- 碑林区高一联考数学试卷
- 鼓楼区楼道出新施工方案
- 电厂排灰委托运行施工方案
- 楼梯间踢脚线粉墙施工方案
- 2025年大数据展现平台合作协议书
- 数控加工工艺与编程技术基础 教案 模块二 项目二 综合件的加工(3-4)
- 加强农田基础设施建设实施方案
- 挥发性有机物排放控制的法律法规及政策要求
- 强化基本医疗卫生服务的策略及实施路径
- GB/T 34448-2017生活用纸及纸制品甲醛含量的测定
- 元宵佳节-主题班会课件1
- GB/T 18877-2009有机-无机复混肥料
- GB 21240-2007液压电梯制造与安装安全规范
- 日用陶瓷工艺流程课件
- 最新部编版语文五年级下册教材分析及教学建议课件
- 中世纪文艺复兴医学史课件
- 家具厂安全生产操作规程大全
- 解剖学绪论课件
- 噬菌体疗法行业分析研究报告
- DB11-T1876-2021城市道路照明设施运行维护规范
评论
0/150
提交评论