FX系列PLC与VB的通讯编程[转帖]
由于Visual Basic6.0具有可视化,支持面向对象的程序设计,具有结构化的事件驱动编程模式,编程效率高等优点,所以我们VB6.0提供串口通信控件MSComm来进行通信编程。在VB6.0的开发环境中MSComm控件可直接从VB的ToolBox中加入窗体Form,即可用其进行通信。
MSComm控件有很多重要属性,其中最主要的有:① Comm Port:设置并返回通信端口号。② Settings:设置串口的通信参数,以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。③ PortOpen:设置并返回通信端口的状态,并强行打开和关闭端口。④ Input:从接收缓冲区读取数据。⑤ Output:向输出缓冲区写入数据。⑥ InBufferCount:接收缓冲区中的字节数。⑦ InputLen:设置并返回Input每次读出的字节数。
MSComm控件同时支持事件驱动及查询方法,在本系统中,我们采用查询通信方式,通过检查InBufferCount属性值来判断输入缓冲区中是否接收到相应的数目字符。PLC通信模块设置为波特率:9600,数据位:8,停止位:1,可以在线写;不进行字符的奇偶检验和报文的和校验。以下是计算机读取1#站PLC数据寄存器DO的内容和将计算机时钟值写入PLC计数器C250中的程序。
(1)窗口加载程序
Private Sub Form-Load()
MSComm1.CommPort=2 '选择通信端口2'
MSComm1.Settings="9600,N,8,1"
'设置端口参数:传输速率9600,无校验,8位数据,1位停止位'
END Sub
(2)读取1#站PLC数据寄存器DO的内容
指令序列代码格式为:ENQ 01 FF WR 0D000 01 CR LF
Private Sub CommandRead-Click()
If MSComm1. PortOpen=False Then
'MSComm1. PortOpen=True'打开串行端口'
END If
MSComm1. Inputlen=0'串行数据接收缓冲区初始化'
rd $=Chr $(5)+"01FFWR0D000001"+ Chr $(13)+ Chr $(10)
'准备向PLC发送的读取数据命令字符串'
MSComm1. Output=rd $
'向PLC发送该字符串'
Dummy=DOEvents=()
Loop Until MSComm1. InBufferCount>=9
rdh $= MSComm1. Input
'读取接收缓冲区数据'
pd $=Mid $(rdh $,1,5)
'取PLC应答字符串的前5位'
If pd $=chr $(2)+"01FF"Then
'判断读取是否正确'
js $ =chr $(06)+"01FF"
'向PLC发送已正确接收数据信号'
MSComm1. Output=js $
rdh $=Mid $(rdh $,6,4)'检出DO内数据并将其转化为十进制数'
rdh =Val("&H"+ Trim(rdh $))
x =MsgBox("读取正常",16)
Else
x =MsgBox("读取数据错误!",16)
END If
END Sub
(3)将计算机时钟值写入PLC计数器C250中
指令序列代码格式为:ENQ 01 FF WW 0CN250 01 CR LF
Private Sub CommandWrite-Click()
If MSComm1. PortOpen=False Then
MSComm1. PortOpen=True'打开串行口'
END If MSComm1. In putLen=0'串行数据接收缓冲区初始化'
szt $ =Trim(str(Int(Timer/60)))
xr $ =Trim(Str(Val(Space(4-Len(szt $))))+ Hex(Val(szt $)))
'取上位机时钟值将其转化为PLC要求的格式'
wr $ = Chr $(5)+"01FFWW0CN25001"+ xr $ + Chr $(13)+ Chr $(10)
'准备向PLC发送的写入数据命令字符串'
MSComm1. Output = wr $
'向PLC发送该命令字符串'
DO '等待接收PLC回答的字符串'
Dummy = DO Events = ()
Loop Until MSComm1. InBufferCount>=5
fh $ = MSComm1. Input '读取接收缓冲区数据'
jc $ = Mid $(fh $,1,5) '取PLC应答字符串的前5位'
If jc $ = chr $(6)+"01FF"Then '判断写入是否正确'
x = MsgBox("写入正常!",16)
Else
x = MsgBox("没有正确写入!",16)
END If
END Sub
(4)通信关闭程序
Private Sub CommandClose-Click()
If MSComm1. PortOpen = True Then
MSComm1. PortOpen = False '关闭串行端口'
x = MsgBox ("关闭通信!",16)
END Sub