紫外工控论坛

 找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 3602|回复: 0

[VB/VB.NET] 如何用VB实现Modbus串行通讯

[复制链接]
admin 发表于 2010-7-20 22:09:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
在一些应用中可能需要使用诸如VB来进行上位机监控程序的开发,而Modbus协议是这类应用中首选的通讯协议;Modbus协议以其简单易用,在工业领域里已广泛的为其他第三方设备所支持。这里对VB和Twido PLC间的通讯进行说明。
  对于大部分应用,Twido PLC作为从站,它不需要编制通讯程序,只要把通讯口的参数设置好即可,例如下图表示此Twido通过编程口和上位机连接,其站号地址为2;波特率、数据位、校验、停止位和上位机设置保持一致。
  
  VB程序通过利用MSComm控件很容易就能够实现。
  1.通讯口初始化:
  1. MSComm1.Settings = "9600,n,8,1"
  2.    MSComm1.CommPort = 1
  3.    MSComm1.SThreshold = 0
  4.    If Not MSComm1.PortOpen Then MSComm1.PortOpen = True
复制代码
2. CRC校验码的计算方法,如以下函数,可以得到字节数组变量cmdstring指向的字符串的CRC校验码。
  1.  Function crc16_1(ByRef cmdstring() As Byte, ByVal j As Integer)
  2.    Dim data As Integer
  3.    Dim i As Integer
  4.   
  5.   
  6.    Addressreg_crc = &HFFFF
  7.    For i = 0 To j
  8.    Addressreg_crc = Addressreg_crc Xor cmdstring(i)
  9.    For j = 0 To 7
  10.    data = Addressreg_crc And &H1
  11.    If data Then
  12.    Addressreg_crc = Int(Addressreg_crc / 2)
  13.    Addressreg_crc = Addressreg_crc And &H7FFF
  14.    Addressreg_crc = Addressreg_crc Xor &HA001
  15.    Else
  16.    Addressreg_crc = Addressreg_crc / 2
  17.    Addressreg_crc = Addressreg_crc And &H7FFF
  18.    End If
  19.    Next j
  20.    Next i
  21.   
  22.    If Addressreg_crc < 0 Then
  23.    Addressreg_crc = Addressreg_crc - &HFFFF0000
  24.    End If
  25.   
  26.    HiByte = Addressreg_crc And &HFF
  27.    LoByte = (Addressreg_crc And &HFF00) / &H100
  28.   End Function


复制代码
3.读多个字的命令(本例是从2号站读%MW10起始的4个字):
  1. Dim SendStr(7) As Byte
  2.    Dim RcvStr() As Byte
  3.    SendStr(0) = 2 ,从站号是2
  4.    SendStr(1) = &H3 ,读多个字的命令代码
  5.    SendStr(2) = 0 ,起始地址高字节
  6.    SendStr(3) = 10,起始地址低字节
  7.    SendStr(4) = &H0,数据长度高字节
  8.    SendStr(5) = 4 ,数据长度低字节
  9.   
  10.    Call crc16(SendStr(), 5) ,CRC计算
  11.    SendStr(6) = HiByte
  12.    SendStr(7) = LoByte
  13.    ,读命令发送后,当接收 5 + SendStr(5) * 2 个字节时产生中断
  14.    CmdLenth = 5 + SendStr(5) * 2
  15.    MSComm1.RThreshold = CmdLenth
  16.    MSComm1.Output = SendStr ,发送命令


复制代码
4.写多个字的命令(本例是写2号站%MW20起始的3个字):
  1. Dim WriteStr() As Byte
  2.    k = 6 ,写6个字节
  3.    ReDim WriteStr(8 + k)
  4.   
  5.    WriteStr(0) = 2 ,从站号是2
  6.    WriteStr(1) = &H10 ,写多个字的命令代码
  7.    WriteStr(2) = 0 ,起始地址高字节
  8.    WriteStr(3) = 20 ,起始地址低字节
  9.    WriteStr(4) = &H0 ,数据长度高字节<字的个数>
  10.    WriteStr(5) = k / 2 ,数据长度低字节<字的个数>
  11.   
  12.    WriteStr(6) = k ,数据长度<字节的个数>
  13.    WriteStr(7) = &H12,写的第1个字的高字节
  14.    WriteStr(8) = &H34,写的第1个字的低字节
  15.    WriteStr(9) = &H56,写的第2个字的高字节
  16.    WriteStr(10) = &H78,写的第2个字的低字节
  17.    WriteStr(11) = &H9A,写的第3个字的高字节
  18.    WriteStr(12) = &HBC,写的第3个字的低字节
  19.   
  20.    Call crc16(WriteStr(), 6 + k)
  21.    WriteStr(9 + (k / 2 - 1) * 2) = HiByte
  22.    WriteStr(10 + (k / 2 - 1) * 2) = LoByte
  23.   
  24.    MSComm1.InBufferCount = 0
  25.    MSComm1.Output = WriteStr
  26.    ,写命令发送后,当接收到8个字节时中断
  27.    CmdLenth = 8
  28.    MSComm1.RThreshold = CmdLenth


复制代码
5.通讯事件中断产生时的数据处理:
  1. Private Sub MSComm1_OnComm()
  2.    Dim inx() As Byte
  3.    Select Case MSComm1.CommEvent
  4.    Case comEvReceive ,判断为接收事件
  5.    MSComm1.InputLen = CmdLenth ,接收数据的长度
  6.    inx = MSComm1.Input ,接收数据
  7.    MSComm1.InBufferCount = 0
  8.   
  9.    For k = 3 To CmdLenth - 3
  10.    tmpstr = tmpstr & "/" & Hex(inx(k))
  11.    Next
  12.    Text1.Text = tmpstr ,以十六进制显示所接收长度的数据
  13.   
  14.   
  15.    Beep
  16.    End Select
  17.   End Sub


复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


--------------------------------------------------------------------------------------------------------------------
本站是工控技术交流站点,论坛内容均为网络收集或会员所发表,并不代表本站立场,会员拥有该内容的所有权力及责任!
本站内容如有侵犯您的版权,请按下面方式联系本站管理员,我们将及时删除处理
管理员:冰糖 QQ:5483695(请直击主题), Mail:admin#ziwai.net(#改成@) 其它非本人.
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!

QQ|Archiver|手机版|小黑屋|紫外工控论坛. ( 苏ICP备11032118号-1 )

GMT+8, 2024-5-14 21:34 , Processed in 0.500000 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表