永宏P(guān)LC自由通訊 CRC校驗(yàn)的生成
“自由通訊”的意思是:上位可以依據(jù)下位給出的協(xié)議,按照該協(xié)議對(duì)下位進(jìn)行存取操作。用在觸摸屏或者PLC上就是:通訊命令完全交由宏指令(對(duì)HMI而言)或者梯形圖(對(duì)PLC而言)來完成。
這里要舉的例子就是用永宏自由通訊(FUN151 MD1模式)實(shí)現(xiàn)對(duì)MODBUS_RTU通訊(MODBUS_RTU協(xié)議內(nèi)容網(wǎng)上可以下載)。我覺得RTU的比較難的在于CRC校驗(yàn)的實(shí)現(xiàn),當(dāng)然永宏本身是有 CRC16 指令的,這樣可以省去CRC生成算法,但在一些沒有CRC指令的PLC上面,就需要自己編寫了,這里來編寫CRC算法。
CRC算法說明,大概就是下面這幾個(gè)意思:
1.設(shè)置CRC寄存器,并給其賦值FFFF(hex)。
2.將數(shù)據(jù)的第一個(gè)8-bit字符與16位CRC寄存器的低8位進(jìn)行異或,并把結(jié)果存入CRC寄存器。
3.CRC寄存器向右移一位,MSB補(bǔ)零,移出并檢查LSB。
4.如果LSB為0,重復(fù)第三步;若LSB為1,CRC寄存器與多項(xiàng)式碼相異或。
5.重復(fù)第3與第4步直到8次移位全部完成。此時(shí)一個(gè)8-bit數(shù)據(jù)處理完畢。
6.重復(fù)第2至第5步直到所有數(shù)據(jù)全部處理完成,最終CRC寄存器的內(nèi)容即為CRC值。

舉例:對(duì) 02H 03H 07H D0H 00H 03H 這6個(gè)數(shù)據(jù)進(jìn)行CRC校驗(yàn)。我們可以事先用winproladder算出這6個(gè)數(shù)據(jù)的CRC校驗(yàn)值或者在通訊表格里面,拖動(dòng)選中需要進(jìn)行CRC校驗(yàn)的寄存器號(hào),也可以得出CRC值,如下圖

現(xiàn)在通過編程來計(jì)算CRC了,我把這個(gè)過程做成子程序,并且命名為 CRC,說明
1. R100=FFFFH(CRC寄存器),在CRC運(yùn)算前,事先被賦值;
2. V 指針,在CRC運(yùn)算前,先被清零;
3. 02H 03H 07H D0H 00H 03H 被放在 R6003 ~R6008 這6個(gè)寄存器內(nèi)。

再來看看主程序部分


通過監(jiān)視頁觀察 CRC結(jié)果

由于CRC校驗(yàn)結(jié)果是高低位對(duì)調(diào)的,這里把CRC累加器的值對(duì)應(yīng)存放到需要存儲(chǔ)CRC結(jié)果的寄存器就可以了。
永宏的B1/B1z系列PLC之前不能使用CRC16指令,所以之前的CRC結(jié)果比較麻煩,但現(xiàn)在winproladder V3.20里面,B1/B1z已經(jīng)支持該指令,并且也可以進(jìn)行浮點(diǎn)運(yùn)算了
這里要舉的例子就是用永宏自由通訊(FUN151 MD1模式)實(shí)現(xiàn)對(duì)MODBUS_RTU通訊(MODBUS_RTU協(xié)議內(nèi)容網(wǎng)上可以下載)。我覺得RTU的比較難的在于CRC校驗(yàn)的實(shí)現(xiàn),當(dāng)然永宏本身是有 CRC16 指令的,這樣可以省去CRC生成算法,但在一些沒有CRC指令的PLC上面,就需要自己編寫了,這里來編寫CRC算法。
CRC算法說明,大概就是下面這幾個(gè)意思:
1.設(shè)置CRC寄存器,并給其賦值FFFF(hex)。
2.將數(shù)據(jù)的第一個(gè)8-bit字符與16位CRC寄存器的低8位進(jìn)行異或,并把結(jié)果存入CRC寄存器。
3.CRC寄存器向右移一位,MSB補(bǔ)零,移出并檢查LSB。
4.如果LSB為0,重復(fù)第三步;若LSB為1,CRC寄存器與多項(xiàng)式碼相異或。
5.重復(fù)第3與第4步直到8次移位全部完成。此時(shí)一個(gè)8-bit數(shù)據(jù)處理完畢。
6.重復(fù)第2至第5步直到所有數(shù)據(jù)全部處理完成,最終CRC寄存器的內(nèi)容即為CRC值。

舉例:對(duì) 02H 03H 07H D0H 00H 03H 這6個(gè)數(shù)據(jù)進(jìn)行CRC校驗(yàn)。我們可以事先用winproladder算出這6個(gè)數(shù)據(jù)的CRC校驗(yàn)值或者在通訊表格里面,拖動(dòng)選中需要進(jìn)行CRC校驗(yàn)的寄存器號(hào),也可以得出CRC值,如下圖

現(xiàn)在通過編程來計(jì)算CRC了,我把這個(gè)過程做成子程序,并且命名為 CRC,說明
1. R100=FFFFH(CRC寄存器),在CRC運(yùn)算前,事先被賦值;
2. V 指針,在CRC運(yùn)算前,先被清零;
3. 02H 03H 07H D0H 00H 03H 被放在 R6003 ~R6008 這6個(gè)寄存器內(nèi)。

再來看看主程序部分


通過監(jiān)視頁觀察 CRC結(jié)果

由于CRC校驗(yàn)結(jié)果是高低位對(duì)調(diào)的,這里把CRC累加器的值對(duì)應(yīng)存放到需要存儲(chǔ)CRC結(jié)果的寄存器就可以了。
永宏的B1/B1z系列PLC之前不能使用CRC16指令,所以之前的CRC結(jié)果比較麻煩,但現(xiàn)在winproladder V3.20里面,B1/B1z已經(jīng)支持該指令,并且也可以進(jìn)行浮點(diǎn)運(yùn)算了
本文標(biāo)簽:永宏P(guān)LC自由通訊 CRC校驗(yàn)的生成
* 由于無法獲得聯(lián)系方式等原因,本網(wǎng)使用的文字及圖片的作品報(bào)酬未能及時(shí)支付,在此深表歉意,請(qǐng)《永宏P(guān)LC自由通訊 CRC校驗(yàn)的生成》相關(guān)權(quán)利人與機(jī)電之家網(wǎng)取得聯(lián)系。
關(guān)于“永宏P(guān)LC自由通訊 CRC校驗(yàn)的生成”的更多資訊










