实时环境监控系统的图形界面设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.引言
1.1 课题的背景及意义
无论是工业生产、科学研究还是日常生活,一些环境参数都需要被采集并被处理。

比如温度、湿度、瓦斯浓度、电脑的CPU使用率等等。

有些参数至关重要,因为一时的疏忽很可能会造成重大的安全隐患,比如瓦斯浓度等。

对于这样的参数,我们需要对其进行实时监控,当它超过一定的阀值时,就会报警以提醒人们注意。

因此我们需要设计监控系统,在这样的系统中,通常由PC机对数据进行分析并处理,单片机则完成数据的采集和上传等工作,复杂的还要建立数据库。

在这样的系统中,单片机系统一般称之为下位机,由PC机、网络设备、数据库组成的应用部分则通称为上位机。

二者结合,充分发挥了单片机在实时数据采集和PC机对图形处理、显示以及数据库管理上的优点。

1.2 课题设计目的
本课题主要是设计用于监控环境温度的简易上位机系统。

上位机作为主控机一般采用PC机,放置在中央控制室,该上位机主要用来进行人机交互,并向下位机发送命令和接收下位机做出的反应。

设计人机交互界面的目的主要是为了用户方便地使用该系统。

这里以监控温度为例,展示了如何设计一款可以满足基本需求的环境监控系统。

更复杂的系统可以在此基础上进行扩展。

2 监控系统总体方案
系统的总体方案设计,关系到系统功能模块的划分、硬件设备的选择和配备以及软件的设计和编制。

总体方案对整个系统的性能以及运行的可靠性有十分重要的意义。

2.1 监控系统结构分析
图2-1 系统原理框图
如图所示,整个监控系统有两大部分组成:前端采集模块和后端处理模块。

前端采集模块通过DS18B20温度传感器采集温度,传递给MCS8051单片机。

然后通过RS232串口传递给了PC,做进一步的处理。

串口通信未增加校验,所以额外增加了LCD1602显示模块,以便观察是否有数据传送错误。

本人负责开发后端处理模块,即位于PC端的监控系统。

前端采集模块有小组另一同学完成。

2.2 监控系统主要功能
系统的主要功能包括两个方面:
1 在PC机上显示温度曲线,以便于对数据进行观测。

2 人为设置温度阀值,当超过阀值时,系统会自动报警以提醒人们注意。

2.3 监控系统总体方案设计
2.3.1 监控系统设计要求
监控系统所面向的对象并非是计算机专业人员,因此系统应具备友好的人机界面以及更好的可操作性。

2.3.2 监控系统开发工具选择
当前,用于设计具有人机界面系统的编程语言和开发环境主要有Visua1C++6.0、Delphi、Visual Basic等。

它们风格迥异并且有着出色的功能,其中Visua1C++6.0使用的是面向对象的开发语言,封装继承性好、方便移植,并且具有更大的灵活性。

可以在任何时刻调用任何API函数。

VC++的优越性主要表现在以下4个方面:
1 开发分布式应用;
2 开发的应用运行效率高;
3 能缩短软件升级周期。

C++类的重用特性以及它对函数库、DLL库的支持能使程序更好地模块化,并缩短软件维护和升级时间;
4 VC支持生成多线程编程,而多线程应用对于增加并发响应有实际意义。

综上所述,本课题选用VC++6.0作为监控系统的开发工具。

3 监控系统主要开发技术
3.1 MFC概述
在开发Windows应用程序时,有两种主要方法:基于Window API的开发方法和基于Windows MFC的开发方法。

前者需要掌握近千个Windows函数的用法,使用不便,故已不独立使用了。

后者借助于其应用程序向导及类向导的帮助,以其封装好的类、构造函数、响应函数及应用程序框架和许多控件等的帮助,大大简化了程序开发的过程并减少了开发的作业量和难度,故获得广泛的应用。

基于 Windows MFC的开发方法并不排斥使用Windows API.事实上,在 Windows MFC的开发过程中,总是要使用Windows API函数以完成特定功能。

因此本课题的上位机应用程序采用MFC来开发应用程序框架。

