理论教育 VB编写ModbusTCP主站代码的优化技巧

VB编写ModbusTCP主站代码的优化技巧

时间:2023-06-28 理论教育 版权反馈
【摘要】:图9-38 Modbus从站设置图9-39 变量赋初值图9-40 变量已被赋值图9-41 创建新的EXE项目2)新建一个Form程序,如图9-42所示。③添加text控件3作为连接状态的指示,其中绿色的连接正常,红色为连接故障。④添加text控件4作为Modbus地址起始地址和数据长度。⑤添加winsock控件5,属性RemoteHost=“192.168.1.66”,属性Remote-Port=“502”。⑦添加button控件8为中断Modbus TCP连接按钮。⑨添加button控件10为回写Modbus数据按钮。图9-42 新建一个Form程序3)点击右键进入代码页面,具体代码如下。

VB编写ModbusTCP主站代码的优化技巧

1)启动Visual Basic,新建一个标准EXE项目,如图9-41所示。

978-7-111-45432-8-Chapter09-41.jpg

图9-38 Modbus从站设置

978-7-111-45432-8-Chapter09-42.jpg

图9-39 变量赋初值

978-7-111-45432-8-Chapter09-43.jpg

图9-40 变量已被赋值

978-7-111-45432-8-Chapter09-44.jpg

图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连接按钮。

978-7-111-45432-8-Chapter09-45.jpg

图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="Can978-7-111-45432-8-Chapter09-46.jpgt 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

978-7-111-45432-8-Chapter09-47.jpgMbusQuery=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中的变量。

978-7-111-45432-8-Chapter09-48.jpg

图9-43 程序连接

978-7-111-45432-8-Chapter09-49.jpg

图9-44 读取Micro850中的变量

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