Visual C++6.0[1]是Microsoft公司Visual Studio系列的一個(gè)重要產(chǎn)品,是一個(gè)功能強(qiáng)大的信息可視化開(kāi)發(fā)工具。它的開(kāi)發(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è)計(jì)了一套類庫(kù)(MFC ) , 把軟件開(kāi)發(fā)平臺(tái)SDK (SoftwareDevelopment Kit)中的大多數(shù)內(nèi)容封裝成為各種類。有了MFC,編程人員可以充分發(fā)揮C++的優(yōu)勢(shì),專注于程序的特殊部分,不需重復(fù)處理Windows必須處理的復(fù)雜工作,提高了編程效率和代碼效率。MFC應(yīng)用程序向?qū)?AppWizard)和MFC類向?qū)?ClassWizard)是Visual C++ 6.0最重要的兩大開(kāi)發(fā)工具。Visual C++ 6.0應(yīng)用程序的創(chuàng)建過(guò)程如圖1所示。

圖1 Visual C++ 6.0應(yīng)用程序創(chuàng)建過(guò)程
Visual C++ 6.0作為一種通用程序開(kāi)發(fā)系統(tǒng),以其強(qiáng)大的數(shù)據(jù)采集、數(shù)據(jù)處理、數(shù)據(jù)分析功能在現(xiàn)代測(cè)控領(lǐng)域中得到了廣泛的應(yīng)用。在對(duì)硬件的支持方面,Visual C++ 6.0集成了與RS-232/485、PLC和插入式數(shù)字采集設(shè)備等進(jìn)行數(shù)據(jù)通信的全部功能,利用Windows技術(shù)的優(yōu)點(diǎn),在Visual C++ 6.0開(kāi)發(fā)平臺(tái)下,設(shè)計(jì)了船舶電站實(shí)時(shí)監(jiān)控系統(tǒng)。
船舶電站[2]實(shí)時(shí)監(jiān)控系統(tǒng)由PC機(jī)、單片機(jī)和RS-485總線組成兩級(jí)控制模式,軟件協(xié)議采用支持RS-485網(wǎng)絡(luò)的Modbus ASCII[3]協(xié)議,數(shù)據(jù)存儲(chǔ)用ACCESS 2003[4]數(shù)據(jù)庫(kù)(圖2)。

圖2 船舶電站柴油發(fā)電機(jī)組監(jiān)控系統(tǒng)結(jié)構(gòu)框圖
由于工控機(jī)(安裝在集控室)具有實(shí)時(shí)性好、可靠性高、輸入/輸出能力和網(wǎng)絡(luò)支持能力強(qiáng)等普通計(jì)算機(jī)不可比擬的優(yōu)點(diǎn),故選用工控機(jī)作為上級(jí)監(jiān)督計(jì)算機(jī)控制系統(tǒng)SCC(Supervisory Computer Control),完成對(duì)柴油發(fā)電機(jī)組運(yùn)行狀態(tài)實(shí)時(shí)監(jiān)控和運(yùn)行參數(shù)的在線設(shè)置,遙控柴油發(fā)電機(jī)組啟動(dòng)/停止。選用“凌陽(yáng)”16位單片機(jī)u′nSPTM(安裝在主配電板內(nèi))作為底層控制級(jí),與柴油發(fā)電機(jī)組這一控制對(duì)象一起組成直接數(shù)字控制系統(tǒng)DDC( Direct Digital Control),完成對(duì)柴油發(fā)電機(jī)組的啟動(dòng)、停機(jī)、怠速運(yùn)行、故障報(bào)警、參數(shù)檢測(cè)等多種控制。利用RS-485通信網(wǎng)絡(luò)可支持多達(dá)256個(gè)接收器或發(fā)送器的特點(diǎn),使用1臺(tái)PC機(jī)運(yùn)用Visual C++ 6.0軟件即可監(jiān)控多套柴油發(fā)電機(jī)組的運(yùn)行。單片機(jī)具有價(jià)格便宜、編程容易、接口簡(jiǎn)單等優(yōu)點(diǎn),但單片機(jī)不具備人機(jī)接口界面。為了易于操作并實(shí)現(xiàn)遠(yuǎn)距離監(jiān)控船舶電站的運(yùn)行狀態(tài),本系統(tǒng)在Visual C++ 6.0集成環(huán)境下開(kāi)發(fā)界面友好的監(jiān)控軟件[5],通過(guò)單片機(jī)的硬件接口,以實(shí)時(shí)通信的方式,實(shí)現(xiàn)工控機(jī)與單片機(jī)之間的通信,完成對(duì)船舶電站的實(shí)時(shí)監(jiān)控和相關(guān)操作。
軟件程序主要完成數(shù)據(jù)采集、分析、顯示、存儲(chǔ)、管理以及打印等功能,所以模塊劃分為串口通信模塊、預(yù)報(bào)警模塊、數(shù)據(jù)打印模塊、數(shù)據(jù)庫(kù)模塊等。各模塊關(guān)系如圖3所示,其中箭頭表示數(shù)據(jù)流向。

圖3 軟件系統(tǒng)模塊結(jié)構(gòu)示意圖
系統(tǒng)模塊軟件實(shí)現(xiàn)關(guān)系如圖4所示,其中寬箭頭表示數(shù)據(jù)流向。

