为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

VB MODBUS实现源码

2019-04-26 43页 doc 80KB 55阅读

用户头像

is_105949

暂无简介

举报
VB MODBUS实现源码Option Explicit Public bln_busy As Boolean Public bln_success As Boolean Public bln_readword As Boolean Public Declare Function timeGetTime Lib "winmm.dll" () As Long Public Sub tran_modbus_order(ByVal byt_slv_id As Byte, ByVal byt_func As Byte, ByVal addr As ...
VB MODBUS实现源码
Option Explicit Public bln_busy As Boolean Public bln_success As Boolean Public bln_readword As Boolean Public Declare Function timeGetTime Lib "winmm.dll" () As Long Public Sub tran_modbus_order(ByVal byt_slv_id As Byte, ByVal byt_func As Byte, ByVal addr As Long, byt_data() As Byte) Dim trans_byte() As Byte Dim i As Integer Dim j As Integer Dim k As Integer Dim Index As Integer Dim CRC() As Byte Dim temp As Integer Dim lenth As Integer Dim lenth1 As Integer Select Case byt_func Case 1 ReDim trans_byte(7) As Byte trans_byte(0) = byt_slv_id trans_byte(1) = 1 trans_byte(2) = (addr - 1) \ 256 trans_byte(3) = (addr - 1) Mod 256 trans_byte(4) = 0 trans_byte(5) = byt_data(0) CRC = CRC16(trans_byte) trans_byte(6) = CRC(0) trans_byte(7) = CRC(1) Case 3 ReDim trans_byte(7) As Byte trans_byte(0) = byt_slv_id trans_byte(1) = 3 trans_byte(2) = (addr - 1) \ 256 trans_byte(3) = (addr - 1) Mod 256 trans_byte(4) = 0 trans_byte(5) = byt_data(0) CRC = CRC16(trans_byte) trans_byte(6) = CRC(0) trans_byte(7) = CRC(1) Case 6 ReDim trans_byte(7) As Byte trans_byte(0) = byt_slv_id trans_byte(1) = 6 trans_byte(2) = (addr - 1) \ 256 trans_byte(3) = (addr - 1) Mod 256 trans_byte(4) = byt_data(0) trans_byte(5) = byt_data(1) CRC = CRC16(trans_byte) trans_byte(6) = CRC(0) trans_byte(7) = CRC(1) Case 15 lenth = UBound(byt_data) + 1 lenth1 = (lenth - 1) \ 8 + 1 ReDim trans_byte(8 + lenth1) trans_byte(0) = byt_slv_id trans_byte(1) = &HF trans_byte(2) = (addr - 1) \ 256 trans_byte(3) = (addr - 1) Mod 256 trans_byte(4) = 0 trans_byte(5) = lenth trans_byte(6) = lenth1 k = 0 Index = 7 temp = 0 For i = 1 To lenth temp = temp + byt_data(i - 1) * (2 ^ k) If (i Mod 8 = 0) Then trans_byte(Index) = CByte(temp) Index = Index + 1 temp = 0 k = 0 End If k = k + 1 Next i trans_byte(Index) = CByte(temp) CRC = CRC16(trans_byte) trans_byte(7 + lenth1) = CRC(0) trans_byte(8 + lenth1) = CRC(1) Case 16 lenth = UBound(byt_data) + 1 ReDim trans_byte(8 + lenth) trans_byte(0) = byt_slv_id trans_byte(1) = &H10 trans_byte(2) = (addr - 1) \ 256 trans_byte(3) = (addr - 1) Mod 256 trans_byte(4) = 0 trans_byte(5) = lenth \ 2 trans_byte(6) = lenth For i = 0 To lenth - 1 trans_byte(7 + i) = byt_data(i) Next i CRC = CRC16(trans_byte) trans_byte(7 + lenth) = CRC(0) trans_byte(8 + lenth) = CRC(1) End Select frm_main.com_modbus.Output = trans_byte Dim ts_i As Integer Dim ts_str As String ts_str = "send:" For ts_i = 0 To UBound(trans_byte) ts_str = ts_str + CStr(Hex(trans_byte(ts_i))) + " " Next ts_i frm_main.Txt_msg.Text = ts_str + Chr(13) + Chr(10) + frm_main.Txt_msg.Text If (Len(frm_main.Txt_msg.Text) > 30000) Then frm_main.Txt_msg.Text = "" End If frm_main.com_modbus.OutBufferCount = 0 End Sub Function CRC16(data() As Byte) As String Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器 Dim CL As Byte, CH As Byte '多项式码&HA001 Dim SaveHi As Byte, SaveLo As Byte Dim i As Integer Dim flag As Integer 'On Error GoTo wrong CRC16Lo = &HFF CRC16Hi = &HFF CL = &H1 CH = &HA0 For i = 0 To UBound(data) - 2 DoEvents DoEvents DoEvents CRC16Lo = CRC16Lo Xor data(i) '每一个数据与CRC寄存器进行异或 For flag = 0 To 7 SaveHi = CRC16Hi SaveLo = CRC16Lo CRC16Hi = CRC16Hi \ 2 '高位右移一位 CRC16Lo = CRC16Lo \ 2 '低位右移一位 If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1 CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1 End If '否则自动补0 If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或 CRC16Hi = CRC16Hi Xor CH CRC16Lo = CRC16Lo Xor CL End If Next flag Next i Dim ReturnData(1) As Byte ReturnData(0) = CRC16Lo 'CRC高位 ReturnData(1) = CRC16Hi 'CRC低位 CRC16 = ReturnData Exit Function 'wrong: errprocess "CRC16" End Function Public Function readcoils(ByVal slv_id As Byte, ByVal addr As Long, ByVal lenth As Byte, ByVal int_time As Integer, ByRef ret_val() As Byte) As Integer Dim byt_data(0) As Byte Dim lngStartTimer As Long Dim lnginval As Long Dim bln_cx As Boolean Dim ret_byte() As Byte 'tm_delay.Enabled = False byt_data(0) = lenth 'Do Until bln_busy = False Or (Abs(timeGetTime - lng_time > 200)) ' DoEvents 'Loop 'bln_busy = True frm_main.com_modbus.InBufferCount = 0 tran_modbus_order slv_id, 1, addr, byt_data lngStartTimer = timeGetTime lnginval = timeGetTime() bln_success = False Dim r_input() As Byte Dim i As Integer Static intCount As Integer Do Until Abs(timeGetTime - lngStartTimer) > int_time Or bln_success DoEvents DoEvents DoEvents DoEvents 'lnginval = timeGetTime() If (Abs(timeGetTime - lnginval) > 8) Then If (intCount <> frm_main.com_modbus.InBufferCount Or intCount = 0) Then intCount = frm_main.com_modbus.InBufferCount Else 'Timer1.Enabled = False 'ReDim r_input(1024) As Byte frm_main.com_modbus.InputLen = 0 'Input_Len = frm_Main.com_modbus.InBufferCount r_input = frm_main.com_modbus.Input frm_main.com_modbus.InBufferCount = 0 For i = 0 To UBound(r_input) Debug.Print r_input(i) 'Text1.Text = Text1.Text & CStr(Hex(r_input(i))) + " " Next i intCount = 0 bln_success = True End If lnginval = timeGetTime() End If Loop If (bln_success) Then Dim lenth1 As Integer readcoils = 0 ret_byte = r_input lenth1 = (lenth - 1) \ 8 + 1 ReDim ret_val(lenth1 - 1) For i = 1 To lenth1 ret_val(i - 1) = ret_byte(2 + i) Next i intCount = 0 Else intCount = 0 readcoils = 1 End If 'bln_busy = False 'tm_delay.Enabled = True End Function Public Function writecoils(ByVal slv_id As Byte, ByVal addr As Long, ByVal lenth As Byte, ByRef byt_data() As Byte, ByVal int_time As Integer) As Integer Dim lngStartTimer As Long Dim lnginval As Long Dim bln_cx As Boolean 'tm_delay.Enabled = False 'Do Until bln_busy = False Or (Abs(timeGetTime - lng_time > 200)) ' DoEvents ' DoEvents ' DoEvents ' DoEvents ' DoEvents 'Loop 'bln_busy = True frm_main.com_modbus.InBufferCount = 0 tran_modbus_order slv_id, 15, addr, byt_data lngStartTimer = timeGetTime lnginval = timeGetTime() bln_success = False Dim r_input() As Byte Dim i As Integer Static intCount As Integer Do Until Abs(timeGetTime - lngStartTimer) > int_time Or bln_success DoEvents DoEvents DoEvents DoEvents DoEvents DoEvents DoEvents 'lnginval = timeGetTime() If (Abs(timeGetTime - lnginval) > 8) Then If (intCount <> frm_main.com_modbus.InBufferCount Or intCount = 0) Then intCount = frm_main.com_modbus.InBufferCount Else frm_main.com_modbus.InputLen = 0 'Input_Len = frm_Main.com_modbus.InBufferCount r_input = frm_main.com_modbus.Input frm_main.com_modbus.InBufferCount = 0 For i = 0 To UBound(r_input) Debug.Print r_input(i) Next i intCount = 0 bln_success = True End If lnginval = timeGetTime() End If Loop If (bln_success) Then writecoils = 0 intCount = 0 Else intCount = 0 writecoils = 1 End If 'bln_busy = False 'tm_delay.Enabled = True End Function Public Function readwords(ByVal slv_id As Byte, ByVal addr As Long, ByVal lenth As Byte, ByVal int_time As Integer, ByRef ret_val() As Long) As Integer Dim lenth1 As Integer Dim lenth2 As Integer Dim ret_val1() As Long Dim ret_val2() As Long Dim addr1 As Long Dim addr2 As Long Dim ret As Integer If (lenth > 100) Then lenth1 = 100 lenth2 = lenth - 100 addr1 = addr addr2 = addr + 100 ret = readwords1(slv_id, addr1, lenth1, int_time, ret_val1) If (ret <> 0) Then readwords = ret Exit Function End If ret = readwords1(slv_id, addr2, lenth2, int_time, ret_val2) If (ret <> 0) Then readwords = ret Exit Function End If ReDim ret_val(lenth - 1) As Long Dim i As Integer For i = 0 To 99 ret_val(i) = ret_val1(i) Next i For i = 100 To lenth - 1 ret_val(i) = ret_val2(i - 100) Next i readwords = ret Else readwords = readwords1(slv_id, addr, lenth, int_time, ret_val) End If End Function Public Function readwords1(ByVal slv_id As Byte, ByVal addr As Long, ByVal lenth As Byte, ByVal int_time As Integer, ByRef ret_val() As Long) As Integer Dim byt_data(0) As Byte Dim lngStartTimer As Long Dim ret_byte() As Byte Dim r_input() As Byte Dim CRC() As Byte Dim intCount As Integer Dim i As Integer byt_data(0) = lenth 'Do Until bln_busy = False Or (Abs(timeGetTime - lng_time > 200)) ' DoEvents ' DoEvents ' 'Loop 'bln_busy = True frm_main.com_modbus.InBufferCount = 0 tran_modbus_order slv_id, 3, addr, byt_data lngStartTimer = timeGetTime bln_success = False Do Until Abs(timeGetTime - lngStartTimer) > int_time Or bln_success DoEvents DoEvents DoEvents intCount = frm_main.com_modbus.InBufferCount If intCount = CInt(byt_data(0) * 2 + 5) Then bln_success = True frm_main.com_modbus.InputLen = 0 r_input = frm_main.com_modbus.Input frm_main.com_modbus.InBufferCount = 0 End If Loop 'frm_Main.Label2.Caption = timeGetTime - lngStartTimer + CLng(frm_Main.Label2.Caption) If bln_success And intCount = CInt(byt_data(0) * 2 + 5) Then CRC = CRC16(r_input) If CRC(0) = r_input(UBound(r_input) - 1) And CRC(1) = r_input(UBound(r_input)) Then ret_byte = r_input ReDim ret_val(lenth - 1) As Long Dim byt(3) As Byte For i = 0 To lenth - 1 ret_val(i) = CLng(ret_byte(i * 2 + 3)) * 256 + ret_byte(i * 2 + 4) If (ret_val(i) > 32767) Then ret_val(i) = ret_val(i) - 65536 End If Next i readwords1 = 0 '通讯成功 Else readwords1 = 2 '通讯错误 End If Else If intCount <> 0 Then readwords1 = 2 '通讯错误 r_input = frm_main.com_modbus.Input Else readwords1 = 1 '通讯失败 End If 'bln_busy = False End If Dim ts_i As Integer Dim ts_str As String If (intCount <> 0) Then ts_str = "receive:" For ts_i = 0 To UBound(r_input) ts_str = ts_str + CStr(Hex(r_input(ts_i))) + " " Next ts_i frm_main.Txt_msg.Text = ts_str + Chr(13) + Chr(10) + frm_main.Txt_msg.Text Else ts_str = "no receive:" frm_main.Txt_msg.Text = ts_str + Chr(13) + Chr(10) + frm_main.Txt_msg.Text End If End Function 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 Dim ret As Integer Dim lenth1 As Integer Dim lenth2 As Integer Dim addr1 As Integer Dim addr2 As Integer Dim lng_data1() As Long Dim lng_data2() As Long Dim i As Integer If (lenth > 100) Then ReDim lng_data1(99) ReDim lng_data2(lenth - 100 - 1) For i = 0 To 99 lng_data1(i) = lng_data(i) Next i For i = 100 To lenth - 1 lng_data2(i - 100) = lng_data(i) Next i addr1 = addr addr2 = addr + 100 lenth1 = 100 lenth2 = lenth - 100 ret = writewords1(slv_id, addr1, lenth1, lng_data1, int_time) If (ret <> 0) Then writewords = ret Exit Function End If ret = writewords1(slv_id, addr2, lenth2, lng_data2, int_time) If (ret <> 0) Then writewords = ret Exit Function End If Else writewords = writewords1(slv_id, addr, lenth, lng_data, int_time) End If End Function 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) 'On Error GoTo wrong Dim lngStartTimer As Long Dim lnginval As Long Dim bln_cx As Boolean Dim byt_data() As Byte Dim r_input() As Byte Dim CRC() As Byte Dim i As Integer ReDim byt_data(lenth * 2 - 1) As Byte For i = 0 To lenth - 1 byt_data(2 * i) = lng_data(i) \ 256 byt_data(2 * i + 1) = lng_data(i) Mod 256 Next i 'Do Until bln_busy = False Or (Abs(timeGetTime - lng_time > 200)) ' DoEvents ' DoEvents ' DoEvents ' DoEvents ' DoEvents 'Loop 'bln_busy = True frm_main.com_modbus.InBufferCount = 0 If (lenth > 1) Then tran_modbus_order slv_id, 16, addr, byt_data Else tran_modbus_order slv_id, 6, addr, byt_data End If lngStartTimer = timeGetTime bln_success = False Dim intCount As Integer Do Until Abs(timeGetTime - lngStartTimer) > int_time Or bln_success DoEvents DoEvents DoEvents DoEvents DoEvents DoEvents intCount = frm_main.com_modbus.InBufferCount If intCount = 8 Then bln_success = True frm_main.com_modbus.InputLen = 0 r_input = frm_main.com_modbus.Input frm_main.com_modbus.InBufferCount = 0 End If Loop If bln_success And intCount = 8 Then CRC = CRC16(r_input) If CRC(0) = r_input(UBound(r_input) - 1) And CRC(1) = r_input(UBound(r_input)) Then writewords1 = 0 '通讯成功 Else writewords1 = 2 '通讯错误 End If ElseIf intCount <> 0 Then writewords1 = 2 '通讯错误 Else writewords1 = 1 '通讯失败 End If If (Not bln_success And intCount <> 0) Then frm_main.com_modbus.InputLen = 0 r_input = frm_main.com_modbus.Input frm_main.com_modbus.InBufferCount = 0 End If 'bln_busy = False Dim ts_i As Integer Dim ts_str As String If (intCount <> 0) Then ts_str = "receive:" For ts_i = 0 To UBound(r_input) ts_str = ts_str + CStr(Hex(r_input(ts_i))) + " " Next ts_i frm_main.Txt_msg.Text = ts_str + Chr(13) + Chr(10) + frm_main.Txt_msg.Text Else ts_str = "no receive:" frm_main.Txt_msg.Text = ts_str + Chr(13) + Chr(10) + frm_main.Txt_msg.Text End If 'wrong: DoEvents End Function '读浮点数 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 Dim lenth1 As Integer Dim lenth2 As Integer Dim ret_val1() As Single Dim ret_val2() As Single Dim addr1 As Long Dim addr2 As Long Dim ret As Integer If (lenth > 50) Then lenth1 = 50 lenth2 = lenth - lenth1 addr1 = addr addr2 = addr + 100 ret = readsgls1(slv_id, addr1, lenth1, int_time, ret_val1) If (ret <> 0) Then readsgls = ret Exit Function End If ret = readsgls1(slv_id, addr2, lenth2, int_time, ret_val2) If (ret <> 0) Then readsgls = ret Exit Function End If ReDim ret_val(lenth - 1) As Single Dim i As Integer For i = 0 To 49 ret_val(i) = ret_val1(i) Next i For i = 50 To lenth - 1 ret_val(i) = ret_val2(i - 50) Next i readsgls = ret Else readsgls = readsgls1(slv_id, addr, lenth, int_time, ret_val()) End If End Function 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 'On Error GoTo wrong Dim i As Integer Dim lngStartTimer As Long Dim byt_data(0) As Byte Dim ret_byte() As Byte Dim r_input() As Byte Dim CRC() As Byte Dim intCount As Integer byt_data(0) = lenth * 2 'Do Until bln_busy = False Or (Abs(timeGetTime - lng_time > 200)) ' DoEvents ' DoEvents ' DoEvents ' DoEvents ' DoEvents 'Loop 'bln_busy = True frm_main.com_modbus.InBufferCount = 0 tran_modbus_order slv_id, 3, addr, byt_data lngStartTimer = timeGetTime bln_success = False Do Until Abs(timeGetTime - lngStartTimer) > int_time Or bln_success DoEvents DoEvents DoEvents DoEvents DoEvents intCount = frm_main.com_modbus.InBufferCount If intCount = CInt(byt_data(0) * 2 + 5) Then bln_success = True frm_main.com_modbus.InputLen = 0 r_input = frm_main.com_modbus.Input frm_main.com_modbus.InBufferCount = 0 End If Loop 'frm_main.Label2.Caption = timeGetTime - lngStartTimer + CLng(frm_main.Label2.Caption) If bln_success And intCount = CInt(byt_data(0) * 2 + 5) Then CRC = CRC16(r_input) If CRC(0) = r_input(UBound(r_input) - 1) And CRC(1) = r_input(UBound(r_input)) Then ret_byte = r_input ReDim ret_val(lenth - 1) As Single Dim byt(3) As Byte For i = 0 To lenth - 1 byt(0) = ret_byte(i * 4 + 4) byt(1) = ret_byte(i * 4 + 3) byt(2) = ret_byte(i * 4 + 6) byt(3) = ret_byte(i * 4 + 5) ret_val(i) = bytTosgl(byt) Next i readsgls1 = 0 Else readsgls1 = 2 End If ElseIf intCount <> 0 Then readsgls1 = 2 Else readsgls1 = 1 End If 'bln_busy = False Dim ts_i As Integer Dim ts_str As String If (intCount <> 0) Then ts_str = "receive:" For ts_i = 0 To UBound(r_input) ts_str = ts_str + CStr(Hex(r_input(ts_i))) + " " Next ts_i frm_main.Txt_msg.Text = ts_str + Chr(13) + Chr(10) + frm_main.Txt_msg.Text Else ts_str = "no receive:" frm_main.Txt_msg.Text = ts_str + Chr(13) + Chr(10) + frm_main.Txt_msg.Text End If End Function '写浮点数 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 Dim addr1 As Integer Dim addr2 As Integer Dim lenth1 As Integer Dim lenth2 As Integer Dim sgl_data1() As Single Dim sgl_data2() As Single Dim i As Integer Dim ret As Integer If lenth > 50 Then ReDim sgl_data1(49) As Single ReDim sgl_data2(lenth - 51) lenth1 = 50 lenth2 = lenth - lenth1 addr1 = addr addr2 = addr + 100 For i = 0 To 49 sgl_data1(i) = sgl_data(i) Next i For i = 50 To lenth - 1 sgl_data2(i - 50) = sgl_data(i) Next i ret = writesgls1(slv_id, addr1, lenth1, sgl_data1, int_time) If (ret <> 0) Then writesgls = ret Exit Function End If ret = writesgls1(slv_id, addr2, lenth2, sgl_data2, int_time) If (ret <> 0) Then writesgls = ret Exit Function End If Else writesgls = writesgls1(slv_id, addr, lenth, sgl_data(), int_time) End If End Function 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 Dim lngStartTimer As Long Dim CRC() As Byte Dim byt_data() As Byte Dim r_input() As Byte Dim i As Integer Dim byt(3) As Byte ReDim byt_data(lenth * 4 - 1) As Byte For i = 0 To lenth - 1 sglTobyt sgl_data(i), byt byt_data(4 * i) = byt(1) byt_data(4 * i + 1) = byt(0) byt_data(4 * i + 2) = byt(3) byt_data(4 * i + 3) = byt(2) Next i 'Do Until bln_busy = False Or (Abs(timeGetTime - lng_time > 200)) ' DoEvents 'Loop 'bln_busy = True frm_main.com_modbus.InBufferCount = 0 tran_modbus_order slv_id, 16, addr, byt_data lngStartTimer = timeGetTime bln_success = False Static intCount As Integer Do Until Abs(timeGetTime - lngStartTimer) > int_time Or bln_success DoEvents intCount = frm_main.com_modbus.InBufferCount If intCount = 8 Then bln_success = True frm_main.com_modbus.InputLen = 0 r_input = frm_main.com_modbus.Input frm_main.com_modbus.InBufferCount = 0 End If Loop If bln_success And intCount = 8 Then CRC = CRC16(r_input) If CRC(0) = r_input(UBound(r_input) - 1) And CRC(1) = r_input(UBound(r_input)) Then writesgls1 = 0 Else writesgls1 = 2 End If ElseIf intCount <> 0 Then writesgls1 = 2 Else writesgls1 = 1 End If Dim ts_i As Integer Dim ts_str As String If (intCount <> 0) Then ts_str = "receive:" For ts_i = 0 To UBound(r_input) ts_str = ts_str + CStr(Hex(r_input(ts_i))) + " " Next ts_i frm_main.Txt_msg.Text = ts_str + Chr(13) + Chr(10) + frm_main.Txt_msg.Text Else ts_str = "no receive:" frm_main.Txt_msg.Text = ts_str + Chr(13) + Chr(10) + frm_main.Txt_msg.Text End If 'bln_busy = False End Function
/
本文档为【VB MODBUS实现源码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
热门搜索

历史搜索

    清空历史搜索