2023年6月30日发(作者:)
华 中 科 技 大 学 硕 士 学 位 论 文
摘 要
随着现代工业的发展,企业中使用的设备大型化、自动化、高速化和复杂化程度越来越高,设备的故障危害越来越大。单靠设备使用者自身的力量来解决设备运行中出现的问题,或对设备进行日常维护等工作变得越来越困难。因此,为尽量避免重大故障事故,提高企业经济效益,对发生故障的设备能够进行及时的处理,开展设备状态监测具有重要意义。
“多级设备状态监测系统”利用客户机/服务器模式进行设计,采用MFC单文档-视图机制设计并实现了多级设备状态监测系统。使用SNTP简单网络时间协议作为其局域网内的时钟同步协议。通过时间服务器将局域网内的所有设备进行时钟同步。在客户端与后台数据库的连接上采用Oracle提供的Oracle Object for Ole的应用程序接口技术,提高系统的性能响应。具备地级、县级以及监控站三级设备状态的管理功能。利用TCP协议,监控中心通过发送设备状态请求指令来获取监控站的设备状态。根据设定的设备报警条件定时监测设备状态情况。对设备的维护信息提供录入以及查询的功能。对设备的报警以及历史状态信息提供查询。将设备在一段时期内运行的状态用直方图显示给用户,便于用户分析设备的历史状态信息。
设备状态监测系统实现了对设备运行情况的高效化、智能化管理。为系统的使用人员提供了设备维护与管理上的便利。同时简化了使用者的操作步骤,具有良好的应用前景。
关键词:状态监测 网络套接字 设备管理
I 华 中 科 技 大 学 硕 士 学 位 论 文
Abstract
With the development of modern industry, the degree of the large, automatic, speed
and complicated of devices which used in enterprises is becoming more and more
harm of the fault devices are also rely on the user to solve the
devices operation problem or to maintain the devices turn into more difficult than
order to avoid device major fault accident, improve the economic efficiency of
enterprises, carry out timely treatment to the failure of the equipment, the device state
monitoring is of great significance.
Multilevel devices state monitoring system using the client/server model design,
use the mechanism of MFC Single Document-View to develop and implement the system.
The system uses simple network time protocol as its LAN to implication the clock
synchronization. Use the time server for all the LAN equipment clocks synchronized. In
the background database, the client is connected to it using Oracle provided by the Oracle
Object for Ole application interface technology to improve the performance of the system
System has local, county and monitoring stations three layers device state
management functions. In the use of TCP protocol, the monitoring center send
requirement to obtain the state of equipment of the monitoring station. The system can
monitor equipments state by timing equipment alarm the maintenance of
the equipments, the system provides the input and query system also
provides the alarm information and the history of the state system uses state
histogram in a period of set time display to users in order to makes it easy for users to
analyze the devices history state information.
The devices state monitoring system implementation of the equipment efficient、intelligent management,and also simplify the process of system will have
widely implemented prospect.
Keywords: State monitoring Network socket Devices management
II 独创性声明
本人声明所呈交的学位论文是我个人在导师指导下进行的研究工作及取得的研究成果。尽我所知,除文中已经标明引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究做出贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。
学位论文作者签名:芦苇
日期: 2008 年 11 月 3 日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,即:学校有权保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权华中科技大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
保密□, 在 年解密后适用本授权书。
本论文属于
√。 不保密□(请在以上方框内打“√”)
学位论文作者签名:芦苇
日期:2008 年 11 月 3 日
指导教师签名:方少红
日期:2008 年 11 月 3 日 华 中 科 技 大 学 硕 士 学 位 论 文
1 绪论
1.1 研究背景
为了促进陆地边防监控与指挥调度工作“全面、高效与准确”地开展,提高陆地边防的整体防控和突发事件的处置能力,需要建设一套满足陆地边防 “集中、统一、高效、先进、实用”要求的陆地边防监控系统。
全国陆地边防监控系统由国家、军区、省、地、县五级监控中心以及一线边防监控站工作共同构成。
全国陆地边防地级监控中心应用系统由综合管理分系统、指挥调度分系统、信息采编与分发分系统、视频应用分系统、态势应用分系统及安全系统等分系统组成。
本人所研究的课题 “多级设备状态监测系统的设计与实现”,是综合管理分系统中的一部分。
1.2 研究的目的与意义
随着现代工业的发展,企业中使用的设备大型化、自动化、高速化和复杂化程度越来越高,设备的故障危害越来越大。单靠设备使用者自身的力量来解决设备运行中出现的问题,或对设备进行日常维护等工作变得越来越困难。因此,为尽量避免重大故障事故,提高企业经济效益,开展设备状态监测具有重要意义[1]。
设备远程状态监测与故障诊断技术是将传统的状态监测[2][3],故障诊断技术与计算机网络技术相结合[4][5]。
多级设备状态监测系统是为了有效地管理与维护地级、县级以及监控站的设备状态,监控站在获得监控中心的请求指令后立即发送设备的状态到地级监控中心,监控中心根据接收到的设备状态快速掌握监控站设备的运行状态,对于出现故障或工作异常的设备能够迅速地进行处理。
对下级设备,通过发送请求下级设备状态指令,利用网络传输将监控站的设备的工作状态上报至地级监控中心,地级监控中心根据上报的设备状态进行有条件的1 华 中 科 技 大 学 硕 士 学 位 论 文
入库以保存下级监控中心的设备状态,并对已入库的状态信息采用列表的形式显示监控站的设备状态。对本级设备通过以发送ARP(Address Resolution Protocol地址解析协议)广播的方式获知与本级各设备连接状态以及部署在各设备的软件所发送的心跳作为软件是否工作正常的依据。根据设备工作的状态分别以红灯和绿灯在地级设备的拓扑图上显示。
系统具备上级对本级授时,本级战区时间授时以及对下级设备授时的功能。通过信息交换服务器将北斗授时机发送的授时时间转发到设备状态监测系统所部署的综合管理席上。综合管理席作为时间同步服务器,本级各设备的系统时间依据时间同步服务器进行对时,同时将设置的战区时间发送到下级的各个监控站的设备。
系统具备设备历史状态查询,历史状态统计以及设备维护信息的管理功能。
1.3 国内外研究情况
随着现代技术的不断发展,各种旋转机械设备,如汽轮机、发电机、鼓风机及压缩机等,日益大型化、高速化、重载化和复杂化,机组的机械效率与自动化水平都比以前有了很大的提高,在国民经济中发挥着极其重要的作用。由于这些旋转机械是现代化连续生产过程中的关键部分,一旦发生故障造成停机,不仅使其本身遭受重大损失,而且造成连续生产中断,导致停工停产,带来巨大的经济损失和社会影响[6][7][8]。
所谓状态监测或条件监测(Condition monitoring),与预测维护(Predictive
maintenance)或基于条件的维护(Condition-based maintenance)以及检测维护(Detective maintenance),其思路都是一致的。状态监测可定义如下:即一种利用设备在需要维护之前,存在一个使用寿命的这种特点的预测方法,充分利用整个设备或者设备的某些重要部件的寿命特征,开发应用一些具有特殊用途的设备,并通过数据采集以及数据分析来预测设备状态发展的趋势。借助于状态监测,便利维护只需在需要时才安排,这样,可避免盲目维护,延长维护间隔,有效地减少因设备故障产生的意外事故[9]。
状态监测可分为3个基本步骤:(1)数据采集;(2)数据分析及特征提取;(3)2 华 中 科 技 大 学 硕 士 学 位 论 文
状态评估或故障诊断及分类。对于不同的步骤,根据不同的监测对象,可采用不同的方法。目前,欧美等发达国家和地区已将状态监测技术广泛应用于航空、航天、军事、冶金、矿山、炼油、化工、石油、汽车、发电等领域,并取得了巨大的经济效益和社会效益[10]。
我国的设备状态监测主要体现在电力部门设备的实时监测,由于国内的设备监测提出较之国外发达国家相对较晚,因此我国的设备状态监测的发展还需要一个长期的过程。
1.4 论文的研究内容
本课题提出了以MFC单文档机制设计并实现了多级设备状态监测系统,关注的主要方面是设备状态监测以及设备状态信息的管理。对局域网内的对时采用SNTP协议作为具体实现的技术。在客户端与后台数据库的连接上采用Oracle提供的Oracle
Object for Ole的应用程序接口技术。在此项目中,作者完成了系统的需求分析,主要模块的设计,以及系统实现的工作。
本文共分六章,各章的主要内容及结构安排如下:
第一章介绍了项目的研究背景以及国内外最新研究进展。
第二章介绍了SNTP协议,重点分析了SNTP的时间同步原理以及报文格式。接下来介绍了套接字的工作原理,最后介绍了OO4O的相关技术。
第三章首先对“多级设备状态监测系统”的需求情况进行了介绍,包括功能需求、性能需求以及运行需求。然后重点介绍系统的设计情况。
第四章对系统的功能模块的实现情况展开详细论述。
第五章介绍了系统的界面测试以及功能测试,并以主要模块的测试用例举例说明了功能测试的情况。
第六章,总结本论文的主要研究成果和系统的应用情况,指出需要进一步解决的问题,对未来发展的方向进行展望。
3 华 中 科 技 大 学 硕 士 学 位 论 文
2 相关技术分析
通过第一章关于设备状态监测系统在国内外的发展趋势及其实际意义的介绍,本章对多级设备状态监测系统所运用的关键技术进行详细的说明,为系统的分析与设计奠定技术上的基础。
2.1 简单网络时间协议
网络时间协议(Network time protocol)是一个跨越局域网和广域网的复杂的时钟同步协议。它提供了访问国家时间的机制,并且为子网中的每一个要求同步的时钟调整时间。NTP提供了1-50ms的精确度,精确度的大小取决于同步源和网络路径等特性[11]。
SNTP(Simple network time protocol简单网络时间协议)是NTP协议的一个简化版本,是为了那些不需要完整的NTP协议的主机制订的,但两者的时钟戳格式相同,而且在基于高速以太网的局域网系统中,通过SNTP协议精确时钟到10ms是可能的。SNTP主要用于局域网子网末端的时间同步协议以及同步因特网中的计算机时钟,其要求在操作过程中只允许存在一个可靠的同步时钟源[12]。SNTP版本4在RFC2030中有详细说明,NTP协议在RFC1305中有详细说明。SNTP服务器被认为是一个精确的时钟源,即使它本身不一定是一个精确的时钟,对于各种设备和工作站来说,都有相应的SNTP客户端软件,能同时钟服务器交换时钟数据。
SNTP能在单播(点对点)或者广播(点对多点)模式中操作。单播客户端发送请求到服务器并从那里得到答复,并且得到有关服务器的往返传播延迟和本地时钟补偿。广播服务器周期性地发送消息给指定的IP广播地址或者IP多播地址,而且通常不从客户端得到请求,广播客户端监听地址但通常并不给服务器发请求。一些广播客户端可能会送请求仅为了确定在服务器和客户端之间的网络传播延迟。
单播模式下,客户端和服务器的IP地址按常规分配。广播模式下,服务器使用指定的IP播送地址或者IP多播地址,以及指明的媒介访问播送地址,客户端4 华 中 科 技 大 学 硕 士 学 位 论 文
要在这些地址上侦听。IP广播地址被限制在一个单独的IP子网范围,因为路由器不传播IP广播数据报。对以太网而言,以太网媒介访问广播地址(主机部分全部为1)被用于表示IP广播地址[13]。
1)SNTP时间同步原理
SNTP时间同步基本原理如图2.1所示[14]。
Δ1BCΔ2服务端T1T2T3T4A图2.1 SNTP传输模型
D客户端
根据图示,可知:
T1:A点,客户方发送查询请求时间(以客户方时间系统为参照),该时间可以从客户机的系统时间读取;
T2:B点,服务器收到查询请求时间(以服务器时间系统为参照),该时间可以从服务器读取;
T3:C点,服务器回复时间信息包时间(以服务器时间系统为参照),该时间也从服务器读取;
T4:D点,客户方收到时间信息包时间(以客户方时间系统为参照),该时间为客户机系统时间;
Δ1:请求信息在网上传播所消耗的时间;
Δ2:回复信息在网上传播所消耗的时间。
设客户端时间与标准时间差值为θ,信息在网上传播的时间为Δ,则由图2.1可
得式2-1:
5 华 中 科 技 大 学 硕 士 学 位 论 文
⎧T2=T1+θ+Δ⎪⎨T4=T3−θ+Δ⎪Δ=Δ1+Δ2⎩12 (公式2-1)
假设请求和回复在网上的传播时间相同,即:Δ1=Δ2,那么可得式2-2:
⎧(T2−T1)−(T4−T3)⎪θ=2⎨⎪⎩Δ=(T2−T1)+(T4−T3) (公式2-2)
可以看到,θ、Δ只与T2、T1差值和T4、T3差值相关,而与T2、T3 差值无关,即最终的结果与服务器处理请求所需的时间无关。据此,客户端(Client)即可通过T1、T2、T3、T4 计算出时差θ去调整本地时钟。
2)SNTP时间戳格式
SNTP时间戳是在SNTP报文格式里出现的表现时间的基本单位。SNTP数据被指定为整数或定点小数,数据位以big-endian风格从左边0位或者高位计数。除非不这样指定,全部数据都将设成unsigned的类型,并且可能用一个在bit0前的隐含0填充全部字段宽度。因为SNTP时间戳是重要的数据和用来描述协议主要产品的,一个专门的时间戳格式已经建立。SNTP用时间戳表示为一个64 位无符号定点数,以秒的形式从1900年1月1日的0:0:0算起。时间戳包括两部分,整数部分和小数部分。整数部分(seconds)在前32位里,后32位(seconds Fraction)用以表示小数部分即秒以下的部分。在Seconds Fraction部分,无意义的低位应该设置为0[15]。
3)SNTP报文格式
SNTP消息封装在UDP (User Datagram Protocol用户数据报协议)报文中,UDP的端口号是123,UDP头中的源端口和目的端口是一样的。SNTP消息紧跟在IP和UDP报头之后,其消息格式如图2.2所示[16]。
6 华 中 科 技 大 学 硕 士 学 位 论 文
LI(2bit)VN(3bit)Mode(3bit)Stratum(8bit)Poll(8bit)Precision(8bit)根时延(Root Delay,32bit)根离散(Root Dispersion,32bit)参考标识符(Reference Identifier,32bit)参考时间戳(Reference Timestamp,64bit)原始时间戳(Originate Timestamp,64bit)接收时间戳(Receive Timestamp,64bit)发送时间戳(Transmit Timestamp,64bit)认证符(Authenticator可选项)
图2.2 SNTP消息格式
(1)LI:闰秒标识器(Leap Indicator),是一个二位码,用来预报当天最后一分钟里要被插入或删除的闰秒数。LI=00标识无预告;01表示最后一分钟61秒;10表示最后一分钟59秒;11表示始终未同步;
(2)VN:表示SNTP的版本(Version Number)号,如果是版本3则该值是3(仅用于IP v4),如果是版本4则该值是4(用于IP v4、IP v6、OSI)。如果必须区分是用于IP v4、IP v6或OSI,则封装的上下文必须要被检查;
(3)Mode:操作模式,其值从0-7表示意义依次为:保留、主动的对称性、被动的对称、客户端、服务器、广播、为NTP控制性系保留、为自用保留。在单播模式下,客户端在请求中设置次字段为3,服务器在回答是设置词字段为4;在多播模式下,服务器设置此字段值为5;
(4)Stratum:层次,是一个8bit的无符号整数,该值表示本地时钟的层次水平,其数值定义如下:0表示未指定或难以获得;1表示主要参考;2-15表示第二参考(通过NTP/SNTP);16-255保留[17];
(5)注册间隔(Poll interval):八位带符号整数,表示连续信息之间的最大间隔,秒数精确到2的n次幂,字段的值从4(16s)到14(16284s);然而,大多数应7 华 中 科 技 大 学 硕 士 学 位 论 文
用使用6(64s)到10(1024s);
(6)精度(Precision):八位带符号整数,表示本地时钟精度,秒数精确到2的n次幂,该字段值的范围一般为-6(主频时钟)到-20(微妙级时钟)出现在一些工作站上;
(7)根时延(Root Delay):32位带符号定点小数,表示在主参考源之间往返的总共时延,很短的时间在小数位后15~16bits。数值根据相关的时间与频率偏移可正可负,从负的几毫秒到正的几百毫秒;
(8)根离散(Root Dispersion):32位带符号定点小数,表示与主参考源的相对误差,到小数位后15~16bits。取值范围为零到几百毫秒[18];
(9)参考标识符(Reference Identifier):32bits的位串,用来标识特殊参考源;
(10)参考时间戳:64bits时间戳,本地时钟被修改后的最新时间;
(11)原始时间戳:客户端发送的时间,64bits;
(12)接受时间戳:服务端接受到的时间,64bits;
(13)传送时间戳:服务端送出应答的时间,64bits[19];
(14)认证符(Authenticator可选项):当NTP的认证机制已运行后,Key Identifier和Message Digest字段包含认证者的信息。对于SNTP认证实现不是必须[20]。
4)SNTP运行模式
SNTP客户端与服务器通信的模式是一个非持久状态的远程过程调用。在单播方式,客户端发给服务器请求并且期望服务器答复。在广播方式,客户端并不请求只是等待一台或更多的服务器的广播消息,这取决于设置。根据客户端和服务器设置,单播客户端和广播服务器通常在从64-1024s的间隔里发送消息。在客户端系统出错重启时也可以主动的发送时钟同步请求报文。这种良好的客户端设计方式可以很好满足网络的互操作性[21]。
时钟服务器与以太网相连,响应来自客户端的SNTP请求。
(1)单播模式:客户机提出同步请求,服务器作出答复。
这种体系结构下,服务器处于监听(Listen)模式,现场总线设备向服务器发送时钟同步请求报文[22]。
(2)广播模式:服务器局域网广播,客户端接收数据
8 华 中 科 技 大 学 硕 士 学 位 论 文
在这种体系结构下,服务器以一定的频率在全网广播SNTP数据报文,客户根据接收的数据报文来实现同服务器的时钟同步[23]。
5)SNTP客户端操作
SNTP客户端软件可以运行在单播模式也可以运行在广播模式。
单播模式下,单播客户端初始化SNTP报文首部,再把消息发送到服务器,然后从服务器回复的报文中取出时间。为此SNTP数据报设置如下[24]:
(1)上面提到的所有报文首部字段,除第一个八位字节外都设置成0。
(2)在这个八位字节里LI字段设置为0(没有警告)和方式字段设置为3(客户端)。
(3)VN字段必须同SNTP服务器的软件版本一致;但是,SNTP版本4(RFC
2030)的服务器也将接受第3(RFC 1769)版本的消息以及版本2(RFC 1119)的消息,而SNTP版本2服务器也将接受SNTP版本1的消息。版本0(RFC 959)消息不再被支持。推荐VN字段设置为1,以便于同不同的服务器通信。
(4)客户端Stratum字段:设置为0,表示没有明确指定。
(5)Precision字段:要求精度达到微秒,也就是2的-20次幂,二进制表示为10 010100(表示为无符号整数为148)。
当单播方式的服务器得到一条请求消息时,就在SNTP的报头里修改特定字段,并把消息返回给发送方。在单播方式下,VN和poll字段被完整地复制到应答包中的相同字段。请求的方式字段是3(客户端),那么在答复过程中它设置成4(服务器)。
广播模式下,客户端设计为既能够接收服务器的广播报文,也能够主动向服务器发送时钟请求报文。即在这种模式下,客户端能够同时支持广播和单播操作。一台服务器既支持广播方式,也支持单播方式,在需要时钟同步的时候能够直接向服务器发送请求同步报文,而不用等待广播消息。这种情况下,发送的SNTP请求报文格式与单播模式是一样的[25]。
2.2 Socket编程
1)Socket 工作原理
随着计算机和网络技术的发展,很多数据处理系统都采用开放系统结构的客户9 华 中 科 技 大 学 硕 士 学 位 论 文
机/服务器网络模式,即客户机发出请求,通过网络发送给服务器,由服务器做相应的处理,执行所请求的任务,然后将结果发送给客户机[26]。这样,如何在前置机和数据主机之间进行信息交换,即进程网络通信,就成为实现这种网络模式的基础。而TCP/IP的套接字技术是解这一问题的有力工具。它从提出时就一直发挥着愈来愈重要的作用,并已成为UNIX操作系统下TCP/IP网络编程标准;甚至Windows、Java都配有它的通用接口。所以,Socket接口被广泛采用,成为事实上的标准[27]。Socket是应用程序进程间通信的端点,计算机的两个进程可分别建立Socket。经过连接后,应用程序的两个进程间可以相互交换数据。在应用开发中就像使用文件句柄一样,可以对Socket句柄进行读、写操作。
Socket由下三个部分组成:
(1)Socket的IP地址:用于确定通信目的计算机。
(2)Socket的通信端口:用于确定通信目的计算机的应用程序进程。
(3)Socket类型:有面向连接的流套接字(Stream Socket)、无连接的数据报套接字(Datagram Socket)及原始Socket三种类型。
应用程序一般仅在同一类的套接口间通讯,目前常用的是流套接字和数据报套接字。以流套接字为例,流套接字提供面向连接的、可靠的、双向的、有序的、无重叠并且无记录边界的通信模式,具有一系列的数据纠错功能,可以保证在网络上传输的数据及时、无误地到达对方,下面介绍流套接字工作过程[28]:
服务器首先启动,通过调用socket()建立一个socket,然后调用bind()将该socket和本地网络地址联系在一起.再调用listen()使套接字接口做好侦听的准备,并规定其请求队列的长度,之后就调用accept()来接收连接。客户在建立socket后就可调用connect()和服务器建立连接。连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。当数据传送结束以后,双方调用close()关闭套接字。流套接字和工作过程如图2.3所示[29]。
2)SocketAPI 主要函数介绍
下面对SocketAPI的主要函数进行介绍[30]:
(1)Soeket():建立套接字。该函数用来建立套接字,并为此套接字分配资源。
10 华 中 科 技 大 学 硕 士 学 位 论 文
(2)Close():关闭套接字。该函数是用来关闭套接字,并回收分配的资源。
(3)Bind():将一本地地址与一个套接字描述字连接在一起。该函数在服务程序上使用,是调用监听函数Listen()必须要调用的函数。
(4)Listen():设置套接字为监听状态,准备被连接。该函数在服务端程序上使用,来设定套接字进入监听状态。
(5)Accept():接受客户端套接字的连接请求,以完成面向连接的客户端套接字的连接请求。
服务端Socket()Bind()客户端Socket()Listen()Connect()请求Recv()Send()Recv()Send()响应Close()Close()
图2.3 流套接字调用原理图
服务端应用程序调用此函数来接受客户端套接字连接请求,Accept()函数的返回值为新的套接字,新套接字可用来在服务端和客户端之间传递接收信息,而原来的套接字仍然可以接收其他客户端的连接请求[31]。
(6)Connect():请求连接客户端套接字到指定的网络服务端。该函数用在客户端,用来向服务端发起建立连接的请求。当连接建立完成后,客户端即可利用此套接字来与服务端进行信息传递[32]。
(7)Read():从面向连接的套接字接收信息。该函数用来使面向连接的套接11 华 中 科 技 大 学 硕 士 学 位 论 文
字接收信息。
(8)Write():使用面向连接的套接字发送信息。该函数用来使面向连接的套接字发送信息。
2.3 Oracle数据库连接组件
1)OO4O 简介
Oracle数据库连接组件OO4O (Oracle Object For OLE)是Oracle公司为了客户端存取数据库所开发的一个重要产品,它以windows95/98/NT为基础,供所有与OLE兼容的应用程序与程序语言(如VB、Access、ASP等)存取Oracle数据库。它能够无缝地联合并优化对Oracle数据库的访问,同时具有一个易于使用的界面。OO4O主要基于Microsoft的COM 和ActiveX技术,它包含一个进程内Automation
Server(自动化服务器)、一个C++ 类库和Oracle数据控件[33]。
(1)进程内自动化服务器
OLE Automation Server为在大范围的环境中有效、简便地访问Oracle数据库服务器提供了关键的功能。其范围包括了从典型的两层客户机/服务器应用程序(例如用Visual Basic或Excel开发的)到n层环境使用的应用服务器和Web服务器(例如IIS或Microsoft Transaction Server,MTS)。其功能包括:对Oracle PL/SQL语言的支持; 强大的查询结果集合管理;数组插入、更新和删除;性能调节和自定义参数;用于开发高效Web服务器和多线程应用服务器的线程无关的对象[34]。
(2)Oracle C++ 类库
C++ 类库包括了一组C++ 类,它实质上是进程内服务器提供的自动化对象封装类的集合。该C++ 类帮助开发人员避免用C或C++ 编写访问自动化对象的OLE
COM 客户端代码。另外,C++ 类库还包含了可以简化查询结果集与数据控制项(例如Visual C++ 中的编辑、文本、列表和组合框控件)之间的数据交换的类[35]。
(3)Oracle数据控件
Oracle数据控件是被设计来用于简化Oracle数据库和可视化控件(如Visual Basic中的编辑、文本、列表和网络控件)之间数据交换的OLE控件[36]。
12 华 中 科 技 大 学 硕 士 学 位 论 文
OO4O全面支持Oracle的关系对象和LOB数据类型,支持PL/SQL存储过程和Oracle AQ(advanced queuing)。所以它能与具有同样的COM和ActiveX技术的开发工具(如Visualc++、Visual Basic、Visual Basic For Applications(Ⅶ A),以及IIS的ASP(Ⅶ Script和JavaScript)等)联合使用,实现优化访问Oracle数据库和可视化开发,避免使用原始的API访问数据库的方式(OCI)和采用设置高层架构外部数据驱动方式(ODBC)来访问数据库,并且它比ODBC、OLE DB或基于组件的DAO、RDO和ADO等访问效率均要高[37]。
OO4O的软件层次如图2.4所示[38]。
Oracle Object For OLEC++ Class LibraryOracle 数据控件Oracle Object For OLEC++ Class LibraryOracle Object For OLE进程内自动化服务器Oracle客户端库Oracle数据库
图2.4 OO4O软件层次图
2)OO4O 类库介绍
OO4O是专为使用Oracle数据库服务器而开发和发展的。它为Oracle提供易于访问的独特功能,而这些功能要从ODBC和基于OLE-DB的组件(如ADO)使用则非常麻烦或者是不可访问。由于这是一个本地驱动程序,OO4O通常可以提供从13 华 中 科 技 大 学 硕 士 学 位 论 文
Windows客户端到Oracle数据库的最佳性能。它不会引起ODBC和OLE DB驱动程序的系统开销。使用Visual C++开发OO4O比较简单,提供了一些封装性较好的类[39]。它封装了访问Oracle数据库的主要API函数。以下介绍几个OO4O常用的C++ 类,如OSession、ODatabase、ODynaset、OField、OConection、OParameter、OParamArray等,其层次关系如图2.5所示[40]。
OSessionOConnectionOParameterODatabaseOParamArrayODynasetOField
图2.5 OO4O类层次关系图
(1)OSession类主要控制整个数据库的会话过程。一般情况下,一个应用程序仅有一个会话对象,每个会话对象却允许有多个数据库连接。该对象在应用程序中处于最高层并管理其它对象,比如管理数据库的连接、事务的提交与回滚等[41]。
(2)OConection类仅负责管理数据库的连接工作,它是会话和数据库对象的桥梁,当然会话也可以直接管理数据库对象。
(3)ODatabase类管理数据库的一个连接,它负责登陆到数据库,然后可用ExecuteSQL方法直接执行SQL语句,也可以创建一个ODynaset对象来操作数据记录集。
(4)ODynaset类是维护SQL语句查询集或PL/SQL存储过程和PL/SQL函数返回值的游标,它允许用户透明地浏览和修改SQL语句查询结果的数据。该对象自动14 华 中 科 技 大 学 硕 士 学 位 论 文
维持了一个本地缓冲区,通过本地缓冲区保证了所修改数据的完整性[42]。
(5)OField类管理一个字段集,它是ODynaset对象中数据列的一个抽象数据列,它可以包含ODynaset对象当前记录中某个列的值或元数据,并支持Oracle数据库的所有数据类型。
(6)OParameter、OParamArray类管理数据库的参数集,OParamArray是OParameter的容器,它主要是提高访问数据库的效率,实现批量操作[43]。
2.4 本章小结
本节主要介绍了SNTP协议的原理,时间戳格式和报文格式。在此基础上进一步介绍了SNTP协议的运行模式和客户端操作。本节还介绍了在Windows下套接字的网络编程的基本原理,介绍了两种套接字类型,字节流套接字以及数据报套接字,介绍了客户机/服务器模型。除此之外,本节还介绍了OO4O的基本概念和其类库中的主要的类的说明以及应用。
15 华 中 科 技 大 学 硕 士 学 位 论 文
3 多级设备状态监测系统的设计
在上一章中,论文对简单网络时间协议,套接字编程技术以及Oracle Object for
OLE的相关技术进行了介绍和研究。从本章开始,论文将具体说明“多级设备状态监测系统”的分析与设计。本章介绍系统的分析和设计情况,包括系统的需求分析、体系结构、业务功能模块的设计。
3.1 系统需求分析
多级设备状态监测系统包括地级设备和监控站设备的监测以及设备信息的管理。在监控站一级运用TCP协议,将应用层的内部协议封装成请求数据包,通过信息交换服务器发送到下级监控站。监控站收到请求指令后根据请求的类型将设备的状态信息或注册信息定时上报(立即)上报到地级监控中心。地级监控中心收到上传的信息后,用户可对这些信息进行选择或全部入数据库存储。同时更新系统的监控站视图区显示结果,将最新一批的设备状态信息输出到界面显示。
在地级通过发送ARP广播判断是否与设备状态系统所部署的主机与在一个网络拓扑结构所有设备(服务器)的连通状态。如发送成功表示连接正常在界面的拓扑图上用绿灯显示;否则表示连接断开,在界面上用红灯显示。
系统还具备对设备的维护信息,设备的报警条件,设备状态查询和统计进行管理。
1)系统功能需求
综合系统的总体需求,得到各个模块的需求情况如下:
(1)系统设置模块
① 设置战区时间,该功能用于对地级监控中心及其下级全部监控站设备进行统一授时;
② 设置行政区划级别,该功能用于用户对设备状态监测系统所管辖的下级监控站进行过滤,仅将需要管理的县级中心和监控站列入已选县级监控中心和已选监控站。监控中心所涉及到的各级行政区划信息数据由数据库中读取。行政区划设置完毕后,将更新层次选择区中的行政区划树型视图;
16 华 中 科 技 大 学 硕 士 学 位 论 文
③ 监控站报警条件设置,该功能用于设置当前管理的各监控站的报警条件,报警条件主要包括发生故障的各类前段设备数量,当该监控站中的设备发生故障的数量达到报警条件时,设备状态检测系统将会显示报警信息;
在设置报警条件的信息中,若设置了故障设备总数后,即不用对各类设备的故障数进行单一设置,若不设置故障设置总数这个条件则必须对各类设备故障数据进行设置;
④ 设备地址及端口配置,该功能是用户设置地级设备的IP地址和与信息交换服务器通信的端口号。初始化界面时读取的是配置文件中设置的内容,用户可以根据需要修改设备的地址以及端口号。再次运行时,显示的是用户设置后的信息;
(2)信息请求管理模块
① 发送请求下级监控站设备状态指令,请求状态指令通过信息交换服务器发送到下级监控站后,下级监控站将上级请求的设备状态发送给信息交换服务器,并由用户确定是否入数据库存储设备状态;
② 发送请求下级监控站设备注册信息指令,请求注册信息指令通过信息交换服务器发送到下级监控站后,下级监控站将上级请求的设备的注册信息发送给信息交换服务器,并由用户确定是否入数据库存储设备注册信息;
③ 发送请求下级监控站设备授时指令,请求授时指令通过信息交换服务器发送到下级监控站后,下级监控站的设备系统时间将自动与时钟服务器的系统时间同步;
(3)设备状态显示模块
① 设备状态显示功能,包括地级设备,县级设备和监控站设备。地级设备显示的是本级网络拓扑结构的各个设备的状态。县级和监控站设备显示的是最近新上报的设备工作状态以及其它的参数信息;
(4)设备维护管理模块
① 设备维护信息录入,地级及下级各类设备使用过程中,需要定期进行维护,为了便于对设备维护信息进行记录管理,需要记录的内容通过多种方式获得后,通过设备维护信息录入对话框,添加到系统的数据库服务器中;
② 设备维护信息查询,该功能负责对系统数据库服务器中设备维护信息记录17 华 中 科 技 大 学 硕 士 学 位 论 文
进行查询,通过设置各种查询条件,可以查询到不同的结果。为进一步查看设备维护信息,可以选中查询结果的某一项,双击后显示查询结果的详细信息;
(5)历史信息管理模块
① 历史状态查询,该功能用于对数据库中记录的各类设备状态进行查询,以了解各类设备的工作状态;当设置完毕查询条件后,可以根据查询条件进行历史状态查询,也可以查询数据库中所有的地级、县级、监控站级设备的历史状态;查询结果将列出在查询结果列表框中,设备的状态除了以文字信息显示外,还将在对应记录号后用红色和绿色区分设备工作状态是否正常;
② 历史报警查询,该功能用于查询数据库中记录的各类设备报警信息。依据不同的报警条件,报警时将记录报警时发生故障的各类设备数量;当设置完毕查询条件后,可以按照查询条件进行历史报警查询,也可以查询数据库中的所有地级、县级、监控站级设备的报警信息;
③ 历史状态统计,该功能将数据库中的监控站设备历史状态以直方图的形式直观地表示出来,以区分不同设备在某一时间段的工作状态。
2)系统性能需求
系统在性能上的需求主要体现在时间上的响应是否符合要求。具体性能需求目标如下:
(1)当前端设备状态发生改变时,系统反应时间<5秒;
(2)综合管理分系统启动后到进入工作状态的时间≤30秒。
3)系统运行需求
(1)基于MFC单文档应用程序框架,以菜单命令驱动方式为主,以工具栏按钮命令驱动方式为辅,选用皮肤背景控件来设置框架窗口各类界面元素。
(2)应用程序应具有启动画面。
(3)应用程序框架窗口区的左侧区域(宽度约站程序窗口1/4),用于显示不同层次级别的监控中心、监控站列表。
(4)应用程序框架窗口区的右侧视图区域通常显示某层次级别下的设备状态信息,对于监控站中的监控设备和雷达,以列表形式给出其工作状态,对于监控中心的设备则给出设备拓扑图。
18 华 中 科 技 大 学 硕 士 学 位 论 文
3.2 系统总体架构设计
1)设计目标
软件架构相当于系统的骨架,在系统中起着支撑的作用。好的软件架构设计对于整个软件项目的开发有着重要的作用,能够节约开发成本与时间,简化软件开发的复杂度,能够保证系统运行的稳定和可靠性。好的架构设计是准则可以概括为以下几个方面:
(1)重用性,通常在软件项目中为了避免重复的劳动,降低软件开发成本,希望能够重用以前的代码和设计工作成果。但是在实际上,能做到软件重用却绝非易事。在实际情况下对软件架构的重用上做了很多的工作,其成果称为框架,比如Windows的消息-窗口机制、J2EE平台等。
(2)封装性,为了提高软件的开发效率,把实现具体的细节信息隐藏起来,仅把客户需要的接口暴露给客户。这样,具体的实现对客户来说就是透明的。封装性是保证软件部件具有优良的模块性的基础。
面向对象的类是封装良好的模块,类定义将其说明(用户可见的外部接口)与实现(用户不可见的内部实现)显式地分开,其内部实现按其具体定义的作用域提供保护。对象是封装的最基本单位。封装防止了程序相互依赖性而带来的变动影响。面向对象的封装比传统语言的封装更为清晰、更为有力。
(3)扩展性,软件开发的一个很困惑的问题就是软件的需求有变化。因此需要软件在架构上具有一定的扩展性,适应将来需求可能发生的变化。
(4)简明性,复杂的软件架构设计在实现上或在维护上都是困难的。因此软件的架构能够在满足需求的情况下尽量简单。利用设计模式能够使得架构的设计变得简单,降低软件开发的复杂度以及开发成本。
(5)高效性,任何系统都追求软件架构的高效性。这对于一些特殊的系统来说显得更为重要。例如对于实时系统、高访问量的网站,都对系统的高效性有较高要求。
2)系统架构设计
根据上节对系统需求的分析,可以将系统设计为以下五大模块:系统设置,信19 华 中 科 技 大 学 硕 士 学 位 论 文
息请求管理,设备状态显示,设备维护管理,历史信息管理。系统的功能结构图如图3.1所示。
设备状态监测子系统系统设置信息请求管理设备状态显示模块设备维护管理历史信息管理设置战区时间设置行政区划级别设置监控站报警条件设备地址及端口配置请求设备状态请求向设备授时请求设备注册信息设备状态显示设备维护信息录入设备维护信息查询历史状态查询历史报警查询历史状态统计
图3.1 系统功能结构图
下面将对各功能模块进行详细的功能描述以及介绍系统的概要设计。
3.3 系统设置模块的设计
1)系统设置模块功能描述
系统设置模块涉及使用本系统所必需录入的基本信息,包括战区时间的设置,行政区划级别的设置,各监控站报警条件的设置以及设备在网络上的IP地址和通信的端口号。
2)设置战区时间子模块的设计
设置战区时间是对监控中心系统和监控站进行校时。修改战区时间后,通过驻留在本级各个设备的时间同步助手(其设计在后面介绍)自动将时间同步。同时通过信息交换服务器将设置的战区时间发送到下级各个监控站以对各监控站进行战区对时。
在该子模块所在的类中主要函数是OnButtonSetandSendTime(),该函数的功能是修改本机的系统时间,并将修改后的时间通过信息交换服务器发送给下级监控站。
时间同步助手是为了完成监控中心各台设备与部署在设备状态监测席位上的时20 华 中 科 技 大 学 硕 士 学 位 论 文
间服务器在时间上实现同步而设计的。设计用于与时间服务器同步的主要函数为OnClickApply(),该函数完成同步时钟周期的设定以及设置时间服务器的IP地址。
3)设置行政区划级别子模块的设计
设置行政区划级别是通过读取数据库中用户级别定义表的信息来设置军区级、地级监控中心、县级监控中心、监控站的行政区划名称。用户设置各级行政区划单位名称后,系统将设置后的各级单位名称存储到名为的配置文件中。用户级别定义表结构如表3.1所示。其中,表中的代号和隶属上级预标识其在系统中各级单位的层级关系。
表3.1 用户级别定义表
NAME COMMENT DATA TYPE NULL
ID
StationID
StationName
StationLevel
AtStationID
Directions
记录索引 Integer F
代号 Varchar(50) F
名称 Varchar(50) F
级别 Integer F
隶属上级 Varchar(50) F
备注 Varchar(500) F
在该子模块对应的类的主要函数是OnButtonSave(),该函数的主要功能是读取界面各行政区划单位名称并写入配置文件。
4)设置监控站报警条件子模块的设计
设置监控站的报警条件是对各监控站的设备故障总数以及各设备类型的故障数量作为报警的依据。设置报警条件后,系统会根据当前监控站发送的状态信息来判断监控站是否报警。下面对主要的功能及其函数进行介绍。
(1)设置监控站设备报警条件功能的设计
报警条件的设置的函数为UpdateAlarmCondition(),该函数的功能是设置监控站报警的故障设备总数和各设备类型故障门限数目,查询数据库中关于该监控站的报警条件,若数据表有该监控站的报警条件,则修改该监控站的报警条件,否则插入该监控站的报警条件,并将结果写入设备报警条件表。
21 华 中 科 技 大 学 硕 士 学 位 论 文
设备报警条件表结构如表3.2所示。
表3.2 设备报警条件表
NAME COMMENT DATA TYPE NULL
ID
SystemLevel
FailedDeviceCount
AlarmLocation
AlarmTime
LDFailSum
BGFailSum
HWFailSum
YTFailSum
记录索引 INTEGER F
设备层次级别 VARCHAR(4) F
故障设备数 VARCHAR(10) F
报警单位代码 VARCHAR(50) F
报警时间 INTEGER F
雷达故障数量 INTEGER
白光故障数量 INTEGER
红外故障数量 INTEGER
云台故障数量 INTEGER
F
F
F
F
(2)监控站设备报警功能设计
监控站报警功能由报警线程函数JKZAlarm()完成。该线程函数每隔一分钟开启一次,主要功能是查询数据库中设备状态表中的某类设备的故障总数,若故障设备总数超过了所该类设备的报警条件值,则提示监控站的这类设备发生故障,并将设备故障信息写入设备报警信息数据表,该数据表记录的信息包括设备报警时间,故障设备的总数以及某监控站下各种设备的故障数目。
设备报警信息数据表结构如表3.3所示。
表3.3 设备报警信息数据表
NAME COMMENT DATA TYPE NULL
AarmNumber
AlarmTime
FiledDeviceCount
LDFailSum
BGFailSum
HWFailSum
YTFailSum
报警事件号 INTEGER
报警事件时间 INTEGER
F
F
故障设备数量 VARCHAR(20) F
雷达故障数量 INTEGER
白光故障数量 INTEGER
红外故障数量 INTEGER
云台故障数量 INTEGER
F
F
F
F
22 华 中 科 技 大 学 硕 士 学 位 论 文
5)设备地址及端口配置子模块的设计
设备地址及端口配置是设置设备的IP地址和端口号是对本级设备、时钟服务器的IP地址和与信息交换服务器所发送状态、注册、授时请求的端口号进行设置。函数OnInitDialog()初始化设备地址及端口配置信息,函数OnButtonSave()将设置后的信息保存到配置文件和配置文件中。
3.4 信息请求管理模块的设计
1)信息请求管理功能描述
信息请求管理模块涉及请求设备状态,请求向设备授时,请求设备注册信息。下面对各子模块的设计进行介绍。
2)请求设备状态子模块的设计
请求设备状态是以通过发送请求下级监控站的指令的方式获取监控站的设备状态。按照内部通信协议中规定的指令格式将数据项封装成数据包通过流套接字发送到指定端口号的信息交换服务器。其功能由函数OnButtonSendState()完成,该函数是将已选择的信息源、信息宿以及所请求的设备类型名称在规定的时间内将通信指令发送给信息交换服务器。若信息交换服务器在规定的时间内没有接受到请求指令则提示连接超时信息。请求设备状态协议如图3.2所示。
数据类型(8bit)数据长度(16it)信息源(24bit)信息宿(24bit)信息类型(24bit)日时间(32bit)用户信息(用户名占40bit,密码占264bit)设备类型(8bit)设备编号(16bit)设备查询(8bit)上报方式(8bit)字段说明符(32it)
图3.2 请求设备状态协议格式
23 华 中 科 技 大 学 硕 士 学 位 论 文
(1)数据类型:长度为一个字节,指明传输的数据类。
(2)数据字段:长度为两个字节,指明数据块的总长度(以字节为单位),该长度包括数据类型和数据长度字段。
(3)字段说明符:是一个可变长的字段,为一个内容表,指明记录中数据字段的有无以及排序;字段中除FX(可扩展位)每位用“1”表示对应的数据字段存在,用“0”表示对应的字段不存在;字段中的顺序表明数据字段在记录中出现的顺序;字段采用字段扩展机制,即每个字节最后一位(FX)指示是否存在后续字节,“1”代表存在,“0”代表不存在,其格式如表3.4所示。
表3.4 字段说明符结构图
位1位2 位3 位4位5位6位7位8
F1 F2 F3 F4 F5 F6 F7 FX
(4)信息源:长度为三个字节,指明信息的发送方。位24-位21为国家与大区域编码定义,位20-位16为省级定义,位15-位11为地级系统定义,预留5位,由各省级系统自行定义。位10-位6为县级系统定义,预留5位,由各省级系统自行定义。位5-位1为监控站系统定义,县级系统下辖监控站编号,预留5位。信息源结构图如图3.3所示。
24232221201918省级12111098县级76543监控站211716国家和军区151413地级
图3.3 信息源结构图
(5)信息宿:长度为三字节,指明信息接收方。其格式同信息源。
(6)信息类型:长度为两字节,是所有类型报文的信息类型均保持相同的数据结构。其中,位24-位21为信息标示位,0000表示编码报,0001表示取消报,0010表示更改报;位20-位17为信息类型,0000表示普通报,0001表示状态类,001024 华 中 科 技 大 学 硕 士 学 位 论 文
表示命令类,0011表示响应类,0100表示请求类,0101表示应答类;位16为响应码(S1),是对命令类的执行情况进行回复;位15为应答码(S2),是对请求类的执行情况进行回复;位14为注册码(S3);位13-位1为识别码。信息类型的结构示意图如图3.4所示。
2423222120191817信息标识16S115S214S31312信息类型1110987识别码654321
图3.4 信息类型结构图
(7)日时间:长度为四字节,采用格林威治时间,单位为毫秒。
(8)用户信息:定义用户信息,包括用户名,用户密码等。
(9)设备类型:描述设备所属的类型,如雷达,摄像机等。该字段为可扩展字段,位8-位2为设备类型,编码规则是0代表默认值,1代表白光摄像机,2代表红外摄像机,3代表云台,4代表DVR,5代表编码器,6代表VGA,7代表防越报警系统,8代表雷达,9代表计算机,10代表电源,11代表北斗。FX为扩展指示位,其意义是0表示数据项结束,1表示向下一域扩展1个字节。设备类型结构示意图如图3.5所示。
8765设备类型图3.5 设备类型结构示意图
4321FX
(10)设备编号:描述监控站或监控中心所属设备的编号。位16-位9为前端号(是指该设备所属的监控站下辖哨所或点位的内部编号),位8-位2为设备编号。位1 (FX)为指示扩展位,其意义是0表示数据项结束,1表示向下一域扩展1个字25 华 中 科 技 大 学 硕 士 学 位 论 文
节。设备编号的结构示意图如图3.6所示。
11098765设备编号4321FX前端号
图3.6 设备编号结构示意图
(11)设备查询:长度为一字节,表示查询监控站或监控中心所属所有设备或单个设备的状态信息或注册信息。编码方式规则是0为系统默认值;1为查询所有设备的状态信息;3位查询所有设备的注册信息;4为查询某个设备的状态信息;6位查询某个设备的注册信息。设备查询的结构示意图如图3.7所示。
87654321设备查询
图3.7 设备查询结构示意图
(12)上报方式:长度为一字节,描述确定设备状态的上报方式。其编码规则是0为默认值;1代表定时上报设备状态;2代表立刻上报设备状态。上报方式的结构示意图如图3.8所示。
87654321上报方式
图3.8 上报方式结构示意图
3)请求向设备授时子模块的设计
请求向设备授时是以通过发送给下级监控站的授时请求指令,监控站获得授时指令后将时间自动同步为地级设备的时间。按照内部通信协议中规定的指令格式将数据项封装成数据包通过流套接字发送到指定端口号的信息交换服务器。其功能由函数OnButtonShoushisend()完成,该函数将已选择的信息源、信息宿以及所请求的设备类型名称将通信指令发送给信息交换服务器。请求设备授时协议如图3.9所示。
其中,数据类型至设备编号的结构格式同请求设备状态协议中的规则。
26 华 中 科 技 大 学 硕 士 学 位 论 文
授时时间:长度为五字节,描述向下级监控中心或监控站发送的时间或对时命令。位40-位37为保留,全填0;位36-位33的编码规则是0000为供下级中心或接收方参考,0001为下级中心按照此时间对时,0010为下级监控中心按照本地高精度时间源对时;位32-位1为时间,单位是毫秒。授时时间的结构示意图如图3.10所示。
数据类型(8bit)数据长度(16it)信息源(24bit)信息宿(24bit)信息类型(24bit)日时间(32bit)用户信息(用户名占40bit,密码占264bit)设备类型(8bit)设备编号(16bit)授时时间(40bit)字段说明符(32it)
图3.9 请求设备授时协议格式
43用2734途2625时1109时24间8间765432181733
图3.10 授时时间结构示意图
4)请求设备注册信息子模块的设计
请求设备注册信息是以通过发送给下级监控站的注册信息指令的方式获取监控站的设备注册信息。按照内部通信协议中规定的指令格式将数据项封装成数据包通过流套接字发送到指定端口号的信息交换服务器。其功能由函数OnButtonRegistsend()完成,该函数将已选择的信息源、信息宿以及所请求的设备类型名称在规定的时间内将通信指令发送给信息交换服务器。若信息交换服务器在规定的时间内没有27 华 中 科 技 大 学 硕 士 学 位 论 文
接收到请求注册信息指令则提示连接超时信息。请求设备注册信息协议如图3.11所示。其中,数据类型至设备查询的结构格式同请求设备状态协议中的规则。
数据类型(8bit)数据长度(16it)信息源(24bit)信息宿(24bit)信息类型(24bit)日时间(32bit)用户信息(用户名占40bit,密码占264bit)设备类型(8bit)设备编号(16bit)设备查询(8bit)字段说明符(32it)
图3.11 请求设备注册信息协议格式
3.5 设备状态显示模块的设计
1)设备状态显示模块功能描述
设备状态显示模块可分为地级设备和监控站设备状态显示两部分。在地级显示的是地级设备的网络拓扑结构图,将在一个网络内监测的所有设备通过拓扑图直观的展示出。对连通的设备用绿灯在拓扑图上显示,对失去连接的设备用红灯在界面上显示。在监控站一级是将监控站最新上报的设备的状态显示在列表框中,对故障的设备用红灯显示,对正常工作的设备用绿灯显示。同时,系统定时刷新列表框的结果,以显示各监控站最新上报的设备状态。
2)设备状态显示子模块的设计
设备状态显示子模块可分为地级设备状态以及监控站设备状态的显示,下面对这两部分的设计进行介绍。
(1)地级设备状态显示设计
界面初始化由函数OnInitialUpdate()完成,该函数的功能是获取屏幕分辨率自动载入拓扑图(位图)。载入显示红绿灯的图标,并返回红绿灯图标的句柄。设置定时器函数SetTimer()。
28 华 中 科 技 大 学 硕 士 学 位 论 文
系统通过定时器函数OnTimer()定时刷新网络拓扑图的设备连接状态。
(2)监控站设备状态现实设计
重载OnDraw()函数,该函数刷新客户区的显示区域,初始化列表框的属性,所显示的列名包括设备故障状态,设备开关机状态,设备类型,设备编号,水平角,俯仰角,电视视场角,红外视场角以及接收时间。该函数将表示红灯和绿灯的图标加入到CImageList队列中。最后调用DisplayList()函数,将从设备状态信息表读出的设备状态插入到列表框中。设备状态信息数据表结构如表3.5所示。
表3.5 设备状态信息数据表
NAME COMMENT DATA TYPE NULL
RecoredID 记录索引 INTEGER F
CurrentTime 当前时间 INTEGER F
InfoSource 信息源 VARCHAR(24) F
InfoDestin 信息宿 VARCHAR(24) F
InfoType 信息类型 VARCHAR(24) F
UserInfo 用户信息 VARCHAR(200) F
DeviceType 设备类型 INTEGER F
DeviceNumber 设备编号 VARCHAR(40) F
DeviceSubject 设备隶属 VARCHAR(40) F
DeviceQuery 设备查询 INTEGER T
DeviceFailureState 设备故障状态 VARCHAR(16) F
AzimuthAngle 水平角 INTEGER F
PitchingAngle 俯仰角 INTEGER F
TvFOVAngle 电视视场角 INTEGER F
InfraredFOVAngle 红外视场角 INTEGER F
BootState 开关机状态 VARCHAR(16) F
SubmissionMode 上报方式 INTEGER F
TimeSet 授时 VARCHAR(40) T
DeviceBrandDescribe 设备品牌描述 VARCHAR(200) T
DeviceModel 设备型号说明 VARCHAR(200) T
3.6 设备维护管理模块的设计
1)设备维护管理模块功能描述
设备维护管理模块包括设备维护信息录入以及查询。下面对这两个子模块的设计进行介绍。
2)设备维护信息录入子模块的设计
29 华 中 科 技 大 学 硕 士 学 位 论 文
设备维护信息录入是对设备的维护情况进行记录并存储到数据库中。进行录入的条件有负责人,设备级别,设备名称,部门类别,部门名称,维护起始时间以及维护的说明信息。
其中,负责人是具体负责设备维修的人员,设备级别包括地级设备,县级设备和监控站设备,若选择设备级别是地级设备则其下的设备名称包括:视频解码服务器,视频转发服务器,视频存储管理服务器,视频会议服务器,数据库服务器,信息交换服务器,视频监控管理席,态势显示控制席,指挥作业管理席,系统综合管理席,值班席,信息安全服务器,防火墙,入侵检测;选择设备级别为监控站则其下的设备名称包括雷达,红外、白光摄像机,云台。维护起始时间的格式采用年-月-日-时-分-秒。保存设备维护的录入信息主要由函数OnButtonInputMaintain()完成,该函数的功能是校验输入的设备维护信息,若通过合法性校验后将输入的维护信息保存到设备维护信息数据表中。设备维护信息表结构如表3.6所示。
表3.6 设备维护信息数据表
NAME COMMENT DATA TYPE NULL
Deviceno
ResName
Department
DepType
SysLevel
DeviceName
MaintainStartTime
MaintainEndTime
DetailInfo
设备编号 INTEGER F
负责人姓名 VARCHAR(30) F
部门名称 VARCHAR(30) F
部门类别 NUMBER(2) F
设备级别 VARCHAR(10) F
设备名称 VARCHAR(50) F
维修起始时间 INTEGER
维修完成时间 INTEGER
说明信息 VARCHAR(1000)F
F
F
3)设备维护信息查询子模块的设计
设备维护信息查询是对设备的维护的历史信息进行查询,查询条件有负责人,设备级别,设备名称,部门类别,部门名称,维护起始时间。提供精确查询和模糊查询以及选择查询条件查询和全部查询。该模块还具备将查询结果分页显示,可选择上一页和下一页查看查询后的结果。
选择查询条件查询的功能由函数OnButtonQuerySelect()完成,该函数将所选30 华 中 科 技 大 学 硕 士 学 位 论 文
择的查询条件拼接成查询语句查询设备维护信息表中的内容,然后调用UpdateListBox()函数将查询结果插入到列表框中。在列表框中每次显示20条查询结果。
全部查询的功能由函数OnButtonQueryAll()完成,该函数查询数据库中所有的设备维护信息,然后调用UpdateListBox()函数将查询结果插入到列表框中。
上一页和下一页的查询结果显示分别由函数OnButtonFrontpage()和函数OnButtonNextpage()完成,这两个函数调用UpdateListBox()函数将查询后的结果插入到列表框中。
3.7 历史信息管理模块的设计
1)历史信息管理模块功能描述
历史信息管理模块包括历史状态查询,历史报警查询和历史状态统计三个子模块,下面对这三个子模块的设计进行介绍。
2)历史状态查询子模块的设计
历史状态查询是对地级设备,县级设备,监控站设备的状态进行的查询。查询的条件包括单位级别,报警单位,系统名称,设备状态,时间范围。提供选择查询条件查询和全部查询。
报警单位将列出某一级行政区划下的全部单位名称;系统名称将列出某一级行政区划下的设备的名称;
设备状态将列出某一级行政区划下的设备的状态,地级和县级设备状态有网络连接正常和网络连接断开两类,监控站设备状态有开机、关机以及无意义三种。
系统提供根据查询条件进行历史状态查询,以及查询数据库中所有的的地级、县级、监控站级设备的历史状态。
查询结果将列出在查询结果列表框中,设备的状态除了以文字信息显示外,还将在对应记录号后用红色和绿色区分设备工作状态是否正常。当查询结果多于20条时,将会分页显示,可选择上一页和下一页查看全部结果。
选择查询条件查询的功能由函数OnButtonQuerySelect()完成,该函数将所选择的31 华 中 科 技 大 学 硕 士 学 位 论 文
查询条件拼接成查询语句查询设备状态和控制信息数据表中的内容,然后调用UpdateListBox()函数将查询结果插入到列表框中。在列表框中每次显示20条查询结果。
全部查询的功能由函数OnButtonQueryAll()完成,该函数查询数据库中所有的设备状态历史信息,然后调用UpdateListBox()函数将查询结果插入到列表框中。
上一页和下一页的查询结果显示分别由函数OnButtonLastpage()和函数OnButtonNextpage()完成,这两个函数调用UpdateListBox()函数将查询后的结果插入到列表框中。
3)历史报警查询子模块的设计
历史报警查询是对地级设备,县级设备,监控站设备的报警信息进行的查询。查询的条件包括单位级别,报警单位以及时间范围。提供选择查询条件查询和全部查询。用于查询数据库中记录的各类设备报警信息。依据不同的报警条件,报警时将记录报警时发生故障的各类设备数量,地级和县级中心的故障设备仅有总数,而无雷达、白光、红外和云台数量,监控站级的将依次列出各种设备类型的故障设备数量。
选择查询条件查询由函数OnButtonQuerySelect()完成,该函数将所选择的设备报警的条件组成查询语句查询设备报警信息数据表,然后调用函数UpdateListBox()将查询结果插入到列表框中,每一页显示20条查询结果。
全部查询由函数OnButtonQueryAll()完成,该函数将设备报警信息数据表中的所有记录全部显示,调用UpdateListBox()将查询结果插入到列表框中。
4)历史状态统计子模块的设计
历史状态统计是对所有下级监控站的状态信息进行直方图的显示。直方图列出了根据监控站名称,设备类型和时间范围进行的状态统计。显示的状态信息是根据设备的故障类型(包括设备正常,亚正常和故障)以及设备类型得到各个设备的统计数目。
历史状态统计条件包括监控站名称,设备类型以及时间范围。当选择监控站为全部时,绘制所有监控站下的各类设备类型的在某一时间范围内的统计直方图,当选择某一监控站,则绘制该监控站下的所有设备类型在某一时间范围内的直方图。
32 华 中 科 技 大 学 硕 士 学 位 论 文
选择监控站名称的下拉框后,调用OnSelchangeComboJkzname()函数,该函数再调用函数UpdateView(),其功能是根据选择的监控站名称从数据库中查询符合条件的状态查询语句绘制状态统计直方图。
选择设备类型下拉框后,调用OnSelchangeComboDevicetype()函数,该函数再调用函数UpdateView(),该函数绘制某一类设备类型在某一时间范围内的统计直方图。
3.8 本章小结
本章首先从系统功能的角度详细介绍了系统的需求情况。
在提取相应的需求后,把系统划分为五个模块:系统设置模块、信息请求管理模块、设备状态显示模块、设备维护管理模块、历史信息管理模块。其中设备状态的显示模块是主要的功能模块,多级设备状态监测的主要功能就是获取本级设备的工作状态,并且显示监控站最新上报的设备状态,使工作人员对设备的运行状况有直观的了解,当设备发生故障时能够及时的进行维修。
本章还针对每个功能模块从功能描述、概要设计、数据库设计情况进行了分析,为之后的详细设计以及实现提供了基础。
33 华 中 科 技 大 学 硕 士 学 位 论 文
4 多级设备状态监测系统的实现
基于前面几章的技术分析和系统分析与设计的要求进行实现多级设备状态监测系统。本章将对设备状态监测系统环境的搭建情况与运行环境,系统中主要功能模块的实现进行详细介绍。
4.1 系统架构搭建与运行环境
系统在Windows XP Professional/2000/NT环境下,使用Visual C++ 6.0作为集成开发环境.系统为用户提供了友好的操作界面。数据库使用Oracle 10g企业版。系统的开发及运行环境如表4.1、表4.2所示。
表4.1 系统开发环境
项目
硬件环境
数据库
开发工具
操作系统
具体环境及版本
Intel P4 2.0Ghz处理器,2GB内存,100M自适应网卡
Oracle 10g 企业版
Visual C++ 6.0,PLSQL Developer7.1
Windows XP Professional/2000/NT
表4.2 系统运行环境
项目
硬件环境
具体环境及版本
Intel P4 2.0Ghz处理器,2GB内存,100M自适应网卡
数据库 Oracle 10g 企业版
操作系统 Windows XP Professional/2000/NT
4.2 系统设置模块的实现
1)设置战区时间子模块的实现
定义设置战区时间子模块的类为CLocalTimeDlg,实现战区授时的主要函数是OnButtonSetandSendTime()。该函数首先将用户输入的时间设置为系统时间,定义一个SYSTEMTIME类型的变量st以及设置系统时间的布尔返回值bSuccess,设置34 华 中 科 技 大 学 硕 士 学 位 论 文
系统时间后发送消息SendMessage(HWND_BROADCAST, WM_TIMECHANGE, 0,
0)。然后将修改后的系统时间通过子节流套接字将授时指令封装成数据包发送给信息交换服务器。如果bSuccess为真,提示授时成功消息,否则提示授时失败。设置战区时间的界面如图4.1所示。
图4.1 设置战区时间界面
定义时间同步助手的类为CTimeSynchronization,实现时间同步周期的函数为OnClickApply()。该函数首先通过UpdateData()获取界面上用户输入的时间服务器的IP地址以及定时的周期,然后调用定时器函数OnTimer(IDT_APPLY)。在函数OnTimer(UINT nIDEvent)中,定义COleDateTime类型的变量dtTime,通过dtTime = COleDateTime::GetCurrentTime(),获得当前系统时间。然后定义CString类型的字符串strTemp,通过("现在时间%02i:%02i:%02i",r(),ute(),ond())格式化当前时间的时分秒,接下来调用GetDlgItem(IDC_CURTIME)->SetWindowText(strTemp)在界面上输出当前时间,最后调用函数TimeChange()。
在函数TimeChange()中,定义CSNTPClient类型的对象clientsntp,以及NtpServerResponse类型的对象 serverresponse。语句m_ress(ch1,ch2,ch3,ch4)将用户设置时间服务器的IP地址保存到四个BYTE类型的变量中,定义CString类型的变量timeIP,该变量存储转化后的点分IP地址。如果verTime(timeIP, serverresponse)为真,则语句CNtpTime newTime(CNtpTime::GetCurrentTime()+ serverresponse.m_LocalClockOffset)以及entTime(newTime)将客户机上的时间与时间服务器同步。时间同步助手的界面如图4.2所示。
35 华 中 科 技 大 学 硕 士 学 位 论 文
图4.2 时间同步助手界面
2)设置行政区划级别子模块的实现
定义设置行政区划级别子模块的类为CRegionDlg。添加“大军区”下拉框m_combo_big的消息映射ON_CBN_SELCHANGE(IDC_COMBO_BIG,
OnSelchangeComboBig),在消息函数OnSelchangeComboBig()中调用函数UpdateDialog(1),函数UpdateDialog(int level)的功能是根据用户选择的行政区划级别显示该行政区划下的单位名称,其中参数level是行政区划级别:1表示大军区,2表示省军区,3表示地级,4表示县级,5表示监控站。
添加备选列表框m_list_left的Notify消息映射,ON_NOTIFY(NM_CLICK,
IDC_LIST_LEFT, OnClickListLeft),消息函数OnClickListLeft(NMHDR* pNMHDR,
LRESULT* pResult),定义POSITION类型的变量pos,由pos=m_list_stSelectedItemPosition()得到用户所选择的第一个所选项的索引,IndexInFieldList = m_list_tSelectedItem(pos)获得下一个选择项的索引,最后*pResult = 0返回。
添加“>>”按钮的消息函数OnButtonLeftone(),该函数的功能是将备选列表框m_list_left中内容的一项添加到保存列表框m_list_right。同样还添加了“<<” 按钮的消息函数OnButtonRightone()将保存列表框的内容添加到备选列表框。
在设置了各级行政区划单位名称后,定义“确定”按钮的响应函数OnButtonSave(),该函数将用户设置的各级单位名称保存到配置文件。
36 华 中 科 技 大 学 硕 士 学 位 论 文
3)设置监控站报警条件子模块的实现
定义监控站监控站报警条件的类CAlarmReasonSet,添加“确定”按钮的响应函数OnButtonSaveAlarmCondition(),该函数定义一个布尔类型的变量ret,调用ret=UpdateAlarmCondition()函数,函数UpdateAlarmCondition()首先检查用户设置的设备报警数目的有效性,查询语句"select * from ALARM_CONDITION
where ALARMLOCATION=str_alarmlocno"是查询用户所选择的监控站的报警条件记录,通过结果集的数目确定数据库中是否有该监控站的报警条件记录:若有记录,调用语句" UPDATE alarm_condition SET faileddevicecount, ….
Where ……",否则调用语句"INSERT INTO alarm_condition (id, systemlevel…)values (……..)。将提交的设备报警条件存储到数据库。
定义监控站设备报警的线程函数JKZAlarm(),定义CEvent类型的全局变量
g_jkzevent,线程函数首先设置事件的状态不允许线程通过:g_vent()。然后查询监控站的报警条件中所设置的报警设备数量:"Select LDFAILSUM,
< ALARMLOCATION, MAX (ALARMTIME)FromALARM_CONDITION Where (alarmtime in (select max (alarmtime)from
alarm_condition))and…….)Group By …"。定义t_ldsum、t_hwsum、t_bgsum、t_ytsum存储雷达、红外、白光,云台的报警门限数量。
接下来查询设备状态信息数据表中故障设备的数量:"Select
devicetype,devicefailurestate,devicenumber From device Where
(currenttime,devicenumber,devicetype,infosource)in (Select max(currenttime),devicenumber,devicetype,infosource from device where…….. Group
By devicenumber, devicetype, infosource)Group By …"。定义color_red_ld,color_red_hw,color_red_bg,color_red_yt存储雷达、红外、白光,云台的故障数目。如果color_red_ld>=t_ldsum或者color_red_bg>=t_bgsum或者color_red_hw>=t_hwsum或者color_red_yt>=t_ytsum,则监控站发出报警提示。同时将报警的日志信息存到数据库。函数调用g_nt()设置事件的状态允许线程通过。
37 华 中 科 技 大 学 硕 士 学 位 论 文
4)设备地址及端口配置子模块的实现
定义类CIPSETDLG,添加Windows消息WM_INITDIALOG,在函数OnInitDialog()中,将配置文件中设备的IP地址以及端口号读出并在界面上显示出。
添加“确定”按钮消息响应函数OnButtonSave(),该函数将用户设置的设备IP地址以及端口号保存到配置文件。定义BYTE类型的数组ipAddr,m_ip_ress(ipAddr[0],ipAddr[1],ipAddr[2],ipAddr[3])获得信息交换服务器的IP地址,然后调用函数WritePrivateProfileString()写配置文件。设备地址及端口配置的界面如图4.3所示。
图4.3 设备地址及端口配置的界面
38 华 中 科 技 大 学 硕 士 学 位 论 文
4.3 信息请求管理模块的实现
1)请求设备状态子模块的实现
定义请求设备状态的类为CSendDeviceState。定义函数GetSourceAeraName(),返回类型为CString。该函数的功能是根据用户选择的信息源,将与之对应的信息源编码从数据库中取出。查询语句为:"Select STATIONID from stationleveltable Where
stationname….."。函数返回信息源编码字符串。
定义函数GetDestAeraName(),返回类型为CString。该函数的功能是根据用户选择的信息宿,将与之对应的信息宿编码从数据库中取出。查询语句为:"Select
STATIONID from stationleveltable "。函数返回信息宿编码字符串。
添加“发送”按钮的消息响应函数OnButtonSendState(),该函数将设备状态请求指令封装成数据包通过字节流套接字发送到指定端口号的信息交换服务器。定义SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0)初始化一个字节流套接字,send(sockClient,buff,67,0)语句将缓冲区buff的数据内容发送到该套接字。最后调用closesocket(sockClient)关闭该套接字以及WSACleanup()终止套接字。
2)请求向设备授时子模块的实现
定义请求向设备授时的类为CSendTime。定义函数GetSourceAeraName(),GetDestAeraName(),这两个函数将用户所选择信息源和信息宿对应的编码信息从数据库中取出。
添加“发送”按钮的消息响应函数OnButtonShoushisend(),该函数将设备授时指令封装成数据包通过字节流套接字发送到指定端口号的信息交换服务器。定义SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0)初始化一个字节流套接字,send(sockClient,buff,66,0)语句将缓冲区buff的数据内容发送到该套接字。最后关闭和终止套接字。
3)请求设备注册信息子模块的实现
定义请求设备注册信息的类为CSendRegisterInfo。定义函数GetSourceAeraName(),GetDestAeraName(),这两个函数将用户所选择信息源和信息宿对应的编码信息从数据库中取出。
39 华 中 科 技 大 学 硕 士 学 位 论 文
添加“发送”按钮的消息响应函数OnButtonRegistsend(),该函数将请求设备注册信息指令封装成数据包通过字节流套接字发送到指定端口号的信息交换服务器。定义SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0)初始化一个字节流套接字,send(sockClient,buff,60,0)语句将缓冲区buff的数据内容发送到该套接字。最后关闭和终止套接字。
4.4 设备状态显示模块的实现
1)地级设备状态显示子模块的实现
定义地级设备状态显示模块的类为CLocalView,其基类是CFormView。添加虚函数OnInitialUpdate(),首先获得当前屏幕的分辨率GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN)。根据分辨率的大小载入不同适应屏幕分辨率的网络拓扑图。定义CBitmap类型的对象bmp,CBrush类型的对象m_brushBackground,通过tmap(…)载入位图以及m_PatternBrush(&bmp)创建背景画刷。最后载入显示设备状态的图标:HICON m_hIcon_green = AfxGetApp()->LoadIcon(IDI_ICON_GREEN16)。
添加Windows消息WM_TIMER,改写void OnTimer(UINT nIDEvent)函数,通过发送arp数据包判断是否与设备连接状态是连通还是断开:DWORD
hr=SendARP(ip_addr,0,mac,&mac_len),若hr为NO_ERROR,与设备连通:用deviceStatue=1表示;否则,连接断开,用deviceStatue=0表示。在系统的状态栏提示拓扑结构中未连网设备的数量:CStatusBar* pStatus = (CStatusBar* )AfxGetApp()->m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR),pStatus->SetPaneText(0,"当前未连网设备数量:"+str_red+"台。")。其中,str_red是连接断开设备的总数。监控中心网络拓扑图如图4.4所示。
2)监控站设备状态显示子模块的实现
定义监控站设备状态显示模块的类为CFrontDeviceView,其基类是CFormView。添加虚函数void OnDraw(CDC* pDC),该函数设置监控站显示列表框m_list_device40 华 中 科 技 大 学 硕 士 学 位 论 文
的列属性以及显示风格:m_list_endedStyle(dwStylel)。定义CImaglist类型的对象image_list,创建表示设备故障状态的图标列表:HICON hIcon
= ::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON_GREEN32)),image_list_(hIcon)。之后设置图标列表的显示风格:m_list_geList(&image,LVSIL_SMALL)。最后调用函数DisplayList()。
图4.4 地级监控中心网络拓扑图
函数DisplayList()首先初始化数据库连接,定义CString类型对象str_devicenumber,对该字符串调用函数 GetDeviceNumber()获得设备编号。然后执行Sql语句:"Select devicefailurestate, bootstate, devicetype, devicenumber…… from
device where (currenttime, devicetype, )in (select max (currenttime), devicetype,
infosource from device where devicenumber='%s' and devicefailurestate is not null
group by devicetype, infosource)group by recordid, devicefailurestate… order by
currenttime desc, recordid desc", str_devicenumber。将查询出的结果插入到列表框m_list_device。监控站设备状态显示界面如图4.5所示。
41 华 中 科 技 大 学 硕 士 学 位 论 文
图4.5 监控站设备状态显示界面
4.5 设备维护管理模块的实现
1)设备维护信息录入子模块的实现
定义设备维护信息录入的类为CDeviceMaintenceInfoWrite。添加设备级别下拉框m_combo_deviceclass的消息映射ON_CBN_SELCHANGE(..,…)。消息函数OnSelchangeComboDeviceclass()调用函数UpdateDialog(),该函数将根据用户选择的设备级别,显示不同的设备名称。
定义“保存配置信息”按钮的响应函数OnButtonSaveConfig(),该函数将用户录入的负责人,部门类型,部门名称保存到配置文件中。
定义“删除配置信息”按钮的响应函数OnButtonDeleteConfig(),该函数将用户所选择的负责人,部门类型,部门名称从配置文件中删除。
定义“确定”按钮的响应函数OnButtonInputMaintain(),函数首先校验用户的录入信息的合法性。其规则是:负责人的名称不能为空;部门类别不能为空;部门名称不能为空;维修的开始时间不能大于等于结束时间;维护的说明信息不能为空。在信息的合法性校验通过后,打开数据库连接,执行Sql语句:"Insert into Device_maintaininfo (DEVICENO, RESNAME, DEPTYPE,)values (……..)"。将结果集中的数据提交到数据库保存。设备维护信息录入的界面如图4.6所示。
42 华 中 科 技 大 学 硕 士 学 位 论 文
图4.6 设备维护信息录入界面
2)设备维护信息查询子模块的实现
定义设备维护信息查询的类为CDeviceMaintenceQuery。添加“查询全部记录”按钮的响应函数OnButtonQueryAll()。该函数初始化数据库连接,执行Sql语句:"select deviceno, resname, deptype, department……., from device_maintaininfo where
deviceno like '%' order by deviceno asc"。获得结果集的查询数目,若该数目大于等于1且小于等于20,提示查询结果的总页数为1页;若查询结果大于20条记录,则每隔20条记录显示一页;若查询结果为0,提示只有0条记录。之后调用函数UpdateListBox(),该函数功能是将查询的结果插入到列表框m_list_result中显示查询结果。 UpdateListBox()函数的实现在其后介绍。
添加“查询”按钮的响应函数OnButtonQuerySelect()。该函数将用户所选择的查询项作为条件进行查询。因此,不仅要进行用户输入的合法性判断,而且用户是否对查询条件的选择也要进行判断,两者是“与”的关系。在进行判断的同时,也43 华 中 科 技 大 学 硕 士 学 位 论 文
对查询语句拼接,然后执行查询语句。其后的实现情况同函数OnButtonQueryAll()。
添加“上一页”按钮的响应函数OnButtonFrontpage()。定义成员变量m_nRecordsCurrent存储当前页数,若m_nRecordsCurrent=1,提示“已经是第一页”;否则m_nRecordsCurrent--,提示当前的页数并调用函数UpdateListBox()。
添加“下一页”按钮的响应函数OnButtonNextpage()。定义局部变量nSum,若查询的结果m_nRecords对20求模不为0,则对nSum赋值为m_nRecords/20+1,否则赋值为m_nRecords/20。然后对(nSum= =m_nRecordsCurrent)||(m_nRecords/20=
=0)进行条件判断。若满足条件,表示已经到达最后一页;否则m_nRecordsCurrent++,并调用函数UpdateListBox()。
函数UpdateListBox()将从数据库中查出的数据插入到列表框m_list_result进行显示,一次插入20条记录。定义局部变量loop存储每页显示结果的索引,在插入列表框m_list_result前先对loop>=(m_nRecordsCurrent-1)*20以及loop 4.6 历史信息管理模块的实现 1)历史状态查询子模块的实现 定义历史状态查询的类为CHistoryState。添加“查询全部”按钮的响应函数OnButtonQueryAll(),该函数先初始化数据库连接,然后执行Sql语句:"select ID,DEVICENAME,IPADDR,DEVICESTATE,CURRENTTIME from local_device where id like '%'",以及"select RECORDID,….. from device where RECORDID like '%'"。最后调用UpdateListBox()函数将查出结果插入到列表框m_list_queryresult显示。 添加“查询”按钮的响应函数OnButtonQuerySelect(),对用户选择的查询项目作为查询条件,其实现原理同设备维护信息查询中函数OnButtonQuery()。 添加“上一页”按钮的响应函数OnButtonLastpage(),其函数的实现同设备维护查询中OnButtonFrontpage()函数。 44 华 中 科 技 大 学 硕 士 学 位 论 文 添加“下一页”按钮的响应函数OnButtonNextpage(),其函数的实现同设备维护查询中OnButtonNextpage()函数。 2)历史报警查询子模块的实现 定义历史报警查询的类为CDeviceAlarmQuery。添加按钮“查询全部记录”的响应函数OnButtonQueryAll(),函数首先初始化数据库连接,然后执行Sql语句:"Select alarmnumber, faileddeviceloc, faileddevicecount, LDFailsum, BGFailsum, HWFailsum, YTFailsum, AlarmTime from device_alarm_info where alarmnumber like '%' order by Alarmnumber asc"。然后对查询的结果进行记录总数和当前页数的判断。最后调用函数UpdateListBox(),将结果插入列表框m_list_alarmresult中。 添加按钮“查询”的响应函数OnButtonQuerySelect(),该函数将用户所选的查询项作为查询条件进行查询,实现原理同设备维护信息查询中OnButtonQuery(),最后调用函数UpdateListBox(),将结果插入列表框m_list_alarmresult中。 添加按钮“上一页”的响应函数OnButtonFrontpage(),其函数的实现同设备维护查询中OnButtonFrontpage()函数。 添加按钮“下一页”的响应函数OnButtonNextpage(),其函数的实现同设备维护查询中OnButtonNextpage()函数。 3)历史状态统计子模块的实现 定义历史状态统计的类为CDrawGraph。添加“监控站名称”下拉框m_combo_jkzname的消息映射ON_CBN_SELCHANGE(IDC_COMBO_JKZNAME, OnSelchangeComboJkzname)。 添加统计开始时间的年月日选择框m_stimeymd的消息映射ON_NOTIFY(DTN_DATETIMECHANGE,IDC_DATETIMEPICKERSYMD,OnDatetimechangeDatetimepickersymd)。 添加统计开始时间的时分秒选择框m_stimehms的消息映射ON_NOTIFY(DTN_DATETIMECHANGE,IDC_DATETIMEPICKERSHMS,OnDatetimechangeDatetimepickershms)。 添加统计结束时间的年月日选择框m_etimeymd的消息映射ON_NOTIFY45 华 中 科 技 大 学 硕 士 学 位 论 文 (DTN_DATETIMECHANGE,IDC_DATETIMEPICKEREYMD,OnDatetimechangeDatetimepickereymd)。 添加统计结束时间的时分秒选择框m_etimehms的消息映射ON_NOTIFY(DTN_DATETIMECHANGE,IDC_DATETIMEPICKEREHMS,OnDatetimechangeDatetimepickerehms)。历史状态统计的界面如图4.7所示。 图4.7 历史状态统计界面 以上添加的消息函数均调用函数UpdateView(),该函数定义CGraph 类型的指针对象*testGraph,并且testGraph = new CGraph(BAR_GRAPH)调用CGraph的构造函数创建对象CGraph。调用testGraph->SetGraphTitle(“….”)创建直方图的标题。根据用户选择的条件查询数据库,统计出相应的设备故障状态为故障,亚正常,正常的数量。调用testGraph->SetXAxisLabel("设备类型")以及testGraph->SetYAxisLabel("设备数量(台)")绘制横轴的标题以及纵轴的标题。以雷达设备为例,构造CGraphSeries* seriesld = new CGraphSeries()对象,设置雷达在横轴上的标题seriesld ->SetLabel("雷达")。seriesld ->SetData(0,devicestate_green_rd),seriesld ->SetData(1,devicestate_yellow_rd),seriesld ->SetData(2,devicestate_red_rd),分别绘制雷达的设备故障状态为故障,亚正常,正常的统计直方图。 46
发布者:admin,转转请注明出处:http://www.yc00.com/web/1688120255a84983.html
评论列表(0条)