基于Visual C++的机舱监视与报警系统仪表实现*

2014-06-09 12:33:48师光飞旷玉芬代建张道发武汉交通职业学院湖北武汉0065武汉理工大学湖北武汉006长江宜昌航道局湖北宜昌00
武汉交通职业学院学报 2014年1期
关键词:控件组态仪表

师光飞旷玉芬代 建张道发(.武汉交通职业学院,湖北 武汉 0065;、.武汉理工大学,湖北 武汉 006; .长江宜昌航道局,湖北 宜昌 00)

基于Visual C++的机舱监视与报警系统仪表实现*

师光飞1旷玉芬2代 建3张道发4
(1.武汉交通职业学院,湖北 武汉 430065;2、3.武汉理工大学,湖北 武汉 430063; 4.长江宜昌航道局,湖北 宜昌 443002)

通常船舶机舱监视与报警系统在实船通过组态软件实现,但组态软件在实船的应用有一定的局限性:封装的仪表难以修改即易读不易写;外观颗粒感强、不清晰、呈伪彩等。而基于Visual C++对监视与报警系统仪表的实现,使用CRgn类实现圆形转速表、圆角矩形温度表以及液压管路等监视与报警系统中必不可少的仪表,通过CRect Tracker类可实现仪表的实时拖动与调整,实现系统的在线可定制,易读易写。

测控;Visual C++;仪表

机舱监视与报警系统通常采用组态软件实现,组态软件是使用灵活的组态方式,为用户提供快速构建工业自动控制系统监控功能的通用层次软件工具。[1]这些组态软件在实现类似测控系统上具有搭建简单、方便的优点,但组态软件是对仪表的预先封装,因此,用户若需要采用新的仪表只能通过软件提供方对仪表的升级来实现,不便于修改,系统适应性较差,且呈现的图片有较强的颗粒感、突兀感。基于Visual C++对监控系统仪表的实现方法,能实现较好的界面效果,用户可以依据自身需要对仪表的图片进行修改,实现图片与图片容器的无缝连接,系统适应性强;界面更美观,可以使用真彩仪表背景图片,系统可扩展性强,方便对系统功能进行升级,适用于实船的机舱监视与报警及仿真等领域。

1 系统构成

机舱监视与报警系统的功能是准确可靠地监测机舱内各种设备的运转状态及其参数,一旦运行设备发生故障,自动发出声、光报警信号。例如对船舶主机的转速、冷却水温度、船舶电站的转速、电压、冷却水温以及喷淋冷却系统的状态进行监视,当监视点发生异常时,且该监视点未被闭锁,则系统立即发出声响报警,同时相应的报警指示灯快速闪烁,指示报警内容。[2]构建该系统需要用到的仪表有:转速表、温度表、液压管路等。

2 基于Visual C++对检测系统仪表实现的设计思路

2.1 仪表图片与控件的融合

2.1.1 规则外形仪表图片与控件的融合外形规则的仪表如转速表、电压表等通常为圆形或者矩形,而编程软件提供的图片容器如Visual C++中的picture控件,其外形为矩形,这样通过控件载入圆形仪表图片实现的仪表并不是真正意义上的圆形。虽然仪表为圆形,而仪表图片却是以矩形形式存在,因此,需要将控件和背景图片进行裁剪,以使控件和仪表图片能融合得体。

使用CRgn类可以很方便地定义控件的外形,圆形仪表使用CRgn类的CreateEllipticRgn实现,该函数创建一个椭圆形的区域,如果定义椭圆的长轴与短轴相等,则创建出来的是一个圆形区域。该函数原型如下:

函数的四个参数分别定义了椭圆的左上、右下两点的坐标,创建成功则返回该区域的句柄。为了适应仪表背景图片的大小,使用图片的长宽来定义椭圆的大小,图片尺寸的大小可以在程序中获得或在系统中通过图片属性获得。图形融合前后对比如图1。

图1 圆形仪表融合前后对比

对于诸如温度计一类的仪表,则可以通过CRgn类的CreateRoundRect Rgn来创建,该函数根据给定参数创建一个圆角矩形。该函数原型如下:

函数有6个参数,前四个参数定义了圆角矩形的左上、右下的两点坐标,后两个参数定义了圆角沿着X轴和Y轴的长度。这六个参数可以根据仪表背景图片内容酌情进行选择,另外,关于温度计液注的实现,可以使用MoveWindow函数实现液柱的伸缩。

2.1.2 不规则外形仪表图片与控件的融合

不规则外形的仪表,如管道、水泵等组件,具有不规则的外形,无法通过类似规则外形仪表的方式(通过设置裁剪区域的方式)进行融合。对于这一类仪表的做法,需要使用CRgn类的CombineRgn来进行抠图,将背景图片中除去仪表之外的部分“抠掉”,根据剩下部分的图像创建一个区域并将此区域赋予控件。由于白色部分创建的区域与初始区域重合,在异或的作用下被剔除,而仪表本身的内容则被保留下来,形成一个区域,将此区域赋予控件,使控件外形与仪表背景一致。

2.2 控件在线调整的实现

为了使程序能够灵活定制,在程序处于运行态时,通过使用CRect Tracker类实现控件的自由调整。通过改变控件的大小和位置,使用有限的控件可以搭建出不同的组合。