MFC,微软基础类(Microsoft Foundation Classes),实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,VC++是WinDOS下开发人员使用的专业
C++ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包,MFC作为与VC++血肉相连的部分(注意C++和
VC++的区别:C++是一种程序设计语言,是一种大家都承认的软件编制的通用规范,而VC++只是一个编译器,或者说是一种编译器+源程序编辑IDE,WS,PlatForm,这跟Pascal和Delphi的关系一个道理,Pascal是Delphi的语言基础,Delphi使用Pascal规范来进行Win下应用程序的开发和编译,却不同于Basic语言和VB 的关系,Basic语言在VB开发出来被应用的年代已经成了Basic语言的新规
范,VB新加的Basic语言要素,如面向对象程序设计的要素,是一种性质上的飞跃,使VB既是一个IDE,又成长成一个新的程序设计语言),MFC同BC++集成的VCL 一样是一个非外挂式的软件包,类库,只不过MFC类是微软为VC++专配的。

MFC,API,即微软提供的WinDOS下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方(如我是一方,微软是一方,Borland就是第三方)的编程语言来进行对WinDOS下应用程序的开发,使这些被开发出来的应用程序能在WinDOS下运行,比如VB,VC++,Java,Dehpi编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在WinDOS的消息机制和绘图里,遵守WinDOS作为一个操作系统的内部实现,这其实也是一种必要,
微软如果不提供API,这个世上对Win编程的工作就不会存在,微软的产品就会迅速从时尚变成垃圾,上面说到MFC是微软对API函数的专用C++封装,这种结合一方面让用户使用微软的专业C++ SDK来进行Win下应用程序的开发变得容易,因为MFC是对API 的封装,微软做了大量的工作,隐藏了好多程序开发人员在Win下用C++ & MFC编制软件时的大量内节,如应用程序实现消息的处理,设备环境绘图,这种结合是以方便为目的的,必定要付出一定代价(这是微软的一向作风),因此就造成了MFC对类封装中的一定程度的的冗余和迂回,但这是可以接受的.
MFC不只是一个功能简单的界面开发系统,虽然它提供的类绝大部分用来进行界面开发,关联一个窗口的动作,但它提供的类中好多不与一个窗口关联,即类的作用不是一个界面类,不提供对一个窗口对象的控制(如创建、销毁),而一是一些在winDOS中实现内部处理的类,如数据库的管理类,网络通信类。

MFC是微软封装了的API。

什么意思呢?windows作为一个提供功能强大的应用程序接口编程的操作系统,的确方便了许多程序员,传统的win32开发(直接使用windows的接口函数API)对于程序员来说非常的困难,因为,API函数实在太多了,而且名称很乱,从零构架一个窗口动辄就是上百行的代码。

MFC 是面向对象程序设计与Application framework的完美结合,他将传统的API 进行了分类封装,并且为你创建了程序的一般框架。

综上所述,本课题的上位机应用程序用C++语言编写,在VC++环境中开发,由于上位机PC机选用的是Microsoft Windows操作系统,所以采用微软提供的编程接口MFC编写界面。

3.2 串口通信
3.2.1 串口通信协议
串口通信协议分为底层通信协议和用户层协议,底层协议一般由计算机硬件提供商和设备厂家提供,在一般性的通信编程中很少涉及,而用户层协议则是面向使用者的,也就是我们编程中通常说到的通信协议。

这种用户层的通信协议,简单来说,就是数据以何种格式发送出去,或者如何从收到的某种格式的数据串中提取需要的数据,以及在发送和接受过程中如何保证这些数据的正确性,即数据校验。

在常见的用户层协议中,按照输出数据的可读性分为完整型协议和简单型协议。

简单型协议去掉了在程序功能中不需要利用的换行和其他分隔符,有时甚至连校验也
省掉了。

本课题采用的是简单型协议。

再根据字符的可见性还可以把用户层协议分为可显示字符型和非可见字符型。

如果用串口调试助手等工具来接收,前者可以用ASCII字符才显示;后者以ASCII字符方式显示时什么也看不到,必须用十六进制方式显示。

典型地,串口用于ASCII码字符的传输。

通信使用3根线完成:(1)地线,(2)发送,(3)接收。

由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。

其他线用于握手,但是不是必须的。

串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。

对于两个进行通行的端口,这些参数必须匹配:
a,波特率:这是一个衡量通信速度的参数。

