摘要:近年來,用電需求量的不斷增加,火電單元機組不斷向大容量、高參數(shù)方向發(fā)展。為保證機組運行的安全性、經(jīng)濟性和穩(wěn)定性,機組運行的難度也相應(yīng)地增加,以往用常規(guī)儀表進行過程監(jiān)控的辦法已經(jīng)不能適應(yīng)大機組安全經(jīng)濟運行,代之而起的是以4C技術(shù)(計算機Computer、通訊Communication、控制Control、顯示終端CRT)為基礎(chǔ)發(fā)展起來的集散控制系統(tǒng)。因而新建機組及一些老機組的改造都無一例外地采用了DCS(集散控制系統(tǒng))。重點介紹了如何有效的實現(xiàn)利用組件對象模型技術(shù)(COM技術(shù))、面向?qū)ο蠹夹g(shù)和可視化軟件的實現(xiàn)方法開發(fā)研制了組態(tài)軟件,在火電機組中的一個DCS的實例應(yīng)用。
關(guān)鍵詞:組態(tài)軟件;火電機組;DCS;實例設(shè)計
中圖分類號:TP311文獻標(biāo)識碼:A 文章編號:1009-3044(2008)33-1522-03
為了滿足國民經(jīng)濟迅速增長帶來的用電需求量的不斷增加,提高電力工業(yè)生產(chǎn)的經(jīng)濟效益,火電單元機組不斷向大容量、高參數(shù)方向發(fā)展。隨著機組容量的增大,為了保證機組運行的安全性、經(jīng)濟性和穩(wěn)定性,機組運行的難度也相應(yīng)地增加,運行過程中需要監(jiān)督控制的參數(shù)越來越多,以往用常規(guī)儀表進行過程監(jiān)控的辦法已經(jīng)不能適應(yīng)大機組安全經(jīng)濟運行,代之而起的是以4C技術(shù)為基礎(chǔ)發(fā)展起來的集散控制系統(tǒng)。因而新建機組及一些老機組的改造都無一例外地采用了DCS(集散控制系統(tǒng))。
1 集散控制系統(tǒng)及其組態(tài)軟件設(shè)計思想
集散控制系統(tǒng)的實質(zhì)是利用計算機技術(shù)對生產(chǎn)過程進行集中監(jiān)視、操作、管理和分散控制,實現(xiàn)危險分散。集散控制系統(tǒng)概括起來由集中管理部分、分散控制監(jiān)測部分和通訊部分組成。集散控制系統(tǒng)軟件部分是由實時多任務(wù)操作系統(tǒng)、數(shù)據(jù)庫管理系統(tǒng)、組態(tài)軟件和各種應(yīng)用軟件所組成,其中組態(tài)軟件的概念是設(shè)計的重點。
集散控制系統(tǒng)的軟件一般是較為成熟的模塊化結(jié)構(gòu),系統(tǒng)的圖形顯示功能、數(shù)據(jù)庫管理功能、控制運算功能和歷史存儲功能等全有成熟的軟件模塊。但通常不同的應(yīng)用對象,對這些內(nèi)容要求有較大的區(qū)別。所以一般的DCS提供一個(或一組)功能很強的軟件工具包,即組態(tài)軟件。該組態(tài)軟件提供友好的用戶界面,使用戶在不需要編寫什么程序代碼的情況下,便可生成自己需要的應(yīng)用軟件。
隨著分布式計算機控制系統(tǒng)的發(fā)展,人們越來越注重系統(tǒng)的軟件組態(tài)和配置功能,即系統(tǒng)中配有一套功能十分齊全的組態(tài)生成工具軟件。組態(tài)軟件應(yīng)當(dāng)具有很強的通用性,能夠適用于一大類應(yīng)用對象,而且系統(tǒng)的執(zhí)行程序代碼部分一般是固定不變的,為使用不同的應(yīng)用對象只需由組態(tài)軟件生成不同的數(shù)據(jù)實體(包括圖形文件、報表文件、數(shù)據(jù)庫文件、腳本文件等)即可。這樣,既大大提高了系統(tǒng)的成套速度,又保證了系統(tǒng)軟件的成熟性和可靠性。
2 實時監(jiān)控系統(tǒng)及其組態(tài)生成系統(tǒng)
從國外引進的大機組及其配套的DCS系統(tǒng)固然有其無可比擬的優(yōu)越性,但代價十分昂貴。在現(xiàn)有機組上進行技術(shù)改造,提高機組的自動化水平,減少工人的勞動強度,增加系統(tǒng)運行的安全性、經(jīng)濟性,對大多數(shù)電廠來說是一條切實可行的途徑。國內(nèi)許多根據(jù)集散控制系統(tǒng)的設(shè)計思想開發(fā)的實時監(jiān)控系統(tǒng),其功能相當(dāng)于集散控制系統(tǒng)的一個子集,能夠根據(jù)電廠生產(chǎn)的實際需要和資金狀況進行靈活配置。在這些實時監(jiān)控系統(tǒng)中,無論是計算機控制系統(tǒng),還是數(shù)據(jù)采集系統(tǒng)(DAS系統(tǒng)),直接的流程畫面顯示和實時數(shù)據(jù)庫都是必不可少的功能。利用顯示實時數(shù)據(jù)庫數(shù)據(jù)的過程監(jiān)控畫面來代替?zhèn)鹘y(tǒng)的龐大的模擬儀表屏,使得運行人員不需要時刻在排列的儀表盤上檢查各儀表的數(shù)據(jù),或巡視整個模擬屏來得到生產(chǎn)過程的運行情況,而只需輕松地坐在CRT終端前面就可以觀看整個流程的工作概況,又可以逐層細化入微,觀察每個調(diào)節(jié)回路的工作細節(jié),即利用計算機強大的信息處理能力,實現(xiàn)系統(tǒng)的集中管理和顯示。實時監(jiān)控系統(tǒng)的過程監(jiān)控畫面不但可以顯示生產(chǎn)過程的流程圖和實時數(shù)據(jù),還可以支持各種趨勢圖、棒圖的顯示、報表的顯示和打印以及報警信息和操作指導(dǎo)等。
對一幅實時監(jiān)控畫面進行分析,可以發(fā)現(xiàn)它是由許多符號組成的,如流程畫面中的各種設(shè)備表示,進一步分解發(fā)現(xiàn)它是由許多基本的幾何圖形組成的,如直線、折線、矩形、多邊形、圓、橢圓、文本等,這些基本的圖形被稱為圖形中的圖元。圖元具有一些屬性,如邊線的顏色、粗細、類型,內(nèi)部填充的顏色以及在顯示器上的顯示位置等,另外,實時監(jiān)控系統(tǒng)畫面還須有動態(tài)顯示屬性,如開關(guān)符號根據(jù)實時參數(shù)的變化呈現(xiàn)打開或閉合狀態(tài)、棒圖的動態(tài)填充、曲線的連續(xù)變化等等。編制一幅監(jiān)控畫面時需要加入上述的靜態(tài)和動態(tài)的屬性特征。
“設(shè)備”包含五個子項目:“COM1”、“COM2”、“DDE”、“板卡”和“網(wǎng)絡(luò)節(jié)點”。主要是支持與I/O設(shè)備的四種通訊方式:串行通訊方式、DDE(動態(tài)數(shù)據(jù)交換)方式、板卡方式和網(wǎng)絡(luò)節(jié)點通訊方式。
“系統(tǒng)配置”包含七個子項目:“設(shè)置開發(fā)系統(tǒng)”、“設(shè)置運行系統(tǒng)”、“報警配置”、“網(wǎng)絡(luò)配置”、“用戶配置”、“打印配置”和“歷史數(shù)據(jù)記錄”,主要是對以上七個方面設(shè)置一些配置信息。
3 控制系統(tǒng)(Make)實例
功能方面對本圖形組態(tài)軟件進行了劃分,它從功能上可以分為四大模塊:工程管理器、畫面開發(fā)系統(tǒng)、畫面運行系統(tǒng)和實時數(shù)據(jù)庫。其中子系統(tǒng)畫面開發(fā)系統(tǒng)主要由菜單、固定工具條、繪圖工具箱和畫面編輯窗口組成,如圖2所示。
3.1 菜單
菜單分為“文件”、“編輯”、“查看”、“排列”、“工具”、“顏色”、“幫助”和“畫面”8個主菜單。“畫面”菜單列表顯示已經(jīng)打開所有的畫面(顯示內(nèi)容為畫面名稱),并可方便地在各畫面之間進行切換。
4 組態(tài)軟件的技術(shù)實現(xiàn)
下面將從MFC提供的基本應(yīng)用程序框架入手,詳細介紹工程瀏覽器和畫面開發(fā)系統(tǒng)的圖元類庫、文檔類、視圖類和實時數(shù)據(jù)庫的實現(xiàn)技術(shù)。
程序框架及框架類:本組態(tài)軟件系統(tǒng)具體實現(xiàn),是在Visual C++ 6.0平臺上利用系統(tǒng)工具生成的比較重要的程序框架基礎(chǔ)類。
利用Visual C++ 6.0工作平臺的AppWizard為本系統(tǒng)建立一個名為Make的項目(Project),并生成具有以下特征的應(yīng)用框架:

圖1 工業(yè)控制計算機系統(tǒng)組態(tài)軟件功能
1) 多文檔界面(MDI:Multiple Documents Interface),支持文檔視圖結(jié)構(gòu);
2) 既是OLE容器又是OLE服務(wù)器,支持ActiveX文檔和ActiveX控件;
3) 在程序主框架中初始化工具條和狀態(tài)條;
4) 在視圖中支持打印和打印預(yù)覽;生成源文件中加入注釋;
5) 生成的是MFC標(biāo)準(zhǔn)類型的項目;使用動態(tài)連接的MFC類庫。
AppWizard為本系統(tǒng)生成出九個類,其中應(yīng)用類、主框架窗口類、子框架窗口類、視圖類和文檔類構(gòu)成了一個多文檔應(yīng)用程序的主要部分。這五個主要的類通過調(diào)用相互的公共成員函數(shù)以及傳遞消息,進行相互間的通訊和數(shù)據(jù)交換。表4.1簡述了本系統(tǒng)中四種主要類的特征。
在程序框架中,上述五個主要的類除繼承其父類全部可繼承的功能以外,還重載了一些虛擬函數(shù)和添加了一些其他函數(shù)。下面對這部分成員函數(shù)進行說明:
4.1 CMakeApp
CMakeApp由CWinApp派生,是應(yīng)用程序類。完成應(yīng)用程序?qū)嵗某跏蓟⒌怯浳臋n模板、生成主窗口及系統(tǒng)的退出結(jié)束處理等。其重載函數(shù)包括:
1) 構(gòu)造函數(shù)CMakeApp():構(gòu)造應(yīng)用程序?qū)嵗龑ο螅?/p>
2) 虛函數(shù)InitInstance():初始化應(yīng)用程序?qū)嵗俅诵枰怯泴⑹褂玫奈臋n模板。文檔模板提供了MFC用來將文檔、視圖和框架窗口結(jié)合在一起的框架結(jié)構(gòu),實際上是文檔模板為應(yīng)用程序創(chuàng)建新文檔和新視圖。文檔模板常以兩種形式出現(xiàn):用于單文檔(SDI)程序的CSingleDocTemplate和用于多文檔(MDI)程序的CMultiDocTemplate。本組態(tài)軟件使用的是多文檔模板,主框架窗口也是以此模板為基礎(chǔ)生成。其實現(xiàn)代碼如下:
pDocTemplate = new CMultiDocTemplate(
IDR_MAKETYPE,
RUNTIME_CLASS(CDrawDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CDrawView));
AddDocTemplate(pDocTemplate);
m_pDrawTemplate=pDocTemplate;
m_pDrawTemplate是應(yīng)用程序?qū)ο蟮墓谐蓡T變量,其他類的對象可以通過應(yīng)用程序?qū)ο髞砣〉迷撐臋n模板,從而可以新建、打開文件等。
由于工程瀏覽器需要通過COM接口訪問實時數(shù)據(jù)庫對象來訪問存放數(shù)據(jù)點信息的Access數(shù)據(jù)庫,所以在初始化函數(shù)中需要對COM庫進行初始化:
CoInitialize(NULL); //初始化COM庫
工程瀏覽器與畫面開發(fā)系統(tǒng)是不同的兩個框架窗口,主窗口是畫面開發(fā)系統(tǒng),因而在初始化過程中還需要創(chuàng)建工程瀏覽器的框架窗口,工程瀏覽器框架窗口類是通過ClassWizard工具從CFrameWnd繼承,關(guān)于工程瀏覽器窗口類將后面介紹。在此新建CProjectFrame的一個對象(即窗口)并顯示,代碼如下:

圖2 畫面開發(fā)系統(tǒng)用戶界面
CProjectFrame * pProjectFrame=new CProjectFrame;
if(!pProjectFrame->LoadFrame(IDR_PROJECTFRAME))
return FALSE;
m_pProjectFrame=pProjectFrame;
pProjectFrame->ShowWindow(SW_SHOWMAXIMIZED);
pProjectFrame->UpdateWindow();
其中m_pProjectFrame是應(yīng)用程序?qū)ο蟮墓谐蓡T變量,其他類的對象可以通過應(yīng)用程序?qū)ο髞砣〉迷摽蚣軐ο蟆?/p>
程序開始運行時并不需要打開新的文檔,而自動生成的程序框架在程序啟動時會新建一個文檔,在InitInstance()中加入以下代碼:
if(CCommandLineInfo::FileNew==cmdInfo.m_nShellCommand)
cmdInfo.m_nShellCommand=cmdInfo.FileNothing; //啟動時不打開文檔
3) 虛函數(shù)ExitInstance():程序退出時進行一些清理工作。由于在InitInstance()中對COM庫進行了初始化,因而在程序退出時需釋放COM庫所占的資源,代碼為:
CoUninitialize();//釋放COM庫使用的資源
CMakeApp只有一個且只能有一個對象實例,即整個應(yīng)用程序,定義為:
CMakeApp theApp;
4.2 CMainFrame
CMainFrame是由CMDIFrameWnd類派生的主框架窗口類,管理畫面開發(fā)系統(tǒng)的程序窗口,顯示有一個標(biāo)題欄、菜單欄、窗口最大化、最小化和關(guān)閉按鈕、邊框、固定工具條、浮動工具條和狀態(tài)欄,其客戶區(qū)顯示子窗口。其初始成員函數(shù)包括:
構(gòu)造函數(shù)CMainFrame();析構(gòu)函數(shù)~CMainFrame();
消息映射函數(shù)OnCreate():響應(yīng)系統(tǒng)消息WM_CREATE,該消息在Windows系統(tǒng)創(chuàng)建主窗口時傳送,在該函數(shù)中,先調(diào)用基類(CMDIFrameWnd)的OnCreate(),然后再創(chuàng)建工具條和狀態(tài)條。
4.3 CChildFrame
CChildFrame是由CMDIChildWnd類派生的子框架類,其客戶區(qū)即為觀察窗口。
構(gòu)造函數(shù)CChildFrame();析構(gòu)函數(shù)~CChildFrame();
虛函數(shù)PreCreateWindow():用于在創(chuàng)建窗口前改變窗口的樣式。

