刀具格斗中的谎言:中国PLC网>>如何用VB实现Modbus串行通讯
来源:百度文库 编辑:偶看新闻 时间:2024/04/29 08:10:52
如何用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.cniplc.com 原文链接:http://www.cniplc.com/article/show.asp?id=5081
作者:佚名 来源:转载 发布时间: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.cniplc.com 原文链接:http://www.cniplc.com/article/show.asp?id=5081
如何用PLC实现
如何用PLC实现此功能
如何用VB实现
如何用VB实现人机对话
如何用VB 实现远程关机呢
如何用VB实现shift键多选
数据结构如何用VB编程实现
如何用VB实现直接发送邮件?
如何用VB实现这个功能?
如何用VB实现多媒体播放功能
如何用vb实现软件使用时间限制
如何用vb实现软件注册
RS232的通信协议该如何用VB实现
编程请教:如何用VB演示银行家算法的实现!
如何用VB实现设计启动控制器(思路)
如何用vb.net和SQL实现学生成绩排名
如何用VB实现创建系统服务程序?
如何用VB在XP下实现屏蔽任务管理器
VB中如何用关闭按纽实现最小化??????
如何用vb实现远程控制开关机?高手请进!!!
如何用VB实现管理系统的登录
如何用VB实现两个图片的切换
如何用VB实现点对点的语音通信?
求助,如何用VB实现开关的功能