它表示每秒钟传送的bit的个数。

例如300波特表示每秒钟发送300个bit。

当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。

这意味着串口通信在数据线上的采样率为4800Hz。

通常电话线的波特率为14400,28800和36600。

波特率可以远远大于这些值,但是波特率和距离成反比。

高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。

b,数据位:这是衡量通信中实际数据位的参数。

当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。

如何设置取决于你想传送的信息。

比如,标准的ASCII码是0~127(7位)。

扩展的ASCII码是0~255(8位)。

如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。

每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。

由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

c,停止位:用于表示单个包的最后一位。

典型的值为1,1.5和2位。

由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。

因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。

适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

d,奇偶校验位:在串口通信中一种简单的检错方式。

有四种检错方式:偶、奇、高和低。

当然没有校验位也是可以的。

对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。

例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。

如果是奇
校验,校验位位1,这样就有3个逻辑高位。

高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。

这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

RS一232C接口标准是在1969年由美国电气工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通信的标准,所以RS一232C 是PC机与通信工业中使用最早的一种串行接口标准。

在短距离、较低波特率串行通信中得到了广泛的应用。

RS一232C接口标准最初是为了远程通信连接数据终端设备DTE和数据通信设备DCE进行通行而设计的。

由于其推出时间较早,通用设备厂商都生产了与RS一232C兼容的设备,因此作为一种标准在微机通信接口中也得到了广泛的采用。

RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。

可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。

用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。

RS-232只限于PC串口和设备间点对点的通信。

RS-232串口通信最远距离是50英尺。

3.2.2 多线程串口编程工具CSerialPort类
这里介绍一下有Remon Spekreijse提供的的免费串口类CSerialPort类,它可以很轻松地完成串口编程任务,几分钟就可以搭好串口通信框架。

CSerialPort类是基于多线程的,其工作过程如下:首先设置好串口参数,在开启串口监测工作线程,串口监测工作线程监测接收到的数据,流控制事件或其他串口事件后,就以消息方式通知主程序,激发消息处理函数来进行数据处理,这是对接收数据而言的;发送数据可直接向串口发送。

这里先重点介绍几个经常用到的函数:
1.串口初始化函数InitPort()
这个函数是用来初始化串口的,即设置串口的通信参数:需要打开的串口号、波特率、求奇偶校验方式、数据位、停止位,这里还可以用来进行事件的设定
BOOL CSerialPort::InitPort(CWnd* pPortOwner,
UINT portnr, //串口号
UINT baud, //波特率
UINT parity, //校验方式
UINT databits, //数据位
UINT stopbits, //停止位
DWORD swCommEvents, //EV_RXCHAR EV_CTS事件设置
UINT writebuffersize) //设置发送缓冲区大小
如果串口初始化成功,就返回TRUE,若串口被其他设备占用、不存在或存在其他故障,就返回FALSE,编程者可以在这儿提示串口操作是否成功。

如果在当前主窗口中调用这个函数,那么pPortOwner就可用this指针表示。

串口号在函数中做了限制,只能用1,2,3和4四个串口号,而事实上我们在编程时可能用到更多串口号,我们可以通过注释掉本函数中的“assert(portnr > 0 && portnr < 5);”语句取消对串口号的限制。

2.启动串口通信监测线程函数StartMonitoring()
串口初始化成功后,就可以调用BOOL StartMonitoring()来启动串口检测线程。

线程启动成功,返回TRUE。

BOOL CSerialPort::StartMonitoring()
{
if(!m_Thread=AfxbeginThread(CommThread,this)))
return FALSE;
TRACE(“Thread started\n”);
Return TRUE;
}
调用InitPort()和StartMonitoring()后,串口就被打开,各种串口状态和事件就可以被监视到。

3.暂停或停止监测线程函数StopMonitoring()
该函数暂停或停止串口监测,要注意的是,调用该函数后,串口资源仍然被占用。

