紫外工控论坛

 找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 3611|回复: 5

[VB/VB.NET] VB_MODBUS实现源码

[复制链接]
冰糖 发表于 2010-12-7 20:39:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
  1. Dim ts_i As Integer
  2. Dim ts_str As String
  3. If (intCount <> 0) Then
  4.     ts_str = "receive:"
  5.     For ts_i = 0 To UBound(r_input)
  6.         ts_str = ts_str + CStr(Hex(r_input(ts_i))) + " "
  7.     Next ts_i
  8.     frm_main.Txt_msg.Text = ts_str + Chr(13) + Chr(10) + frm_main.Txt_msg.Text
  9. Else
  10.     ts_str = "no receive:"
  11.     frm_main.Txt_msg.Text = ts_str + Chr(13) + Chr(10) + frm_main.Txt_msg.Text
  12. End If


  13. End Function



  14. Public Function writewords(ByVal slv_id As Byte, ByVal addr As Long, ByVal lenth As Byte, ByRef lng_data() As Long, ByVal int_time As Integer) As Integer
  15.     Dim ret As Integer
  16.     Dim lenth1 As Integer
  17.     Dim lenth2 As Integer
  18.     Dim addr1 As Integer
  19.     Dim addr2 As Integer
  20.     Dim lng_data1() As Long
  21.      Dim lng_data2() As Long
  22.     Dim i As Integer
  23.     If (lenth > 100) Then
  24.         ReDim lng_data1(99)
  25.         ReDim lng_data2(lenth - 100 - 1)
  26.         For i = 0 To 99
  27.             lng_data1(i) = lng_data(i)
  28.         Next i
  29.         For i = 100 To lenth - 1
  30.             lng_data2(i - 100) = lng_data(i)
  31.         Next i
  32.         addr1 = addr
  33.         addr2 = addr + 100
  34.         lenth1 = 100
  35.         lenth2 = lenth - 100
  36.         ret = writewords1(slv_id, addr1, lenth1, lng_data1, int_time)
  37.         If (ret <> 0) Then
  38.             writewords = ret
  39.             Exit Function
  40.         End If
  41.         ret = writewords1(slv_id, addr2, lenth2, lng_data2, int_time)
  42.         If (ret <> 0) Then
  43.             writewords = ret
  44.             Exit Function
  45.         End If
  46.     Else
  47.         writewords = writewords1(slv_id, addr, lenth, lng_data, int_time)
  48.     End If
  49. End Function

  50. Public Function writewords1(ByVal slv_id As Byte, ByVal addr As Long, ByVal lenth As Byte, ByRef lng_data() As Long, ByVal int_time As Integer)
  51.     'On Error GoTo wrong
  52.     Dim lngStartTimer As Long
  53.     Dim lnginval As Long
  54.     Dim bln_cx As Boolean
  55.     Dim byt_data() As Byte
  56.     Dim r_input() As Byte
  57.     Dim CRC() As Byte
  58.     Dim i As Integer
  59.     ReDim byt_data(lenth * 2 - 1) As Byte
  60.     For i = 0 To lenth - 1
  61.         byt_data(2 * i) = lng_data(i) \ 256
  62.         byt_data(2 * i + 1) = lng_data(i) Mod 256
  63.     Next i
  64.     'Do Until bln_busy = False Or (Abs(timeGetTime - lng_time > 200))
  65.     '    DoEvents
  66.     '    DoEvents
  67.     '    DoEvents
  68.     '    DoEvents
  69.     '    DoEvents
  70.     'Loop

  71.     'bln_busy = True
  72.     frm_main.com_modbus.InBufferCount = 0
  73.     If (lenth > 1) Then
  74.         tran_modbus_order slv_id, 16, addr, byt_data
  75.     Else
  76.         tran_modbus_order slv_id, 6, addr, byt_data
  77.     End If
  78.     lngStartTimer = timeGetTime
  79.     bln_success = False
  80.     Dim intCount As Integer
  81.     Do Until Abs(timeGetTime - lngStartTimer) > int_time Or bln_success
  82.         DoEvents
  83.         DoEvents
  84.         DoEvents
  85.         DoEvents
  86.         DoEvents
  87.         DoEvents
  88.         intCount = frm_main.com_modbus.InBufferCount
  89.         If intCount = 8 Then
  90.             bln_success = True
  91.             frm_main.com_modbus.InputLen = 0
  92.             r_input = frm_main.com_modbus.Input
  93.             frm_main.com_modbus.InBufferCount = 0
  94.         End If
  95.     Loop
  96.    
  97.     If bln_success And intCount = 8 Then
  98.         CRC = CRC16(r_input)
  99.         If CRC(0) = r_input(UBound(r_input) - 1) And CRC(1) = r_input(UBound(r_input)) Then
  100.             writewords1 = 0      '通讯成功
  101.         Else
  102.             writewords1 = 2     '通讯错误
  103.         End If
  104.     ElseIf intCount <> 0 Then
  105.         writewords1 = 2          '通讯错误
  106.     Else
  107.         writewords1 = 1          '通讯失败
  108.     End If
