摘要:本論文采用面向?qū)ο蟮木幊谭椒?,以Visual C++6.0為工具,設(shè)計(jì)實(shí)現(xiàn)了變電站自動(dòng)化圖形界面模塊。
關(guān)鍵詞:變電站自動(dòng)化;VC++;圖形界面模塊
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)30-0643-03
Research and Design of the Graphical Interface Module of the Substation Automation Based on Visual C++
WU Su-hua1,2
(1.Jiangshu University, Zhenjiang 212003, China; 2.Zhenjiang College, Zhenjiang 212003, China)
Abstract: This article based on oop, realized in C++ with Visual C++6.0 develoPing tool, Research and design of the graphical interface module.
Key words: The Substation Automation; VC++; graphical interface module
1 引言
圖形界面模塊是變電站監(jiān)控組態(tài)軟件的一個(gè)重要組成部分,是生成單線圖和監(jiān)控畫(huà)面的設(shè)計(jì)工具。它以圖形方式對(duì)控制系統(tǒng)現(xiàn)場(chǎng)環(huán)境中客觀存在的事物進(jìn)行抽象,并且建立它們之間的關(guān)系,形成簡(jiǎn)潔、直觀的單線圖以及用戶與系統(tǒng)之間的交互圖。用戶可以直觀地掌握控制系統(tǒng)現(xiàn)場(chǎng)的運(yùn)行情況。因此,給用戶提供功能強(qiáng)大的圖形界面系統(tǒng)是非常必要。
2 圖形界面模塊簡(jiǎn)介
圖形界面系統(tǒng)是系統(tǒng)與工程人員交互的接口,是自動(dòng)化工程系統(tǒng)的調(diào)度中心和控制中心,它在變電站監(jiān)控軟件系統(tǒng)中一直起著極其重要的作用。圖形界面系統(tǒng)一般由兩部分組成:圖形開(kāi)發(fā)系統(tǒng)和圖形運(yùn)行系統(tǒng)[1-2]。
本文以VC++6.0為開(kāi)發(fā)工具主要討論圖形開(kāi)發(fā)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。
3 圖形開(kāi)發(fā)系統(tǒng)
3.1 圖形開(kāi)發(fā)系統(tǒng)的基本結(jié)構(gòu)
圖形開(kāi)發(fā)系統(tǒng)處于監(jiān)控組態(tài)軟件的上層,為用戶提供操縱底層數(shù)據(jù)源的圖形界面,是監(jiān)控組態(tài)軟件使用最為頻繁的部分。實(shí)踐表明,圖形開(kāi)發(fā)系統(tǒng)是否能夠提供強(qiáng)大的畫(huà)圖工具滿足用戶需求,已經(jīng)成為評(píng)價(jià)一個(gè)監(jiān)控組態(tài)軟件水平的重要指標(biāo)。圖形開(kāi)發(fā)系統(tǒng)包括以下四個(gè)方面的功能:
1) 圖形工具
圖形工具的主要功能是,根據(jù)用戶的選擇生成滿足需要的圖形對(duì)象,在此過(guò)程中需要處理一些重要的鼠標(biāo)事件,圖形的操作按照用戶最熟悉的方式進(jìn)行,以增強(qiáng)軟件對(duì)用戶的友好性。
2) 編輯工具
編輯工具的主要功能是針對(duì)圖形對(duì)象的剪切、拷貝、粘貼、刪除、旋轉(zhuǎn)、翻轉(zhuǎn)對(duì)齊、成組、解組等操作以及對(duì)用戶動(dòng)作的UNDO、REDO操作。該工具的目的是為了用戶組態(tài)的快捷性和方便性而設(shè)計(jì)的。這些工具都具有Windows的常用快捷鍵。
3) 屬性管理
畫(huà)圖對(duì)象的屬性大致分為以下幾個(gè)類別:
顏色:包括前景色、背景色和線色;
位置:包括左邊位置、上邊位置、寬度、高度等位置屬性;
風(fēng)格:包括前景風(fēng)格、背景風(fēng)格、線風(fēng)格以及線寬;
旋轉(zhuǎn):包括旋轉(zhuǎn)的角度、旋轉(zhuǎn)的中心;
視覺(jué):主要指圖形對(duì)象的可見(jiàn)行;
通用:包括對(duì)象的名稱、描述、及所在的圖層數(shù)。屬性管理處理的主要是對(duì)象以上屬性的設(shè)置、修改、保存功能。
4) 動(dòng)畫(huà)連接
動(dòng)畫(huà)連接主要是對(duì)監(jiān)控組態(tài)程序的運(yùn)行態(tài)而言的,其主要功能是對(duì)圖形對(duì)象的各種屬性如位置、顏色、旋轉(zhuǎn)等進(jìn)行動(dòng)態(tài)設(shè)定。在運(yùn)行態(tài)時(shí)能使該對(duì)象的屬性隨現(xiàn)場(chǎng)的實(shí)時(shí)數(shù)據(jù)變化而變化,給操作人員以直觀而明顯的提示。動(dòng)態(tài)畫(huà)連接包括以下內(nèi)容:
畫(huà)圖對(duì)象的屬性大致分為以下幾個(gè)類別:前景色顏色、背景色顏色和邊框顏色的動(dòng)態(tài)設(shè)定;左邊位置、上邊位置、寬度、高度等位置屬性的動(dòng)態(tài)設(shè)定;前景風(fēng)格、背景風(fēng)格、線風(fēng)格以及線寬的動(dòng)態(tài)設(shè)定;旋轉(zhuǎn)的角度、旋轉(zhuǎn)的中心的動(dòng)態(tài)設(shè)定;可見(jiàn)性的動(dòng)態(tài)設(shè)定;按鈕的功能以及動(dòng)態(tài)設(shè)定,可用來(lái)完成相應(yīng)的動(dòng)作或數(shù)據(jù)輸入;實(shí)時(shí)數(shù)據(jù)框的動(dòng)態(tài)設(shè)定,可用來(lái)顯示現(xiàn)場(chǎng)的數(shù)據(jù)和輸入設(shè)定數(shù)據(jù);滾動(dòng)條,曲線的動(dòng)態(tài)設(shè)定,可用來(lái)直觀設(shè)定數(shù)據(jù)并顯示實(shí)時(shí)數(shù)據(jù)。
3.2 圖形工具設(shè)計(jì)
3.2.1 基本圖元
繪制和編輯不同類型的圖元是變電站監(jiān)控軟件最基礎(chǔ)、也是最重要的功能。然而變電站一次、二次線路圖等涉及的電力圖元種類繁多,如果用簡(jiǎn)單的圖元生成工作量非常大。但是仔細(xì)分析電力設(shè)備圖元的顯示和實(shí)現(xiàn)方法,就會(huì)發(fā)現(xiàn),很多圖元都有共性,例如文字描述、矩形邊框和位圖都需要兩個(gè)點(diǎn)確定位置,選中時(shí)都顯示四個(gè)點(diǎn)的邊框等,它們的平移、縮放操作都是通過(guò)改變坐標(biāo)來(lái)實(shí)現(xiàn)的。這一系列的共性正好便于我們采用面向?qū)ο蟮乃枷牒头椒ㄟM(jìn)行設(shè)計(jì)和操作。通過(guò)分析,可以利用類的繼承性質(zhì)和虛函數(shù)的方法來(lái)實(shí)現(xiàn)圖元的共性,先從一個(gè)基類CDraw派生出幾個(gè)大的類,具體的圖元類再依次從這幾類派生出來(lái),這樣便會(huì)形成一個(gè)類的結(jié)構(gòu)層次樹(shù)[4]。
在基本圖元之下,我們根據(jù)圖元的復(fù)雜程度分為簡(jiǎn)單圖元、特殊圖元和復(fù)雜圖元。在簡(jiǎn)單圖元中包括直線類、文本類等;特殊圖元包括變壓器類、熔斷器類等;復(fù)雜圖元包括趨勢(shì)類和報(bào)警類等。
通用類CDraw的定義如下:
class CDrwa:public CObject//繼承來(lái)自基本對(duì)象CObject
{
public:
COLORREF m_Color;//顏色
int m_Order;//圖元序號(hào)
CString m_Name;//圖元名稱
CString m_Lable;//圖元標(biāo)簽
CRect m_Rect;//繪制圖元的矩形大小
……//其他屬性
public:
//繪制圖形函數(shù),其他子類重載
virtual void OnDraw(CDC*pDC);
virtual void OnOpen();//雙擊圖元打開(kāi)動(dòng)態(tài)連接對(duì)話框
virtual void Serialize(CArchivear);//序列化
//其他函數(shù)略
各種子類從圖元基類繼承基本屬性,然后加上了各自圖元的專用屬性,如文本類中,會(huì)加上表示文本內(nèi)容的成員變量。
3.2.2 圖形工具的實(shí)現(xiàn)
圖形工具的實(shí)現(xiàn)包括:畫(huà)bmp圖形作為工具欄按鈕的圖標(biāo);制作類似于Word
的任意浮動(dòng)的工具欄;編寫(xiě)點(diǎn)擊工具欄中按鈕的事件,繪圖功能的實(shí)現(xiàn)四個(gè)步驟。
現(xiàn)逐步介紹如下:
1) 畫(huà)bmp圖形作為工具欄按鈕的圖標(biāo)
在Resource View中,雙擊Toolbar中的IDR_MAINFRAME項(xiàng),就會(huì)顯示主界面中工具欄的編輯窗口,在其中添加需要制作的圖元的工具欄按鈕,畫(huà)bmp圖形作為工具欄按鈕的圖標(biāo)。工具欄按鈕的ID設(shè)計(jì)為ID_DRAW_LINE、ID_DRAW_TEXT、ID_DRAW_TRANS、ID_DRAW_FUSE、ID_DRAW_TRENDS、ID_DRAW_ALARM等。添加的工具欄按鈕的作用是向繪圖對(duì)象的鏈表m ObjectList中添加直線、文本、變壓器、熔斷器、趨勢(shì)、報(bào)警等圖元。
2) 制作類似于Word的任意浮動(dòng)的工具欄
只需要簡(jiǎn)單的編程就可以實(shí)現(xiàn)任意浮動(dòng)的工具欄,設(shè)計(jì)如下:
if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE
|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|
CBRS_SIZE_DYNAMIC)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
//設(shè)置工具欄的屬性
{
TRACE0(\"Failed to create toolbar\\");
return-1;//fail to create
}
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);//實(shí)現(xiàn)任意停靠
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(m_wndToolBar);
3) 編寫(xiě)點(diǎn)擊工具欄中按鈕的事件
打開(kāi)C1assWizard,在Message Maps選項(xiàng)頁(yè),選擇類名為CMyDrawView,ObjectIds分別ID_DRAW_LINE、ID_DRAW_TEXT、ID_DRAW_TRANSID_DRAW_FUSE、
ID_DRAW_TRENDS、ID_DRAW_ALARM等,選擇Messages為COMMAND,單擊添加函數(shù)按鈕即可添加工具欄按鈕的響應(yīng)函數(shù),在其中添加如下代碼:
void CMyDrawView::OnButtonLinen
{
//TODO:Add your command handler code here
CLine*pLine=new CLine;
m_ObjectList.AddTail(pLine);
Invalidate;
}
……
4) 繪圖功能的實(shí)現(xiàn)
圖形組態(tài)開(kāi)發(fā)環(huán)境中的每一種畫(huà)圖工具的功能都是通過(guò)一個(gè)類來(lái)實(shí)現(xiàn)的。因此,系統(tǒng)定義了CLine,CText,CTran,CFuse,CTrends,CAlarm等類來(lái)分別實(shí)現(xiàn)畫(huà)直線、文本、變壓器、熔斷器,趨勢(shì),報(bào)警等功能。下面以類CLine為例來(lái)說(shuō)明如何實(shí)現(xiàn)畫(huà)直線的功能,其余與之類似。類CLine的結(jié)構(gòu)如下:
class CLine:public CDraw
{
public:
int StartX;
int StartY;//直線的起點(diǎn)x,y坐標(biāo)
int EndX;
int EndY;//直線的終點(diǎn)x,y坐標(biāo)
int m_LineWidth;//線寬
int m_LineColor;//線的顏色
BOOL bChangeCol;//是否允許修改線顏色
BOOL bVisible;//是否允許修改可見(jiàn)屬性
public:
void DrawLine(CDC*pDC);
virtual void PasteMove();
CLine();//構(gòu)造函數(shù)
CLine(int startx,int starty,int endx,int endy,COLORREF linecolor,int linewidth);
~CLine();//析構(gòu)函數(shù)
……}
3.3 編輯工具設(shè)計(jì)
3.3.1 刪除、拷貝、剪切和粘貼
刪除的實(shí)現(xiàn)過(guò)程為:1)從畫(huà)面圖元鏈表中移走檢取的圖元并釋放其內(nèi)存空間;2)通知編輯環(huán)境重繪畫(huà)面。其余三個(gè)操作需要中間變量的支持。編輯環(huán)境中專門設(shè)置了一個(gè)中間變量鏈表,用于保存拷貝和剪切的圖元??截惡图羟兄跋惹蹇真湵?。然后調(diào)用檢取對(duì)象的Clone()函數(shù),返回一份該對(duì)象的完整拷貝,并將其置于中間變量鏈表中。對(duì)于剪切,隨后還要做一步和刪除相同的工作。粘貼的時(shí)候從中間變量鏈表中獲取其成員圖元的一份深拷貝,將其加入畫(huà)面的圖元鏈表中。需要注意的是這時(shí)候并不能清除中間變量鏈表,因?yàn)橥瑯拥恼迟N工作可能需要做不止一次。
3.3.2 旋轉(zhuǎn)
旋轉(zhuǎn)函數(shù)Rotate包含兩個(gè)參數(shù),一個(gè)是MyPoint(旋轉(zhuǎn)參考點(diǎn)),一個(gè)是angle(旋轉(zhuǎn)角度)。函數(shù)功能即為計(jì)算圖元各個(gè)關(guān)鍵坐標(biāo)點(diǎn)(比如,圓的圓心,矩形的四個(gè)頂點(diǎn)等)相對(duì)旋轉(zhuǎn)參考點(diǎn)旋轉(zhuǎn)angle角度后的新坐標(biāo)。旋轉(zhuǎn)的實(shí)現(xiàn)也是通過(guò)異或方式擦處旋轉(zhuǎn)前的圖形,然后調(diào)用各個(gè)圖元的Rotate函數(shù)改變關(guān)鍵坐標(biāo)點(diǎn)的坐標(biāo),然后再調(diào)用Draw函數(shù)在新位置畫(huà)出旋轉(zhuǎn)后的結(jié)果。
3.4 屬性管理設(shè)計(jì)
圖形對(duì)象創(chuàng)建完畢后,往往還需要對(duì)其作進(jìn)一步的調(diào)整和修改,有些對(duì)象的關(guān)鍵屬性就是在創(chuàng)建完畢以后通過(guò)進(jìn)一步的屬性設(shè)置得到的。比如圖片對(duì)象,創(chuàng)建的時(shí)候只是為他規(guī)定了顯示的區(qū)域,要等到設(shè)置好對(duì)應(yīng)的圖片文件后才能顯示出來(lái)。對(duì)于位置和大小這樣的外部屬性,實(shí)現(xiàn)的時(shí)候通過(guò)鼠標(biāo)選中相應(yīng)對(duì)象進(jìn)行進(jìn)一步的的指點(diǎn)和拖放操作來(lái)完成。對(duì)于線型、字體、曲線顏色等復(fù)雜的內(nèi)部屬性設(shè)置,則通過(guò)調(diào)用控件屬性對(duì)話框來(lái)進(jìn)行[3]。
3.5 動(dòng)畫(huà)連接設(shè)計(jì)
變電站監(jiān)控軟件系統(tǒng)為了在組態(tài)軟件運(yùn)行時(shí)實(shí)現(xiàn)動(dòng)畫(huà)效果,需要在圖形開(kāi)發(fā)系統(tǒng)下組態(tài)時(shí)定義動(dòng)畫(huà)連接,即在需要實(shí)現(xiàn)動(dòng)畫(huà)的圖形對(duì)象與系統(tǒng)變量之間建立一個(gè)聯(lián)系,讓工作站運(yùn)行軟件了解某一個(gè)圖形對(duì)象應(yīng)該根據(jù)系統(tǒng)哪一變量的數(shù)值動(dòng)作。當(dāng)用戶需要為某一圖形對(duì)象建立動(dòng)畫(huà)連接時(shí),只需讓鼠標(biāo)指向該對(duì)象,雙擊鼠、標(biāo)左鍵,此時(shí)會(huì)彈出一個(gè)動(dòng)畫(huà)連接對(duì)話框,在此對(duì)話框內(nèi),輸入與此圖形對(duì)象相聯(lián)系的一個(gè)變量名即可。利用動(dòng)畫(huà)連接對(duì)話框,系統(tǒng)將生成一系列組態(tài)信息,并將他們保存在數(shù)據(jù)文件中,供工作站運(yùn)行軟件調(diào)用。
4 結(jié)束語(yǔ)
本論文采用面向?qū)ο蟮木幊谭椒ǎ訴isual C++6.0為工具,利用多文檔、矢量制圖等技術(shù),設(shè)計(jì)實(shí)現(xiàn)了整個(gè)組態(tài)圖形界面系統(tǒng)。其中將圖形開(kāi)發(fā)系統(tǒng)分為圖元工具、編輯工具、屬性編輯、動(dòng)畫(huà)連接四個(gè)功能塊進(jìn)行設(shè)計(jì)實(shí)現(xiàn),大大降低了設(shè)計(jì)難度。
參考文獻(xiàn):
[1] 李書(shū)娟. 面向?qū)ο蟮碾娏D形系統(tǒng)的研究與開(kāi)發(fā)[D]. 武漢:武漢理工大學(xué),2005.
[2] 楊少波. 定制Visual C++應(yīng)用程序用戶界面技術(shù)[J]. 計(jì)算機(jī)系統(tǒng)應(yīng)用,1998(7):44-46.
[3] 畢文彬. 嵌入式圖形組態(tài)軟件的研究與開(kāi)發(fā)[D]. 大連:大連理工大學(xué),2005.
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文