BOOL CSerialPort::StopMonitoring()
{
TRACE(“Thread suspended\n”);
m_Thread->SuspendThread();
return TRUE;
}
4.关闭串口函数ClosePort()
void CSerialPort::ClosePort()
{
SetEvent(m_hShutdownEvent);
}
5.通过串口发送字符/写串口函数WriteToPort()
void CSerialPort::WriteToPort(char* string)
{
assert(m_hComm != 0);
memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer)); strcpy(m_szWriteBuffer, string);
m_nWriteSize=strlen(string);
// set event for write
SetEvent(m_hWriteEvent);
}
4 系统软件设计
这里先介绍下整个系统的运行机理:
4.1 窗口
窗口是Windows应用程序中一个非常重要的元素,一个Winsows应用程序至少要有一个窗口,称之为主窗口。

窗口是屏幕中的一块矩形区域,是Windows应用程序与用户交互的接口。

应用窗口可以接受用户的输入,和显示输出。

一个应用程序窗口通常都包含标题栏,菜单栏,系统菜单,最大化框,最小化框,可调边框等等。

如图所示:
图4-1 监控系统窗口
在Windows应用程序中,窗口是通过窗口句柄来标示的。

我们要对某个窗口进行操作,首先要得到这个窗口的句柄。

句柄是Windows程序设计中一个重要的概念,使用也非常频繁。

在Windows程序中有各种各样的资源(窗口,图标,光标等都是资源),系统在创建这些资源时会为它们分配内存,并返回标示这些资源的标识号,即句柄。

对于一个监控系统而言,当然要首先具备友好的人际界面且便于操作,这就是通过窗口的创建而完成的。

4.2 消息
Windows采用的是基于事件驱动的程序设计模式,主要是基于消息的。

比如,当温度传感器采集到温度,将其传给温度监控系统,此时操作系统会感知到这一事件,于是将这一事件包装成消息,投递到应用程序的消息队列中,然后应用程序从消息队列中取出消息并进行相应。

在这个处理过程中,操作系统也会给应用程序“发送消息”。

所谓“发送消息”,实际上是操作系统调用程序中一个专门负责处理消息的函数,这个函数称为窗口过程。

以下是消息的结构:
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt; } MSG, *PMSG;
4.3 WinMain函数
在应用程序中有一个重要的函数WinMain函数,它是应用程序的基础。

当我们启动监控系统的程序时,操作系统调用的就是这个程序的WinMain函数。

WinMain函数是Windows程序的入口点函数,当WinMain函数结束或返回时,Windows程序就结束了。

4.4 系统设计
整个系统有两大功能构成,所以软件的设计也紧紧围绕着这两大功能,如图所示:
1)显示温度曲线
2)报警
图 4-2 系统功能流图
将以上的要求分解为若干的问题,如图所示:
图4-3 系统设计流图
4.4.1 接收温度
在前面已经介绍了有关串口的一些信息,在附录中有采集温度以及通过串口向
上位机发送数据的程序,这里介绍下上位机接收后处理过程,如图:
图4-4 接受温度流程图
当系统打开后,单击菜单栏中的“开始监测”。

首先是调用CSerialPort类,通过串口初始化函数InitPort()初始串口。

当初始化成功后,启动串口通信监测线程函数StartMonitoring(),来监测串口看是否收到了数据,若收到了数据则发送消息,调用函数过程进一步的处理消息,比如显示成曲线。

当单击菜单栏中的“停止监测”时,系统会调用关闭串口函数ClosePort()来关闭串口。

4.4.2 显示温度曲线
对于接收到的温度如何处理?对于监控系统而言,需要它更加友好,便于观察数据。

本课题将采集到得温度通过曲线实时显示出来:
图4-5 显示温度曲线流程图
5 上位机界面实现及系统调试
5.1 上位机界面实现
监控系统一共有四个一级菜单:日常操作、查看、设置、帮助。

1.“查看”、“帮助”菜单
查看菜单有两个二级菜单:工具栏、状态栏。

实现的功能主要是查看相应的信息。

单击帮助菜单弹出管理系统的版本信息。

这两个菜单是留作以后系统功能扩展用的。

2.“日常操作”菜单
“日常操作”菜单共有三个子菜单:开始监测,停止监测和日志查询。

其中开始监测和停止监测用来控制系统是否检测温度,而日志查询是用来查看存储的异常温度信息(如果你设定了存储异常温度的话)。