复制代码
游客,如果您要查看本帖隐藏内容请回复
 楼主| 冰糖 发表于 2010-12-7 20:40:05 | 显示全部楼层
  1. '读浮点数
  2. Public Function readsgls(ByVal slv_id As Byte, ByVal addr As Long, ByVal lenth As Byte, ByVal int_time As Integer, ByRef ret_val() As Single) As Integer
  3.     Dim lenth1 As Integer
  4.     Dim lenth2 As Integer
  5.     Dim ret_val1() As Single
  6.     Dim ret_val2() As Single
  7.     Dim addr1 As Long
  8.     Dim addr2 As Long
  9.     Dim ret As Integer
  10.     If (lenth > 50) Then
  11.         lenth1 = 50
  12.         lenth2 = lenth - lenth1
  13.         addr1 = addr
  14.         addr2 = addr + 100
  15.         ret = readsgls1(slv_id, addr1, lenth1, int_time, ret_val1)
  16.         If (ret <> 0) Then
  17.             readsgls = ret
  18.             Exit Function
  19.         End If
  20.         ret = readsgls1(slv_id, addr2, lenth2, int_time, ret_val2)
  21.         If (ret <> 0) Then
  22.             readsgls = ret
  23.             Exit Function
  24.         End If
  25.         ReDim ret_val(lenth - 1) As Single
  26.         Dim i As Integer
  27.         For i = 0 To 49
  28.             ret_val(i) = ret_val1(i)
  29.         Next i
  30.         For i = 50 To lenth - 1
  31.             ret_val(i) = ret_val2(i - 50)
  32.         Next i
  33.         readsgls = ret
  34.     Else
  35.         readsgls = readsgls1(slv_id, addr, lenth, int_time, ret_val())
  36.     End If
  37. End Function


  38. Public Function readsgls1(ByVal slv_id As Byte, ByVal addr As Long, ByVal lenth As Byte, ByVal int_time As Integer, ByRef ret_val() As Single) As Integer
  39. 'On Error GoTo wrong
  40. Dim i As Integer
  41. Dim lngStartTimer As Long
  42. Dim byt_data(0) As Byte
  43. Dim ret_byte() As Byte
  44. Dim r_input() As Byte
  45. Dim CRC() As Byte
  46. Dim intCount As Integer
  47. byt_data(0) = lenth * 2
  48. 'Do Until bln_busy = False Or (Abs(timeGetTime - lng_time > 200))
  49. '    DoEvents
  50. '    DoEvents
  51. '    DoEvents
  52. '    DoEvents
  53. '    DoEvents
  54. 'Loop
  55. 'bln_busy = True
  56. frm_main.com_modbus.InBufferCount = 0
  57. tran_modbus_order slv_id, 3, addr, byt_data
  58. lngStartTimer = timeGetTime
  59. bln_success = False
  60. Do Until Abs(timeGetTime - lngStartTimer) > int_time Or bln_success
  61.     DoEvents
  62.     DoEvents
  63.     DoEvents
  64.     DoEvents
  65.     DoEvents
  66.     intCount = frm_main.com_modbus.InBufferCount
  67.     If intCount = CInt(byt_data(0) * 2 + 5) Then
  68.         bln_success = True
  69.         frm_main.com_modbus.InputLen = 0
  70.         r_input = frm_main.com_modbus.Input
  71.         frm_main.com_modbus.InBufferCount = 0
  72.     End If
  73. Loop
  74. 'frm_main.Label2.Caption = timeGetTime - lngStartTimer + CLng(frm_main.Label2.Caption)
  75. If bln_success And intCount = CInt(byt_data(0) * 2 + 5) Then
  76.     CRC = CRC16(r_input)
  77.     If CRC(0) = r_input(UBound(r_input) - 1) And CRC(1) = r_input(UBound(r_input)) Then
  78.         ret_byte = r_input
  79.         ReDim ret_val(lenth - 1) As Single
  80.         Dim byt(3) As Byte
  81.         For i = 0 To lenth - 1
  82.             byt(0) = ret_byte(i * 4 + 4)
  83.             byt(1) = ret_byte(i * 4 + 3)
  84.             byt(2) = ret_byte(i * 4 + 6)
  85.             byt(3) = ret_byte(i * 4 + 5)
  86.             ret_val(i) = bytTosgl(byt)
  87.         Next i
  88.         readsgls1 = 0
  89.     Else
  90.         readsgls1 = 2
  91.     End If
  92. ElseIf intCount <> 0 Then
  93.     readsgls1 = 2
  94. Else
  95.     readsgls1 = 1
  96. End If
  97. 'bln_busy = False
  98. Dim ts_i As Integer
  99. Dim ts_str As String
  100. If (intCount <> 0) Then
  101.     ts_str = "receive:"
  102.     For ts_i = 0 To UBound(r_input)
  103.         ts_str = ts_str + CStr(Hex(r_input(ts_i))) + " "
  104.     Next ts_i
  105.     frm_main.Txt_msg.Text = ts_str + Chr(13) + Chr(10) + frm_main.Txt_msg.Text
  106. Else
  107.     ts_str = "no receive:"
  108.     frm_main.Txt_msg.Text = ts_str + Chr(13) + Chr(10) + frm_main.Txt_msg.Text
  109. End If

  110. End Function
