全部評(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)
登錄或新用戶注冊(cè)
- 微信登錄
- 密碼登錄
- 短信登錄
請(qǐng)用手機(jī)微信掃描下方二維碼
快速登錄或注冊(cè)新賬號(hào)
微信掃碼,手機(jī)電腦聯(lián)動(dòng)
注冊(cè)登錄即表示同意《儀器網(wǎng)服務(wù)條款》和《隱私協(xié)議》
熱門問(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è)
最新話題





參與評(píng)論
登錄后參與評(píng)論