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

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


2
CRC校验码的计算方法,如以下函数,可以得到字节数组变量cmdstring指向的字符串的CRC校验码。
CODE:
  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个字):
CODE:
   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个字):
CODE:
   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
通讯事件中断产生时的数据处理:
CODE:
  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
 

 

相关文章推荐

[转]我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp) [http://blog.csdn.net/yefanqiu/archive/2007/07/19/169848

其实很早就想写写关于Modbus的开发历程,但牵扯项目较多,不同语言版本较多,头绪繁杂,一时不知从何写起。最近的医疗项目的通信部分,重新调整为Modbus协议,并且内容几乎涵盖了Modbus的方方面面...

深入分析rails数据库连接流程 (转http://blog.csdn.net/pwlazy/archive/2007/11/16/1889264.aspx)

  第一部分:Method 1)def self.establish_connection(spec = nil)     case spec                             ...
  • fjfdszj
  • fjfdszj
  • 2011年06月08日 11:45
  • 795

postgresql运维命令简记 转自:http://blog.csdn.net/hitzhang/archive/2010/09/16/5888028.aspx

转自: hitzhang的博客1 安装:./configuregmakesugmake installadduser postgresmkdir /usr/local/pgsql/datachown ...
  • jubincn
  • jubincn
  • 2011年03月11日 21:48
  • 955

http://blog.csdn.net/sunjd2001/archive/2007/05/15/1609263.aspx

http://blog.csdn.net/sunjd2001/archive/2007/05/15/1609263.aspx

【Android内核】下载编译android kernel( 原文地址 http://blog.csdn.net/chizhaolin/archive/2010/07/08/5721539.aspx)

编译linux内核映像 a)准备交叉编译工具链 android代码树中有一个prebuilt项目,包含了我们编译内核所需的交叉编译工具。 注意:虽然Prebuilt下包含了交叉编译工具,但是...
  • liuxiIT
  • liuxiIT
  • 2011年10月20日 10:12
  • 1329

Oracle体系结构 转自: http://blog.csdn.net/truexf/archive/2006/07/05/881726.aspx

第一篇 Oracle架构总览先让我们来看一张图这张就是Oracle 9i的架构全图。看上去,很繁杂。是的,是这样的。现在让我们来梳理一下:一、数据库、表空间、数据文件1.数据库数据库是数据集合。Ora...

简单驱动开发配置(转自http://blog.csdn.net/yinxu/archive/2007/11/12/1880561.aspx)经典

注:转载请注明出处,谢谢!编写驱动程序, 现网上大部分文章都是关于VC + Windows DDK + DriverStudio的配置,但如果只是简单的开发,使用DriverStudio实在是没有...

mysql c api 列表(转贴自http://blog.csdn.net/loveu131/archive/2006/07/26/982629.aspx)

为了方便以后不再找mysql 的API,于是转了CSDN站内ID为loveu131的贴子。FunctionDescriptionmysql_affected_rows()Returns the num...

http://blog.csdn.net/whpeace/archive/2007/05/23/1622510.aspx

COM 组件设计与应用(十)——IDispatch 接口 for VC.NET一、前言    终于写到了第十回,我也一直期盼着写这回的内容耶,为啥呢?因为自动化(automation)是非常常用、非常...
  • fenving
  • fenving
  • 2011年04月15日 17:36
  • 373
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[转]如何用VB实现Modbus串行通讯 [http://blog.csdn.net/kw123/archive/2007/09/07/1776758.aspx]
举报原因:
原因补充:

(最多只允许输入30个字)