1)启动Visual Basic,新建一个标准EXE项目,如图9-41所示。
图9-38 Modbus从站设置
图9-39 变量赋初值
图9-40 变量已被赋值
图9-41 创建新的EXE项目
2)新建一个Form程序,如图9-42所示。
①添加text控件1作为数据显示。
②添加text控件2作为IP地址输入框。
③添加text控件3作为连接状态的指示,其中绿色的连接正常,红色为连接故障。
④添加text控件4作为Modbus地址起始地址和数据长度。
⑤添加winsock控件5(TCP通信),属性RemoteHost=“192.168.1.66”,属性Remote-Port=“502”。
⑥添加timer控件6为间隔轮询时间。
⑦添加button控件8为中断Modbus TCP连接按钮。
⑧添加button控件9为读取Modbus数据按钮。
⑨添加button控件10为回写Modbus数据按钮。
⑩添加button控件7为连接Modbus TCP连接按钮。
图9-42 新建一个Form程序
3)点击右键进入代码页面,具体代码如下。
Dim MbusQuery(11)As Byte‘声明Modbus请求指令位
Public MbusResponse As String‘声明Modbus回应标识
Dim MbusByteArray(255)As Byte‘声明Modbus字节数组255个
Public MbusRead As Boolean‘声明Modbus读标志
Public MbusWrite As Boolean‘声明Modbus写标志
Dim ModbusTimeOut As Integer‘声明Modbus连接超时
Dim ModbusWait As Boolean‘声明Modbus等待标志
Private Sub Command1 Click()‘创建connect按钮的点击事件
Dim StartTime‘声明一个内部启动时间的标志
If(Winsock1.State<>sckClosed)Then‘判断Modbus TCP连接是否成功
Winsock1.Close‘如果modbus TCP连接成功将关闭连接
End If
Winsock1.RemoteHost=Text1.Text‘设置Modbus TCP的IP地址为text1的内容
Winsock1.Connect‘连接Modbus TCP client
StartTime=Timer‘设置轮询时间间隔
Do While((Timer<StartTime+2)And(Winsock1.State<>7))‘等待连接超时时间或者通信中断
DoEvents
Loop
If(Winsock1.State=7)Then‘如果Modbus TCP通信连接正常
Text5.Text="Connected"‘让连接状态栏显示连接字符
Text5.BackColor=&HFF00&‘并且让连接状态栏的颜色显示为绿色
Else
Text5.Text="Cant connect to"+Text1.Text‘否则显示不能连接
Text5.BackColor=&HFF‘状态栏颜色值置为红色
End If
End Sub
Private Sub Command2 Click()‘点击中断button事件
If(Winsock1.State<>sckClosed)Then‘判断Modbus TCP连接有没有中断
Winsock1.Close‘关闭Modbus TCP通信
End If
Do While(Winsock1.State<>sckClosed)‘等待Modbus TCP关闭
DoEvents
Loop
Text5.Text="Disconnected"‘状态栏显示连接中断
Text5.BackColor=&HFF‘状态栏颜色设置为红色
End Sub
Private Sub Command3 Click()‘点击读线圈button的事件
Dim StartLow As Byte‘设置起始低位
Dim StartHigh As Byte‘设置起始高位
Dim LengthLow As Byte‘设置长度低位
Dim LengthHigh As Byte‘设置长度高位
If(Winsock1.State=7)Then‘判断Modbus TCP通信连接正常
StartLow=Val(Text2.Text)Mod 256‘将起始text框内数值和256求模然后赋值给起始低位
StartHigh=Val(Text2.Text)\256‘将起始text框内数值除256然后赋值给起始高位
LengthLow=Val(Text3.Text)Mod 256‘将长度text框内数值和256求模然后赋值给起始低位
LengthHigh=Val(Text3.Text)\256‘将起始text框内数值除256然后赋值给起始高位
‘设置modbus TCP主站的通信协议帧
MbusQuery(0)=0
MbusQuery(1)=0
MbusQuery(2)=0
MbusQuery(3)=0
MbusQuery(4)=0
MbusQuery(5)=6
MbusQuery(6)=1
MbusQuery(7)=3
MbusQuery(8)=StartHigh
MbusQuery(9)=StartLow
MbusQuery(10)=LengthHigh
MbusQuery(11)=LengthLow
MbusRead=True
MbusWrite=False
MbusQuery=Chr(0)+Chr(0)+Chr(0)+Chr(0)+Chr(0)+Chr(6)+Chr(1)+Chr(3)+Chr(StartHigh)+Chr(StartLow)+Chr(LengtHigh)+Chr(LengthLow)
Winsock1.SendData MbusQuery‘把设置好的通信数据帧,发送给Modbus TCP从站
ModbusWait=True‘设置Modbus轮询是否等待(www.daowen.com)
ModbusTimeOut=0‘设置Modbus超时为0
Timer1.Enabled=True‘启动timer计时器
Else
MsgBox("Device not connected via TCP/IP")‘提示信息为设备不能连接
End If
End Sub
Private Sub Command4 Click()‘写线圈数值button事件
Dim MbusWriteCommand As String‘modbus写命令
Dim StartLow As Byte‘设置启动低位
Dim StartHigh As Byte‘设置启动高位
Dim ByteLow As Byte‘设置字节低位
Dim ByteHigh As Byte‘设置字节高位
Dim i As Integer‘设置循环变量
If(Winsock1.State=7)Then‘判断Modbus TCP通信是否正常
StartLow=Val(Text2.Text)Mod 256‘将起始text框内数值和256求模然后赋值给起始低位
StartHigh=Val(Text2.Text)\256‘将起始text框内数值除256然后赋值给起始高位
LengthLow=Val(Text3.Text)Mod 256‘将长度text框内数值和256求模然后赋值给起始低位
LengthHigh=Val(Text3.Text)\256‘将起始text框内数值除256然后赋值给起始高位
MbusWriteQuery=Chr(0)+Chr(0)+Chr(0)+Chr(0)+Chr(0)+Chr(7+2*Val(Text3.Text))+Chr(1)+Chr(16)+Chr(StartHigh)+Chr(StartLow)+Chr(0)+Chr(Val(Text3.Text))+Chr(2*Val(Text3.Text))‘设置Modbus TCP写数值通信帧
For i=0 To Val(Text3.Text)-1‘循环计算crc校验数值并写入通信数据帧
ByteLow=Val(Text4(i).Text)Mod 256
ByteHigh=Val(Text4(i).Text)\256
MbusWriteQuery=MbusWriteQuery+Chr(ByteHigh)+Chr(ByteLow)
Next i
MbusRead=False
MbusWrite=True
Winsock1.SendData MbusWriteQuery‘发送Modbus TCP写指令
ModbusWait=True‘设置Modbus等待标志
ModbusTimeOut=0‘设置超时时间为0
Timer1.Enabled=True‘启动timer计时器
Else
MsgBox("Device not connected via TCP/IP")‘提示不能连接Modbus TCP从站
End If
End Sub
Private Sub Timer1 Timer()‘timer计时器启动事件
ModbusTimeOut=ModbusTimeOut+1‘累加Modbus超时时间
If ModbusTimeOut>2 Then‘判断Modbus超时大于2个周期
ModbusWait=False‘Modbus等待标志为0
ModbusTimeOut=0‘清除Modbus超时累计
Text5.Text="Modbus Time Out"‘状态栏显示Modbus超时
Text5.BackColor=&HFF‘设置状态栏的颜色为红色
Timer1.Enabled=False‘设置timer计时器停止
End If
End Sub
Private Sub Winsock1 DataArrival(ByVal datalength As Long)‘Modbus TCP接受事件
Dim b As Byte
Dim j As Byte
For i=1 To datalength
Winsock1.GetData b‘接受TCP端口收到的Modbus TCP信息
MbusByteArray(i)=b‘接受的数据放入byte数组
Next
j=0
If MbusRead Then‘判断是否为读指令接受数据帧
For i=10 To MbusByteArray(9)+9 Step 2‘循环分解Modbus TCP从站返回来的数据帧
Text4(j).Text=Str((MbusByteArray(i)*256)+MbusByteArray(i+1))
j=j+1
Next i
Text5.Text="Registers read"‘状态栏写入线圈读字符
Text5.BackColor=&HFF00&‘状态栏设置为绿色
For l=j To 61‘没有数据的text数据框将被用*****替代
Text4(l).Text="*****"
Next l
ModbusWait=False‘设置Modbus等待标志
ModbusTimeOut=0‘设置Modbus超时为0
Timer1.Enabled=False‘设置timer计时器启动
End If
If MbusWrite Then‘判断如果是写指令返回通信帧
If(MbusByteArray(8)=16)And(MbusByteArray(12)=Val(Text3.Text))Then
Text5.Text="Registers written"‘状态栏写入线圈写入字符
Text5.BackColor=&HFF00&‘设置状态栏颜色为绿色
ModbusWait=False‘设置Modbus等待标志
ModbusTimeOut=0‘设置Modbus通信超时为0
Timer1.Enabled=False‘设置timer计时器停止
Else
Text5.Text="Error writting registers"‘状态栏写入写线圈错误字符
Text5.BackColor=&HFF‘设置状态栏颜色为红色
End If
End If
End Sub
4)运行这个开发好的程序,然后点击“Connect”按钮,这时状态文本框出现“Con-nected”,表示连接成功,如图9-43所示。
5)点击“Read Registers”按钮会发现前4个文本框出现数值1、2、3、4,这表明VB可以通过Modbus TCP协议对Micro850中的变量进行读取,如图9-44所示。
同理如果使用通用组态软件也可以通过Modbus TCP协议读取和写入Micro 850中的变量。
图9-43 程序连接
图9-44 读取Micro850中的变量
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。