您的位置:控制工程论坛网论坛 » 现场总线 » modbus通讯协议中文版

  • 匿名

    匿名   |   当前状态:离线

    总积分:0  2024年可用积分:0

    注册时间: 0001-01-01

    最后登录时间: 0001-01-01

    空间 发短消息加为好友

    匿名   发表于 2009/6/4 15:21:38

    谢谢!

    12楼 回复本楼

    引用 匿名 2009/6/4 15:21:38 发表于12楼的内容

  • wygtong

    wygtong   |   当前状态:在线

    总积分:5074  2024年可用积分:0

    注册时间: 2006-05-29

    最后登录时间: 2018-05-11

    空间 发短消息加为好友

    wygtong   发表于 2009/6/12 7:59:02

    好资料,下载了
    13楼 回复本楼

    引用 wygtong 2009/6/12 7:59:02 发表于13楼的内容

  • wygtong

    wygtong   |   当前状态:在线

    总积分:5074  2024年可用积分:0

    注册时间: 2006-05-29

    最后登录时间: 2018-05-11

    空间 发短消息加为好友

    wygtong   发表于 2009/6/17 7:25:23

    正是我需要的
    14楼 回复本楼

    引用 wygtong 2009/6/17 7:25:23 发表于14楼的内容

  • daniel808492

    daniel808492   |   当前状态:离线

    总积分:217  2024年可用积分:0

    注册时间: 2008-12-08

    最后登录时间: 2013-10-31

    空间 发短消息加为好友

    daniel808492   发表于 2009/6/23 13:04:11


    15楼 回复本楼

    引用 daniel808492 2009/6/23 13:04:11 发表于15楼的内容

  • chenwh78

    chenwh78   |   当前状态:在线

    总积分:6174  2024年可用积分:0

    注册时间: 2008-10-10

    最后登录时间: 2019-06-16

    空间 发短消息加为好友

    chenwh78   发表于 2009/7/8 12:55:24

    在一些应用中可能需要使用诸如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
    16楼 回复本楼

    引用 chenwh78 2009/7/8 12:55:24 发表于16楼的内容

  • 匿名

    匿名   |   当前状态:离线

    总积分:0  2024年可用积分:0

    注册时间: 0001-01-01

    最后登录时间: 0001-01-01

    空间 发短消息加为好友

    匿名   发表于 2009/7/15 17:16:53

    多谢分享!!
    17楼 回复本楼

    引用 匿名 2009/7/15 17:16:53 发表于17楼的内容

  • wjzln_01

    wjzln_01   |   当前状态:离线

    总积分:57  2024年可用积分:0

    注册时间: 2009-09-03

    最后登录时间: 2009-09-03

    空间 发短消息加为好友

    wjzln_01   发表于 2009/9/3 22:55:57

    很好,谢谢

    18楼 回复本楼

    引用 wjzln_01 2009/9/3 22:55:57 发表于18楼的内容

  • 匿名

    匿名   |   当前状态:离线

    总积分:0  2024年可用积分:0

    注册时间: 0001-01-01

    最后登录时间: 0001-01-01

    空间 发短消息加为好友

    匿名   发表于 2009/10/24 17:34:53

    好东西
    19楼 回复本楼

    引用 匿名 2009/10/24 17:34:53 发表于19楼的内容

  • 匿名

    匿名   |   当前状态:离线

    总积分:0  2024年可用积分:0

    注册时间: 0001-01-01

    最后登录时间: 0001-01-01

    空间 发短消息加为好友

    匿名   发表于 2009/11/4 14:10:33

    20楼 回复本楼

    引用 匿名 2009/11/4 14:10:33 发表于20楼的内容

  • 南方侠客

    南方侠客   |   当前状态:离线

    总积分:64  2024年可用积分:0

    注册时间: 2009-11-04

    最后登录时间: 2009-11-04

    空间 发短消息加为好友

    南方侠客   发表于 2009/11/4 18:36:01

    谢谢了
    21楼 回复本楼

    引用 南方侠客 2009/11/4 18:36:01 发表于21楼的内容

总共 , 当前 /, 【上一页】123【下一页】