許 坤,沈 偉,鄧 洲
(中國船舶重工集團公司第七二三研究所,江蘇 揚州 225101)
現(xiàn)代軟件開發(fā)的一個趨勢是軟件構件化[1]。軟件開發(fā)的規(guī)模越來越大,功能越來越復雜,這對于軟件模塊的可靠性、可重用性提出了更高的要求。為了有效提高軟件開發(fā)效率,縮短開發(fā)周期[2-3],降低人力物力成本,基于構件的軟件總線技術逐漸被廣泛應用。
軟件總線是為保證軟件系統(tǒng)開發(fā)過程規(guī)范性和系統(tǒng)應用中的適用性以及可擴展性而提出的一種設計思想。軟件總線是一種虛擬總線[4],這組總線可以為多種語言編寫的不同類型不同功能的程序服務。軟件總線是一組標準的軟件模塊,它為計算機操作系統(tǒng)、各種軟部件提供數(shù)據(jù)傳輸,并為這些程序提供虛擬共享的通道與接口界面[3]。
本文基于軟件總線技術設計了一種管控軟件,對某大型系統(tǒng)中電磁收發(fā)設備的頻譜使用進行管理。該系統(tǒng)內(nèi)電子設備數(shù)量多、密度大、對電磁頻譜資源的占用存在較為嚴重的沖突,需要采取有效管理措施。本文設計的軟件,目的就是依據(jù)一定的決策規(guī)則對系統(tǒng)內(nèi)電子設備進行管控,實現(xiàn)各電子設備的兼容協(xié)同工作。
軟件總線是一組虛擬的數(shù)據(jù)傳輸通道和即插即用的構件集成框架,也就是提供數(shù)據(jù)傳輸通道的軟件及其標準接口[2],支持應用程序間、軟件構件間的功能共享和信息交互,能有效降低應用程序之間、構件之間的耦合度。
軟件總線一般完成4個基本功能[5]:
(1)通信功能:軟件總線的最重要功能,能夠實現(xiàn)安裝在軟件總線上的由不同語言編寫的異構構件之間的相互通信。
(2)構件調(diào)度功能:實現(xiàn)軟件構件庫的管理,完成對軟件構件的安裝、卸載、調(diào)用。
(3)管理控制功能:解決對軟件總線的合理分配、有效使用等問題。
(4)接口功能:解決軟件總線與不同語言編寫的軟件構件間的通信、數(shù)據(jù)傳輸?shù)慕涌趩栴}。
“軟件總線+構件”技術,可以理解為面向對象技術的擴展與提升。構件是可復用軟件模塊,是被封裝的對象類。構件實現(xiàn)一定的功能,可以單獨開發(fā)調(diào)試,調(diào)試完成后插入到軟件總線上使用[6]。軟件總線對構件進行組裝集成,使多個構件以公共接口互相連接,實現(xiàn)構件的即插即用。接口規(guī)范的統(tǒng)一,使軟件總線與構件、構件與構件之間的通信復雜度大大降低。軟件總線的結構模型見圖1。
圖1中,構件安裝或加載到總線上,構件間通過軟件總線進行通訊,相互協(xié)作,完成較為復雜的功能;部分構件通過不同層次的總線生成復合構件,再插入底層軟件總線,實現(xiàn)系統(tǒng)的結構分層,提供了一個可重用的軟件系統(tǒng)解決方案。
傳統(tǒng)軟件總線的設計思想,是著眼于網(wǎng)絡環(huán)境下的分布式應用[7]。本文在單機系統(tǒng)中基于軟件總線技術進行管控軟件開發(fā),避免了分布式應用中面臨的容錯處理、負載平衡等比較繁瑣的問題。軟件總線及各構件之間的通信采用消息機制,降低了構件間的耦合性,增強了系統(tǒng)的靈活性與可擴展性。
管控軟件的框架見圖2。
圖2 管控軟件基本框架
在軟件框架中包含5類模塊:總線調(diào)度模塊、驅動模塊、策略模塊、設備信息處理模塊、顯示模塊,其功能描述如下:
總線調(diào)度模塊:創(chuàng)建軟件總線并維護其運行;創(chuàng)建消息隊列并維護其運行;對各軟構件進行安裝、注冊以及卸載。
驅動模塊:包括網(wǎng)絡驅動、串口驅動、并口驅動3種構件。網(wǎng)絡驅動為軟件系統(tǒng)提供了與外部進行網(wǎng)絡信息交換的功能,包括UDP協(xié)議和TCP協(xié)議2種通信協(xié)議方式。串口驅動為系統(tǒng)提供了與外部以RS232或RS422方式進行串口通訊的功能。并口驅動則為系統(tǒng)提供了與外部進行I/O通訊的功能。
設備信息處理模塊:包括若干個設備信息處理構件,每個構件對應被管控的一個外部電子設備。負責接收、處理、存儲外部設備的工作狀態(tài)及參數(shù),以及策略模塊下發(fā)的管理命令。
策略模塊:包括一個管控策略構件。根據(jù)收集到的各外部設備的工作狀態(tài)、參數(shù),進行電磁兼容態(tài)勢判斷,依據(jù)一定的決策規(guī)則,作出綜合決策,并發(fā)出管控命令。
顯示模塊:包括一個人機界面構件。負責顯示各外部設備的工作狀態(tài)、參數(shù)以及對各外部設備下發(fā)的管理命令。
本文設計的軟件總線,核心是對構件進行集成的鏈表結構以及構件之間進行通信的的消息機制。鏈表是一種物理存儲單元上非連續(xù)的存儲結構,數(shù)據(jù)元素的邏輯順序通過鏈表中的指針鏈接次序實現(xiàn)。鏈表由一系列結點組成。圖3描述了軟件總線的鏈表結構。
圖3 軟件總線的鏈表結構
這是一個雙向鏈表,可以從任意結點開始,很方便地訪問其前驅結點(通過prev指針)與后繼結點(通過next指針)。結點中包含一個構件ID與指向該構件對象的指針。對鏈表進行遍歷操作,很容易實現(xiàn)對各構件的訪問。
構件對象中包含數(shù)據(jù)、功能函數(shù),以及規(guī)范的消息處理接口函數(shù)。構件之間交互通過消息機制實現(xiàn)。軟件總線作為各個構件的集成平臺,負責消息的傳遞、派發(fā)。軟件總線為構件提供透明的服務,使遵循總線接口規(guī)范的構件實現(xiàn)即插即用。
消息中包含著構件之間需要傳輸?shù)男畔?,信息類型包括設備狀態(tài)、數(shù)據(jù)、控制命令等,所以消息也有多種類型。消息結構中包含多個域,其定義如表1所示。
表1 消息結構中的域說明
構件既是消息發(fā)生的主體與來源,也是消息派送的目的地。圖4描述了軟件總線的消息傳輸機制。應用程序工作時,總線調(diào)度模塊首先調(diào)用rngCreate函數(shù)創(chuàng)建1個ring buffer緩沖區(qū),這是1個FIFO型消息隊列,緩沖區(qū)的大小根據(jù)程序的需要而定。當構件由于外部事件驅動而產(chǎn)生消息后,即調(diào)用rngBufPut函數(shù),把消息壓進消息隊列。與此同時,總線調(diào)度模塊中執(zhí)行著一個不斷從消息隊列中檢測消息的無限循環(huán),一旦讀到了有消息存在,就調(diào)用rngBufGet函數(shù)提取消息,并調(diào)用MsgDispatch函數(shù)進行消息派送。消息派發(fā)的主要依據(jù)是消息中的目標。從鏈表的首結點開始,對目標進行構件ID匹配,并按照鏈表的次序一直執(zhí)行到底。一旦檢測到有構件的ID匹配成功,則由該構件調(diào)用消息接收處理函數(shù),完成消息響應。這個消息響應有可能會導致該構件發(fā)出新的消息,并進而產(chǎn)生新一輪的消息循環(huán)。
在VxWorks系統(tǒng)中進行如圖2所示的軟件總線框架設計,基于雙向鏈表結構和消息機制,由總線調(diào)度模塊把生成的若干構件進行集成。系統(tǒng)啟動后,對構件進行注冊、初始化,開始工作并等待消息。作為驅動模塊的3個構件:網(wǎng)絡驅動、串口驅動和并口驅動,將響應外部事件的激勵,接收外部設備的網(wǎng)絡報文、串口報文或I/O信號,轉化為內(nèi)部消息發(fā)給相應的設備信息處理構件。收到消息的設備信息處理構件從中提取并存儲設備狀態(tài)、數(shù)據(jù),再發(fā)出消息給管控策略構件。管控策略作為業(yè)務處理核心構件,根據(jù)收集到的各外部設備工作狀態(tài)、參數(shù),進行全局電磁兼容態(tài)勢判斷,依據(jù)一定的決策準則,作出綜合決策,以消息的形式發(fā)出管控命令給對應的設備信息處理構件。設備信息處理構件再根據(jù)業(yè)務規(guī)則生成管理命令報文或數(shù)字量信息,發(fā)送消息給驅動構件,最終由驅動構件完成報文或I/O信號的發(fā)出。
圖4 軟件總線的消息傳輸機制
基于軟件總線技術進行軟件系統(tǒng)開發(fā),具有即插即用、靈活性、開放性、易擴展性等優(yōu)點,大大提高了開發(fā)效率,降低了開發(fā)成本與難度,逐漸成為軟件開發(fā)的主流技術。本文基于軟件總線技術設計的管控軟件,有效解決了某系統(tǒng)內(nèi)部的電磁頻譜沖突問題,使系統(tǒng)內(nèi)各電子設備協(xié)同工作。該軟件框架具有通用性與可擴展性,適用于單機系統(tǒng)的軟件開發(fā)設計。