圖4 系統(tǒng)模塊實(shí)現(xiàn)關(guān)系
串口通信使用編寫的類CSerialPort,將SerialPort.h SerialPort.cpp兩個(gè)類文件復(fù)制到工程文件夾中,用Project-Add to Project-Files命令將上述兩個(gè)文件加入工程,并在MinitorSystem.h中將頭文件SerialPort.h說(shuō)明:#include“SerialPort.h”。CSerialPort類在串口數(shù)據(jù)到達(dá)時(shí),將數(shù)據(jù)發(fā)送到程序主窗口。
使用函數(shù)關(guān)鍵代碼如下:
1) 串口初始化函數(shù)InitPort ( );
2) 啟動(dòng)串口通信監(jiān)測(cè)線程函數(shù)StartMonitoring()來(lái)啟動(dòng)串口;
3) 接收字符函數(shù)ReceiveChar(),被CommThread()線程調(diào)用發(fā)送消息等待主線程來(lái)處理接收字符;
4) 通過(guò)串口發(fā)送字符/寫串口函數(shù)WriteToPort( ),調(diào)用WriteChar()完成發(fā)送任務(wù),和ReceiveChar()處理過(guò)程基本一致;
5) 停止監(jiān)測(cè)線程函數(shù)StopMonitoring();
6) 關(guān)閉串口函數(shù)C1osePort ( )。
相應(yīng)的串口消息處理函數(shù),要手動(dòng)添加消息處理函數(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ù)對(duì)象,是基于OLE DB的訪問(wèn)接口,它是面向?qū)ο蟮腛LE DB技術(shù)。ADO對(duì)ACCESS數(shù)據(jù)庫(kù)開(kāi)發(fā)的基本流程及它的基本步驟如下:
1) 初始化COM庫(kù)
CoInitialize(NULL)初始化OLE/COM庫(kù)環(huán)境;引入ADO庫(kù)定義文件:#import "c:program filescommon filessystemadomsado15.dll" o_namespace ename ("EOF", "adoEOF");#import包含后就可以用3個(gè)智能指針:_ConnectionPtr、_RecordsetPtr和_CommandPtr了;
2) 用Connection對(duì)象連接數(shù)據(jù)庫(kù);
3) 利用建立好的連接,利用Recordset對(duì)象執(zhí)行SQL命令,取得結(jié)果記錄集進(jìn)行查詢、處理;
4) 使用完畢后關(guān)閉連接釋放對(duì)象。
聯(lián)機(jī)調(diào)試的數(shù)據(jù)庫(kù)顯示實(shí)現(xiàn)效果如圖5所示。

圖5 歷史記錄顯示
程序采用聲光報(bào)警,使用多媒體實(shí)現(xiàn)聲音報(bào)警。當(dāng)滿足報(bào)警所需要的條件時(shí),界面上小燈由綠變紅,并且發(fā)出報(bào)警聲,完成報(bào)警功能。
在用VC++ 6. 0開(kāi)發(fā)多媒體應(yīng)用時(shí),必須在所有要用到多媒體函數(shù)的源程序中,包含MMSYSTEM.H頭文件,并且該文件位置應(yīng)在Windows.H頭文件的后面。另外,在連接程序時(shí)要用到WINMM.LIB引入庫(kù),在Project→Settings對(duì)話框的Link頁(yè)的Object/library modusles欄中加入WINMM.LIB,或者在源程序中加入:# pragma comment (lib, “winmm.lib”)。
本文采用把聲音文件加入到資源中,然后從資源中播放聲音的方式。VC++ 6.0支持WAVE型資源,并把聲音文件導(dǎo)入到WAVE資源中,設(shè)置聲音資源的ID為IDR_ WARN。滿足報(bào)警條件時(shí),下面的調(diào)用會(huì)輸出報(bào)警聲音:
P1aySound((LPCTSTR)IDR_WARN,AfxGetlnstanceHandle(),SND_RESOURC|SND_ASYNC)
聯(lián)機(jī)調(diào)試的實(shí)現(xiàn)效果如圖6所示。

圖6 在線預(yù)警、報(bào)警效果顯示圖
在程序中操作Word文檔,需要先在程序中啟動(dòng)Word應(yīng)用程序,然后獲得Word文檔管理對(duì)象(Documents),通過(guò)文檔管理對(duì)象添加文檔對(duì)象(_document),由文檔對(duì)象獲得選區(qū)(Range),再通過(guò)選區(qū)向文檔中添加表格(Tables),最后通過(guò)(Selection)移動(dòng)光標(biāo)位置并向表格中插入數(shù)據(jù)。
由于記錄數(shù)據(jù)表數(shù)據(jù)項(xiàng)比較多,所以要進(jìn)行橫向預(yù)覽。聯(lián)機(jī)調(diào)試的運(yùn)行效果如圖7所示。

圖7 歷史數(shù)據(jù)打印預(yù)覽
基于VC++ 6.0的船舶電站實(shí)時(shí)監(jiān)控系統(tǒng)在船舶電站實(shí)驗(yàn)室進(jìn)行了實(shí)機(jī)調(diào)試,成功地實(shí)現(xiàn)了對(duì)2套船用柴油發(fā)電機(jī)組的現(xiàn)場(chǎng)監(jiān)控和數(shù)據(jù)的相關(guān)處理,系統(tǒng)運(yùn)行穩(wěn)定、可靠,監(jiān)控功能完善,界面友好,可視性強(qiáng)。
[1] 明日科技.Visual C++程序開(kāi)發(fā)范例寶典[M].北京:人民郵電出版社,2007.
[2] 王煥文.艦船電力系統(tǒng)及自動(dòng)裝置[M].北京:科學(xué)出版社,2004.
[3] ODICON M.Inc.Modbus Protocol Reference Guide [M].
1996.
[4] 向中凡.Access2000實(shí)用操作與技巧[M].西安:西安電子科技大學(xué)出版社,2000.
[5] 杜鴻震. 基于VC 6.0的相繼增壓柴油機(jī)試驗(yàn)臺(tái)監(jiān)控系統(tǒng)軟件設(shè)計(jì)[D].哈爾濱:哈爾濱工程大學(xué),2006.