VBMODBUS實(shí)現(xiàn)源碼_第1頁
VBMODBUS實(shí)現(xiàn)源碼_第2頁
VBMODBUS實(shí)現(xiàn)源碼_第3頁
VBMODBUS實(shí)現(xiàn)源碼_第4頁
VBMODBUS實(shí)現(xiàn)源碼_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余16頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、OptionExplicitPublicbln_busyAsBooleanPublicbln_successAsBooleanPublicbln_readwordAsBooleanPublicDeclareFunctiontimeGetTimeLibwinmm.dll()AsLongPublicSubtran_modbus_order(ByValbyt_slv_idAsByte,ByValbyt_funcAsByte,ByValaddrAsLong,byt_data()AsByte)Dimtrans_byte()AsByteDimiAsIntegerDimjAsIntegerDimkAsInt

2、egerDimIndexAsIntegerDimCRC()AsByteDimtempAsIntegerDimlenthAsIntegerDimlenth1AsIntegerSelectCasebyt_funcCase1ReDimtrans_byte(7)AsBytetrans_byte(0)=byt_slv_idtrans_byte(1)=1trans_byte(2)=(addr-1)256trans_byte(3)=(addr-1)Mod256trans_byte(4)=0trans_byte(5)=byt_data(0)CRC=CRC16(trans_byte)trans_byte(6)=

3、CRC(0)trans_byte(7)=CRC(1)Case3ReDimtrans_byte(7)AsBytetrans_byte(0)=byt_slv_idtrans_byte(1)=3trans_byte(2)=(addr-1)256trans_byte(3)=(addr-1)Mod256trans_byte(4)=0trans_byte(5)=byt_data(0)CRC=CRC16(trans_byte)trans_byte(6)=CRC(0)trans_byte(7)=CRC(1)Case6ReDimtrans_byte(7)AsBytetrans_byte(0)=byt_slv_i

4、dtrans_byte(1)=6trans_byte(2)=(addr-1)256trans_byte(3)=(addr-1)Mod256trans_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)Case15lenth=UBound(byt_data)+1lenth1=(lenth-1)8+1ReDimtrans_byte(8+lenth1)trans_byte(0)=byt_slv_idtrans_byte(1)=&HFt

5、rans_byte(2)=(addr-1)256trans_byte(3)=(addr-1)Mod256trans_byte(4)=0trans_byte(5)=lenthtrans_byte(6)=lenth1k=0Index=7temp=0Fori=1Tolenthtemp=temp+byt_data(i-1)*(2Ak)If(iMod8=0)Thentrans_byte(Index)=CByte(temp)Index=Index+1temp=0k=0EndIfk=k+1Nextitrans_byte(Index)=CByte(temp)CRC=CRC16(trans_byte)trans

6、_byte(7+lenth1)=CRC(0)trans_byte(8+lenth1)=CRC(1)Case16lenth=UBound(byt_data)+1ReDimtrans_byte(8+lenth)trans_byte(0)=byt_slv_idtrans_byte(1)=&H10trans_byte(2)=(addr-1)256trans_byte(3)=(addr-1)Mod256trans_byte(4)=0trans_byte(5)=lenth2trans_byte(6)=lenthFori=0Tolenth-1trans_byte(7+i)=byt_data(i)Ne

