賀敏 陳宏君
摘 要:傳統(tǒng)繼電保護裝置的功能主要由開發(fā)人員直接編寫程序,開發(fā)工作量大,維護成本高,需要提高開發(fā)效率,為此開發(fā)了基于組件化、圖形化配置軟件。本文介紹了該軟件的組件開發(fā)架構(gòu),架構(gòu)由主框架、組件庫、事件總線、主程序組成。主程序讀取組件配置文件,加載和創(chuàng)建相關(guān)組件對象,組件對應(yīng)的主窗體放置在主框架的界面容器內(nèi)。組件之間需要協(xié)同配合時,通過發(fā)送和響應(yīng)預定義的事件實現(xiàn)。在繼電保護配置軟件中應(yīng)用了該組件架構(gòu),降低了模塊間的耦合關(guān)系,提高了軟件可擴展能力和開發(fā)集成效率。
關(guān)鍵詞:組件;主框架;事件總線;繼電保護軟件
中圖分類號:TP31 文獻標識碼:A\
1 引言(Introduction)
在人機界面軟件的開發(fā)維護周期內(nèi),由于面向的領(lǐng)域較為復雜,軟件的復雜度和規(guī)模在不斷延伸,要求軟件系統(tǒng)具有較強的演化能力[1,2]。這一方面要求開發(fā)人員能快速適應(yīng)改變,減少軟件維護的代價,另一方面又需要一種通用的方法來實現(xiàn)滿足特定的需求,確保個性化的需求實現(xiàn)不影響已經(jīng)成熟穩(wěn)定的模塊[3-8]。人機界面軟件存在交互頻繁、基于鼠標和鍵盤操作無規(guī)律觸發(fā)、運行周期長等特點,用組件模式開發(fā)時,面臨組件數(shù)據(jù)和界面管理、組件間交互配合等難點。本文設(shè)計了一種輕量級、組件開發(fā)集成架構(gòu),通過跨平臺庫開發(fā),面向不同權(quán)限的用戶,可配置加載不同組件,并在繼電保護裝置配置軟件中進行了應(yīng)用。
2 基于組件技術(shù)的軟件架構(gòu)(Software architecture
based on component technology)
2.1 組件概念與組件系統(tǒng)原理
組件(Component)是一個黑盒子,是可獨立發(fā)布的二進制單元。組件對外的接口主要是API功能和端口,其中API是組件對外提供的功能,端口表示組件內(nèi)部調(diào)用外部其他組件功能的函數(shù)。圖1是一種組件模型[1]:
圖1 組件模型
Fig.1 Component model
嵌入式裝置是一個典型的組件系統(tǒng),例如繼電保護測控裝置由若干塊CPU/DSP/IO插件組成,不同的裝置將具有獨立功能的集成電路插件按照設(shè)計要求進行組裝,通過總線進行高速通信和有效協(xié)同工作[9]。類比于物理裝置,軟組件系統(tǒng)由總線、接口、組件共三部分組成。組件通過預先定制的接口連接到總線上,總線是一個總控程序(宿主程序),負責組件之間的通信和互操作;接口負責組件啟動、初始化、設(shè)置、注銷等功能;組件實際上是普通的程序,可由界面、數(shù)據(jù)、函數(shù)組成,可以完成某種功能,編譯為DLL。在對組件的接口定義了統(tǒng)一的規(guī)范后,系統(tǒng)投入運行時,用戶可以根據(jù)自己的需要通過接口集成到系統(tǒng)中,也可卸載,而框架程序不用修改,如果總控程序正在運行,修改某個組件時,不用停止運行,通過這種技術(shù),增強了系統(tǒng)的靈活性和擴展性,延長了軟件系統(tǒng)的生命周期。
基于組件開發(fā)設(shè)計的重點包括:(1)實現(xiàn)對組件的管理,宿主程序可以搜索、加載、卸載組件和維護組件的狀態(tài)。將這些功能放到組件配置樹(組件容器)模塊實現(xiàn)。(2)接口的設(shè)計和識別,接口是不同組件之間、宿主程序與組件之間的通信基礎(chǔ)。宿主程序只有識別接口,才能加載組件。(3)資源的互斥和同步,多個組件的并行運行可能對申請資源產(chǎn)生競爭。(4)組件的設(shè)計和生成,組件系統(tǒng)的功能由組件實現(xiàn),在設(shè)計時需考慮與組件相關(guān)的界面顯示、數(shù)據(jù)處理能夠高效進行。
2.2 組件接口設(shè)計
本文采用導出函數(shù)作為組件提供服務(wù)的接口,通過函數(shù)指針方式實現(xiàn)對象的映射和接口的調(diào)用。定義組件基類Component,編譯形成comp.dll。組件有初始化、運行、停止等接口,有請求服務(wù)的回調(diào)函數(shù),有發(fā)送組件狀態(tài)的信號,其UML模型如圖2所示。
圖2 組件的UML模型
Fig.2 Component UML model
其C++主要接口定義如下:
class COMP_DECLSPEC Component:
public QObject {Q_OBJECT
public:
Component ();
virtual~Component()=0;
public://公共接口
virtual bool init(void*)=0;
virtual bool run()=0;
virtual bool stop()=0;
virtual void free()=0;
signals://信號
void sigStarted(bool);
void sigFinished(int);
void sigRequire (void*,int);
public slots://回調(diào)函數(shù)
virtual void respond(void*,int);
protected:
void* m_pdata;
QString m_name;
QString m_version;};
Component只是定義純虛接口函數(shù),具體的實現(xiàn)由各派生的組件細化。各子組件、頂層組件均繼承自組件基類,繼承的組件均須實現(xiàn)統(tǒng)一的組件構(gòu)造接口:
extern"C"Component*
newComponent();
通過類似如下的實現(xiàn)方式,返回動態(tài)類型不同的組件實例。例如定值整定組件創(chuàng)建接口實現(xiàn)為:
Component*newComponent(){
CSettingEditor*ptr=new
CSettingEditor();
return(Component*)ptr;}
2.3 組件配置樹
一個軟件系統(tǒng)的組件結(jié)構(gòu)關(guān)系可用組合配置樹(Composition and Configuration Tree,CCT)來描述[1]。形式化定義為一個三元組CCT=(N,E,R),其中:N表示樹節(jié)點的集合;R是節(jié)點間語義關(guān)系的集合,R有組合關(guān)系和配置關(guān)系。R={Rcomp,Rconf}。配置關(guān)系通過包括OR(或選)、AND(并選)、Switch(多選一)、Multiplex(多選多)等關(guān)系。Rconf={AND,OR,Switch,Multiplex};E是節(jié)點之間的邊的集合;E=Ecomp∪Econf,Ecomp表示組合關(guān)系邊,Econf表示配置關(guān)系邊。Econf=EAND∪EOR ∪ESwitch∪EMultiplex以繼電保護配置軟件的代碼生成子系統(tǒng)為例,其組合配置樹如圖3所示。
圖3 組件配置樹示例
Fig.3 Example of component configuration tree
在圖3中,實線表示組合關(guān)系,虛線表示配置關(guān)系。Coder系統(tǒng)可由多個主要組件構(gòu)成,而其中部分組件也是由下層組件構(gòu)成。三角形表示多選一配置關(guān)系,coder組件根據(jù)不同的應(yīng)用領(lǐng)域,可選擇對應(yīng)交直流嵌入式保護裝置code組件、EMTDC仿真code組件。六邊形表示或選配置關(guān)系,CID的處理有直流裝置分布式的配置建模組件和交流裝置的集中式配置建模組件。可用XML文件描述該配置樹關(guān)系,基于組件配置樹實現(xiàn)軟件系統(tǒng)的更新、維護,將修改的函數(shù)的影響盡量限定在某個組件的內(nèi)部。
2.4 人機界面軟件的組件架構(gòu)
本文設(shè)計的人機界面軟件集成架構(gòu)包括:主程序、主框架、組件庫、事件總線。
主程序是main.cpp文件編譯后形成的可執(zhí)行程序,僅包括一個main入口函數(shù)。在main函數(shù)中讀取組件配置樹文件,調(diào)用組件構(gòu)造函數(shù),形成組件對象實例,將組件對應(yīng)的主窗體界面放入到主框架容器內(nèi)。main函數(shù)還調(diào)用事件總線構(gòu)造函數(shù),將組件接口對象指針放入事件總線散列管理。
在main函數(shù)中創(chuàng)建主框架實例。主框架是一個通用的軟件集成窗體,繼承自QMainWindow,由菜單工具欄、左側(cè)資源管理器、中間界面容器、右側(cè)屬性編輯器、底部輸出欄五個區(qū)域構(gòu)成,支持各頂層組件創(chuàng)建主框架的子菜單、圖標、??繖趦?nèi)的標簽窗體。在頂層主框架的界面容器內(nèi)管理各頂層組件的主窗體界面,每個組件在主窗體容器內(nèi)管理各自子界面。界面容器按照后入先出方式管理。主框架提供文件的新建、打開、關(guān)閉、保存操作入口,可顯示、隱藏??繖?。
圖4 人機界面軟件組件架構(gòu)
Fig.4 Human machine interface software
component architecture
事件總線CEventBus是個全局對象類,各組件也可將事件發(fā)往循環(huán)處理隊列中,總線周期定時觸發(fā)后,將事件轉(zhuǎn)發(fā)給目標組件。以保存文件為例,鼠標點擊工具欄的保存按鈕,工程管理組件響應(yīng)該命令,調(diào)用發(fā)送接口,向所有組件群發(fā)保存:
CEvent*pevent=new CEvent
(getName(),"SaveData");
CEventBus::instance()->send("all",pevent);
delete pevent;
圖5 事件發(fā)送機制
Fig.5 Event sending mechanism
如圖5所示,事件總線串行發(fā)送,各組件接收到該命令后,依次進入活動狀態(tài),保存對應(yīng)的數(shù)據(jù)。
3 繼電保護配置軟件設(shè)計(Design of relay protection
configuration software)
隨著IEC 61850智能變電站應(yīng)用的深入,要求繼電保護裝置具備更靈活的可配置能力,基于手工編寫代碼和配置文件的開發(fā)方式,已經(jīng)很難適應(yīng)快速集成的需求[10]。面向海外用戶需要較強的可配置功能,例如根據(jù)現(xiàn)場應(yīng)用增加減少開入開出插件、保護測控功能投入退出等,這都需要通過工具軟件進行人機界面交互。
3.1 軟件功能設(shè)計
繼電保護配置軟件是基于組件集成框架開發(fā)的,其輸入為各類符號庫,通過圖形編輯實例化符號,并對符號進行編輯設(shè)置和連接輸入輸出關(guān)系,通過各個實例化的符號頁面,生成變量庫,變量庫作為整個系統(tǒng)的數(shù)據(jù)中心,為各個應(yīng)用服務(wù)配置提供數(shù)據(jù)源,對各類服務(wù)所需要的變量進行配置歸類。各個應(yīng)用服務(wù)的配置可以相對獨立的加載和卸載,可以方便的擴充應(yīng)用配置功能。主要功能如下:(1)裝置硬件配置,從插件庫中選擇相關(guān)型號插件搭建裝置,形成可編程的插件節(jié)點。(2)裝置程序功能模塊化配置,將繼電保護程序進行模塊化設(shè)計,形成可復用的元件符號庫,在圖形化頁面中創(chuàng)建元件實例和進行數(shù)據(jù)連線,以可視化模塊化的方式完成嵌入式裝置程序組態(tài)。(3)裝置HMI配置,從變量庫中挑選信號,進行LCD層次菜單分組,包括模擬量分組、開關(guān)量分組、錄波分組等功能。(4)裝置定值分組和整定,包括定值的導入、導出、比較等功能。(5)裝置系統(tǒng)選型配置,包括裝置MOT選型、系統(tǒng)功能選擇、保護測控功能模塊投退。(6)在線調(diào)試功能。
3.2 軟件組件劃分
繼電保護配置軟件基于C++/Qt跨平臺庫開發(fā),按照功能可劃分為:工程管理、離線配置、圖形編輯、數(shù)據(jù)處理、在線調(diào)試五個部分,共分18個頂層組件:
(1)工程管理層:用資源管理(工作空間)組件展示,用工程數(shù)據(jù)管理組件維護數(shù)據(jù)響應(yīng)操作。(2)離線配置層:包括基本信息配置、LCD層次菜單配置、錄波等引用表配置、IEC61850配置瀏覽、LCD主畫面編輯、集中式瀏覽、定值整定、系統(tǒng)功能配置共八個組件。(3)圖形編輯層:包括可視化頁面圖形編輯器、符號庫制作、符號庫三個組件。其中圖形編輯器可細分多種場景的子組件。(4)產(chǎn)物處理層:包括變量庫、后端產(chǎn)物形成組件、驅(qū)動包處理(壓縮、比較、升級)組件。(5)在線調(diào)試,包括可視化調(diào)試、Inspect瞬時錄波等功能。
組件分層關(guān)系如圖6所示。
圖6 配置軟件結(jié)構(gòu)劃分圖
Fig.6 Configuration software structure partition graph
以資源管理器為例,表1給出該組件的輸入、輸出、組件間交互設(shè)計要點。
表1 資源管理器組件
Tab.1 Explorer component
內(nèi)容 描述
組件名 GuiExplorer.dll
功能概述 在左邊??繖陲@示繪制工程及子節(jié)點;支持鼠標操作
輸入 裝置工程文件
輸出 樹形列表
交互 頂級節(jié)點繪制由工程數(shù)據(jù)管理組件創(chuàng)建;子節(jié)點由對應(yīng)組件創(chuàng)建;鼠標操作時,在樹形列表的響應(yīng)函數(shù)中發(fā)送事件給總線,然后轉(zhuǎn)發(fā)給所屬的組件處理
例如:打開工程時只繪制裝置節(jié)點,點擊裝置節(jié)點時,發(fā)送事件給工程管理組件,繪制裝置子節(jié)點、加載顯示變量庫。
3.3 應(yīng)用場景
基于組件化的軟件架構(gòu),可根據(jù)不同用戶角色(研發(fā)人員、工程人員、終端用戶),定制發(fā)布不同的組件庫。圖7是面向研發(fā)人員的編輯場景,研發(fā)人員基于公共元件庫,搭建圖形化頁面程序,之后在離線配置相關(guān)組件內(nèi)完成HMI等人機接口配置。
圖7 配置軟件應(yīng)用場景
Fig.7 Configuration software application scenarios
4 結(jié)論(Conclusion)
本文介紹了一種人機界面軟件的組件化框架,定義了組件的公共接口模型;設(shè)計了基于事件總線的交互方法?;诒疚奶岢龅慕M件開發(fā)架構(gòu)在繼電保護配置軟件中進行了應(yīng)用,該軟件通過組件分層設(shè)計,將組件的交互協(xié)議和組件的內(nèi)部實現(xiàn)細節(jié)分開,并支持部分升級,提高了軟件開發(fā)集成效率。
參考文獻(References)
[1] 陶傳奇,等.基于模型的構(gòu)件軟件修改影響分析[J].軟件學報,
2013,24(5):942-960.
[2] 郁湧,劉永剛,侯江畔.一種基于構(gòu)件的可信軟件系統(tǒng)框架及
其表示[J].軟件工程師,2015,18(5):60-62.
[3] 譚海中.基于Java的Web通用DataTable組件設(shè)計[J].軟件工程
師,2015,18(7):22-23.
[4] 袁偉民,左春.基于樣本程序的領(lǐng)域開發(fā)平臺的研究與實踐
[J].計算機工程設(shè)計,2010,31(18):3979-3982.
[5] 張弛.軟件組件接口擴展技術(shù)研究[J].微電子學與計算機,
2007,24(8):35-41.
[6] 何鵬飛,等.組件技術(shù)在嵌入式系統(tǒng)中的應(yīng)用[J].計算機系統(tǒng)
應(yīng)用,2014,23(6):220-223.
[7] 丁博,王懷民,史殿習.構(gòu)造具備自適應(yīng)能力的軟件[J].軟件學
報,2013,9(24):1981-2000.
[8] 陳宏君,等.一種基于組件和腳本的可視化程序產(chǎn)物形成架
構(gòu)及應(yīng)用[J].工業(yè)控制計算機,2013,26(12):1-5.
[9] 李響,等.新一代控制保護系統(tǒng)通用硬件平臺設(shè)計與應(yīng)用
[J].電力系統(tǒng)自動化,2012,36(14):52-55.
[10] 陳宏君,等.新一代保護測控裝置配套工具軟件設(shè)計與應(yīng)用
[J].電力系統(tǒng)自動化,2013,37(20):92-96.
作者簡介:
賀 敏(1972-),女,碩士,高級工程師.研究領(lǐng)域:電力系統(tǒng)
及其自動化軟件研發(fā),新能源發(fā)電及控制.
陳宏君(1981-),男,碩士,高級工程師.研究領(lǐng)域:電力系統(tǒng)
及其自動化軟件研發(fā).