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