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