国产三级在线看完整版-内射白嫩大屁股在线播放91-欧美精品国产精品综合-国产精品视频网站一区-一二三四在线观看视频韩国-国产不卡国产不卡国产精品不卡-日本岛国一区二区三区四区-成年人免费在线看片网站-熟女少妇一区二区三区四区

儀器網(wǎng)(yiqi.com)歡迎您!

| 注冊(cè)2 登錄
網(wǎng)站首頁(yè)-資訊-話題-產(chǎn)品-評(píng)測(cè)-品牌庫(kù)-供應(yīng)商-展會(huì)-招標(biāo)-采購(gòu)-知識(shí)-技術(shù)-社區(qū)-資料-方案-產(chǎn)品庫(kù)-視頻

問(wèn)答社區(qū)

如何使用Delphi編寫Modbus RTU CRC16的校驗(yàn)碼

xuhui2565 2016-12-23 13:59:01 393  瀏覽
  •  

參與評(píng)論

全部評(píng)論(1條)

  • 張章長(zhǎng) 2016-12-24 00:00:00
    在工業(yè)控制中,Modbus RTU CRC16的校驗(yàn)碼用的比較廣泛,包括本人富士產(chǎn)品中,PC與伺服電機(jī)以及PC與VP系列的變頻器的Modbus RTU通訊中都使用到了CRC16. 而對(duì)CRC16的計(jì)算的方式基本上有2種:diyi種,使用雙循環(huán)依照CRC的計(jì)算方法進(jìn)行計(jì)算,第二種,采用查表的方式。本人愚鈍無(wú)比,從網(wǎng)絡(luò)上搜來(lái)的查表法都與實(shí)際的正確CRC16的結(jié)果有所差異,因此編寫了一個(gè)小程序供自己使用。 軟件的界面很簡(jiǎn)單,輸入諸如“010303020014”的值,然后每2個(gè)字符作為一個(gè)字節(jié),填入字節(jié)數(shù),然后就可以計(jì)算出校驗(yàn)碼,校驗(yàn)碼的多項(xiàng)式為:X16+X15+X2+1. 程序界面如下: 實(shí)現(xiàn)的源代碼如下: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Edit2: TEdit; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Memo1: TMemo; Label4: TLabel; function CalCRC16(AData:array of Byte;AStart,AEnd:Integer):Word; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} //×××××××××××××××××××××××××× // CalCRC16用于計(jì)算Modbus RTU的CRC16 // 多項(xiàng)式公式為X16+X15+X2+1 //×××××××××××××××××××××××××× function TForm1.CalCRC16(AData:array of Byte;AStart,AEnd:Integer):Word; const GENP=$A001; //多項(xiàng)式公式X16+X15+X2+1(1100 0000 0000 0101) var crc:Word; i:Integer; tmp:Byte; procedure CalOneByte(AByte:Byte); //計(jì)算1個(gè)字節(jié)的校驗(yàn)碼 var j:Integer; begin crc:=crc xor AByte; //將數(shù)據(jù)與CRC寄存器的低8位進(jìn)行異或 for j:=0 to 7 do //對(duì)每一位進(jìn)行校驗(yàn) begin tmp:=crc and 1; //取出Z低位 crc:=crc shr 1; //寄存器向右移一位 crc:=crc and $7FFF; //將Z高位置0 if tmp=1 then //檢測(cè)移出的位,如果為1,那么與多項(xiàng)式異或 crc:=crc xor GENP; crc:=crc and $FFFF; end; end; begin crc:=$FFFF; //將余數(shù)設(shè)定為FFFF for i:=AStart to AEnd do //對(duì)每一個(gè)字節(jié)進(jìn)行校驗(yàn) CalOneByte(AData[i]); Result:=crc; end; procedure TForm1.Button1Click(Sender: TObject); var Data:array[0..255] of Byte; i,j,Count:Integer; Res:Word; szData:string; begin szData:=Form1.Edit2.Text; //讀入欲校驗(yàn)的字符串 Count:=StrToInt(form1.Edit3.Text); //讀入需要計(jì)算的字符串長(zhǎng)度 i:=1; j:=0; for j:=0 to Count-1 do begin if (i mod 2)=0 then //每2個(gè)字符放入一個(gè)字節(jié)中 i:=i+1; if i>=Length(szData) then exit; Data[j]:=StrToInt('$'+copy(szData,i,2)); //取出字符并轉(zhuǎn)換為16進(jìn)制數(shù) i:=i+1; end; Res:=CalCRC16(Data,Low(Data),Count-1); form1.Edit1.Text:=IntToHex(Res,4); end; end.

    贊(1)

    回復(fù)(0)

    評(píng)論

熱門問(wèn)答

如何使用Delphi編寫Modbus RTU CRC16的校驗(yàn)碼
 