圖3程序執(zhí)行步驟
4.4 CDrawView
CDrawView是由滾動視圖CScrollView派生而來,其初始成員函數(shù)包括:
構(gòu)造、析構(gòu)函數(shù);
GetDocument():一個視圖只能與一個文檔相聯(lián)系,該函數(shù)返回與該視圖相聯(lián)系的文檔類對象指針,返回類型為CDrawDoc *,即CDrawDoc類對象的指針;
虛函數(shù)OnInitialUpdate():是視圖的初始化函數(shù);
虛函數(shù)OnDraw():用于更新視圖窗口;
以上簡單介紹了AppWizard為本組態(tài)軟件生成的主要類的基本功能,并對本軟件應(yīng)用類作了較為詳細的介紹。其中,對文檔類的派生類CDrawDoc的成員和功能擴充后,就可實現(xiàn)畫面開發(fā)系統(tǒng)的文檔管理器功能;對視類CDrawView、主框架類CMainFrame、子框架類CChildFrame進行擴展,并與一些另外定義圖元類、圖元工具類相結(jié)合即可實現(xiàn)畫面開發(fā)系統(tǒng)的編輯環(huán)境;工程瀏覽器則是由自定義的框架類和視圖類來實現(xiàn)。
從應(yīng)用框架的角度來講,本組態(tài)軟件的執(zhí)行步驟如圖3所示:
1) 調(diào)用CWinApp類構(gòu)造函數(shù);
2) 程序入口函數(shù)WinMain()接收控制,調(diào)用InitInstance()函數(shù)進行初始化,創(chuàng)建工程瀏覽器和畫面開發(fā)系統(tǒng)框架;
3) WinMain()進入處理消息的循環(huán);
4) 用戶可以通過菜單命令啟動畫面運行系統(tǒng);
5) WinMain()退出,程序終止執(zhí)行;
6) 如果啟動了畫面運行系統(tǒng)View,可終止View。
其中,程序入口函數(shù)WinMain()是在MFC內(nèi)定義的。
5 結(jié)束語
在本組態(tài)軟件的設(shè)計過程中,充分體現(xiàn)了面向組件對象的設(shè)計思想,將畫面的開發(fā)、運行和實時數(shù)據(jù)庫可分成不同的模塊,通過COM接口實現(xiàn)相互訪問,在軟件擴充時只需加入不同功能的模塊并實現(xiàn)相應(yīng)的接口,使本組態(tài)軟件有較好的可擴充性;本軟件采用了面向COM和面向?qū)ο蟮脑O(shè)計方法,在COM庫和MFC類庫的強大功能支持下開發(fā)完成,將各個模塊的方法和數(shù)據(jù)封裝在一起,并大量繼承了MFC類庫中經(jīng)過很多測試的類,大大提高了系統(tǒng)的穩(wěn)定和可靠性;由于COM支持聚合和包容,MFC中的各個類支持類的繼承,每個圖元有自己的方法和屬性,所以本系統(tǒng)也具有較好的可擴充性。
本組態(tài)軟件除了用于火電廠監(jiān)控系統(tǒng),同樣可用作其它監(jiān)控系統(tǒng)的組態(tài);除了用于專用系統(tǒng)的圖形組態(tài)外,本軟件也可以作為通用的繪圖工具軟件來使用。因此具有較廣泛的實用價值。本次開發(fā)只是建立了一個組態(tài)軟件的框架,實現(xiàn)了組態(tài)軟件的一些基本功能,還需要在實際應(yīng)用中通過擴充手段不斷豐富和加強。
參考文獻:
[1] David J.Kruglinski,Scot Wingo,George Shepherd,著Visual C++ 6.0 技術(shù)內(nèi)幕(第5版)[M].希望圖書創(chuàng)作室,譯.北京:希望電子出版社,1999.
[2] 程文斌,王一行,等.C庫函數(shù)和MFC庫類詳解[M].北京:航空航天大學(xué)出版社,1995.
[3] 王葉,葉愛亮,祁立學(xué).Visual C++ 6.0 編程實例與技巧[M].北京:機械工業(yè)出版社,1999.
[4] Chuck Wood著.Visual C++ 6.0數(shù)據(jù)庫編程大全[M].梁普選,梁津,劉玉芬,等譯.北京:電子工業(yè)出版社,2000.
[5] Steve Oualline著.實用C++編程大全[M].辛運幃,吳拉朵,譯.北京:電子工業(yè)出版社,1997.
[6] John E.Swanke著.Visual C++ MFC擴展編程實例[M].前導(dǎo)譯.北京:機械工業(yè)出版社,2000.
[7] Kate Gregory著.Visual C++ 6 開發(fā)使用手冊[M].前導(dǎo)譯.北京:機械工業(yè)出版社,1998.
[8] James L.Conger著.Microsoft Windows API大全[M].沈民,張燕,譯.北京科海培訓(xùn)中心,1997.
[9] 木林森,等.Visual C++ 6.0使用與開發(fā)[M].北京:清華大學(xué)出版社,1998.
[10] Richard C.Leinecker,Jamie Nye著.Visual C++開發(fā)工具使用指南[M].廖安隸,等譯.北京:機械工業(yè)出版社,1997.
[11] 顧良士,朱學(xué)武,張衛(wèi),等.InTouch人機接口應(yīng)用生成程序[M].北京:學(xué)苑出版社,1993.