基于PLC的Modbus通信協(xié)議的實(shí)現(xiàn)
考慮到操作的方便性, 在系統(tǒng)初次安裝時(shí), 先在PC 機(jī)上用上位機(jī)軟件將所有傳感器的ID 搜索出來(lái), 然后按實(shí)際安裝位置給每個(gè)傳感器編號(hào), 讀溫度測(cè)試傳感器是否工作正常。在PLC 上使用Mo dbus協(xié)議通信時(shí)首先要對(duì)通信格式進(jìn)行設(shè)定, 即對(duì)D8120 寄存器進(jìn)行寫(xiě)操作, 在本系統(tǒng)條件下設(shè)置為0C87 , 即數(shù)據(jù)長(zhǎng)度為8 位, 無(wú)校驗(yàn), 無(wú)起始位與停止位, 波特率9 600 bps。 修改D8120 設(shè)置后, 確保通斷PLC 電源一次。 再用RS 指令進(jìn)行數(shù)據(jù)的傳輸, 相關(guān)程序格式如圖4 所示。
圖4 RS 指令程序格式
按照上述程序格式, 即可在數(shù)據(jù)發(fā)送區(qū)寫(xiě)入指令進(jìn)行相應(yīng)的操作。
1) 讀取溫度, 其指令格式: [ 設(shè)備地址] [ 命令號(hào)] [ 通道號(hào)] [ 傳感器編號(hào)] [ 讀取個(gè)數(shù)高8 位] [ 低8位] [ CRC 低8 位] [ CRC 高8 位] , 其中CRC 校驗(yàn)字節(jié)以子程序形式調(diào)用. 設(shè)備響應(yīng): [ 設(shè)備地址] [ 命令號(hào)] [ 返回的字節(jié)個(gè)數(shù)] [ 數(shù)據(jù)1] [ 數(shù)據(jù)2] . . . [ 數(shù)據(jù)n] [ CRC 低8 位] [ CRC 高8 位] 。
每個(gè)18b20 讀取溫度的返回值占用兩個(gè)字節(jié).
轉(zhuǎn)換方法: 將實(shí)際溫度擴(kuò)大100 倍, 再將此數(shù)值分為兩個(gè)字節(jié)傳送出來(lái)即可. 例如, 實(shí)測(cè)出來(lái)溫度是28.65℃ , 擴(kuò)大100 倍即2 865, 則發(fā)送的第一個(gè)字節(jié)是2 865/ 256 即是11, 第二個(gè)字節(jié)是2 865% 256 即49, 那么傳送的兩個(gè)字節(jié)為0×0B 和0×31。
需要注意的是, 由于采用兩線(xiàn)制的485 連線(xiàn)方式, 會(huì)產(chǎn)生回波通信, 即接收端會(huì)先接收到自己發(fā)送出去的數(shù)據(jù), 但數(shù)據(jù)還是會(huì)正常發(fā)送給采集模塊, 此時(shí)接收端則應(yīng)該避開(kāi)前面的無(wú)用數(shù)據(jù), 接收后面模塊響應(yīng)的有效數(shù)據(jù)。
2) 在系統(tǒng)運(yùn)行后, 若需更換傳感器, 則需執(zhí)行以下兩條指令, 首先, 搜索ID, [ 01] [ 06] [ 0c] [ 00][ 00] [ 00] [ CRC 低] [ CRC 高] , 此指令為搜索模塊1上各個(gè)通道的所有傳感器。 然后寫(xiě)編號(hào), 例如: [ 01][ 06] [ 09] [ 05] [ 00] [ 05] [ CRC 低] [ CRC 高] , 表示將第9 通道的原來(lái)編號(hào)為05 的傳感器更換后重新設(shè)定為05, 執(zhí)行此兩條指令后, 方可重新讀取溫度。
3) CRC 校驗(yàn)字節(jié)的生成是比較關(guān)鍵的一步,其過(guò)程比較復(fù)雜, 步驟如下:
?、兕A(yù)置一個(gè)16 位CRC 寄存器為十六進(jìn)制FFFF, 即所有數(shù)位均為1。
②該16 位寄存器的低8 位字節(jié)與信息幀的第一個(gè)字節(jié)的低8 位進(jìn)行 異或?運(yùn)算. 運(yùn)算結(jié)果放入這個(gè)16 位寄存器。
③ 把這個(gè)16 寄存器向右移一位, 用0 填補(bǔ)高位。
?、苋粝蛴? 標(biāo)記位) 移出的數(shù)位是1, 則生成多項(xiàng)式A001( 1010000000000001) 和這個(gè)寄存器進(jìn)行“異或”運(yùn)算; 若向右移出的數(shù)位是0, 則返回③。
?、葜貜?fù)③ 和④, 直至移出8 位。
?、拗貜?fù)③ ~⑤, 直至該報(bào)文所有字節(jié)均與16 位寄存器進(jìn)行 異或?運(yùn)算, 并移位8 次。
?、邔⒌玫降膌6 位CRC 寄存器的高、低位字節(jié)進(jìn)行, 即2 字節(jié)CRC, 加到報(bào)文。
其程序流程如圖5, 以上面的溫度讀取指令為例, 其CRC 校驗(yàn)梯形圖如圖6。
圖5 CRC 校驗(yàn)流程
圖6 CRC 校驗(yàn)程序
在讀取溫度時(shí), 應(yīng)嚴(yán)格遵守DS18b20 的讀寫(xiě)時(shí)序, 否則就會(huì)出現(xiàn)錯(cuò)誤, 丟幀等, 若用脈沖信號(hào)定時(shí)讀取, 則間隔應(yīng)不小于100 ms. 一般出現(xiàn)錯(cuò)誤幀時(shí)數(shù)據(jù)顯示為0℃, 此時(shí)可以進(jìn)行簡(jiǎn)單的濾波, 例如傳回值為0 時(shí)不顯示數(shù)據(jù), 或者多組數(shù)據(jù)取平均值后再顯示, 以避免溫度顯示的大幅度跳動(dòng)。 DS18b20的初始化溫度顯示為85℃, 若一直不變, 則此傳感器可能已經(jīng)損壞或是接線(xiàn)不良, 應(yīng)進(jìn)行相應(yīng)的檢查。
4 結(jié)束語(yǔ)
該系統(tǒng)應(yīng)用于生產(chǎn)過(guò)程實(shí)時(shí)監(jiān)控中, PLC 既作為現(xiàn)場(chǎng)控制機(jī)完成對(duì)生產(chǎn)過(guò)程的自動(dòng)控制, 又作為主從通信的主機(jī), 與相關(guān)儀表連接, 實(shí)現(xiàn)與基于Modbus 現(xiàn)場(chǎng)總線(xiàn)協(xié)議的DS18b20 型數(shù)字溫度傳感器的采集模塊的主從通信, 并通過(guò)PLC 高速實(shí)時(shí)網(wǎng)絡(luò)實(shí)現(xiàn)對(duì)其的遠(yuǎn)程監(jiān)控。 該系統(tǒng)目前處于試運(yùn)行階段, 表現(xiàn)較為穩(wěn)定, 通信可靠, 效果良好。
通信相關(guān)文章:通信原理
評(píng)論