如何用VB实现Modbus串行通讯

 
如何用 VB 实现 Modbus 串行通讯
在一些应用中可能需要使用诸如 VB 来进行上位机监控程序的开发,而 Modbus 协议是这类应用中首选的通讯协议; Modbus 协议以其简单易用,在工业领域里已广泛的为其他第三方设备所支持。这里对 VB Twido PLC 间的通讯进行说明。
  对于大部分应用, Twido PLC 作为从站,它不需要编制通讯程序,只要把通讯口的参数设置好即可,例如下图表示此 Twido 通过编程口和上位机连接,其站号地址为 2 ;波特率、数据位、校验、停止位和上位机设置保持一致。
  
   VB 程序通过利用 MSComm 控件很容易就能够实现。
   1 通讯口初始化:
   MSComm1.Settings = "9600,n,8,1"
   MSComm1.CommPort = 1
   MSComm1.SThreshold = 0
   If Not MSComm1.PortOpen Then MSComm1.PortOpen = True


2
CRC 校验码的计算方法,如以下函数,可以得到字节数组变量 cmdstring 指向的字符串的 CRC 校验码。
   Function crc16_1(ByRef cmdstring() As Byte, ByVal j As Integer)
   Dim data As Integer
   Dim i As Integer
  
  
   Addressreg_crc = &HFFFF
   For i = 0 To j
   Addressreg_crc = Addressreg_crc Xor cmdstring(i)
   For j = 0 To 7
   data = Addressreg_crc And &H1
   If data Then
   Addressreg_crc = Int(Addressreg_crc / 2)
   Addressreg_crc = Addressreg_crc And &H7FFF
   Addressreg_crc = Addressreg_crc Xor &HA001
   Else
   Addressreg_crc = Addressreg_crc / 2
   Addressreg_crc = Addressreg_crc And &H7FFF
   End If
   Next j
   Next i
  
   If Addressreg_crc < 0 Then
   Addressreg_crc = Addressreg_crc - &HFFFF0000
   End If
  
   HiByte = Addressreg_crc And &HFF
   LoByte = (Addressreg_crc And &HFF00) / &H100
   End Function


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


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


5
通讯事件中断产生时的数据处理:
   Private Sub MSComm1_OnComm()
   Dim inx() As Byte
   Select Case MSComm1.CommEvent
   Case comEvReceive , 判断为接收事件
   MSComm1.InputLen = CmdLenth , 接收数据的长度
   inx = MSComm1.Input , 接收数据
   MSComm1.InBufferCount = 0
  
   For k = 3 To CmdLenth - 3
   tmpstr = tmpstr & "/" & Hex(inx(k))
   Next
   Text1.Text = tmpstr , 以十六进制显示所接收长度的数据
  
  
   Beep
   End Select
   End Sub
 
 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值