黎欽銀,文 超
(1.壹倍科技(東莞)有限公司,廣東 東莞 523077;2.廣東力源工程技術有限公司,廣東 東莞 523077)
Modbus 通信協議是當前工業領域常用的通信協議,工業現場設備的通信線路經常會采用雙絞屏蔽線將設備的RS 485 接口并聯起來,并通過ModBusRTU 協議進行主從設備間的通信[1-5],如圖1所示。這種總線通信架構具有敷設簡單、通信穩定和通信距離較遠的優點。在標準ModBusRTU協議的鏈路中,僅有一個主設備能采集多個從設備的數據,但是隨著工業物聯網的發展,經常會出現多個主設備需要同時采集多個從設備的數據的情況[6-9]。針對這個問題,本文通過單片機的串口接入RS 485 總線,對主通信鏈路中從設備的數據進行復制、映射、轉發,從而實現多個主設備同時采集一個從設備數據的目的。

圖1 RS 485 總線通信網絡
選用的單片機至少應帶有兩個硬件串口,為了描述方便,下面簡稱為串口1 和串口2。串口1 并入到主網絡中,該串口只對主網絡的數據進行收集而不返回。串口2 作為從設備,用于數據轉發,提供給另一個主設備采集數據。從設備數據映射網絡結構如圖2所示。

圖2 從設備數據映射網絡結構
在原有RS 485 總線網絡中,主設備1 對從設備1 進行數據采集時,由于RS 485 總線的特性,總線上的所有設備都能收到主設備1 的請求幀和從設備1 的應答幀,所以從設備1 的數據映射單片機的串口1,能監聽RS 485 總線上從設備1 的應答幀。單片機將應答幀信息分析處理后保存到單片機中,并由單片機的串口2 進行數據轉發,接入新增的RS 485 總線,供其他主設備采集。
單片機利用串口1 識別出需要的數據,使用串口2 提供標準的ModBusRTU Server 功能。對于串口2 的功能,比較常規,具體參考ModBusRTU 標準通信協議進行編程即可實現。因此重點是串口1 如何準確識別出原有RS 485 總線中從設備的數據,再通過串口2 映射及轉發數據。單片機運行主流程如圖3所示。

圖3 單片機運行主流程
為了準確識別數據,單片機需要利用ModBusRTU 協議中數據幀的特征值對串口1 收到的數據幀進行甄別。數據幀的特征值有:設備的ModBus 地址、數據的ModBus 功能區、數據的寄存器地址、數據的類型(整型、浮點型等)。通過這些特征值,就能判斷從原有RS 485 總線接收的數據是否為主設備2 需要的正確數據。如圖4所示為ModBusRTU 通信協議的數據格式[10]。

圖4 ModBusRTU 通信協議的數據格式
因為RS 485 總線采用半雙工工作方式,所以單片機的串口1 采集到的數據幀有可能是主機的請求幀,也有可能是從設備的應答幀。如何判斷當前的數據幀是請求幀還是應答幀,可以先假設一種情況:串口1 收到一個數據幀,數據為“01 01 18 00 00 01 FB 6A”。對于該數據幀,會存在表1和表2中所列兩種情況。

表1 主站請求幀的情況

表2 從站應答幀的情況
從表1和表2可以看到,單純靠一個數據幀是無法辨別該數據幀是請求幀還是應答幀的。通過ModBusRTU 協議的通信過程可以知道,總是主機先發出請求幀,然后從機再發出應答幀,而請求幀和應答幀有對應關系,比如設備地址碼相同、功能碼相同、請求的寄存器數量和應答的數據字節數量吻合等,所以單片機需要緩存兩個數據幀,如圖5所示。

圖5 數據幀處理
單片機內部的數據幀處理采用了線性隊列的數據結構,新數據幀入列,內部緩存的數據幀進行移動,舊的數據幀出列并丟棄。從單片機的視角而言,數據幀緩存2 存放的是主機的請求幀,數據幀緩存1 存放的是從機的應答幀,請求幀和應答幀需要滿足相同的設備地址碼、相同的功能碼、請求幀寄存器數量和應答幀數據字節數量能對應上、請求幀和應答幀的CRC(Cyclic Redundancy Check)校驗碼都能校驗通過等條件,就可以認為該請求幀和應答幀是有效的。得到有效的請求幀和應答幀后,再根據用戶設定的需求數據的特征值進一步判斷該數據幀是否有需求的數據,程序判斷流程如圖6所示。

圖6 用戶需求數據特征判斷流程
利用單片機的串口1 接入原有RS 485 總線中監聽數據幀,獲取從設備的數據,顯著優勢是對原來的總線網絡和控制系統沒有影響。在實際應用中,該設計方案可以在不動原有系統的前提下搭建新的系統。同時對該設計方案靈活運用可以衍生出多種架構,如除圖2的總線方式連接外,還可以按圖7的總線方式連接,對從設備1 進行了兩次復制、映射和轉發,實現多主設備采集同一從設備,并且各個系統可以做到相互獨立、互不相關。

圖7 多主設備采集同一從設備
當然該方法也存在不足,比如主設備1 不發送請求幀,單片機的串口1 將不會有數據幀,從而導致從設備的數據不能轉發給其他主設備。另外,單片機的串口1 獲取從設備的數據幀數跟主設備1 請求數據頻率有關,如果主設備1 請求頻率慢,那么單片機更新從設備的數據就慢。因此對數據的實時性要求比較高的場合,不適合采用該方法。
利用單片機的一個串口接入原有RS 485 總線,用于接收數據幀,然后對所需從設備的應答幀進行分析、處理并映射到單片機的內存中,最后通過單片機的另外一個串口,采用ModBusRTU 協議把數據轉發出來,供其他主設備讀取。該設計拓展性好、數據采集穩定、性價比高。對于從設備的RS 485 通信接口被占的情況,可參考該設計方案。