利用VB实现PC与PLC的联机控制
序号 | 控件类型 | 控件名称 | 说明 |
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控制的特点,可在其它控制场合使用上述方法实现双机甚至多机联机控制。
评论