手把手教你用VB实现Modbus RTU串行通讯工程实例

  • 格式:doc
  • 大小:35.50 KB
  • 文档页数:6

下载文档原格式

  / 8
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

对于大部分应用,Twido PLC作为从站,它不需要编制通讯程序,只要把通讯口的参数设置好即可,例如下图表示此Twido通过编程口和上位机连接,其站号地址为2;波特率、数据位、校验、停止位和上位机设置保持一致。

VB程序通过利用MSComm控件很容易就能够实现。

1.通讯口初始化:

MSComm1.Settings = "9600,n,8,1"

mPort = 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