[转]如何用VB实现Modbus串行通讯 [http://blog.csdn.net/kw123/archive/2007/09/07/1776758.aspx]

如何用VB实现Modbus串行通讯
在一些应用中可能需要使用诸如VB来进行上位机监控程序的开发,而Modbus协议是这类应用中首选的通讯协议;Modbus协议以其简单易用,在工业领域里已广泛的为其他第三方设备所支持。这里对VBTwido 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
 

 

阅读更多
个人分类: 0025 工业控制
上一篇[转]MODBUS_RTU通讯规约 [http://blog.csdn.net/kw123/archive/2007/09/07/1776750.aspx]
下一篇[转]CRC算法与实现 [http://blog.csdn.net/kw123/archive/2007/09/07/1776706.aspx]
想对作者说点什么? 我来说一句

YUV420转BMP

2007年09月30日 22KB 下载

vc删注释工具

2007年09月07日 1.5MB 下载

何用VB实现Modbus串行通讯

2012年08月22日 44KB 下载

VBMODBUS crc16校验代码实现

2008年07月29日 7KB 下载

Ext.DatePicker yearmonth

2010年07月09日 1KB 下载

quartztool.rar QUARTZ封装

2009年07月10日 11KB 下载

vc.net 2003与matlab混合编程模板

2008年09月07日 3.92MB 下载

junrar

2007年07月28日 3.2MB 下载

没有更多推荐了,返回首页

关闭
关闭