Visual C++6.0[1]是Microsoft公司Visual Studio系列的一個重要產(chǎn)品,是一個功能強(qiáng)大的信息可視化開發(fā)工具。它的開發(fā)環(huán)境包含文本編輯器(Text Editor)、資源編輯器(Resource Editor)、源代碼瀏覽器(SourceCode Browser)、C/C++編譯器(C/C++ Compiler)、調(diào)試器(Debugger)、連接器(Linker)及MSDN在線幫助系統(tǒng)等。
為了幫助編程者處理通常復(fù)雜而又繁瑣的有關(guān)Windows的工作,Visual C++ 6.0設(shè)計了一套類庫(MFC ) , 把軟件開發(fā)平臺SDK (SoftwareDevelopment Kit)中的大多數(shù)內(nèi)容封裝成為各種類。有了MFC,編程人員可以充分發(fā)揮C++的優(yōu)勢,專注于程序的特殊部分,不需重復(fù)處理Windows必須處理的復(fù)雜工作,提高了編程效率和代碼效率。MFC應(yīng)用程序向?qū)?AppWizard)和MFC類向?qū)?ClassWizard)是Visual C++ 6.0最重要的兩大開發(fā)工具。Visual C++ 6.0應(yīng)用程序的創(chuàng)建過程如圖1所示。
圖1 Visual C++ 6.0應(yīng)用程序創(chuàng)建過程
Visual C++ 6.0作為一種通用程序開發(fā)系統(tǒng),以其強(qiáng)大的數(shù)據(jù)采集、數(shù)據(jù)處理、數(shù)據(jù)分析功能在現(xiàn)代測控領(lǐng)域中得到了廣泛的應(yīng)用。在對硬件的支持方面,Visual C++ 6.0集成了與RS-232/485、PLC和插入式數(shù)字采集設(shè)備等進(jìn)行數(shù)據(jù)通信的全部功能,利用Windows技術(shù)的優(yōu)點,在Visual C++ 6.0開發(fā)平臺下,設(shè)計了船舶電站實時監(jiān)控系統(tǒng)。
船舶電站[2]實時監(jiān)控系統(tǒng)由PC機(jī)、單片機(jī)和RS-485總線組成兩級控制模式,軟件協(xié)議采用支持RS-485網(wǎng)絡(luò)的Modbus ASCII[3]協(xié)議,數(shù)據(jù)存儲用ACCESS 2003[4]數(shù)據(jù)庫(圖2)。
圖2 船舶電站柴油發(fā)電機(jī)組監(jiān)控系統(tǒng)結(jié)構(gòu)框圖
由于工控機(jī)(安裝在集控室)具有實時性好、可靠性高、輸入/輸出能力和網(wǎng)絡(luò)支持能力強(qiáng)等普通計算機(jī)不可比擬的優(yōu)點,故選用工控機(jī)作為上級監(jiān)督計算機(jī)控制系統(tǒng)SCC(Supervisory Computer Control),完成對柴油發(fā)電機(jī)組運(yùn)行狀態(tài)實時監(jiān)控和運(yùn)行參數(shù)的在線設(shè)置,遙控柴油發(fā)電機(jī)組啟動/停止。選用“凌陽”16位單片機(jī)u′nSPTM(安裝在主配電板內(nèi))作為底層控制級,與柴油發(fā)電機(jī)組這一控制對象一起組成直接數(shù)字控制系統(tǒng)DDC( Direct Digital Control),完成對柴油發(fā)電機(jī)組的啟動、停機(jī)、怠速運(yùn)行、故障報警、參數(shù)檢測等多種控制。利用RS-485通信網(wǎng)絡(luò)可支持多達(dá)256個接收器或發(fā)送器的特點,使用1臺PC機(jī)運(yùn)用Visual C++ 6.0軟件即可監(jiān)控多套柴油發(fā)電機(jī)組的運(yùn)行。單片機(jī)具有價格便宜、編程容易、接口簡單等優(yōu)點,但單片機(jī)不具備人機(jī)接口界面。為了易于操作并實現(xiàn)遠(yuǎn)距離監(jiān)控船舶電站的運(yùn)行狀態(tài),本系統(tǒng)在Visual C++ 6.0集成環(huán)境下開發(fā)界面友好的監(jiān)控軟件[5],通過單片機(jī)的硬件接口,以實時通信的方式,實現(xiàn)工控機(jī)與單片機(jī)之間的通信,完成對船舶電站的實時監(jiān)控和相關(guān)操作。
軟件程序主要完成數(shù)據(jù)采集、分析、顯示、存儲、管理以及打印等功能,所以模塊劃分為串口通信模塊、預(yù)報警模塊、數(shù)據(jù)打印模塊、數(shù)據(jù)庫模塊等。各模塊關(guān)系如圖3所示,其中箭頭表示數(shù)據(jù)流向。
圖3 軟件系統(tǒng)模塊結(jié)構(gòu)示意圖
系統(tǒng)模塊軟件實現(xiàn)關(guān)系如圖4所示,其中寬箭頭表示數(shù)據(jù)流向。
圖4 系統(tǒng)模塊實現(xiàn)關(guān)系
串口通信使用編寫的類CSerialPort,將SerialPort.h SerialPort.cpp兩個類文件復(fù)制到工程文件夾中,用Project-Add to Project-Files命令將上述兩個文件加入工程,并在MinitorSystem.h中將頭文件SerialPort.h說明:#include“SerialPort.h”。CSerialPort類在串口數(shù)據(jù)到達(dá)時,將數(shù)據(jù)發(fā)送到程序主窗口。
使用函數(shù)關(guān)鍵代碼如下:
1) 串口初始化函數(shù)InitPort ( );
2) 啟動串口通信監(jiān)測線程函數(shù)StartMonitoring()來啟動串口;
3) 接收字符函數(shù)ReceiveChar(),被CommThread()線程調(diào)用發(fā)送消息等待主線程來處理接收字符;
4) 通過串口發(fā)送字符/寫串口函數(shù)WriteToPort( ),調(diào)用WriteChar()完成發(fā)送任務(wù),和ReceiveChar()處理過程基本一致;
5) 停止監(jiān)測線程函數(shù)StopMonitoring();
6) 關(guān)閉串口函數(shù)C1osePort ( )。
相應(yīng)的串口消息處理函數(shù),要手動添加消息處理函數(shù),步驟如下:
( 1) .h文件中添加:
// Generated message map functions
//{{AFX_MSG(MinitorSystemDlg)
afx_msg LONG OnComm(WPARAM ch, LPARAM port);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
( 2) cpp文件中添加:
BEGIN_ MESSAGE_ MAP(MinitorSystemDlg, CDialog)
//{{AFX_MSG_MAP (MinitorSystemDlg)
ON_ MESSAGE(WM_COMM_RXCHAR, OnComm)
//}}AFX_MSG_MAP
END_ MESSAGE_ MAP()
(3) LONG MinitorSystemDlg::OnComm
(WPARAM ch, LPARAM port)
{
/ /接收字符
}
ADO(ActiveX Data Object)ActiveX數(shù)據(jù)對象,是基于OLE DB的訪問接口,它是面向?qū)ο蟮腛LE DB技術(shù)。ADO對ACCESS數(shù)據(jù)庫開發(fā)的基本流程及它的基本步驟如下:
1) 初始化COM庫
CoInitialize(NULL)初始化OLE/COM庫環(huán)境;引入ADO庫定義文件:#import "c:program filescommon filessystemadomsado15.dll" o_namespace ename ("EOF", "adoEOF");#import包含后就可以用3個智能指針:_ConnectionPtr、_RecordsetPtr和_CommandPtr了;
2) 用Connection對象連接數(shù)據(jù)庫;
3) 利用建立好的連接,利用Recordset對象執(zhí)行SQL命令,取得結(jié)果記錄集進(jìn)行查詢、處理;
4) 使用完畢后關(guān)閉連接釋放對象。
聯(lián)機(jī)調(diào)試的數(shù)據(jù)庫顯示實現(xiàn)效果如圖5所示。
圖5 歷史記錄顯示
程序采用聲光報警,使用多媒體實現(xiàn)聲音報警。當(dāng)滿足報警所需要的條件時,界面上小燈由綠變紅,并且發(fā)出報警聲,完成報警功能。
在用VC++ 6. 0開發(fā)多媒體應(yīng)用時,必須在所有要用到多媒體函數(shù)的源程序中,包含MMSYSTEM.H頭文件,并且該文件位置應(yīng)在Windows.H頭文件的后面。另外,在連接程序時要用到WINMM.LIB引入庫,在Project→Settings對話框的Link頁的Object/library modusles欄中加入WINMM.LIB,或者在源程序中加入:# pragma comment (lib, “winmm.lib”)。
本文采用把聲音文件加入到資源中,然后從資源中播放聲音的方式。VC++ 6.0支持WAVE型資源,并把聲音文件導(dǎo)入到WAVE資源中,設(shè)置聲音資源的ID為IDR_ WARN。滿足報警條件時,下面的調(diào)用會輸出報警聲音:
P1aySound((LPCTSTR)IDR_WARN,AfxGetlnstanceHandle(),SND_RESOURC|SND_ASYNC)
聯(lián)機(jī)調(diào)試的實現(xiàn)效果如圖6所示。
圖6 在線預(yù)警、報警效果顯示圖
在程序中操作Word文檔,需要先在程序中啟動Word應(yīng)用程序,然后獲得Word文檔管理對象(Documents),通過文檔管理對象添加文檔對象(_document),由文檔對象獲得選區(qū)(Range),再通過選區(qū)向文檔中添加表格(Tables),最后通過(Selection)移動光標(biāo)位置并向表格中插入數(shù)據(jù)。
由于記錄數(shù)據(jù)表數(shù)據(jù)項比較多,所以要進(jìn)行橫向預(yù)覽。聯(lián)機(jī)調(diào)試的運(yùn)行效果如圖7所示。
圖7 歷史數(shù)據(jù)打印預(yù)覽
基于VC++ 6.0的船舶電站實時監(jiān)控系統(tǒng)在船舶電站實驗室進(jìn)行了實機(jī)調(diào)試,成功地實現(xiàn)了對2套船用柴油發(fā)電機(jī)組的現(xiàn)場監(jiān)控和數(shù)據(jù)的相關(guān)處理,系統(tǒng)運(yùn)行穩(wěn)定、可靠,監(jiān)控功能完善,界面友好,可視性強(qiáng)。
[1] 明日科技.Visual C++程序開發(fā)范例寶典[M].北京:人民郵電出版社,2007.
[2] 王煥文.艦船電力系統(tǒng)及自動裝置[M].北京:科學(xué)出版社,2004.
[3] ODICON M.Inc.Modbus Protocol Reference Guide [M].
1996.
[4] 向中凡.Access2000實用操作與技巧[M].西安:西安電子科技大學(xué)出版社,2000.
[5] 杜鴻震. 基于VC 6.0的相繼增壓柴油機(jī)試驗臺監(jiān)控系統(tǒng)軟件設(shè)計[D].哈爾濱:哈爾濱工程大學(xué),2006.