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.