单击日志查询菜单,弹出如图所示对话框,它将用来显示存储的异常温度信息:
图 5-1 对话框
单机打开按钮,会弹出如图所示对话框:
图 5-2 打开对话框
将存储异常温度信息的文件打开,文件存储的异常温度的信息就会显示在对话框中,如图所示:
图 5-3 温度信息保存
3.“设置”菜单
“设置”菜单有两个子菜单:系统设置,串口通讯设置
1)单击系统设置,弹出如图所示对话框:
图 5-4 温度报警设置
在这里可以设置是否启用温度报警,以及温度的阀值和是否保存异常温度信息,已便于以后查询。

如果设置成功,当温度达到阀值时PC机就会报警。

报警声音也可
以设置,如图所示:
2)单击串口通讯设置:
图5-6 串口通信设置
这里的对话框是预留给以后扩展用的,如果希望使用自定义的用户层串口通信协议,就可以在这里进行设置。

本课题最终调试使用的是简单型的用户层协议。

5.2 系统调试
为了验证系统的各项功能,搭建了一个简单的温度采集系统,对采集到得温度进行了监控,实验结果是系统可以实时的监控温度的变化;设定温度异常阀值后,当温度超过阀值,PC机会报警并记录异常信息。

系统满足要求。

图5-7 结果显示
总结
本文主要上位机技术以及上位机应用程序的设计过程展开论述。

本文的引言介绍了课题的背景及意义,以及课题的设计目的。

第二章讨论了监控系统的总体设计方案,主要设计系统组成部分及格模块的功能。

第三章对系统开发所涉及的技术进行了介绍,主要包括MFC和串口通信。

第四章介绍了系统开发。

第五章论述了上位机的主要功能和系统调试。

通过最终的实验,系统满足了基本的要求。

对于采集到的温度可以实时显示,并且如果设定了温度报警,当温度超过警戒值时系统就会报警。

系统的应用范围非常广泛,可以单独使用作为监控仪,应用于农业温室大棚监测植物生长的环境变化,工业厂房测量各部分的工作温度等等。

也可以作为智能控制系统的一部分,与其它设备协同工作。

系统移植性强,这里的展示的是基础版本,可以对此进行扩展:
1.如果采集的环境参数比较复杂,可以自定义完整的用户层协议,以对数据进行
处理。

2.可以添加数据库,以方便对采集到的数据进行存储和日后查询,还可以增加用
户管理。

3.将系统联网,可以方便对数据进行分类处理。

4.可以处理多种环境参数,比如湿度,浓度等等。

致谢
经过四年的学习,现在终于要毕业了。

在学习期间经历了风风雨雨,在各位老师和同学的帮助和支持下最终得以顺利完成。

在此,首先感谢我的老师,感谢各位老师这四年中在学习中、生活上的关心和照顾;其次感谢各位同学,同学们在生活中给予很大的帮助,在学习上也给极大的鼓舞。

指导老师XXX治学严谨,学识渊博,平易近人,在我做设计和论文期间对我的教诲和指导将使我终生受益。

无论是在平时的阶段,还是在论文的选题、资料查询、开题、研究、设计和撰写的每一个环节,都得到导师的悉心指导和帮助。

借此机会向葛明涛老师表示衷心的感谢!
在毕业设计的这段时间里,其他老师们也都言传身教,以他们广博的知识,敏锐的洞察力,多年的教学和实际工作经验,在毕业设计上给予我很大的帮助。

在本次设计中我学到的不仅是科学知识和工作方法,更学到了作为一个研究人员应有的治学态度以及为人处世的道理,这一切都将使我终身受益。

谨在此向罗中剑主任,张凤炳老师致以崇高的敬意和衷心的感谢!
感谢几年来传授我知识的老师们,更要感谢我的家人对我学业上的支持和鼓励,感谢所有关心帮助过我的人。

参考文献
[1] 谭浩强《C程序设计》清华大学出版社 1999.12
[2] 孙鑫,余安萍《深入详解VC++》电子工业出版社 2006.6
[3] 侯俊杰《深入浅出MFC》华中科技大学出版社 2001.10
[4] 龚建伟《Visual C++/Turbo C串口通信编程实践教程》电子工业出版社 2006.1
[5] Stanley B.Lippman 《C++ Primer》人民邮电出版社 2006.3
[6] 李群芳肖看《单片机原理,接口及应用》清华大学出版社 2005.3。

相关文档
最新文档