[转]如何用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通讯口初始化:
   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
 

 

如何用VB实现Modbus串行通讯

 如何用VB实现Modbus串行通讯在一些应用中可能需要使用诸如VB来进行上位机监控程序的开发,而Modbus协议是这类应用中首选的通讯协议;Modbus协议以其简单易用,在工业领域里已广泛的为其他第...
  • kw123
  • kw123
  • 2007年09月07日 21:57
  • 7697

嵌入式Linux学习七步曲

  嵌入式Linux学习七步曲Sailor_forever sailing_9806@163.com 转载请注明http://blog.csdn.net/sailor_8318/archive/200...
  • sailor_8318
  • sailor_8318
  • 2007年09月03日 00:43
  • 11128

[转]MODBUS_RTU通讯规约 [http://blog.csdn.net/kw123/archive/2007/09/07/1776750.aspx]

MODBUS通讯协议:ModBus通讯规约允许PDM系列仪表/变送器与施耐德、西门子、AB、GE等多个国际著名品牌的可编程顺序控制器(PLC)、RTU、SCADA系统、DCS或与第三方具有ModBus...
  • gxj022
  • gxj022
  • 2007年09月14日 14:02
  • 1845

在Eclipse中封装程序通过JDBC访问MySQL的代码

public class ConDB...{        private Connection _con;    private String _driver;    private String ...
  • Ingenuus
  • Ingenuus
  • 2007年06月21日 03:04
  • 2217

大数据处理的三大基石论文:GFS,MapReduce,BigTble中文译版

GFS: http://blog.csdn.net/xuleicsu/archive/2005/11/10/526386.aspx MapReduce: http://blog.csdn.net...
  • xxssyyyyssxx
  • xxssyyyyssxx
  • 2016年01月16日 13:14
  • 431

VB6基于Windows API的Modbus RTU/ASCII/TCP的主站实现代码

分三模块 modSerialPort.bas 串口操作模块 modTCPClient.bas TCP操作模块 modModbusMaster.bas Modbus主站模块 实现代码例举如下 '打开 ...
  • bakw
  • bakw
  • 2016年01月09日 13:12
  • 2922

[转]CRC算法与实现 [http://blog.csdn.net/kw123/archive/2007/09/07/1776706.aspx]

引言CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。实际上,除数...
  • gxj022
  • gxj022
  • 2007年09月14日 14:43
  • 742

whoosh笔记:用Apache commons-net 包对服务器上的文件进行先重写后删除操作

最近接到一个任务:为了确保安全,在删除ftp服务器上文件之前需要用1k大小的随机数重写该文件。该操作需要用到Apache commons-net 包下面的FTPClient类,为了重写文件,我用到了该...
  • zccbbg
  • zccbbg
  • 2010年09月11日 14:20
  • 2703

AttributeCollection类与Attributes.Add方法的使用

控件属性集合:AttributeCollection类 AttitudeCollection隶属于namespace System.Web.UI命名空间。AttributeCollection类属于...
  • byondocean
  • byondocean
  • 2010年08月09日 21:47
  • 3096

Visual FoxPro Sedna Beta

  订购:http://www.huachu.com.cn/itbook/itbookinfo.asp?lbbh=10054628http://www.china-pub.com/computers/...
  • zhanghongju
  • zhanghongju
  • 2007年08月11日 16:27
  • 6561
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[转]如何用VB实现Modbus串行通讯 [http://blog.csdn.net/kw123/archive/2007/09/07/1776758.aspx]
举报原因:
原因补充:

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