7、xtiCRC=CRC16(trans_byte)trans_byte(7+lenth)=CRC(0)trans_byte(8+lenth)=CRC(1)EndSelectfrm_modbus.Output=trans_byteDimts_iAsIntegerDimts_strAsStringts_str=send:Forts_i=0ToUBound(trans_byte)ts_str=ts_str+CStr(Hex(trans_byte(ts_i)+Nextts_ifrm_main.Txt_msg.Text=ts_str+Chr(13)+Chr(10)+frm_main.Txt_msg.Tex

8、tIf(Len(frm_main.Txt_msg.Text)30000)Thenfrm_main.Txt_msg.Text=EndIffrm_modbus.OutBufferCount=0EndSubFunctionCRC16(data()AsByte)AsStringDimCRC16LoAsByte,CRC16HiAsByteCRC 寄存器DimCLAsByte,CHAsByte多項(xiàng)式碼&HA001DimSaveHiAsByte,SaveLoAsByteDimiAsIntegerDimflagAsIntegerOnErrorGoTowrongCRC16Lo=&HFFCRC16

9、Hi=&HFFCL=&H1CH=&HA0Fori=0ToUBound(data)-2DoEventsDoEventsDoEventsCRC16Lo=CRC16LoXordata(i)每一個(gè)數(shù)據(jù)與 CRC 寄存器進(jìn)行異或Forflag=0To7SaveHi=CRC16HiSaveLo=CRC16Lowrong:errprocessCRC16EndFunctionPublicFunctionreadcoils(ByValslv_idAsByte,ByValaddrAsLong,ByVallenthAsByte,ByValint_timeAsInteger,ByRefret_

10、val()AsByte)AsIntegerDimbyt_data(0)AsByteDimlngStartTimerAsLongDimlnginvalAsLongDimbln_cxAsBooleanDimret_byte()AsBytetm_delay.Enabled=FalseCRC16Hi=CRC16Hi2CRC16Lo=CRC16Lo2If(SaveHiAnd&H1)=&H1)ThenCRC16Lo=CRC16LoOr&H80EndIfIf(SaveLoAnd&H1)=&H1)ThenCRC16Hi=CRC16HiXorCHCRC16Lo=CRC16

