




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、變頻器與PLC通訊的CRC校驗程序設(shè)計與分析通常變頻器與PLC進行通訊控制時,特別是在寫頻率時需要在PLC程序中加入CRC檢驗程序,很多人對檢驗程序看不懂,不明白是怎么一個原理。以下我們來詳細說說這個CRC校驗。何為CRC校驗?采用CRC-16,即2字節(jié)冗余循環(huán)碼CRC,低字節(jié)在前。CRC碼由發(fā)端計算,放置于發(fā)送消息幀的尾部,接收端再重新計算接收到信息的CRC碼,比較計算得到的CRC碼是否與接收到的相符,若不符則表明出錯。CRC碼的計算包括整個消息內(nèi)容,計算時只用8位數(shù)據(jù)位,而起始位、停止位及可能的校驗位均不參與CRC計算。廣州旭康自動化專注于為您提供專業(yè)的自動化系統(tǒng)解決方案!CRC校驗可以1
2、00%檢測出所有奇數(shù)個隨機錯誤。CRC-16校驗可以檢測出長度小于等于16的突發(fā)錯誤,可以保證在1014 bit碼元中只含有1位未被檢測出的錯誤。CRC-16的具體算法有多種,以下是一個例子。1.置16位寄存器為全1,作為CRC寄存器。2.把一個8位數(shù)據(jù)與16位CRC寄存器的低字節(jié)相異或,把結(jié)果放于CRC寄存器中。3.把寄存器的內(nèi)容右移一位(朝低位),用0填補最高位,檢查最低位(移出位)。4.如果最低位為0,重復(fù)(再移位);如果最低位為1,CRC寄存器與多項式A001H(1010 0000 0000 0001)進行異或。5.重復(fù)、,直到右移8次,這樣整個8位數(shù)據(jù)全部進行了處理。6.重復(fù),進行下
3、一個8位數(shù)據(jù)的處理。7.將一幀的所有數(shù)據(jù)字節(jié)處理完后得到CRC-16寄存器。8.將CRC-16寄存器的低字節(jié)和高字節(jié)交換,得到的值即為CRC-16碼。一、循環(huán)冗余校驗碼(CRC)CRC校驗采用多項式編碼方法。被處理的數(shù)據(jù)塊可以看作是一個n階的二進制多項式,由 。如一個8位二進制數(shù)10110101可以表示為: 。多項式乘除法運算過程與普通代數(shù)多項式的乘除法相同。多項式的加減法運算以2為模,加減時不進,錯位,和邏輯異或運算一致。采用CRC校驗時,發(fā)送方和接收方用同一個生成多項式g(x),并且g(x)的首位和最后一位的系數(shù)必須為1。CRC的處理方法是:發(fā)送方以g(x)去除t(x),得到余數(shù)作為CRC
4、校驗碼。校驗時,以計算的校正結(jié)果是否為0為據(jù),判斷數(shù)據(jù)幀是否出錯。CRC校驗可以100地檢測出所有奇數(shù)個隨機錯誤和長度小于等于k(k為g(x)的階數(shù))的突發(fā)錯誤。所以CRC的生成多項式的階數(shù)越高,那么誤判的概率就越小。CCITT建議:2048 kbit/s的PCM基群設(shè)備采用CRC-4方案,使用的CRC校驗碼生成多項式g(x)= 。采用16位CRC校驗,可以保證在 bit碼元中只含有一位未被檢測出的錯誤 。在IBM的同步數(shù)據(jù)鏈路控制規(guī)程SDLC的幀校驗序列FCS中,使用CRC-16,其生成多項式g(x)= ;而在CCITT推薦的高級數(shù)據(jù)鏈路控制規(guī)程HDLC的幀校驗序列FCS中,使用CCITT-
5、16,其生成多項式g(x)= 。CRC-32的生成多項式g(x)= 。CRC-32出錯的概率比CRC-16低 倍 。由于CRC-32的可靠性,把CRC-32用于重要數(shù)據(jù)傳輸十分合適,所以在通信、計算機等領(lǐng)域運用十分廣泛。在一些UART通信控制芯片(如MC6582、Intel8273和Z80-SIO)內(nèi),都采用了CRC校驗碼進行差錯控制;以太網(wǎng)卡芯片、MPEG解碼芯片中,也采用CRC-32進行差錯控制。2、CRC校驗碼的算法分析CRC校驗碼的編碼方法是用待發(fā)送的二進制數(shù)據(jù)t(x)除以生成多項式g(x),將最后的余數(shù)作為CRC校驗碼。其實現(xiàn)步驟如下:(1) 設(shè)待發(fā)送的數(shù)據(jù)塊是m位的二進制多項式t(
6、x),生成多項式為r階的g(x)。在數(shù)據(jù)塊的末尾添加r個0,數(shù)據(jù)塊的長度增加到m+r位,對應(yīng)的二進制多項式為 。(2) 用生成多項式g(x)去除 ,求得余數(shù)為階數(shù)為r-1的二進制多項式y(tǒng)(x)。此二進制多項式y(tǒng)(x)就是t(x)經(jīng)過生成多項式g(x)編碼的CRC校驗碼。(3) 用 以模2的方式減去y(x),得到二進制多項式 。 就是包含了CRC校驗碼的待發(fā)送字符串。從CRC的編碼規(guī)則可以看出,CRC編碼實際上是將代發(fā)送的m位二進制多項式t(x)轉(zhuǎn)換成了可以被g(x)除盡的m+r位二進制多項式 ,所以解碼時可以用接受到的數(shù)據(jù)去除g(x),如果余數(shù)位零,則表示傳輸過程沒有錯誤;如果余數(shù)不為零,則在
7、傳輸過程中肯定存在錯誤。許多CRC的硬件解碼電路就是按這種方式進行檢錯的。同時 可以看做是由t(x)和CRC校驗碼的組合,所以解碼時將接收到的二進制數(shù)據(jù)去掉尾部的r位數(shù)據(jù),得到的就是原始數(shù)據(jù)。為了更清楚的了解CRC校驗碼的編碼過程,下面用一個簡單的例子來說明CRC校驗碼的編碼過程。由于CRC-32、CRC-16、CCITT和CRC-4的編碼過程基本一致,只有位數(shù)和生成多項式不一樣。為了敘述簡單,用一個CRC-4編碼的例子來說明CRC的編碼過程。設(shè)待發(fā)送的數(shù)據(jù)t(x)為12位的二進制數(shù)據(jù);CRC-4的生成多項式為g(x)= ,階數(shù)r為4,即10011。首先在t(x)的末尾添加4個0構(gòu)成 ,數(shù)據(jù)塊
8、就成了。然后用g(x)去除 ,不用管商是多少,只需要求得余數(shù)y(x)。下表為給出了除法過程。除數(shù)次數(shù) 被除數(shù)/ g(x)/結(jié)果 余數(shù)從上面表中可以看出,CRC編碼實際上是一個循環(huán)移位的模2運算。對CRC-4,我們假設(shè)有一個5 bits的寄存器,通過反復(fù)的移位和進行CRC的除法,那么最終該寄存器中的值去掉最高一位就是我們所要求的余數(shù)。所以可以將上述步驟用下面的流程描述:/reg是一個5 bits的寄存器把reg中的值置0.把原始的數(shù)據(jù)后添加r個0.While (數(shù)據(jù)未處理完BeginIf (reg首位是1reg = reg XOR 0011.把reg中的值左移一位,讀入一個新的數(shù)據(jù)并置于regi
9、ster的0 bit的位置。Endreg的后四位就是我們所要求的余數(shù)。這種算法簡單,容易實現(xiàn),對任意長度生成多項式的G(x)都適用。在發(fā)送的數(shù)據(jù)不長的情況下可以使用。但是如果發(fā)送的數(shù)據(jù)塊很長的話,這種方法就不太適合了。它一次只能處理一位數(shù)據(jù),效率太低。為了提高處理效率,可以一次處理4位、8位、16位、32位。由于處理器的結(jié)構(gòu)基本上都支持8位數(shù)據(jù)的處理,所以一次處理8位比較合適。為了對優(yōu)化后的算法有一種直觀的了解,先將上面的算法換個角度理解一下。在上面例子中,可以將編碼過程看作如下過程:由于最后只需要余數(shù),所以我們只看后四位。構(gòu)造一個四位的寄存器reg,初值為0,數(shù)據(jù)依次移入reg0(reg的0
10、位),同時reg3的數(shù)據(jù)移出reg。有上面的算法可以知道,只有當移出的數(shù)據(jù)為1時,reg才和g(x)進行XOR運算;移出的數(shù)據(jù)為0時,reg不與g(x)進行XOR運算,相當與和0000進行XOR運算。就是說,reg和什么樣的數(shù)據(jù)進行XOR移出的數(shù)據(jù)決定。由于只有一個bit,所以有 種選擇。上述算法可以描述如下,/reg是一個4 bits的寄存器初始化t=0011,0000把reg中的值置0.把原始的數(shù)據(jù)后添加r個0.While (數(shù)據(jù)未處理完Begin把reg中的值左移一位,讀入一個新的數(shù)據(jù)并置于register的0 bit的位置。reg = reg XOR t移出的位End上面算法是以bit
11、為單位進行處理的,可以將上述算法擴展到8位,即以Byte為單位進行處理,即CRC-32。構(gòu)造一個四個Byte的寄存器reg,初值為0x00000000,數(shù)據(jù)依次移入reg0(reg的0字節(jié),以下類似),同時reg3的數(shù)據(jù)移出reg。用上面的算法類推可知,移出的數(shù)據(jù)字節(jié)決定reg和什么樣的數(shù)據(jù)進行XOR。由于有8個bit,所以有 種選擇。上述算法可以描述如下:/reg是一個4 Byte的寄存器初始化t/共有 256項把reg中的值置0.把原始的數(shù)據(jù)后添加r/8個0字節(jié).While (數(shù)據(jù)未處理完Begin把reg中的值左移一個字節(jié),讀入一個新的字節(jié)并置于reg的第0個byte的位置。reg =
12、reg XOR t移出的字節(jié)End算法的依據(jù)和多項式除法性質(zhì)有關(guān)。如果一個m位的多項式t(x)除以一個r階的生成多項式g(x), ,將每一位 (0= )提出來,在后面不足 r 個 0 后,單獨去除 g ( x ),得到的余式位 。則將 后得到的就是 t ( x )由生成多項式 g ( x )得到的余式。對于 CRC-32 ,可以將每個字節(jié)在后面補上 32 個 0 后與生成多項式進行運算,得到余式和此字節(jié)唯一對應(yīng),這個余式就是上面算法種 t 中的值,由于一個字節(jié)有 8 位,所以 t 共有 256 項。多項式運算性質(zhì)可以參見參考文獻 1 。這種算法每次處理一個字節(jié),通過查表法進行運算,大大提高了處
13、理速度,故為大多數(shù)應(yīng)用所采用。 明白了嗎? 3 、 CRC-32 的程序?qū)崿F(xiàn)。 為了提高編碼效率,在實際運用中大多采用查表法來完成 CRC-32 校驗,下面是產(chǎn)生 CRC-32 校驗嗎的子程序。 unsigned long crc_32_tab256= 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,0x0edb8832, , 0x5a05df1b, 0x2d02ef8d ;/ 事先計算出的參數(shù)表,共有 256 項,未全部列出。 unsigned lon
14、g GenerateCRC32(char xdata * DataBuf,unsigned long lenunsigned long oldcrc32;unsigned long crc32;unsigned long oldcrc;unsigned int charcnt;char c,t;oldcrc32 = 0x00000000; /初值為0charcnt=0;while (len- t= (oldcrc32 >> 24 & 0xFF; /要移出的字節(jié)的值oldcrc=crc_32_tabt; /根據(jù)移出的字節(jié)的值查表c=DataBufcharcnt; /新移進來的
15、字節(jié)值oldcrc32= (oldcrc32 << 8 | c; /將新移進來的字節(jié)值添在寄存器末字節(jié)中oldcrc32=oldcrc32oldcrc; /將寄存器與查出的值進行xor運算charcnt+;crc32=oldcrc32;return crc32;參數(shù)表可以先在PC機上算出來,也可在程序初始化時完成。下面是用于計算參數(shù)表的c語言子程序,在Visual C+ 6.0下編譯通過。#include ; unsigned long int crc32_table256;unsigned long int ulPolynomial = 0x04c11db7;unsigned l
16、ong int Reflect(unsigned long int ref, char ch unsigned long int value(0;/ 交換bit0和bit7,bit1和bit6,類推for(int i = 1; i < (ch + 1; i+ if(ref & 1value |= 1 << (ch - i;ref >>= 1; return value;init_crc32_table( unsigned long int crc,temp;/ 256個值for(int i = 0; i <= 0xFF; i+ temp=Reflect(i, 8;crc32_tablei= temp<< 24;for (int j = 0; j < 8; j+unsigned long int t1,t2;unsigned long int flag=crc32_tablei&0x80000000;t1=(cr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 礦石買賣運輸合同范本
- 危廢處置合同范本
- 醫(yī)院標識設(shè)計合同范本
- 農(nóng)村聯(lián)營合同范本
- 反恐安全運輸合同范例
- 上半年政務(wù)工作總結(jié)
- 危運司機合同范本
- 設(shè)備保養(yǎng)合同范本
- 合伙做母嬰店合同范本
- 產(chǎn)品批發(fā)代銷合同范本
- 2025年中央一號文件高頻重點考試題庫150題(含答案解析)
- 接觸隔離標準操作流程
- 世界給予我的 課件-2024-2025學年高二下學期開學第一課主題班會
- 港股基礎(chǔ)知識
- 2025年溫州市甌海旅游投資集團有限公司下屬子公司招聘筆試參考題庫附帶答案詳解
- 2025年天津三源電力集團有限公司招聘筆試參考題庫含答案解析
- 2025年上半年浙江嘉興桐鄉(xiāng)市水務(wù)集團限公司招聘10人易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年腹腔穿刺術(shù)課件 (1)2
- (八省聯(lián)考)2025年高考綜合改革適應(yīng)性演練 物理試卷合集(含答案逐題解析)
- 2025年度智能倉儲管理系統(tǒng)軟件開發(fā)合同6篇
- 2024版數(shù)據(jù)中心建設(shè)與運維服務(wù)合同協(xié)議書3篇
評論
0/150
提交評論