宋志剛,蔡偉周,李劍波,胡 陽,陳 佳,張 昆
隨著計算機技術(shù)、通訊技術(shù)及軟件技術(shù)的發(fā)展,大量采用不同通訊協(xié)議的智能設備或系統(tǒng)被廣泛應用于工業(yè)現(xiàn)場。為了實現(xiàn)這些使用不同通訊協(xié)議的設備或系統(tǒng)之間信息互聯(lián)互通,人們設計了多種協(xié)議轉(zhuǎn)換方法,如:比特型固定格式數(shù)據(jù)協(xié)議通用轉(zhuǎn)換方法[1]、參考編譯原理的通訊協(xié)議轉(zhuǎn)換方法[2]、基于特征關鍵字的協(xié)議轉(zhuǎn)換方法[3]、基于通用協(xié)議模版的協(xié)議轉(zhuǎn)換方法等[4]。文獻[5]設計了一種基于WEB的數(shù)據(jù)采集與監(jiān)控系統(tǒng)。本文設計了一種基于組件式[6-7]軟件平臺架構(gòu)的通用協(xié)議轉(zhuǎn)換器,具有良好的靈活性、可維護性和擴展性。為敘述方便本文將以MODBUS協(xié)議為例介紹該協(xié)議轉(zhuǎn)換器的軟件設計。
通用協(xié)議轉(zhuǎn)換器的硬件使用嵌入式工業(yè)計算機MOXA UC系列來實現(xiàn),具有2個10/100M LAN口和8個RS232/422/485可配置串口。CPU選用IXP-422,板上配置128MB DRAM和32MB FLASH。操作系統(tǒng)選用嵌入式uC?Linux[8]。
協(xié)議轉(zhuǎn)換模塊的軟件系統(tǒng)應滿足如下功能需求:
(1)適用于多種標準協(xié)議,包括但不限于MODBUS/RTU、MODBUS/TCP、IEC104等;
(2)支持用戶自定義協(xié)議;
(3)支持多個通道同時進行通訊;
(4)可以適應各種對接設備的不同通訊速率,且不同通訊通道不會互相拖慢處理速度;
(5)可以通過遠程工具配置端口通訊參數(shù),配置文件可以上傳下載;
(6)可以在遠程監(jiān)視到各個通訊通道的報文收發(fā),并可記錄系統(tǒng)日志;
(7)預留開發(fā)接口,允許用戶使用編程語言針對特定協(xié)議進行自主開發(fā);
(8)部分通訊端口故障不影響整體運行;
(9)支持對用戶身份及權(quán)限的校驗和管理。
為了使協(xié)議轉(zhuǎn)換器具有良好的可擴展性,通用協(xié)議轉(zhuǎn)換器的軟件系統(tǒng)采用組件式架構(gòu),包括:協(xié)議轉(zhuǎn)換器主服務程序(下簡稱主服務程序)、協(xié)議通訊組件(下簡稱通訊組件)和遠程監(jiān)視及配置工具(下簡稱監(jiān)視配置工具)。主服務程序與監(jiān)視配置工具構(gòu)成客戶端/服務器(C/S)結(jié)構(gòu)。
主服務程序運行于協(xié)議轉(zhuǎn)換器的uCLinux系統(tǒng)之下,隨操作系統(tǒng)自啟動,負責根據(jù)配置文件加載通訊組件,并提供協(xié)議轉(zhuǎn)換服務。同時,主服務程序也負責響應監(jiān)視配置工具的命令請求,完成系統(tǒng)配置的上傳、下載、備份以及對各個端口通訊狀態(tài)的監(jiān)視功能。為了節(jié)約系統(tǒng)資源,主服務程序采取單一進程多個線程的方式提供通訊及系統(tǒng)管理服務。
通訊組件采用動態(tài)鏈接庫(.SO文件)方式實現(xiàn),用于實現(xiàn)與協(xié)議轉(zhuǎn)換器某一端口所連接的設備實現(xiàn)數(shù)據(jù)通訊。在主服務程序啟動后被動態(tài)加載。
監(jiān)視配置工具運行于與協(xié)議轉(zhuǎn)換器處于同一網(wǎng)絡下的某臺工作站上。該工作站操作系統(tǒng)采用WINDOWS系列。監(jiān)視配置工具與協(xié)議轉(zhuǎn)換器之間的命令交互及通訊監(jiān)視功能采用TCP協(xié)議實現(xiàn)。
協(xié)議轉(zhuǎn)換器件系統(tǒng)軟件邏輯結(jié)構(gòu)如圖1所示。
圖1 協(xié)議轉(zhuǎn)換器件系統(tǒng)軟件邏輯結(jié)構(gòu)
監(jiān)視配置工具作為客戶端運行于同一網(wǎng)絡內(nèi)的某WINDOWS系統(tǒng)計算機上。監(jiān)視配置工具與協(xié)議轉(zhuǎn)換器之間通過TCP協(xié)議傳遞配置命令及被監(jiān)視端口的實時通訊數(shù)據(jù)。
監(jiān)視配置工具采用分層式架構(gòu)、模塊化設計,使用C++語言進行開發(fā)。
2.2.1 邏輯結(jié)構(gòu)設計
如圖2所示,監(jiān)視配置工具軟件分為三個邏輯層次,分別為界面層、業(yè)務層、通訊服務層。業(yè)務層劃分為三個功能模塊,包括用戶管理模塊、器件配置管理模塊、端口通訊監(jiān)視模塊。
圖2 監(jiān)視配置工具邏輯結(jié)構(gòu)
業(yè)務層的用戶管理模塊主要實現(xiàn)用戶登錄驗證,用戶權(quán)限判斷,新用戶創(chuàng)建,用戶身份配置,用戶密碼修改等功能。
器件配置管理模塊用于對端口的配置,包括端口的通訊參數(shù)、通訊協(xié)議、數(shù)據(jù)點表、點位映射關系表等。配置信息可以存儲為文件并予以保存。配置信息的收發(fā)采用命令報文實現(xiàn)。
端口通訊監(jiān)視模塊用于接收協(xié)議轉(zhuǎn)換器上報的通訊報文及設備警告信息。
通訊服務模塊封裝了TCP報文的收發(fā)。在該模塊內(nèi)對于業(yè)務層下發(fā)的命令報文采用緩沖隊列進行緩存并逐一發(fā)送。
2.2.2 通訊報文設計
監(jiān)視配置工具與協(xié)議轉(zhuǎn)換器之間的通訊報文基本結(jié)構(gòu)如圖3所示。0XFFFF為報文起始標志,0XEEEE為報文結(jié)束標志。FC為報文功能類別碼。PT為端口類型,用數(shù)字0表示串口,用數(shù)字1表示網(wǎng)口。PI為端口ID,用于區(qū)分同類別的不同端口。LEN為后續(xù)內(nèi)容到報文結(jié)束標志之前的數(shù)據(jù)的長度。DIRC為報文傳遞方向,進入?yún)f(xié)議轉(zhuǎn)換器的方向設為0,離開協(xié)議轉(zhuǎn)換器的方向設為1。
定義 2[9] Hom-Jordan李代數(shù)(L,[·,·]L,α,δ)由空間L,一個二元雙線性運算L×L→L滿足
圖3 監(jiān)視配置工具與協(xié)議轉(zhuǎn)換器的通訊報文結(jié)構(gòu)設計
參見表1,根據(jù)報文功能,將報文分為如下幾類,分別用FC的不同數(shù)值表示。
表1 監(jiān)視配置工具與協(xié)議轉(zhuǎn)換器的通訊報文類型
協(xié)議轉(zhuǎn)換器中的主服務程序和通訊組件共同完成協(xié)議轉(zhuǎn)換功能。主服務程序作為單一進程跟隨系統(tǒng)啟動,啟動后將根據(jù)端口所使用的通訊協(xié)議類型加載對應的動態(tài)鏈接庫。
2.3.1 程序設計
如圖1所示,協(xié)議轉(zhuǎn)換器軟件邏輯上包括配置管理服務模塊、通訊監(jiān)視服務模塊、用戶管理服務模塊和數(shù)據(jù)通訊服務模塊。
配置管理服務模塊在主線程運行,負責響應監(jiān)視配置工具的配置命令,接收端口配置文件或上傳端口配置文件。配置發(fā)生更改后系統(tǒng)將重新啟動,并重新載入配置文件。端口配置文件內(nèi)容包括:端口通訊參數(shù)設置、端口通訊協(xié)議、端口所連接的設備的地址或標識、端口所連接設備的數(shù)據(jù)點位等。每個通訊口上所連接的設備個數(shù)多于1個時通過設備地址或標識予以區(qū)分。
通訊監(jiān)視服務模塊以主線程的子線程運行,負責轉(zhuǎn)發(fā)端口通訊報文、端口警告信息給監(jiān)視配置工具。在該模塊內(nèi)部維護了一個循環(huán)緩沖隊列,用于存儲需要轉(zhuǎn)發(fā)的通訊報文或警告信息。使用互斥鎖來防止對緩沖隊列的數(shù)據(jù)訪問沖突。同時,在該模塊內(nèi)部設置一個客戶端列表,記錄每個客戶端具體訂閱了哪些端口的通訊或警告消息。
用戶管理服務模塊功能在主線程實現(xiàn),負責響應監(jiān)視配置工具的用戶操作命令。用戶配置信息以文件的形式存儲于主服務程序的工作目錄,并進行加密。
數(shù)據(jù)通訊服務模塊以單獨的工作線程運行,用于管理每個端口上的數(shù)據(jù)通訊。該線程啟動后,根據(jù)各個端口的名字找到對應的端口配置文件,并根據(jù)配置文件中所配置的通訊協(xié)議,加載對應的通訊組件,隨后開啟該端口的通訊線程。通訊組件在發(fā)現(xiàn)數(shù)據(jù)出現(xiàn)更新時,調(diào)用主服務程序中的回調(diào)函數(shù)OnPortDataChange,通知主服務程序本端口上某個數(shù)據(jù)點位已發(fā)生變化。主服務程序通過查配置表找到該數(shù)據(jù)點位的對端端口點位,并將該點位的更新信息發(fā)送給對端端口的通訊組件。對端端口的通訊組件將對應點位的數(shù)值更新到數(shù)據(jù)緩存區(qū),并通過通訊報文,將對端端口的數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)變化信息傳遞給對端所連接的設備。
協(xié)議轉(zhuǎn)換器對不同協(xié)議進行轉(zhuǎn)換的數(shù)據(jù)處理流程如圖4所示。
圖4 端口協(xié)議轉(zhuǎn)換處理流程
2.3.2 組件設計
協(xié)議轉(zhuǎn)換器通訊組件采用動態(tài)鏈接庫實現(xiàn)。協(xié)議通訊組件對應于某個特定的通訊協(xié)議,如MODBUS-RTU主站、MODBUS-RTU從站、MODBUS-TCP主站、MOD?BUS-TCP從站、IEC104主站、IEC104子站等。
通訊組件對外需提供一組接口函數(shù)用于與主服務程序的交互。StartComm接口函數(shù)用于協(xié)議轉(zhuǎn)換器主服務程序控制端口通訊的啟動過程。SetDataBuf用于設置該端口對應的數(shù)據(jù)緩存區(qū),數(shù)據(jù)緩存區(qū)由主服務程序根據(jù)設備的配置信息從內(nèi)存池獲取,并把申請到的內(nèi)存地址傳遞給通訊組件,通訊組件使用該段內(nèi)存緩存數(shù)據(jù),并把數(shù)據(jù)變化信息通過回調(diào)函數(shù)OnPortDataChange通知給主服務程序,主服務程序調(diào)用對端端口通訊組件的SetDataExchange函數(shù)將數(shù)據(jù)變化更新到對端端口的數(shù)據(jù)緩存區(qū)并通過通訊報文同步到對端所連設備。對于某些主動上報型通訊協(xié)議如(IEC104子站),SetDataExchange函數(shù)需要將數(shù)據(jù)變化主動發(fā)送給所連設備,而對于輪詢類型的通訊協(xié)議(如MOD?BUS-RTU從站)只需要等待本端口外接的設備發(fā)起數(shù)據(jù)輪詢。
由于采用了組件式架構(gòu),對于該協(xié)議轉(zhuǎn)換器暫未支持的工業(yè)標準通訊協(xié)議或某些設備廠家的自定義協(xié)議,只需按照通訊組件接口規(guī)范來開發(fā)出相應的通訊組件即可予以支持。對于文獻1、文獻3等文獻中所介紹的種種協(xié)議轉(zhuǎn)換算法,也均可以通訊組件的方式予以實現(xiàn)。
設計了一種通用協(xié)議轉(zhuǎn)換器的軟件系統(tǒng),該軟件系統(tǒng)以組件式架構(gòu)實現(xiàn),具有較好的靈活性,可以適應復雜的通訊協(xié)議轉(zhuǎn)換需求。同時,該軟件系統(tǒng)提供了開發(fā)接口,方便于協(xié)議轉(zhuǎn)換器的功能擴展和升級。