11、LoXorCLEndIfNextflagNextiDimReturnData(1)AsByteReturnData(0)=CRC16LoReturnData(1)=CRC16HiCRC16=ReturnDataExitFunction高位右移一位低位右移一位如果高位字節(jié)最后一位為 1則低位字節(jié)右移后前面補(bǔ) 1否則自動(dòng)補(bǔ) 0如果 LSB 為 1,則與多項(xiàng)式碼進(jìn)行異或CRC 高位CRC 低位byt_data(0)=lenthDoUntilbln_busy=FalseOr(Abs(timeGetTime-lng_time200)DoEventsLoopbln_busy=Truefrm_modbus.

12、InBufferCount=0tran_modbus_orderslv_id,1,addr,byt_datalngStartTimer=timeGetTimelnginval=timeGetTime()bln_success=FalseDimr_input()AsByteDimiAsIntegerStaticintCountAsIntegerDoUntilAbs(timeGetTime-lngStartTimer)int_timeOrbln_successDoEventsDoEventsDoEventsDoEventsInginval=timeGetTime()If(Abs(timeGetTi

13、me-Inginval)8)ThenIf(intCountfrm_modbus.InBufferCountOrintCount=0)ThenintCount=frm_modbus.InBufferCountElseTimer1.Enabled=FalseReDimr_input(1024)AsBytefrm_modbus.InputLen=0Input_Len=frm_M_modbus.InBufferCountr_input=frm_modbus.Inputfrm_modbus.InBufferCount=0Fori=0ToUBound(r_input)Debug.Printr_input(

14、i)Text1.Text=Text1.Text&CStr(Hex(r_input(i)+NextiintCount=0bln_success=TrueEndIflnginval=timeGetTime()EndIfLoopIf(bln_success)ThenDimlenth1AsIntegerreadcoils=0ret_byte=r_inputlenth1=(lenth-1)8+1ReDimret_val(lenth1-1)Fori=1Tolenth1ret_val(i-1)=ret_byte(2+i)NextiintCount=0ElseintCount=0readcoils=1

15、EndIfbln_busy=Falsetm_delay.Enabled=TrueEndFunctionPublicFunctionwritecoils(ByValslv_idAsByte,ByValaddrAsLong,ByVallenthAsByte,ByRefbyt_data()AsByte,ByValint_timeAsInteger)AsIntegerDimlngStartTimerAsLongDimlnginvalAsLongDimbln_cxAsBooleantm_delay.Enabled=FalseDoUntilbln_busy=FalseOr(Abs(timeGetTime-

16、lng_time200)DoEventsDoEventsDoEventsDoEventsDoEventsLoopbln_busy=Truefrm_modbus.InBufferCount=0tran_modbus_orderslv_id,15,addr,byt_datalngStartTimer=timeGetTimelnginval=timeGetTime()bln_success=FalseDimr_input()AsByteDimiAsIntegerStaticintCountAsIntegerDoUntilAbs(timeGetTime-lngStartTimer)int_timeOr

17、bln_successDoEventsDoEventsDoEventsDoEventsDoEventsDoEventsDoEventslnginval=timeGetTime()If(Abs(timeGetTime-lnginval)8)ThenIf(intCountfrm_modbus.InBufferCountOrintCount=0)ThenintCount=frm_modbus.InBufferCountElsefrm_modbus.InputLen=0Input_Len=frm_M_modbus.InBufferCountr_input=frm_modbus.Inputfrm_mod

18、bus.InBufferCount=0Fori=0ToUBound(r_input)Debug.Printr_input(i)NextiintCount=0bln_success=TrueEndIfInginval=timeGetTime()EndIfLoopIf(bln_success)Thenwritecoils=0intCount=0ElseintCount=0writecoils=1EndIfbln_busy=Falsetm_delay.Enabled=TrueEndFunctionPublicFunctionreadwords(ByValslv_idAsByte,ByValaddrA

19、sLong,ByVallenthAsByte,ByValint_timeAsInteger,ByRefret_val()AsLong)AsIntegerDimlenth1AsIntegerDimlenth2AsIntegerDimret_val1()AsLongDimret_val2()AsLongDimaddr1AsLongDimaddr2AsLongDimretAsIntegerIf(lenth100)Thenlenth1=100lenth2=lenth-100addr1=addraddr2=addr+100ret=readwords1(slv_id,addr1,lenth1,int_ti

20、me,ret_val1)If(ret0)Thenreadwords=retExitFunctionEndIfret=readwords1(slv_id,addr2,lenth2,int_time,ret_val2)If(ret0)Thenreadwords=retExitFunctionEndIfReDimret_val(lenth-1)AsLongDimiAsIntegerFori=0To99ret_val(i)=ret_val1(i)NextiFori=100Tolenth-1ret_val(i)=ret_val2(i-100)Nextireadwords=retElsereadwords

21、=readwords1(slv_id,addr,lenth,int_time,ret_val)EndIfEndFunctionPublicFunctionreadwords1(ByValslv_idAsByte,ByValaddrAsLong,ByVallenthAsByte,ByValint_timeAsInteger,ByRefret_val()AsLong)AsIntegerDimbyt_data(0)AsByteDimlngStartTimerAsLongDimret_byte()AsByteDimr_input()AsByteDimCRC()AsByteDimintCountAsIn

22、tegerDimiAsIntegerbyt_data(0)=lenthDoUntilbln_busy=FalseOr(Abs(timeGetTime-lng_time200)DoEventsDoEventsLoopbln_busy=Truefrm_modbus.InBufferCount=0tran_modbus_orderslv_id,3,addr,byt_datalngStartTimer=timeGetTimebln_success=FalseDoUntilAbs(timeGetTime-lngStartTimer)int_timeOrbln_successDoEventsDoEvent

23、sDoEventsintCount=frm_modbus.InBufferCountIfintCount=CInt(byt_data(0)*2+5)Thenbln_success=Truefrm_modbus.InputLen=0r_input=frm_modbus.Inputfrm_modbus.InBufferCount=0EndIfLoopfrm_Main.Label2.Caption=timeGetTime-lngStartTimer+CLng(frm_Main.Label2.Caption)Ifbln_successAndintCount=CInt(byt_data(0)*2+5)T

24、henCRC=CRC16(r_input)IfCRC(0)=r_input(UBound(r_input)-1)AndCRC(1)=r_input(UBound(r_input)Thenret_byte=r_inputReDimret_val(lenth-1)AsLongDimbyt(3)AsByteFori=0Tolenth-1ret_val(i)=CLng(ret_byte(i*2+3)*256+ret_byte(i*2+4)If(ret_val(i)32767)Thenret_val(i)=ret_val(i)-65536EndIfNextireadwords1=0通訊成功Elserea

25、dwords1=2通訊錯(cuò)誤EndIfElseIfintCount0Thenreadwords1=2通訊錯(cuò)誤r_input=frm_modbus.InputElsereadwords1=1通訊失敗EndIfbln_busy=FalseEndIfDimts_iAsIntegerDimts_strAsStringIf(intCount0)Thents_str=receive:Forts_i=0ToUBound(r_input)ts_str=ts_str+CStr(Hex(r_input(ts_i)+Nextts_ifrm_main.Txt_msg.Text=ts_str+Chr(13)+Chr(10

26、)+frm_main.Txt_msg.TextElsets_str=noreceive:frm_main.Txt_msg.Text=ts_str+Chr(13)+Chr(10)+frm_main.Txt_msg.TextEndIfEndFunctionPublicFunctionwritewords(ByValslv_idAsByte,ByValaddrAsLong,ByVallenthAsByte,ByReflng_data()AsLong,ByValint_timeAsInteger)AsIntegerDimretAsIntegerDimlenth1AsIntegerDimlenth2As

27、IntegerDimaddr1AsIntegerDimaddr2AsIntegerDimlng_data1()AsLongDimlng_data2()AsLongDimiAsIntegerIf(lenth100)ThenReDimlng_data1(99)ReDimlng_data2(lenth-100-1)Fori=0To99lng_data1(i)=lng_data(i)NextiFori=100Tolenth-1lng_data2(i-100)=lng_data(i)Nextiaddr1=addraddr2=addr+100lenth1=100lenth2=lenth-100ret=wr

28、itewords1(slv_id,addr1,lenth1,lng_data1,int_time)If(ret0)Thenwritewords=retExitFunctionEndIfret=writewords1(slv_id,addr2,lenth2,lng_data2,int_time)If(ret0)Thenwritewords=retExitFunctionEndIfElsewritewords=writewords1(slv_id,addr,lenth,lng_data,int_time)EndIfEndFunctionPublicFunctionwritewords1(ByVal

29、slv_idAsByte,ByValaddrAsLong,ByVallenthAsByte,ByReflng_data()AsLong,ByValint_timeAsInteger)OnErrorGoTowrongDimlngStartTimerAsLongDimlnginvalAsLongDimbln_cxAsBooleanDimbyt_data()AsByteDimr_input()AsByteDimCRC()AsByteDimiAsIntegerReDimbyt_data(lenth*2-1)AsByteFori=0Tolenth-1byt_data(2*i)=lng_data(i)25

30、6byt_data(2*i+1)=lng_data(i)Mod256NextiDoUntilbln_busy=FalseOr(Abs(timeGetTime-lng_time200)DoEventsDoEventsDoEventsDoEventsDoEventsLoopbln_busy=Truefrm_modbus.InBufferCount=0If(lenth1)Thentran_modbus_orderslv_id,16,addr,byt_dataElsetran_modbus_orderslv_id,6,addr,byt_dataEndIflngStartTimer=timeGetTim

31、ebln_success=FalseDimintCountAsIntegerDoUntilAbs(timeGetTime-lngStartTimer)int_timeOrbln_successDoEventsDoEventsDoEventsDoEventsDoEventsDoEventsintCount=frm_modbus.InBufferCountIfintCount=8Thenbln_success=Truefrm_modbus.InputLen=0r_input=frm_modbus.Inputfrm_modbus.InBufferCount=0EndIfLoopIfbln_succe

32、ssAndintCount=8ThenCRC=CRC16(r_input)IfCRC(0)=r_input(UBound(r_input)-1)AndCRC(1)=r_input(UBound(r_input)Thenwritewords1=0通訊成功Elsewritewords1=2通訊錯(cuò)誤EndIfElseIfintCount0Thenwritewords1=2通訊錯(cuò)誤Elsewritewords1=1通訊失敗EndIfIf(Notbln_successAndintCount0)Thenfrm_modbus.InputLen=0r_input=frm_modbus.Inputfrm_mod

33、bus.InBufferCount=0EndIfbln_busy=FalseDimts_iAsIntegerDimts_strAsStringIf(intCount0)Thents_str=receive:Forts_i=0ToUBound(r_input)ts_str=ts_str+CStr(Hex(r_input(ts_i)+Nextts_ifrm_main.Txt_msg.Text=ts_str+Chr(13)+Chr(10)+frm_main.Txt_msg.TextElsets_str=noreceive:frm_main.Txt_msg.Text=ts_str+Chr(13)+Ch

34、r(10)+frm_main.Txt_msg.TextEndIfwrong:DoEventsEndFunction讀浮點(diǎn)數(shù)PublicFunctionreadsgls(ByValslv_idAsByte,ByValaddrAsLong,ByVallenthAsByte,ByValint_timeAsInteger,ByRefret_val()AsSingle)AsIntegerDimlenth1AsIntegerDimlenth2AsIntegerDimret_val1()AsSingleDimret_val2()AsSingleDimaddriAsLongDimaddr2AsLongDimr

35、etAsIntegerIf(lenth50)Thenlenthi=50lenth2=lenth-lenthiaddri=addraddr2=addr+100ret=readsglsi(slv_id,addri,lenthi,int_time,ret_vali)If(ret0)Thenreadsgls=retExitFunctionEndIfret=readsglsi(slv_id,addr2,lenth2,int_time,ret_val2)If(ret0)Thenreadsgls=retExitFunctionEndIfReDimret_val(lenth-i)AsSingleDimiAsI

36、ntegerFori=0To49ret_val(i)=ret_vali(i)NextiFori=50Tolenth-iret_val(i)=ret_val2(i-50)Nextireadsgls=retElsereadsgls=readsglsi(slv_id,addr,lenth,int_time,ret_val()EndIfEndFunctionPublicFunctionreadsglsi(ByValslv_idAsByte,ByValaddrAsLong,ByVallenthAsByte,ByValint_timeAsInteger,ByRefret_val()AsSingle)AsI

37、ntegerOnErrorGoTowrongDimiAsIntegerDimlngStartTimerAsLongDimbyt_data(0)AsByteDimret_byte()AsByteDimr_input()AsByteDimCRC()AsByteDimintCountAsIntegerbyt_data(0)=lenth*2DoUntilbln_busy=FalseOr(Abs(timeGetTime-lng_time200)DoEventsDoEventsDoEventsDoEventsDoEventsLoopbln_busy=Truefrm_modbus.InBufferCount

38、=0tran_modbus_orderslv_id,3,addr,byt_datalngStartTimer=timeGetTimebln_success=FalseDoUntilAbs(timeGetTime-lngStartTimer)int_timeOrbln_successDoEventsDoEventsDoEventsDoEventsDoEventsintCount=frm_modbus.InBufferCountIfintCount=CInt(byt_data(0)*2+5)Thenbln_success=Truefrm_modbus.InputLen=0r_input=frm_m

39、odbus.Inputfrm_modbus.InBufferCount=0EndIfLoopfrm_main.Label2.Caption=timeGetTime-lngStartTimer+CLng(frm_main.Label2.Caption)Ifbln_successAndintCount=CInt(byt_data(0)*2+5)ThenCRC=CRC16(r_input)IfCRC(0)=r_input(UBound(r_input)-1)AndCRC(1)=r_input(UBound(r_input)Thenret_byte=r_inputReDimret_val(lenth-

40、1)AsSingleDimbyt(3)AsByteFori=0Tolenth-1byt(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)Nextireadsgls1=0Elsereadsglsl=2EndIfElselfintCount0Thenreadsglsl=2Elsereadsgls1=1EndIfbln_busy=FalseDimts_iAsIntegerDimts_strAsStringIf(intCount0)Th

41、ents_str=receive:Forts_i=0ToUBound(r_input)ts_str=ts_str+CStr(Hex(r_input(ts_i)+Nextts_ifrm_main.Txt_msg.Text=ts_str+Chr(13)+Chr(10)+frm_main.Txt_msg.TextElsets_str=noreceive:frm_main.Txt_msg.Text=ts_str+Chr(13)+Chr(10)+frm_main.Txt_msg.TextEndIfEndFunction寫浮點(diǎn)數(shù)PublicFunctionwritesgls(ByValslv_idAsBy

42、te,ByValaddrAsLong,ByVallenthAsByte,ByRefsgl_data()AsSingle,ByValint_timeAsInteger)AsIntegerDimaddr1AsIntegerDimaddr2AsIntegerDimlenth1AsIntegerDimlenth2AsIntegerDimsgl_data1()AsSingleDimsgl_data2()AsSingleDimiAsIntegerDimretAsIntegerIflenth50ThenReDimsgl_data1(49)AsSingleReDimsgl_data2(lenth-51)lenth1=50lenth2=lenth-lenth1addr1=addraddr2=addr+100Fori=0To49sgl_data1(i)=sgl_data(i)NextiFori=50Tolenth-1sgl_data2(i-50)=sgl_data(i)Nextiret=writesgls1(slv_id,addri,lenthl,sgl_data1,int_time)If(ret0)Thenwritesgls=retExitFun

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論