如何用VB实现Modbus串行通讯
作者:佚名 来源:转载 发布时间:2008-10-30 23:49:13 发布人:admin 在一些应用中可能需要使用诸如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 本篇文章来源于 中国PLC网|www. 原文链接:http://www./article/show.asp?id=5081
|
|