Delphi使用Modbus常用的一些函数.doc

上传人:PIYPING 文档编号:10744757 上传时间:2021-06-02 格式:DOC 页数:6 大小:33KB
返回 下载 相关 举报
Delphi使用Modbus常用的一些函数.doc_第1页
第1页 / 共6页
Delphi使用Modbus常用的一些函数.doc_第2页
第2页 / 共6页
Delphi使用Modbus常用的一些函数.doc_第3页
第3页 / 共6页
Delphi使用Modbus常用的一些函数.doc_第4页
第4页 / 共6页
Delphi使用Modbus常用的一些函数.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《Delphi使用Modbus常用的一些函数.doc》由会员分享,可在线阅读,更多相关《Delphi使用Modbus常用的一些函数.doc(6页珍藏版)》请在三一文库上搜索。

1、CRC-16校验(多项式为x16+x15+x2+1): type CRC校验 TDataByte=arrayofbyte; const CRCHi:array0.255ofbyte= ( $00,$C1,$81,$40,$01,$C0,$80,$41,$01,$C0,$80,$41,$00, $C1,$81,$40,$01,$C0,$80,$41,$00,$C1,$81,$40,$00,$C1, $81,$40,$01,$C0,$80,$41,$01,$C0,$80,$41,$00,$C1,$81, $40,$00,$C1,$81,$40,$01,$C0,$80,$41,$00,$C1,$81

2、,$40, $01,$C0,$80,$41,$01,$C0,$80,$41,$00,$C1,$81,$40,$01, $C0,$80,$41,$00,$C1,$81,$40,$00,$C1,$81,$40,$01,$C0, $80,$41,$00,$C1,$81,$40,$01,$C0,$80,$41,$01,$C0,$80, $41,$00,$C1,$81,$40,$00,$C1,$81,$40,$01,$C0,$80,$41, $01,$C0,$80,$41,$00,$C1,$81,$40,$01,$C0,$80,$41,$00, $C1,$81,$40,$00,$C1,$81,$40,$

3、01,$C0,$80,$41,$01,$C0, $80,$41,$00,$C1,$81,$40,$00,$C1,$81,$40,$01,$C0,$80, $41,$00,$C1,$81,$40,$01,$C0,$80,$41,$01,$C0,$80,$41, $00,$C1,$81,$40,$00,$C1,$81,$40,$01,$C0,$80,$41,$01, $C0,$80,$41,$00,$C1,$81,$40,$01,$C0,$80,$41,$00,$C1, $81,$40,$00,$C1,$81,$40,$01,$C0,$80,$41,$00,$C1,$81, $40,$01,$C0

4、,$80,$41,$01,$C0,$80,$41,$00,$C1,$81,$40, $01,$C0,$80,$41,$00,$C1,$81,$40,$00,$C1,$81,$40,$01, $C0,$80,$41,$01,$C0,$80,$41,$00,$C1,$81,$40,$00,$C1, $81,$40,$01,$C0,$80,$41,$00,$C1,$81,$40,$01,$C0,$80, $41,$01,$C0,$80,$41,$00,$C1,$81,$40 ); CRCLo:array0.255ofbyte= ( $00,$C0,$C1,$01,$C3,$03,$02,$C2,$C

5、6,$06,$07,$C7,$05, $C5,$C4,$04,$CC,$0C,$0D,$CD,$0F,$CF,$CE,$0E,$0A,$CA, $CB,$0B,$C9,$09,$08,$C8,$D8,$18,$19,$D9,$1B,$DB,$DA, $1A,$1E,$DE,$DF,$1F,$DD,$1D,$1C,$DC,$14,$D4,$D5,$15, $D7,$17,$16,$D6,$D2,$12,$13,$D3,$11,$D1,$D0,$10,$F0, $30,$31,$F1,$33,$F3,$F2,$32,$36,$F6,$F7,$37,$F5,$35, $34,$F4,$3C,$FC,

6、$FD,$3D,$FF,$3F,$3E,$FE,$FA,$3A,$3B, $FB,$39,$F9,$F8,$38,$28,$E8,$E9,$29,$EB,$2B,$2A,$EA, $EE,$2E,$2F,$EF,$2D,$ED,$EC,$2C,$E4,$24,$25,$E5,$27, $E7,$E6,$26,$22,$E2,$E3,$23,$E1,$21,$20,$E0,$A0,$60, $61,$A1,$63,$A3,$A2,$62,$66,$A6,$A7,$67,$A5,$65,$64, $A4,$6C,$AC,$AD,$6D,$AF,$6F,$6E,$AE,$AA,$6A,$6B,$AB

7、, $69,$A9,$A8,$68,$78,$B8,$B9,$79,$BB,$7B,$7A,$BA,$BE, $7E,$7F,$BF,$7D,$BD,$BC,$7C,$B4,$74,$75,$B5,$77,$B7, $B6,$76,$72,$B2,$B3,$73,$B1,$71,$70,$B0,$50,$90,$91, $51,$93,$53,$52,$92,$96,$56,$57,$97,$55,$95,$94,$54, $9C,$5C,$5D,$9D,$5F,$9F,$9E,$5E,$5A,$9A,$9B,$5B,$99, $59,$58,$98,$88,$48,$49,$89,$4B,$

8、8B,$8A,$4A,$4E,$8E, $8F,$4F,$8D,$4D,$4C,$8C,$44,$84,$85,$45,$87,$47,$46, $86,$82,$42,$43,$83,$41,$81,$80,$40 ); functioncrc16(vardataaddress:byte;datalength:byte):word; var hi:byte; lo:byte; i:byte; index:byte; datadd:pbytearray; begin hi:=$FF; lo:=$FF; datadd:=dataaddress; i:=0; while(datalength0)d

