卞志國,湯東陽,曹棟
(1.南京工業(yè)職業(yè)技術(shù)大學(xué)計(jì)算機(jī)與軟件學(xué)院,江蘇 南京 210023;2.江蘇省工業(yè)軟件工程技術(shù)研究開發(fā)中心,江蘇南京 210023)
在工業(yè)生產(chǎn)領(lǐng)域,由于自動(dòng)化設(shè)備廠商和相關(guān)國際標(biāo)準(zhǔn)化組織的不妥協(xié),導(dǎo)致了現(xiàn)場總線和工業(yè)以太網(wǎng)均出現(xiàn)了多種標(biāo)準(zhǔn)共存的局面,標(biāo)準(zhǔn)之間互不兼容,導(dǎo)致不同的工控協(xié)議使用不同的實(shí)現(xiàn)方法,數(shù)據(jù)組織方式、語義表示也不盡相同[1-2]。針對當(dāng)前工業(yè)互聯(lián)網(wǎng)邊緣計(jì)算基礎(chǔ)網(wǎng)關(guān)與軟件平臺多協(xié)議交互形式存在普適性低、缺乏自適應(yīng)能力等問題[3-7],本文研究并開發(fā)在工業(yè)互聯(lián)網(wǎng)邊緣計(jì)算場景下,多種工控協(xié)議的自適應(yīng)協(xié)議交互模型,解決具有有限聯(lián)網(wǎng)能力的設(shè)備之間進(jìn)行數(shù)據(jù)交互過程中存在的瓶頸問題,從而實(shí)現(xiàn)該類設(shè)備之間通過協(xié)議轉(zhuǎn)換進(jìn)行數(shù)據(jù)交互。
本文設(shè)計(jì)了一種滿足讀、寫、訂閱/發(fā)布、設(shè)備狀態(tài)查詢等功能的普適性數(shù)據(jù)交互語義模型,并利用Golang語言實(shí)現(xiàn)跨平臺的交互數(shù)據(jù)協(xié)議轉(zhuǎn)換服務(wù)。該服務(wù)北向與標(biāo)準(zhǔn)化協(xié)議客戶端通過HTTP 協(xié)議進(jìn)行交互,負(fù)責(zé)將獲取的標(biāo)準(zhǔn)化協(xié)議數(shù)據(jù)轉(zhuǎn)換為普適性數(shù)據(jù)交互語義模型,南向與非標(biāo)準(zhǔn)化協(xié)議的智能設(shè)備或邊緣云平臺進(jìn)行交互,將獲取的非標(biāo)準(zhǔn)化協(xié)議數(shù)據(jù)(如智能傳感器、無線設(shè)備、智能工業(yè)云平臺)轉(zhuǎn)換為普適性數(shù)據(jù)交互語義模型,從而為客戶端提供統(tǒng)一的數(shù)據(jù)輸入/輸出協(xié)議,系統(tǒng)總體架構(gòu)如圖1 所示。
圖1 跨平臺交互數(shù)據(jù)協(xié)議轉(zhuǎn)換服務(wù)數(shù)據(jù)流
協(xié)議轉(zhuǎn)換網(wǎng)關(guān)實(shí)現(xiàn)了web 服務(wù)功能,向客戶端提供RESTful 風(fēng)格的API 接口,客戶端通過向協(xié)議轉(zhuǎn)換網(wǎng)關(guān)請求數(shù)據(jù),從而實(shí)現(xiàn)設(shè)備數(shù)據(jù)的讀、寫、訂閱/發(fā)布。協(xié)議轉(zhuǎn)換網(wǎng)關(guān)接收到客戶端發(fā)送的請求后,通過查詢其管理的設(shè)備資源模型,進(jìn)行相應(yīng)的操作,并向客戶端返回響應(yīng)。
(1)資源模型文件 本文采用統(tǒng)一的設(shè)備資源模型描述文件定義終端設(shè)備的數(shù)據(jù)資源,支持JSON 和TOML兩種文件格式。以Modbus 設(shè)備為例,其中Name 定義了設(shè)備的名稱,DebiceId 定義設(shè)備的ID 號,對于連接到該網(wǎng)關(guān)的設(shè)備而言,該ID 號應(yīng)該是唯一的,Protocol 定義了設(shè)備支持的工業(yè)協(xié)議,本文采用動(dòng)態(tài)加載的方式,支持Modbus、OPC UA、MQTT 三種協(xié)議。BaseInfo 給出了該設(shè)備所特有的信息,如Modbus 設(shè)備要求給出設(shè)備IP、設(shè)備端口號、從設(shè)備號、寄存器節(jié)點(diǎn)信息,其中寄存器節(jié)點(diǎn)信息表Nodes 定義了該設(shè)備所有可訪問寄存器數(shù)據(jù)的信息,包括地址、數(shù)據(jù)類型、數(shù)據(jù)長度,BaseInfo 部分根據(jù)設(shè)備協(xié)議的不同定義相應(yīng)的字段。
(2)插件式協(xié)議轉(zhuǎn)換模塊 本文采用插件模塊實(shí)現(xiàn)非標(biāo)準(zhǔn)工業(yè)協(xié)議的轉(zhuǎn)換,開發(fā)了OPC UA、Modbus、MQTT 三種常用協(xié)議轉(zhuǎn)換模塊。
本文采用Golang 作為系統(tǒng)開發(fā)工具,作為編譯型的開發(fā)語言,Golang 本身并不支持通過源代碼實(shí)現(xiàn)動(dòng)態(tài)加載和更新。但Golang 官方提供了Plugin 技術(shù),實(shí)現(xiàn)動(dòng)態(tài)加載。即通過動(dòng)態(tài)共享對象封裝操作系統(tǒng)底層接口,對外提供統(tǒng)一的調(diào)用接口,以供上層應(yīng)用程序調(diào)用,相當(dāng)于提供了一層兼容層。
首先定義插件模塊基類,在此基類的基礎(chǔ)上,派生出對應(yīng)協(xié)議轉(zhuǎn)換模塊,插件模塊關(guān)系如圖2 所示。
圖2 插件模塊關(guān)系
在插件模塊基類中,定義了設(shè)備的基礎(chǔ)信息,如設(shè)備名稱、ID 號、是否在線等,定義了共性操作方法,如初始化模塊,斷開連接,處理WebSocket 請求,處理HTTP 請求等。非標(biāo)準(zhǔn)協(xié)議轉(zhuǎn)換插件均派生于該基類,并根據(jù)非標(biāo)準(zhǔn)協(xié)議的具體操作規(guī)程,增加協(xié)議特有的操作,改寫基類中相應(yīng)的函數(shù)等。
其次,在轉(zhuǎn)換軟件啟動(dòng)時(shí),掃描插件模塊文件夾,依次加載對應(yīng)的插件模塊,協(xié)議轉(zhuǎn)換軟件服務(wù)的總活動(dòng)流程如圖3 所示。
圖3 協(xié)議轉(zhuǎn)換軟件服務(wù)的總活動(dòng)流程
協(xié)議轉(zhuǎn)換軟件服務(wù)有兩部分組成,一是協(xié)議轉(zhuǎn)換軟件網(wǎng)關(guān)主線程,二是掛載在該服務(wù)器的虛擬設(shè)備線程。
軟件主線程啟動(dòng)后,首先加載協(xié)議轉(zhuǎn)換插件,獲取該服務(wù)支持的非標(biāo)準(zhǔn)協(xié)議類型;然后從配置文件加載設(shè)備資源模型,構(gòu)建虛擬設(shè)備;最后啟動(dòng)web 服務(wù),等待客戶端請求。服務(wù)端接收到客戶端請求后,首先解析請求數(shù)據(jù),將對應(yīng)的請求分配到對應(yīng)的虛擬設(shè)備,如果對應(yīng)的虛擬設(shè)備不存在,則直接返回錯(cuò)誤信息,否則將對應(yīng)的服務(wù)請求轉(zhuǎn)發(fā)至對應(yīng)的虛擬設(shè)備線程;接著,虛擬設(shè)備線程將基于普適協(xié)議的請求數(shù)據(jù)轉(zhuǎn)換為對應(yīng)的設(shè)備協(xié)議數(shù)據(jù),對相應(yīng)的設(shè)備進(jìn)行讀、寫、訂閱等操作,并獲取相應(yīng)的返回?cái)?shù)據(jù);最后,將返回的非標(biāo)準(zhǔn)協(xié)議數(shù)據(jù)轉(zhuǎn)換為標(biāo)準(zhǔn)協(xié)議數(shù)據(jù),并返回到請求客戶端。
按照上述總體架構(gòu)搭建測試系統(tǒng),其中協(xié)議轉(zhuǎn)換網(wǎng)關(guān)分別部署于PC 機(jī)和RaspberryPi 3B,PC 機(jī)配置運(yùn)行于Intel(R)Core(TM)i7-10750H CPU @ 2.60GHz,32G內(nèi)存機(jī)器上的WSL Ubuntu20.04 子系統(tǒng);RaspberryPi 3B配 置BCM2835,ARMv7 Processor rev 4(v7l),內(nèi) 存1G。
利用Postman 對服務(wù)器進(jìn)行不間斷寫操作訪問100次,統(tǒng)計(jì)API 響應(yīng)時(shí)間,其平均每次API 響應(yīng)時(shí)間見表1。
表1 API 請求響應(yīng)時(shí)間(單位:ms)
API 一次完整的寫操作時(shí)間包括三個(gè)部分:一是客戶端與web 服務(wù)器之間消耗的時(shí)間,二是web 服務(wù)器與設(shè)備之間消耗的時(shí)間,三是協(xié)議轉(zhuǎn)換的時(shí)間,如圖4 所示。
因此表1 中ping 的時(shí)間只有t1+t6,而訪問設(shè)備的時(shí)間包括t1+t2+t3+t4+t5+t6,所以平均一次協(xié)議轉(zhuǎn)換時(shí)間不超過(t3+t4+t5+t6)/2,在本次測試中,平均轉(zhuǎn)換時(shí)間見表2。
表2 平均轉(zhuǎn)換時(shí)間(單位:ms)
從表2 可以看出,Modbus 耗時(shí)最長,這是因?yàn)镸odbus 設(shè)備端對寄存器的讀寫是串行的,對設(shè)備的訪問相對較耗時(shí)間;MQTT 耗時(shí)最短,因?yàn)镸QTT 寫完后并不需要等待返回?cái)?shù)據(jù)因此相對速度較快。
本文提出的協(xié)議轉(zhuǎn)換方案優(yōu)點(diǎn)主要體現(xiàn)在五個(gè)方面:①Golang 語言開發(fā),部署方便,并發(fā)效率高;②設(shè)備協(xié)議插件化,便于擴(kuò)展新的設(shè)備協(xié)議;③利用多線程技術(shù)及設(shè)備描述文件虛擬化設(shè)備,系統(tǒng)適應(yīng)性強(qiáng),響應(yīng)速度快;④系統(tǒng)采用RESTful API 接口和WebSocket 長連接設(shè)計(jì),便于多種類型客戶端操作各類協(xié)議設(shè)備;⑤系統(tǒng)運(yùn)行環(huán)境適應(yīng)性強(qiáng),可運(yùn)行于普通計(jì)算機(jī)平臺或樹莓派等嵌入式系統(tǒng)。