复制代码
 楼主| 冰糖 发表于 2010-12-7 20:40:28 | 显示全部楼层
  1. '写浮点数
  2. Public Function writesgls(ByVal slv_id As Byte, ByVal addr As Long, ByVal lenth As Byte, ByRef sgl_data() As Single, ByVal int_time As Integer) As Integer
  3.     Dim addr1 As Integer
  4.     Dim addr2 As Integer
  5.     Dim lenth1 As Integer
  6.     Dim lenth2 As Integer
  7.     Dim sgl_data1() As Single
  8.     Dim sgl_data2() As Single
  9.     Dim i As Integer
  10.     Dim ret As Integer
  11.     If lenth > 50 Then
  12.         ReDim sgl_data1(49) As Single
  13.         ReDim sgl_data2(lenth - 51)
  14.         lenth1 = 50
  15.         lenth2 = lenth - lenth1
  16.         addr1 = addr
  17.         addr2 = addr + 100
  18.         For i = 0 To 49
  19.             sgl_data1(i) = sgl_data(i)
  20.         Next i
  21.         For i = 50 To lenth - 1
  22.             sgl_data2(i - 50) = sgl_data(i)
  23.         Next i
  24.         ret = writesgls1(slv_id, addr1, lenth1, sgl_data1, int_time)
  25.         If (ret <> 0) Then
  26.             writesgls = ret
  27.             Exit Function
  28.         End If
  29.         ret = writesgls1(slv_id, addr2, lenth2, sgl_data2, int_time)
  30.         If (ret <> 0) Then
  31.             writesgls = ret
  32.             Exit Function
  33.         End If
  34.     Else
  35.         writesgls = writesgls1(slv_id, addr, lenth, sgl_data(), int_time)
  36.     End If
  37. End Function


  38. Public Function writesgls1(ByVal slv_id As Byte, ByVal addr As Long, ByVal lenth As Byte, ByRef sgl_data() As Single, ByVal int_time As Integer) As Integer
  39. Dim lngStartTimer As Long
  40. Dim CRC() As Byte
  41. Dim byt_data() As Byte
  42. Dim r_input() As Byte
  43. Dim i As Integer
  44. Dim byt(3) As Byte
  45. ReDim byt_data(lenth * 4 - 1) As Byte
  46. For i = 0 To lenth - 1
  47.     sglTobyt sgl_data(i), byt
  48.     byt_data(4 * i) = byt(1)
  49.     byt_data(4 * i + 1) = byt(0)
  50.     byt_data(4 * i + 2) = byt(3)
  51.     byt_data(4 * i + 3) = byt(2)
  52. Next i
  53. 'Do Until bln_busy = False Or (Abs(timeGetTime - lng_time > 200))
  54. '    DoEvents
  55. 'Loop
  56. 'bln_busy = True
  57. frm_main.com_modbus.InBufferCount = 0
  58. tran_modbus_order slv_id, 16, addr, byt_data
  59. lngStartTimer = timeGetTime
  60. bln_success = False
  61. Static intCount As Integer
  62. Do Until Abs(timeGetTime - lngStartTimer) > int_time Or bln_success
  63.     DoEvents
  64.     intCount = frm_main.com_modbus.InBufferCount
  65.     If intCount = 8 Then
  66.         bln_success = True
  67.         frm_main.com_modbus.InputLen = 0
  68.         r_input = frm_main.com_modbus.Input
  69.         frm_main.com_modbus.InBufferCount = 0
  70.     End If
  71. Loop

  72. If bln_success And intCount = 8 Then
  73.     CRC = CRC16(r_input)
  74.     If CRC(0) = r_input(UBound(r_input) - 1) And CRC(1) = r_input(UBound(r_input)) Then
  75.         writesgls1 = 0
  76.     Else
  77.         writesgls1 = 2
  78.     End If
  79. ElseIf intCount <> 0 Then
  80.     writesgls1 = 2
  81. Else
  82.     writesgls1 = 1
  83. End If

  84. Dim ts_i As Integer
  85. Dim ts_str As String
  86. If (intCount <> 0) Then
  87.     ts_str = "receive:"
  88.     For ts_i = 0 To UBound(r_input)
  89.         ts_str = ts_str + CStr(Hex(r_input(ts_i))) + " "
  90.     Next ts_i
  91.     frm_main.Txt_msg.Text = ts_str + Chr(13) + Chr(10) + frm_main.Txt_msg.Text
  92. Else
  93.     ts_str = "no receive:"
  94.     frm_main.Txt_msg.Text = ts_str + Chr(13) + Chr(10) + frm_main.Txt_msg.Text
  95. End If

  96. 'bln_busy = False
  97. End Function
复制代码
su_3344 发表于 2011-4-21 23:04:06 | 显示全部楼层
到代码很辛苦,我需要一个vb.net的modbus 例程
ss283031771 发表于 2011-4-22 06:47:13 | 显示全部楼层
真是好东西,感谢分享
winare 发表于 2011-10-17 13:20:41 | 显示全部楼层
no demo????????????
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


--------------------------------------------------------------------------------------------------------------------
本站是工控技术交流站点,论坛内容均为网络收集或会员所发表,并不代表本站立场,会员拥有该内容的所有权力及责任!
本站内容如有侵犯您的版权,请按下面方式联系本站管理员,我们将及时删除处理
管理员:冰糖 QQ:5483695(请直击主题), Mail:admin#ziwai.net(#改成@) 其它非本人.
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!

QQ|Archiver|手机版|小黑屋|紫外工控论坛. ( 苏ICP备11032118号-1 )

GMT+8, 2024-4-29 17:39 , Processed in 0.453128 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表