黎欽銀,文 超
(1.壹倍科技(東莞)有限公司,廣東 東莞 523077;2.廣東力源工程技術(shù)有限公司,廣東 東莞 523077)
Modbus 通信協(xié)議是當(dāng)前工業(yè)領(lǐng)域常用的通信協(xié)議,工業(yè)現(xiàn)場設(shè)備的通信線路經(jīng)常會采用雙絞屏蔽線將設(shè)備的RS 485 接口并聯(lián)起來,并通過ModBusRTU 協(xié)議進(jìn)行主從設(shè)備間的通信[1-5],如圖1所示。這種總線通信架構(gòu)具有敷設(shè)簡單、通信穩(wěn)定和通信距離較遠(yuǎn)的優(yōu)點。在標(biāo)準(zhǔn)ModBusRTU協(xié)議的鏈路中,僅有一個主設(shè)備能采集多個從設(shè)備的數(shù)據(jù),但是隨著工業(yè)物聯(lián)網(wǎng)的發(fā)展,經(jīng)常會出現(xiàn)多個主設(shè)備需要同時采集多個從設(shè)備的數(shù)據(jù)的情況[6-9]。針對這個問題,本文通過單片機的串口接入RS 485 總線,對主通信鏈路中從設(shè)備的數(shù)據(jù)進(jìn)行復(fù)制、映射、轉(zhuǎn)發(fā),從而實現(xiàn)多個主設(shè)備同時采集一個從設(shè)備數(shù)據(jù)的目的。
圖1 RS 485 總線通信網(wǎng)絡(luò)
選用的單片機至少應(yīng)帶有兩個硬件串口,為了描述方便,下面簡稱為串口1 和串口2。串口1 并入到主網(wǎng)絡(luò)中,該串口只對主網(wǎng)絡(luò)的數(shù)據(jù)進(jìn)行收集而不返回。串口2 作為從設(shè)備,用于數(shù)據(jù)轉(zhuǎn)發(fā),提供給另一個主設(shè)備采集數(shù)據(jù)。從設(shè)備數(shù)據(jù)映射網(wǎng)絡(luò)結(jié)構(gòu)如圖2所示。
圖2 從設(shè)備數(shù)據(jù)映射網(wǎng)絡(luò)結(jié)構(gòu)
在原有RS 485 總線網(wǎng)絡(luò)中,主設(shè)備1 對從設(shè)備1 進(jìn)行數(shù)據(jù)采集時,由于RS 485 總線的特性,總線上的所有設(shè)備都能收到主設(shè)備1 的請求幀和從設(shè)備1 的應(yīng)答幀,所以從設(shè)備1 的數(shù)據(jù)映射單片機的串口1,能監(jiān)聽RS 485 總線上從設(shè)備1 的應(yīng)答幀。單片機將應(yīng)答幀信息分析處理后保存到單片機中,并由單片機的串口2 進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā),接入新增的RS 485 總線,供其他主設(shè)備采集。
單片機利用串口1 識別出需要的數(shù)據(jù),使用串口2 提供標(biāo)準(zhǔn)的ModBusRTU Server 功能。對于串口2 的功能,比較常規(guī),具體參考ModBusRTU 標(biāo)準(zhǔn)通信協(xié)議進(jìn)行編程即可實現(xiàn)。因此重點是串口1 如何準(zhǔn)確識別出原有RS 485 總線中從設(shè)備的數(shù)據(jù),再通過串口2 映射及轉(zhuǎn)發(fā)數(shù)據(jù)。單片機運行主流程如圖3所示。
圖3 單片機運行主流程
為了準(zhǔn)確識別數(shù)據(jù),單片機需要利用ModBusRTU 協(xié)議中數(shù)據(jù)幀的特征值對串口1 收到的數(shù)據(jù)幀進(jìn)行甄別。數(shù)據(jù)幀的特征值有:設(shè)備的ModBus 地址、數(shù)據(jù)的ModBus 功能區(qū)、數(shù)據(jù)的寄存器地址、數(shù)據(jù)的類型(整型、浮點型等)。通過這些特征值,就能判斷從原有RS 485 總線接收的數(shù)據(jù)是否為主設(shè)備2 需要的正確數(shù)據(jù)。如圖4所示為ModBusRTU 通信協(xié)議的數(shù)據(jù)格式[10]。
圖4 ModBusRTU 通信協(xié)議的數(shù)據(jù)格式
因為RS 485 總線采用半雙工工作方式,所以單片機的串口1 采集到的數(shù)據(jù)幀有可能是主機的請求幀,也有可能是從設(shè)備的應(yīng)答幀。如何判斷當(dāng)前的數(shù)據(jù)幀是請求幀還是應(yīng)答幀,可以先假設(shè)一種情況:串口1 收到一個數(shù)據(jù)幀,數(shù)據(jù)為“01 01 18 00 00 01 FB 6A”。對于該數(shù)據(jù)幀,會存在表1和表2中所列兩種情況。
表1 主站請求幀的情況
表2 從站應(yīng)答幀的情況
從表1和表2可以看到,單純靠一個數(shù)據(jù)幀是無法辨別該數(shù)據(jù)幀是請求幀還是應(yīng)答幀的。通過ModBusRTU 協(xié)議的通信過程可以知道,總是主機先發(fā)出請求幀,然后從機再發(fā)出應(yīng)答幀,而請求幀和應(yīng)答幀有對應(yīng)關(guān)系,比如設(shè)備地址碼相同、功能碼相同、請求的寄存器數(shù)量和應(yīng)答的數(shù)據(jù)字節(jié)數(shù)量吻合等,所以單片機需要緩存兩個數(shù)據(jù)幀,如圖5所示。
圖5 數(shù)據(jù)幀處理
單片機內(nèi)部的數(shù)據(jù)幀處理采用了線性隊列的數(shù)據(jù)結(jié)構(gòu),新數(shù)據(jù)幀入列,內(nèi)部緩存的數(shù)據(jù)幀進(jìn)行移動,舊的數(shù)據(jù)幀出列并丟棄。從單片機的視角而言,數(shù)據(jù)幀緩存2 存放的是主機的請求幀,數(shù)據(jù)幀緩存1 存放的是從機的應(yīng)答幀,請求幀和應(yīng)答幀需要滿足相同的設(shè)備地址碼、相同的功能碼、請求幀寄存器數(shù)量和應(yīng)答幀數(shù)據(jù)字節(jié)數(shù)量能對應(yīng)上、請求幀和應(yīng)答幀的CRC(Cyclic Redundancy Check)校驗碼都能校驗通過等條件,就可以認(rèn)為該請求幀和應(yīng)答幀是有效的。得到有效的請求幀和應(yīng)答幀后,再根據(jù)用戶設(shè)定的需求數(shù)據(jù)的特征值進(jìn)一步判斷該數(shù)據(jù)幀是否有需求的數(shù)據(jù),程序判斷流程如圖6所示。
圖6 用戶需求數(shù)據(jù)特征判斷流程
利用單片機的串口1 接入原有RS 485 總線中監(jiān)聽數(shù)據(jù)幀,獲取從設(shè)備的數(shù)據(jù),顯著優(yōu)勢是對原來的總線網(wǎng)絡(luò)和控制系統(tǒng)沒有影響。在實際應(yīng)用中,該設(shè)計方案可以在不動原有系統(tǒng)的前提下搭建新的系統(tǒng)。同時對該設(shè)計方案靈活運用可以衍生出多種架構(gòu),如除圖2的總線方式連接外,還可以按圖7的總線方式連接,對從設(shè)備1 進(jìn)行了兩次復(fù)制、映射和轉(zhuǎn)發(fā),實現(xiàn)多主設(shè)備采集同一從設(shè)備,并且各個系統(tǒng)可以做到相互獨立、互不相關(guān)。
圖7 多主設(shè)備采集同一從設(shè)備
當(dāng)然該方法也存在不足,比如主設(shè)備1 不發(fā)送請求幀,單片機的串口1 將不會有數(shù)據(jù)幀,從而導(dǎo)致從設(shè)備的數(shù)據(jù)不能轉(zhuǎn)發(fā)給其他主設(shè)備。另外,單片機的串口1 獲取從設(shè)備的數(shù)據(jù)幀數(shù)跟主設(shè)備1 請求數(shù)據(jù)頻率有關(guān),如果主設(shè)備1 請求頻率慢,那么單片機更新從設(shè)備的數(shù)據(jù)就慢。因此對數(shù)據(jù)的實時性要求比較高的場合,不適合采用該方法。
利用單片機的一個串口接入原有RS 485 總線,用于接收數(shù)據(jù)幀,然后對所需從設(shè)備的應(yīng)答幀進(jìn)行分析、處理并映射到單片機的內(nèi)存中,最后通過單片機的另外一個串口,采用ModBusRTU 協(xié)議把數(shù)據(jù)轉(zhuǎn)發(fā)出來,供其他主設(shè)備讀取。該設(shè)計拓展性好、數(shù)據(jù)采集穩(wěn)定、性價比高。對于從設(shè)備的RS 485 通信接口被占的情況,可參考該設(shè)計方案。