曾水根,劉 瀏,劉萬(wàn)斌,丁俊健
(國(guó)電南京自動(dòng)化股份有限公司,南京210032)
新一代保護(hù)軟件開(kāi)發(fā)平臺(tái)系統(tǒng)(以下簡(jiǎn)稱系統(tǒng))是一個(gè)面向保護(hù)類產(chǎn)品PC機(jī)端工具軟件快速二次開(kāi)發(fā)的基礎(chǔ)開(kāi)發(fā)平臺(tái),使用Visual C++2010(以下簡(jiǎn)稱為VC++2010)進(jìn)行開(kāi)發(fā)。
之所以選定VC++2010作為開(kāi)發(fā)語(yǔ)言,是因?yàn)閂C++2010為所有的VC++開(kāi)發(fā)人員做了貼心而又周全的考慮。具體表現(xiàn)在其Ribbion界面可視化的設(shè)計(jì)、更加人性化的使用、提升了的安全可靠性、更加容易發(fā)布與部署簡(jiǎn)潔等特點(diǎn)[1],并且VC++2010對(duì)C++新標(biāo)準(zhǔn)C++0x全面支持。
系統(tǒng)大量采用.NET成熟的組件技術(shù),降低二次開(kāi)發(fā)及維護(hù)成本與風(fēng)險(xiǎn),提供統(tǒng)一的語(yǔ)言、數(shù)據(jù)庫(kù)、配置、通信、公共功能、日志、權(quán)限角色等公共模塊,并可根據(jù)二次開(kāi)發(fā)需求隨意組裝、刪減模塊,快速開(kāi)發(fā)出滿足實(shí)際工程應(yīng)用需求的應(yīng)用軟件。
系統(tǒng)功能模塊使用Visual Studio2010.NET作為主要開(kāi)發(fā)工具,綜合應(yīng)用VC++2010的CLI、MFC、COM等技術(shù)實(shí)現(xiàn)封裝和系統(tǒng)之間的跨進(jìn)程通信,并利用Win32API技術(shù)實(shí)現(xiàn)和Windows系統(tǒng)間的交互[2]。
系統(tǒng)由多語(yǔ)言功能模塊、數(shù)據(jù)庫(kù)功能模塊、串口通信功能模塊、以太網(wǎng)通信功能模塊、公共類功能模塊、公用重寫(xiě)控件功能模塊、權(quán)限角色功能模塊和事件日志功能模塊共八大功能模塊組成。各功能模塊項(xiàng)目開(kāi)發(fā)為VC++2010的CLR類庫(kù)項(xiàng)目。
系統(tǒng)項(xiàng)目開(kāi)發(fā)過(guò)程中采用SVN進(jìn)行多人同步開(kāi)發(fā)的源代碼管理,為避免不同模塊間的名稱命名沖突,充分運(yùn)用標(biāo)準(zhǔn)C++引入的關(guān)鍵字namespace(命名空間/名字空間/名稱空間/名域),每個(gè)功能模塊擁有獨(dú)一無(wú)二的命名空間名稱。各功能模塊命名空間名稱原則上要反應(yīng)出模塊功能。為了省去每次調(diào)用模塊成員都要添加“命名空間名::成員名”的麻煩,使用標(biāo)準(zhǔn) C++的using編譯指令(“using namespace命名空間名稱”)來(lái)簡(jiǎn)化對(duì)命名空間中的成員的使用;同時(shí),使用using聲明來(lái)簡(jiǎn)化對(duì)命名空間中的名稱的使用。
系統(tǒng)的串口、以太網(wǎng)通信功能模塊以國(guó)電南自以太網(wǎng)103規(guī)約為實(shí)施標(biāo)準(zhǔn)。
總體功能框架如圖1。
圖1 新一代保護(hù)軟件開(kāi)發(fā)平臺(tái)系統(tǒng)框架圖
名稱定義原則上要基本體現(xiàn)類型和意義。如以“CLR”開(kāi)頭的名稱代表命名空間名稱,以“l(fā)bl”開(kāi)頭的名稱表示標(biāo)簽(Label)類型的名稱,表示用戶名有關(guān)的名稱應(yīng)該包含“username”字符,表示密碼有關(guān)的名稱應(yīng)該包含“pass”字符等。
為方便二次開(kāi)發(fā)人員快速的讀懂程序,命名空間命名采用有名的命名空間命名法則,C++標(biāo)準(zhǔn)文檔中的有名命名空間語(yǔ)句如下:
named-namespace-definition:
namespace identifier{namespace-body}[3]
簡(jiǎn)單描述為:
namespace命名空間名{
聲明序列[可選]
}
命名空間名稱從字面上要基本反映出模塊的功能。如多語(yǔ)言功能模塊命名空間名稱為“CLRDllMLanguage”,其中“CLRDll”前綴表示類型為 VC++的 CLR 類庫(kù)項(xiàng)目,“MLanguage”為“Multi Language”的簡(jiǎn)寫(xiě),從字面上即體現(xiàn)出該模塊功能和多語(yǔ)言有關(guān)。
各功能模塊主要類的名稱與命名空間名稱差別僅在于前1-6個(gè)字符,這1-6個(gè)字符反應(yīng)出功能模塊類型。如CLR類型類庫(kù)項(xiàng)目功能模塊命名空間名前綴以字符“CLRDll”開(kāi)始,而類以字符“C”開(kāi)始。后面的字符基本相同,從字面上體現(xiàn)功能。如多語(yǔ)言功能模塊的命名空間名稱為“CLRMLanguage”,其主要類名為“CMLanguage”,從字面上很容易理解分別為多語(yǔ)言功能模塊命名空間名稱和多語(yǔ)言功能模塊主要實(shí)現(xiàn)類的名稱。
命名空間中的名稱均使用有意義的名稱,通過(guò)名稱基本能反映出具體的類型和用途。
(1)對(duì)于控件類型的變量,前3個(gè)字符一般為控件類型名的縮寫(xiě),后面的字符反應(yīng)變量的作用。如“mnuAlltrip”表示這是個(gè)菜單項(xiàng)的名稱,和跳閘功能有關(guān)。
(2)對(duì)于類的實(shí)例變量,變量名即為類名去掉前綴“C”(如果有)后余下部分的小寫(xiě)。如“commonfunc”為“CCommonFunc”類的實(shí)例。
(3)一般變量命名采用駱駝命名法規(guī)則,即混合使用大小寫(xiě)字母,第一個(gè)單詞以小寫(xiě)字母開(kāi)始,第二個(gè)單詞的首字母大寫(xiě)或每一個(gè)單詞的首字母都采用大寫(xiě)字母。如username,myFirstName。
各模塊對(duì)應(yīng)命名空間名稱如表1。
(1)多語(yǔ)言功能模塊
適應(yīng)軟件項(xiàng)目國(guó)際化的需要,實(shí)現(xiàn)多語(yǔ)言切換功能。
(2)數(shù)據(jù)庫(kù)功能模塊
根據(jù)系統(tǒng)設(shè)置中選擇的數(shù)據(jù)庫(kù)類型和位置提供相應(yīng)的數(shù)據(jù)連接支持,以實(shí)現(xiàn)數(shù)據(jù)的提取、添加、修改及刪除和統(tǒng)計(jì)等操作。
(3)串口通信功能模塊
實(shí)現(xiàn)串口通信控件及相關(guān)功能的封裝,二次開(kāi)發(fā)人員只需創(chuàng)建該模塊實(shí)例即可直接進(jìn)行串口通信相應(yīng)的設(shè)置、數(shù)據(jù)發(fā)送及接收等,而不用每次重復(fù)繁瑣的串口控件創(chuàng)建與管理。
(4)以太網(wǎng)通信功能模塊
實(shí)現(xiàn)以太網(wǎng)通信控件及相關(guān)功能的封裝,二次開(kāi)發(fā)人員只要?jiǎng)?chuàng)建該模塊的實(shí)例即可實(shí)現(xiàn)以太網(wǎng)通信相應(yīng)的設(shè)置、數(shù)據(jù)發(fā)送和接收及網(wǎng)絡(luò)監(jiān)聽(tīng)等功能。
(5)公共類功能模塊
將使用頻率較高的公用方法歸集到公共類功能模塊,方便維護(hù)或BUG查找及改進(jìn)。
(6)公用重寫(xiě)控件功能模塊
將使用頻率較高且需要進(jìn)行個(gè)性化定制的系統(tǒng)控件集中于此模塊進(jìn)行重寫(xiě)實(shí)現(xiàn),以便根據(jù)實(shí)際情況需要對(duì)此類控件的限制條件統(tǒng)一進(jìn)行調(diào)整。
(7)權(quán)限角色功能模塊
納入角色分級(jí)管理模式實(shí)現(xiàn)用戶權(quán)限的劃分。
(8)事件日志功能模塊
自動(dòng)記錄用戶每次操作并分類存檔。
表1 新一代保護(hù)軟件開(kāi)發(fā)平臺(tái)系統(tǒng)命名空間表
各模塊主要類如表2。
表2 新一代保護(hù)軟件開(kāi)發(fā)平臺(tái)系統(tǒng)主要類表
各個(gè)模塊都要用到公共類功能模塊,以公共功能模塊為例介紹系統(tǒng)的模塊實(shí)踐和跨命名空間(這里其實(shí)就是跨模塊)標(biāo)識(shí)符的調(diào)用方法。
(1)COMSetT枚舉
串口數(shù)據(jù)參數(shù)數(shù)據(jù)結(jié)構(gòu)枚舉,包含串口一般設(shè)置項(xiàng),枚舉項(xiàng)見(jiàn)圖2。
圖2 COMSetT枚舉(部分截圖)
(2)EvevtType枚舉
圖3 EvevtType枚舉(部分截圖)
列出事件/日志類型可能的列表,以便將事件按照所屬類型自動(dòng)分類,枚舉項(xiàng)見(jiàn)圖3。
(3)IniFile類
實(shí)現(xiàn)文本配置文件的讀寫(xiě),內(nèi)含IniKey和IniSection兩個(gè)類,類視圖見(jiàn)圖4。
圖4 IniFile類視圖(部分截圖)
(4)ComFunc類
實(shí)現(xiàn)不同數(shù)據(jù)類型轉(zhuǎn)換功能,類視圖部分轉(zhuǎn)換方法見(jiàn)圖5。
(5)CCommonFunc類
公共功能模塊的主類,類視圖部分截圖見(jiàn)圖6。
圖5 ComFunc類視圖(部分截圖)
圖6 CCommonFunc類視圖(部分截圖)
(6)跨命名空間標(biāo)識(shí)符使用
為簡(jiǎn)化代碼,使用其它命名空間的標(biāo)識(shí)符,可使用標(biāo)準(zhǔn)C++的using編譯指令來(lái)簡(jiǎn)化對(duì)命名空間中的名稱的使用,加入了“using namespace命名空間名稱”后就可以直接使用該命名空間中的標(biāo)識(shí)符了。當(dāng)然還可以使用using聲明來(lái)簡(jiǎn)化對(duì)其它命名空間中的名稱的使用[4]。
基于以上設(shè)計(jì),研發(fā)了新一代保護(hù)軟件開(kāi)發(fā)平臺(tái)系統(tǒng),并以此編寫(xiě)了以DGT801系列的發(fā)變組保護(hù)裝置PC機(jī)端數(shù)據(jù)定義為目的的測(cè)試樣例對(duì)其進(jìn)行了測(cè)試[5],測(cè)試結(jié)果見(jiàn)表3。
表3 新一代保護(hù)軟件開(kāi)發(fā)平臺(tái)系統(tǒng)測(cè)試結(jié)果
基于保護(hù)類軟件系統(tǒng)功能復(fù)雜,且對(duì)數(shù)據(jù)傳輸穩(wěn)定性、精確性要求高的特性,筆者選定VC++2010作為系統(tǒng)的開(kāi)發(fā)語(yǔ)言,測(cè)試結(jié)果表明此平臺(tái)系統(tǒng)完全符合保護(hù)產(chǎn)品PC機(jī)端軟件的二次開(kāi)發(fā)需求。
通過(guò)搭建一個(gè)性能卓越、技術(shù)先進(jìn)、安全可靠、易于擴(kuò)展、便以進(jìn)行快速二次開(kāi)發(fā)的基礎(chǔ)平臺(tái),為后期發(fā)變組保護(hù)軟件系統(tǒng)的升級(jí)換代及新產(chǎn)品開(kāi)發(fā)提供了有效的技術(shù)支撐和保障。
[1]霍頓.Visual C++2010入門(mén)經(jīng)典.5版[M].北京:清華大學(xué)出版社,2010.
[2]李瑞生,李燕斌,周逢權(quán).智能變電站功能架構(gòu)及設(shè)計(jì)原則[J].電力系統(tǒng)保護(hù)與控制,2010,38(21):24-27
[3]ISO/IEC14882,INTERNATION STANDARD of Programming languages-C++[S].
[4]吳克力.C++面向?qū)ο蟪绦蛟O(shè)計(jì) ——基于Visual C++2010[M].北京:清華大學(xué)出版社,2013.
[5]顏炯,王戟,陳火旺.基于模型的軟件測(cè)試綜述[J].計(jì)算機(jī)科學(xué),2004,31(2):184-187.