Visual C++6.0[1]是Microsoft公司Visual Studio系列的一個重要產品,是一個功能強大的信息可視化開發工具。它的開發環境包含文本編輯器(Text Editor)、資源編輯器(Resource Editor)、源代碼瀏覽器(SourceCode Browser)、C/C++編譯器(C/C++ Compiler)、調試器(Debugger)、連接器(Linker)及MSDN在線幫助系統等。
為了幫助編程者處理通常復雜而又繁瑣的有關Windows的工作,Visual C++ 6.0設計了一套類庫(MFC ) , 把軟件開發平臺SDK (SoftwareDevelopment Kit)中的大多數內容封裝成為各種類。有了MFC,編程人員可以充分發揮C++的優勢,專注于程序的特殊部分,不需重復處理Windows必須處理的復雜工作,提高了編程效率和代碼效率。MFC應用程序向導(AppWizard)和MFC類向導(ClassWizard)是Visual C++ 6.0最重要的兩大開發工具。Visual C++ 6.0應用程序的創建過程如圖1所示。

圖1 Visual C++ 6.0應用程序創建過程
Visual C++ 6.0作為一種通用程序開發系統,以其強大的數據采集、數據處理、數據分析功能在現代測控領域中得到了廣泛的應用。在對硬件的支持方面,Visual C++ 6.0集成了與RS-232/485、PLC和插入式數字采集設備等進行數據通信的全部功能,利用Windows技術的優點,在Visual C++ 6.0開發平臺下,設計了船舶電站實時監控系統。
船舶電站[2]實時監控系統由PC機、單片機和RS-485總線組成兩級控制模式,軟件協議采用支持RS-485網絡的Modbus ASCII[3]協議,數據存儲用ACCESS 2003[4]數據庫(圖2)。

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

圖3 軟件系統模塊結構示意圖
系統模塊軟件實現關系如圖4所示,其中寬箭頭表示數據流向。

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

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

圖6 在線預警、報警效果顯示圖
在程序中操作Word文檔,需要先在程序中啟動Word應用程序,然后獲得Word文檔管理對象(Documents),通過文檔管理對象添加文檔對象(_document),由文檔對象獲得選區(Range),再通過選區向文檔中添加表格(Tables),最后通過(Selection)移動光標位置并向表格中插入數據。
由于記錄數據表數據項比較多,所以要進行橫向預覽。聯機調試的運行效果如圖7所示。

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