2016-12-23 13:59:01 393 1
如何使用Delphi編寫Modbus RTU CRC16的校驗(yàn)碼
 
2015-08-17 02:54:21 419 1
C語(yǔ)言如何編寫modbus RTU協(xié)議?
我用c語(yǔ)言編寫程序,通過(guò)USART收發(fā)數(shù)據(jù),硬件電路為RS-485,我想實(shí)現(xiàn)modbus RTU協(xié)議的通信,如何配置和編寫?越詳細(xì)越好,多謝,若有資料提供,發(fā)到2041479809@qq.com郵箱,感激不盡!
2017-01-08 15:58:41 602 1
modbus協(xié)議RTU模式校驗(yàn)碼怎么計(jì)算
 
2016-01-30 03:44:18 509 1
modbus協(xié)議RTU模式校驗(yàn)碼怎么計(jì)算
 
2016-01-25 04:46:33 636 1
如何使用kepserver進(jìn)行modbus的rtu通訊
 
2015-11-26 23:05:25 306 1
modbus RTU一般怎么使用?
 
2014-12-21 03:05:50 479 2
如何使用RTU數(shù)據(jù)采集終端中的modbus功能
 
2017-07-21 03:17:33 861 1
modbus RTU和modbus TCP能同時(shí)使用么
 
2017-08-14 04:39:33 479 1
modbus rtu 校驗(yàn)碼CRC在PLC梯形圖里面怎么實(shí)現(xiàn)?麻煩詳細(xì)點(diǎn)。
 
2012-11-18 14:24:46 608 2
javascript 如何發(fā)送modbus rtu 指令
有一個(gè)繼電器,通過(guò)485轉(zhuǎn)usb接在電腦上(客戶機(jī)),客戶機(jī)通過(guò)瀏覽器訪問(wèn)服務(wù)端,要根據(jù)服務(wù)端返回的不同數(shù)據(jù)給繼電器發(fā)送不同的指令!現(xiàn)在的初步想法是從服務(wù)端返回一個(gè)json數(shù)據(jù),根據(jù)json數(shù)據(jù)用javascript給繼電器發(fā)送指令,但不知道如何實(shí)現(xiàn)!
2015-06-01 10:07:47 424 2
modbus rtu 如何讀保持寄存器
 
2012-02-28 11:54:13 459 2
modbus rtu 如何讀保持寄存器
 
2012-05-20 15:47:23 386 1
modbus rtu是什么?
 
2012-10-13 03:39:38 495 2
modbus rtu協(xié)議
儀表的modbus rtu 協(xié)議的保持寄存器地址是從40001,但是OPC軟件上的modbus rtu 協(xié)議卻是400001開始,我不知道怎么獲取儀表上的數(shù)據(jù),我軟件上我要怎么跟儀表地址對(duì)起來(lái)。
2011-12-24 07:10:01 639 4
Modbus TCP和Modbus Rtu的區(qū)別
 
2017-10-02 23:41:54 432 1
GPRS RTU模塊可以將modbus TCP轉(zhuǎn)換成modbus RTU嗎?或是將modbus RTU轉(zhuǎn)換成modbus TCP?
 
2014-12-21 15:17:31 351 1
Modbus RTU 幀接收完畢如何判斷
Modbus RTU 判斷一幀數(shù)據(jù)接收完成,是不是就用定時(shí)器判斷接收到的兩字符時(shí)間間隔是否大于傳送3.5個(gè)字符時(shí)間呀?但這樣的話,接收完一幀數(shù)據(jù)還必須要花費(fèi)大概1.45個(gè)毫秒(對(duì)波特率19200,28/19200)來(lái)判斷接收完畢了,才能去處理接收到的數(shù)據(jù),會(huì)不會(huì)影響下一幀... Modbus RTU 判斷一幀數(shù)據(jù)接收完成,是不是就用定時(shí)器判斷接收到的兩字符時(shí)間間隔是否大于傳送3.5個(gè)字符時(shí)間呀?但這樣的話,接收完一幀數(shù)據(jù)還必須要花費(fèi)大概1.45個(gè)毫秒(對(duì)波特率19200,28/19200)來(lái)判斷接收完畢了,才能去處理接收到的數(shù)據(jù),會(huì)不會(huì)影響下一幀數(shù)據(jù)的接收呀?一般發(fā)送兩幀數(shù)據(jù)之間的時(shí)間間隔是多少呀?有沒有其他的判斷幀接收完畢的方法呀?謝謝 展開
2012-05-07 03:16:16 545 3
如何 把can bus 轉(zhuǎn)為modbus rtu
 
2017-06-10 09:58:11 360 1
tcp網(wǎng)絡(luò)如何發(fā)送modbus rtu命令
 
2018-11-22 02:01:13 300 0

4月突出貢獻(xiàn)榜

推薦主頁(yè)

最新話題