9、o begin index:=(hixordataddi); i:=i+1; hi:=loxorcrchiindex; lo:=crcloindex; datalength:=datalength-1; end; crc16:=hishl8orlo; end; functionModBusCRC(Data:string):string;/生成modbusCRC数据 var CRC16Lo,CRC16Hi,CL,CH,UseHi,UseLo:Dword; i,index:integer; begin CRC16Lo:=$FF;/CRC16Lo为CRC寄存器低8位 CRC16Hi:=$FF;/CR

10、C16Hi为CRC寄存器高8位 CL:=$01; CH:=$A0;/A001H是CRC16多项式代码 fori:=1toLength(Data)do begin CRC16Lo:=CRC16Loxorord(Datai);/每一个数据与CRC寄存器异或 forindex:=0to7do begin UseHi:=CRC16Hi; UseLo:=CRC16Lo; CRC16Hi:=CRC16Hishr1; CRC16Lo:=CRC16Loshr1;/右移一位 if(UseHiand$1)=$1)then/如果高位字节最后一位是1的话 CRC16Lo:=CRC16Loor$80;/低位字节右移后前

11、面补1 if(UseLoand$1)=$1)then/如果LSB为1,则与多项式进行异或 begin CRC16Hi:=CRC16HixorCH; CRC16Lo:=CRC16LoxorCL; end; end; end; Result:=IntToHex(CRC16Lo,2)+IntToHex(CRC16Hi,2); end; 进制转换: functionStrToHexStr(constS:string):string; /字符串转换成16进制字符串 var I:Integer; begin forI:=1toLength(S)do begin ifI=1then Result:=IntT

12、oHex(Ord(S1),2) elseResult:=Result+IntToHex(Ord(SI),2); end; end; functionHexStrToStr(constS:string):string; /16进制字符串转换成字符串 var t:Integer; ts:string; M,Code:Integer; begin t:=1; Result:=; whiletLength(S)or(not(St+1in0.9,A.F,a.f)then ts:=$+St else ts:=$+St+St+1; Val(ts,M,Code); ifCode=0then Result:=R

13、esult+Chr(M); inc(t,2); end; end; functionHex2Dec(Hexs:string):string; /十六进制转换成十进制 var i,j:integer; res,base:LongWord; begin res:=0; fori:=1toLength(Hexs)do begin base:=1; forj:=1toLength(Hexs)-ido base:=base*16; caseHexsiof 0.9:res:=res+(Ord(Hexsi)-Ord(0)*base; a.f:res:=res+(Ord(Hexsi)-Ord(a)+10)*b

14、ase; A.F:res:=res+(Ord(Hexsi)-Ord(A)+10)*base; end; end; result:=inttostr(res); end; functionBcdToHex(Hexstr:string):string; /BCD转换成十六进制 var i:integer; returnstr:string; begin result:=0; try returnstr:=IntToHex(StrToInt64(Hexstr),4); fori:=1tolength(returnstr)do begin ifreturnstr1=0then delete(retur

15、nstr,1,1); end; Result:=returnstr; except end; end; functionDecToHex(DecS:string):string; /十进制转换成十六进制 vari:integer; begin i:=StrToInt(DecS); Restult:=IntToHex(i,2); end; 使用Comport控件进行modbus通信的简单例子: procedureTMainForm.btnReadBuadRateClick(Sender:TObject);/波特率 var str,str1,BaudRate1:string; i:integer;

16、 obj:PAsync; begin i:=0; if(edAdd.text=)and(notCheckBox1.checked)then showmessage(请输入装置地址) else begin ifcheckBox1.checkedthen/广播方式 Address:=00 else Address:=DecToHex(edAdd.text); ifnot(address=error)then/判断地址是否超出0255地址范围 begin str:=Address+03+00+02+00+01;/差校验数值 str:=str+ModBusCRC(HexStrToStr(str);/发

17、送的字符串(包含地址,功能码,数据,CRC) InitAsync(obj); try ComPort.WriteStrAsync(hexstrToStr(str),obj); SendMemo.Text:=SendMemo.text+str+; i:=i+1; if(i30000)then begin ComPort.AbortAllAsync; showmessage(通信失败,请重新发送!); end; ComPort.WaitForAsync(obj); sleep(500);/发送命令后等待500MS,保证数据的完整性; ComPort.ReadStr(Str,20);/读取接收缓存区

18、20个字节数; comport.ClearBuffer(true,true);/清除发送区和接收区,准备下一个通道通信; finally DoneAsync(obj); end; RXMemo.text:=RXMemo.text+StrToHexstr(str); if(str=)then showmessage(没有收到数据,请重发!) else begin /if(notCRCCheck(str)then /showmessage(接收数据错误!) /else /begin forI:=1toLength(str)do/将接收到的数据作处理 begin str1:=IntToHex(Ord(Stri),2); ifi=5thenBaudRate1:=str1;/测量值的低位字节 end; end; edit1.text:=Hex2Dec(BaudRate1); edBaudRate.text:=BaudRateInterv(Hex2Dec(BaudRate1); end; /end; str:=; end; end;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1