使用CRect Tracker类的关键在于CRect-Tracker类中的三个函数:(1)void Draw(CDC* pDC)const。此函数绘制控件外的调整框的图形,在使用鼠标调整控件后,调用这个函数重绘当前的调整框。(2)int Hit Test(CPoint point)const。该函数可以判断当前点击的位置(参数point)位于调整框的什么位置,通常,返回值大于等于0表示鼠标点击的范围在调整框内。(3)BOOL Track (CWnd*p Wnd,CPoint point,BOOL b AllowInvert =FALSE,CWnd*p WndClip To=NULL)。此函数实时跟踪调整框的大小,从鼠标点击到鼠标抬起的过程中,Track记录着调整框的大小。

根据以上函数说明,在程序运行时动态调整控件的大小和位置,应在鼠标左键单击的响应函数中调用上述函数,并根据调整框的大小和位置改变控件的大小和位置。

使用CRect Tracker类实现控件的在线调整之后,使程序的灵活性和通用性得到增强,如图2是船舶海水冷却系统管路监控图从初始状态调整到最终状态的过程。

图2 控件由初始状态到最终状态的调整过程

2.3 控件位置保存实现

通过CRect Tracker类对对象的位置和大小进行调整之后,必须对对象的状态进行保存,否则,在程序关闭后这些状态信息会丢失。因此,应该在程序启动时读取对象位置和大小并赋予对象,在程序关闭时将对象的位置和大小信息保存。由于具体调整的对象不确定,需要对程序中控件进行遍历。控件的位置通过二进制文件保存在程序可执行文件路径下,采用二进制方式写入数据,可以防止人为修改控件中的状态。

2.3.1 对象状态的读取

在程序初始化过程中,需要读取对话框上各个控件的位置,以使各个控件能够对号入座,重现上次程序关闭时控件的状态。

2.3.2 对象状态的保存

对象状态的保存是状态读取的逆向过程,两者在流程上大体相同,状态保存与状态读取的主要区别是:(1)二进制文件的属性中要加入mode-Create,在程序第一次运行时没有所需要的二进制文件存在,可以创建二进制文件。(2)将文件读改成文件写。读取文件时是将文件中保存的状态信息赋予指定ID号的控件,而写文件是将控件的ID号和该控件的状态信息写入到文件中。

2.4 仪表参数显示的实现

仪表参数显示根据不同的仪表类型有不同的实现方式,如转速表的示值方式是通过仪表指针旋转,温度表的示值方式是液面的升降,其他开关量监控的仪表如阀门和液压管路则是颜色的切换。为了读取方便,具有非开关量显示的仪表还需要搭配一个类似数码管的数值显示器。

2.4.1 指针的实现

在仪表盘上实现指针,首先必须获得仪表盘容器控件的dc(设备上下文指针),并使用该指针调用CDC类的MoveTo和LineTo绘制仪表的指针(如图3)。

图3 指针实现流程

2.4.2 开关状态的实现

开关状态的实现方法很多,可以使用窗体的Show Window函数使控件显示和隐藏,也可以使用Load Bitmap函数改变容器内的图片来实现状态切换。本程序中用到的状态指示灯的切换和开关动作的效果图(如图4)。

图4 开关量实现效果图

3 结束语

本文提出的基于Visual C++编程平台的监控与报警系统仪表界面实现的方法,达到了交互友好、简单、直观、便于修改等优点。在程序编制过程中:(1)采用了大量的真彩仪表图片,使仪表表现更加真实,突破了常见组态软件仅求象形的局限;(2)使用CRgn类,实现了图片与图片容器的无缝连接,使对象在加入到程序界面中后没有突兀感,与界面融为一体;(3)使用CRect Tracker类实现了控件的在线、实时调整,增强了程序的可定制性和灵活性。

图5 电站监控与冷却系统监控效果图

通过以上步骤,最终达到了比较满意的效果(如图5)。基于Visual C++编程平台的测控系统仪表界面实现的方法,在实船的机舱监视与报警系统以及仿真等工作中相对于组态软件具有一定的优越性。

[1]欧金成,欧世乐,林德杰,彭备战.组态软件的现状与发展[J].工业控制计算机,2002,(4):1-5.

[2]李世臣,徐善林.船舶机舱自动化[M].大连:大连海事出版社,2012:111.

10.3969/j.issn.1672-9846.2014.01.020

U665.26

A

1672-9846(2014)01-0082-03

2013-12-10

师光飞(1979-),男,湖北武汉人,武汉交通职业学院航海学院教师,主要从事船舶电气与自动化研究。

旷玉芬(1988-),女,湖北武汉人,武汉理工大学硕士研究生,主要从事船舶流场的研究工作。

代 建(1985-),男,湖北孝感人,武汉理工大学硕士研究生,主要从事舰船电力推进及其自动化技术研究。

张道发(1982-),男,湖北宜昌人,长江宜昌航道局工程师,主要从事航运工程研究。

猜你喜欢
控件组态仪表
◆ 仪表
建筑与预算(2023年2期)2023-03-10 13:13:36
◆ 仪表
建筑与预算(2022年5期)2022-06-09 00:55:10
仪表
建筑与预算(2022年2期)2022-03-08 08:40:56
基于PLC及组态技术的恒温控制系统开发探讨
河北农机(2020年10期)2020-12-14 03:13:42
关于.net控件数组的探讨
软件(2018年7期)2018-08-13 09:44:42
基于PLC和组态的智能电动拧紧系统
PLC组态控制在水箱控制系统的应用
工业设计(2016年11期)2016-04-16 02:49:22
铸造行业三维组态软件的应用
Microchip推出全新零漂移仪表放大器
就这样玩会VBA中常见的自定义控件
电脑迷(2012年24期)2012-04-29 00:44:03