西門子plc的crc校驗(yàn)程序
德國西門子(SIEMENS)公司生產(chǎn)的可編程序控制器在我國的應(yīng)用也相當(dāng)廣泛,在冶金、化工、印刷生產(chǎn)線等領(lǐng)域都有應(yīng)用。西門子(SIEMENS)公司的PLC產(chǎn)品包括LOGO、S7-200、S7-1200、S7-300、S7-400等。 西門子S7系列PLC體積小、速度快、標(biāo)準(zhǔn)化,具有網(wǎng)絡(luò)通信能力,功能更強(qiáng),可靠性高。S7系列PLC產(chǎn)品可分為微型PLC(如S7-200),小規(guī)模性能要求的PLC(如S7-300)和中、高性能要求的PLC(如S7-400)等。
CRC校驗(yàn)RC即循環(huán)冗余校驗(yàn)碼(Cyclic Redundancy Check):是數(shù)據(jù)通信領(lǐng)域中最常用的一種查錯(cuò)校驗(yàn)碼,其特征是信息字段和校驗(yàn)字段的長(zhǎng)度可以任意選定。循環(huán)冗余檢查(CRC)是一種數(shù)據(jù)傳輸檢錯(cuò)功能,對(duì)數(shù)據(jù)進(jìn)行多項(xiàng)式計(jì)算,并將得到的結(jié)果附在幀的后面,接收設(shè)備也執(zhí)行類似的算法,以保證數(shù)據(jù)傳輸?shù)恼_性和完整性。
工作原理
循環(huán)冗余校驗(yàn)碼(CRC)的基本原理是:在K位信息碼后再拼接R位的校驗(yàn)碼,整個(gè)編碼長(zhǎng)度為N位,因此,這種編碼也叫(N,K)碼。對(duì)于一個(gè)給定的(N,K)碼,可以證明存在一個(gè)最高次冪為N-K=R的多項(xiàng)式G(x)。根據(jù)G(x)可以生成K位信息的校驗(yàn)碼,而G(x)叫做這個(gè)CRC碼的生成多項(xiàng)式。
校驗(yàn)碼的具體生成過程為:假設(shè)要發(fā)送的信息用多項(xiàng)式C(X)表示,將C(x)左移R位(可表示成C(x)*2R),這樣C(x)的右邊就會(huì)空出R位,這就是校驗(yàn)碼的位置。用 C(x)*2R 除以生成多項(xiàng)式G(x)得到的余數(shù)就是校驗(yàn)碼。任意一個(gè)由二進(jìn)制位串組成的代碼都可以和一個(gè)系數(shù)僅為‘0’和‘1’取值的多項(xiàng)式一一對(duì)應(yīng)。例如:代碼1010111對(duì)應(yīng)的多項(xiàng)式為x6+x4+x2+x+1,而多項(xiàng)式為x5+x3+x2+x+1對(duì)應(yīng)的代碼101111。
PLC的crc校驗(yàn)程序
方法1:計(jì)算法
主程序:OB1
Network 1
LD M0.0
EU
CALL SBR0, AC0 /
INCB VB0
INCB VB0
XMT 發(fā)送接收緩沖區(qū), 0
Network 2
LD M0.1
EU
CALL SBR0, AC0
AW《》 AC0, +0
MOVB 1, AC0
SBR_0:SBR0
VAR_OUTPUT
crc:INT;
END_VAR
VAR
count:INT;
ptr:DWORD;
END_VAR
BEGIN
Network 1
// MOVW AC0, *#ptr 用于發(fā)送,直接將CRC寫入發(fā)送緩沖區(qū),然后mmodbusBufr加2。
//
LD SM0.0
MOVW 16#FFFF, AC0
BTI VB0, LW2
MOVD &VB0, LD4
INCD LD4
FOR AC2, +1, LW2
XORB *LD4, AC0
FOR AC1, +1, +8
SRW AC0, 1
LD SM1.1
XORW 16#A001, AC0
NEXT
LD SM0.0
INCD LD4
NEXT
Network 2
// MOVW AC0, #crc 用于接收
// 如果程序無須接收,則可刪除這一行,刪除crc這個(gè)OUT參數(shù)。
//
//
//
// MOVW AC0, *#ptr 用于發(fā)送
// 直接將CRC寫入發(fā)送緩沖區(qū),然后mmodbusBufr加2。
// 如果程序無須發(fā)送,則可刪除這一行。
LD SM0.0
SWAP AC0
MOVW AC0, LW0
MOVW AC0, *LD4
Network 3 // 網(wǎng)絡(luò)標(biāo)題
// 網(wǎng)絡(luò)注釋
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=中斷程序注釋
BEGIN
Network 1 // 網(wǎng)絡(luò)標(biāo)題
// 網(wǎng)絡(luò)注釋
END_INTERRUPT_BLOCK
方法2:查表法
ORGANIZATION_BLOCK 主程序:OB1
TITLE=和方法1不同的是多了個(gè)初始化,簡(jiǎn)化了CRC計(jì)算過程,縮短了時(shí)間。
// 調(diào)用方法和方法1一樣
BEGIN
Network 1 // 網(wǎng)絡(luò)標(biāo)題
// 初始化CRC表,需要512個(gè)字節(jié)。VB2256---------VB2767
LD SM0.1
CALL SBR0
Network 2 // 網(wǎng)絡(luò)標(biāo)題
// 發(fā)送
LD M0.0
EU
CALL SBR1, AC0 //AC0在此無用
INCB VB2000
INCB VB2000
XMT 發(fā)送接收緩沖區(qū), 0
Network 3
// 接收完成后檢查接收的數(shù)據(jù)對(duì)錯(cuò),如果計(jì)算結(jié)果為0,則說明傳輸正確。
LD M0.1
EU
CALL SBR1, AC0
AW《》 AC0, +0
MOVB 1, AC0
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK SBR_0:SBR0
TITLE=子程序注釋
VAR
index1:INT;
index2:INT;
END_VAR
BEGIN
Network 1
LD SM0.0
MOVD &VB2256, AC3
MOVD +0, AC2
FOR LW0, +1, +256
MOVW AC2, AC0
FOR LW2, +1, +8
SRW AC0, 1
Network 2
LD SM1.1
XORW 16#A001, AC0
Network 3
NEXT
Network 4
LD SM0.0
MOVW AC0, *AC3
INCW AC2
+I +2, AC3
Network 5
NEXT
Network 6 // 網(wǎng)絡(luò)標(biāo)題
// 網(wǎng)絡(luò)注釋
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK SBR_1:SBR1
TITLE=子程序注釋
VAR_OUTPUT
crc:INT;
END_VAR
VAR
count:INT;
ptr:DWORD;
END_VAR
BEGIN
Network 1
LD SM0.0
BTI VB2000, LW2
MOVD &VB2000, LD4
INCD LD4
XORD AC0, AC0
MOVD 16#FFFF, AC2
FOR AC1, +1, LW2
MOVB *LD4, AC0
XORW AC2, AC0
ANDW 16#FF, AC0
SLW AC0, 1
MOVD &VB2256, AC3
+I AC0, AC3
SWAP AC2
ANDW 16#FF, AC2
XORW *AC3, AC2
INCD LD4
Network 2
NEXT
Network 3
LD SM0.0
SWAP AC2
MOVW AC2, LW0
MOVW AC2, *LD4
Network 4 // 網(wǎng)絡(luò)標(biāo)題
// 網(wǎng)絡(luò)注釋
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=中斷程序注釋
BEGIN
Network 1 // 網(wǎng)絡(luò)標(biāo)題
// 網(wǎng)絡(luò)注釋
END_INTERRUPT_BLOCK