【玩轉(zhuǎn)485】15.crc效驗1【連載15】
林慧玲
發(fā)布于2015-02-15 11:33
2226
0
標(biāo)簽:通訊
寫了這么多了終于寫到了校驗可能大部分人都覺得校驗是整個通訊過程中復(fù)雜的一個環(huán)節(jié)。下面我就系統(tǒng)的給大家來介紹一下校驗的整個過程。
1 .什么是校驗 要搞懂校驗的整個過程我們先來看看到底什么是校驗,可能在我之前的文章中大家也發(fā)現(xiàn)了我所寫過的程序沒有一個和校驗有關(guān)系,站點與站點之間數(shù)據(jù)的傳遞都是直接進(jìn)行收發(fā),而且也沒有出現(xiàn)過任何問題,既然不寫校驗程序也能正常運行,那校驗在我們的整個通訊過程中到底起著什么樣的作用呢?
其實這里可能大家忽略了一個問題,我之前文章中所寫的程序都是在實驗環(huán)境中運行的,電腦與PLC之間的距離不超過2米,周圍也沒有會產(chǎn)生電磁干擾的用電設(shè)備,在這樣理想的環(huán)境中,數(shù)據(jù)在傳輸過程中肯定不會發(fā)生任何變化,所以寫不寫校驗程序都無所謂,但是在我們的工業(yè)現(xiàn)場環(huán)境就非常復(fù)雜甚至惡劣了,數(shù)據(jù)在傳輸過程中很可能由于外部復(fù)雜的環(huán)境發(fā)生變化,甚至是丟失,那么接收到的數(shù)據(jù)就不是對方發(fā)出的數(shù)據(jù)了,報文的內(nèi)容就發(fā)生了變化,如果變化后的報文沒有任何指令含義還好說,一旦變化后的報文的含義發(fā)生轉(zhuǎn)變,比如本來主站發(fā)出的報文是控制A設(shè)備的,但是由于現(xiàn)場的干擾報文變成了控制B設(shè)備,那么就會在控制過程中出現(xiàn)誤操作,這種情況雖然概率極低但是非常危險。因此我們需要對所有傳輸?shù)臄?shù)據(jù)進(jìn)行校驗以判斷接收到的數(shù)據(jù)是否和對方發(fā)送的數(shù)據(jù)是一致的。
2. crc校驗 下面我就向大家介紹一種工業(yè)控制中非常常用的一種校驗算法crc校驗,首先我用文字向大家描述一下crc校驗算法的整個流程。
1) 向一個16位寄存器A裝載16個1也就是16#FFFF
2) 取被校驗串的個字節(jié)與16位寄存器A的高位字節(jié)進(jìn)行“異或”運算,運算結(jié)果存回寄存器A。
3) 把寄存器A內(nèi)的數(shù)據(jù)向右移動一位。
4) 若A寄存器中被移出的數(shù)是1,則用1010 0000 0000 0001(16#A001)和寄存器A進(jìn)行”異或運算”,若寄存器中被移出的數(shù)是0則返回步驟3)
5) 重復(fù)步驟3)和4),直到移出8位數(shù)據(jù)為止。
6) 取被校驗串的下一個字節(jié)
7) 重復(fù)步驟3)至6)直至被校驗串所有字節(jié)均與寄存器A進(jìn)行“異或”運算,并移位8次。
8) 終A寄存器中的數(shù)值就是crc校驗結(jié)果。
3. 程序編寫 此處我先在S7-200PLC中給大家把上面的漢字版校驗過程翻譯成具體的程序,至于具體在整個通訊的過程中如何使用我們下一篇文章再具體討論。
圖 3-1主程序
圖 3-1
圖 3-2子程序接口與本地數(shù)據(jù)定義
圖 3-2
圖 3-3
4 程序演示 這里我們可以將PLC的計算結(jié)果,與專門計算crc的軟件算出的數(shù)值進(jìn)行比較。
圖 4-1
圖 4-2
由圖 4-1和圖 4-2我們可以看出PLC計算出的結(jié)果沒有任何錯誤,當(dāng)然大家也可以自己去實驗更多的數(shù)值來對本程序進(jìn)行驗證。
作者:馬樂
版權(quán)為技成所有,未經(jīng)同意,盜取必究!