APP下载

基于VC++的汽车虚拟仪表设计与应用

2017-08-12

计算机应用与软件 2017年8期
关键词:控件仪表波形

余 燕 娟

(漳州职业技术学院 福建 漳州 363000)



基于VC++的汽车虚拟仪表设计与应用

余 燕 娟

(漳州职业技术学院 福建 漳州 363000)

虚拟仪表技术是计算机技术与仪表技术结合的新兴技术,其低成本、高效率的特点在瞬息万变的汽车监测行业体现出了独特的优势。设计基于VC++的开发设计平台,利用MFC可视化、框架结构设计特点,采取面向对象的C++语言结合图形处理软件PlotLab。该设计具有通用性高、可扩展性好的特点,已成功通过测试并且运行稳定。

虚拟仪表 VC++ 面向对象 PlotLab

0 引 言

汽车仪表作为人与汽车的沟通平台,其精准性与稳定性关乎行车人员安全以及对于运行的判断。随着国内外汽车行业的迅猛发展,汽车种类也跟着层出不穷,不同型号的汽车中使用的仪表及指示器的结构、数量、工作原理各不相同。因此汽车仪表的检测工作就常暴露出以下几个问题:同一车辆不同仪表需分开进行测试;不同车辆的仪表型号区别导致硬件检测平台也要相应更换;检测仪表设备价格昂贵、故障率较高。汽车仪表检测呈现出检测成本高、通用性差、检测操作复杂等缺点[1,6-9]。

目前汽车仪表逐步向数字化、智能化、网络化、微型化发展[1]。计算机技术和仪表仪器技术的完美结合诞生了虚拟仪表,汽车虚拟仪器设计也应运而生。相对汽车常规仪表,软件虚拟仪表具备其独特的优势,其性能高、故障率低、成本低,同时用户可根据需求轻松更改调试项目,因此汽车虚拟仪表更能适应当前瞬息万变的汽车市场[2-14]。

1 面向对象完成虚拟仪表类的设计

1.1 面向对象技术设计优势及虚拟仪表类设计

传统汽车检测的虚拟仿制常使用Matlab工具,此方式只能观测到数据曲线,对汽车的仪表的真实情况及制动过程和方法不得而知,对于仪表测试人员而言,这种用户体验并非最佳状态[2]。为提高用户测试的可视性,本文的设计构建在窗口化界面基础之上,利用VC++的图形绘制的优势,完成汽车仪表的真实模拟。

本设计在VS2010开发环境下,基于MFC结构化窗体设计模式,采用面向对象的设计方式,利用封装、继承、多态等特性,实现通过仪表类的设计。面向对象的设计方式将客观事物的共性形成集合类,对象可根据自身特性和运行规律对类进行派生和继承,子类可增加对象的特性函数,保证了共有特点的继承和本身独有特点。这种方式具有结构清晰、可重复性好[3]。本文根据实际仪表测试特点设计了可供用户调用的基础仪表类,用户根据需求可调用本设计的仪表类,完成测试软件的编程,从而缩短开发时间。基于本文虚拟仪表的软件设计在开发效率、稳定性及可靠性上显示出了优势[4]。

汽车仪表检测平台常测试的项目包括汽车发动机转速表、里程速度表、汽油表、发动机水温表、制动及报警等。为了降低代码冗余,保证代码可重复性和使用效率,程序将各仪表测试内容分装成了类:CCarMeter、CCarGauge、CAlarm等。其中,用户可选择CCarMeter类实现圆形仪表设计,如发动机转速表、里程速度表,也可以选择CCarGauge类可完成汽油表和水温表的测试的显示。为了保证用户对于数据变化的掌握,本设计还引入了PlotLab曲线设计,用户根据曲率变化可以更好了解掌握当前检测状态,这在制动检测过程中显得尤为重要。

1.2 虚拟表盘CCarMerter与柱表CCarGauge设计

基于C++面向对象具有继承性和封装性的特点,软件把虚拟仪表常有的特性及操作设计成通用的仪表类。仪表绘制是采用Visual C++提供的CDC类,通过LineTo()(直线)、 Ellipse()(椭圆)、Arc()(弧形)等函数共同绘制。部分程序如下所示:

pDC->FillRect(rect, &m_brushBack);

//绘制背景

pDC->Rectangle(rect);//绘制一个边框

CRect arcAngle(……);//画外圈圆弧

pDC->Arc(&arcAngle, ptStart, ptEnd);

//画刻度

pDC->MoveTo(……);

pDC->LineTo(……);

……

pDC->TextOut(……);

虚拟仪表类包含m_BackColor(背景颜色)、m_dMaxValue(表量最大值)、m_nTicks(量程刻度)等,其中通用属性可以通过接口函数,如SetCurrentValue()、SetMeterBackColor()、SetTicks()等来进行设置,完成效果如图1所示。

图1 虚拟表盘与虚拟柱表

1.3 解决图形闪烁的双缓存技术

MFC窗体结构化设计中图形绘制和更新是由消息响应WM_PAINT完成,在进行复杂的图形处理时,重绘的图形会因过度的刷新引起闪烁现象。为了解决图形闪烁的问题,程序中自行设计了内存变量类CDiscMemDC,形成双缓存。在绘图刷新函数OnPaint()中通过中间变量先对图形处理形成过渡,将复杂的图形的操作转入后台处理,绘制完成后再显示,以此来解决仪表图形闪烁问题。代码部分如下:

CBitmap m_bitmapMeterPlate;

//内存中承载临时图形的位图

CBitmap *m_pbitmapOldMeterPlate;

//内存中承载临时图形的位图指针

……

void CCarMeter::OnPaint()

{

CPaintDC dc(this);

//绘图设备

GetClientRect (&m_rectCtrl);

// 获得控件区域

CDiscMemDC memDC(&dc, &m_rectCtrl);

//缓存内存设备DC

……

m_dcMeterPlate.CreateCompatibleDC(&dc);

//依附窗口DC创建兼容内存DC

m_bitmapMeterPlate.CreateCompatibleBitmap(……) ;

//创建兼容位图

DrawMeterBackground(……);

//绘制背景

……

memDC.BitBlt(……);

//后台中间变量拷贝到前台显示

DrawNeedle(&memDC);

//绘制指针

DrawValue(&memDC);

//显示值

}

1.4 立体效果设计

为了突出仪表立体效果,设计采用三色三重错位绘制的方式绘制图形,三种颜色分别绘制粗线、细线及阴影线,如下所示,使图形更具立体感。

pDC->SelectObject(&penThick);

//绘制实线,颜色RGB(172, 168, 153)

pDC->MoveTo(rectScale.left, rectScale.bottom);

……

pDC->SelectObject(&penThin);

//绘制细线,颜色RGB(113, 111, 110)

pDC->MoveTo(rectScale.left + 1, rectScale.bottom);

……

pDC->SelectObject(&penShadow);

//绘制阴影线,颜色RGB(255, 255, 255)

pDC->MoveTo(rectScale.right - 1, rectScale.top + 1);

1.5 嵌入式PlotLab实现波形显示

由Mitov公司设计的PlotLab软件,包含可实现信号绘制和可视化的VCL控件,控件具备点状图、波形图及柱状图等多种图形模式,它可嵌入应用到Visual C++中,并且具备有多线程处理能力。

嵌入式PlotLab设计需先安装PlotLab_VC软件到开发系统中,然后将PlotLab_VC包含的库添加到开发环境库中。设计时在开发工程中进行库调用命令如下所示:

#include

增加波形变量CTSLScope Scope1。在资源中添加一个STATIC控件作为图形绘制的画布,添加该Static变量m_ScopeSpeed。将波形变量与该控件关联,指定STATIC画布大小为波形绘制的载体,即可调用PlotLab软件中关于波形处理的方法,通过接口函数完成波形设置。

Scope1.Open( m_ScopeSpeed.m_hWnd );

//关联控件与波形类;

Scope1.Channels.Add(1);

//添加两条曲线

Scope1.Title.Text=″里程速度值与发动机转速波形图″;

//这个曲线图名称

Scope1.Channels[ 0 ].Name = ″里程速度值″;

//添加波形曲线变量名1

Scope1.Channels[ 1 ].Name = ″发动机转速″;

//添加波形曲线变量名2

Scope1.SizeLimit =201;

/////////////Y轴初始化/////

Scope1.YAxis.AxisLabel.Text = ″速度值(KM/H)″;

//Y轴坐标名字;

Scope1.YAxis.Max.Value = 8000.00;

//默认Y轴最大值

Scope1.YAxis.Min.Value = 0.00;

//默认Y轴最小值

Scope1.YAxis.Max.AutoScale = true;

//Y轴可根据动态数据变化坐标轴

……

开启定时器SetTimer(0,100,NULL),定时器每隔100毫秒更新一次波形。当接收到新数据后,首先对数据进行处理,然后等定时器时间一到就在消息响应函数OnTimer()中自动调用波形显示函数Scope1.Channels[0].Data.AddYPoint(Value),并将0通道的数值Value显示在波形中。

1.6 多线程通信技术

软件与测试平台采用串口通信方式,VC++具有两种串口编程方式,分别为MSComm控件调用和Windows的API函数。为了提高通信的效率及可拓展性,本设计的串口通信类采用API串口通信。通信设置有中断重连机制,保证了通信可靠性,在串口网络通信编程中,引入多线程技术可同时完成接收发送数据,改善吞吐量,避免阻塞,并利用自定义监视线程完成串口网络通信的监督。串口监视线程方式如下:

UINT CSerialPort::CommThread(LPVOID pParam)

{

switch (dwError = GetLastError())

//通信状态监测,错误停止通信线程

{ case ERROR_IO_PENDING: {//break;}

case 87: {//不处理,继续break; }

default: {//继续等待通信线程

port->ProcessErrorMessage("WaitCommEvent()");

break;}

}

……

Event = WaitForMultipleObjects(3, port->m_hEventArray, FALSE, INFINITE);

switch (Event)

{case 0://终止线程,关闭事件

{ port->m_bThreadAlive = FALSE;

return 0;break;}

case 1: //读数据动作

{ ReceiveChar(port, comstat); break;}

case 2: //写数据动作

{WriteChar(port);break;}

return 0;}

}

2 汽车电子平台下虚拟仪表开发

2.1 虚拟仪表设计的平台环境

汽车检测平台完成数据采集、信号处理、数据传输等一系列工作,其中数据获取由传感器实现,结构如图2所示。DSP获取有效数据并对数据进行格式处理,然后将数据上传。上位计算机虚拟仪表软件接收DSP上传的数据然后进行数据处理、仪表显示、波形显示最后将数据存储。其中,传感器包括液位传感器、转速传感器、温度传感器、制动传感器[5,9]。

图2 汽车虚拟仪表检测平台结构图

为优化虚拟仪表上层测试软件的可扩展性及通过性,本文对软件设计的需求进行层次结构划分,形成虚拟仪表测试软件结构图,如图3所示。软件需求设计及层次结构与软件框架结构密切相关,编程技巧和设计风格也同软件框架优劣有关系。本系统的软件框架结构分成五个部分:用户交互层、系统交互层、逻辑操作层、数据管理层及通用模块。用户交互层完成用户的图形绘制及数据显示;系统交互层是软件程序与开发系统的通信交互接口; 逻辑操作层是整个系统真正实现控制操作的部分,同时根据操作对象的不同,逻辑操作层又可划分成数据处理、数据传送等;数据管理层负责完成数据存储。

图3 汽车虚拟仪表测试软件结构图

2.2 虚拟仪表软件设计

该系统采用的是MFC框架窗口设计模式。程序设计根据需求在软件中添加测试需要的仪表类,并在工程头文件中添加类头文件:如添加CCarMerter类,需先在工程中添加#include ″CarMerter.h″。软件在资源中添加STATIC控件,为该控件定义一个CCarMerter类型变量m_SpeedMerter,完成了STATIC控件与CCarMerter类关联。根据仪表本身差异进行初始化设置,代码如下所示:

/////设置速度表的基本特性

m_SpeedMeter.SetMeterBackColor(RGB( 0, 0, 255));

//背景颜色设置

m_SpeedMeter.SetRange(0.00,220.0);

//设置表盘的最小值和最大值

m_SpeedMeter.SetSubTicks(5);

//在两个数据间分几隔,默认是5隔

m_SpeedMeter.SetTicks(10);

//在最大数据与最小数据间分几隔,默认是5

m_SpeedMeter.SetUnits(″KM/h″);

//设置仪表的单位

虚拟仪表检测界面设有:CCarMeter车速仪表,用来显示实时车速;CCarMeter发动机转速表,显示发动机转速;设有CCarGauge柱状类,用于显示汽油量及温度值。软件设计有四个数字表,分别显示实时行驶速度、发动机转速、油泵值及温度值,同时引入了波形显示用于显示测试值的曲线变化。检测软件设置有测试项目的选项,用户可以根据测试的需求选择要测试的项目。其中各仪表类之间继承关系如图4所示。

图4 汽车虚拟仪表软件中类调用情况

2.3 测试平台与虚拟仪表交互

选择大众POLO 排量1.4L车型进行测试,测试平台每40 ms接收一组信号,在测试软件的串口消息响应函数中接收串口通信的数据。通过数据处理函数ProcessData()对数据进行截取和转换,根据设计要求将数据分别在仪表中显示、保存以及波形处理,并对出现故障的数据进行分析,将异常情况在提示栏中显示。汽车虚拟仪表检测软件如图5所示。

图5 汽车虚拟仪表检测软件

在搭建好汽车仪表的硬件检测环境后,开启汽车虚拟仪表检测软件,检测项目可在软件左部进行选择,并点击启动测试。汽车的常用仪表数据都可在软件平台中直观的获取,并可通过波形图了解到数据变化的更多特性。本软件只关心数据接收、处理、传递的正确性,软件的结构、排版等所以与系统硬件无关,保证了检测的稳定性。通过多次实验测试汽车虚拟仪表发软件性能稳定、数据准确、可视性强。

3 结 语

软件采用面向对象的C++为开发语言,在MFC开发平台上结合PlotLab完成汽车检测虚拟仪表设计。利用面向对象继承和派生的特点设计好了基础的仪表类。虚拟仪表测试软只需组合利用此仪表类就可以进行开发设计,因此该系统具有可扩展性、可重复强等优点,这样大大缩短了开发的流程及周期。设计拥有可视化、仿真实的图形化界面,使用直观方便,用户体验良好。该软件已在汽车仪表检测平台顺利完成测试,并且运行良好,测试取得较好的效果。通过后期用户的要求及不断的完善改进,此软件会具有更强的的实用性和广阔的应用前景。

[1] 黄磊.基于LabWindowns-CVI虚拟汽车仪表设计[D].西北师范大学,2008.

[2] 金作军,李银国,姜虹.基于虚拟仪表的汽车ABS综合检测平台的研究与实现[J].重庆工学院学报,2007,21(11):19-23.

[3] 金作军,李银国,姜虹.基于汽车电子检测平台的虚拟仪表的设计与应用[J].微计算机信息,2007,23(32):275-277.

[4] 史永胜,李秀静.基于单元要素的虚拟仪表平台设计方法[J].计算机工程与设计,2015(8):2287-2290,2302.

[5] 周桂成,秦贵和,陈筠翰,等.通用汽车仪表检测平台的设计与实现[J].计算机工程,2012,38(20):228-231.

[6] 陈旭东.汽车模拟驾驶虚拟场景设计与研究[D].西南交通大学,2016.

[7] 王韬,郭玲,史迎春,等.基于OpenGVS的虚拟仪表实现[J].计算机仿真,2006,23(3):275-278.

[8] Ian Graham.Object-Oriented Methods Principles & Practice[J].Simulation,1998,70(6):359-368.

[9] 曾秀云.基于虚拟仪器的信号采集与控制系统开发[D].电子科技大学,2010.

[10] 周友波.汽车综合性能检测技术现状与发展趋势研究[J].沿海企业与科技,2010(4):29-31.

[11] 朱则刚.谈汽车的检测及其发展方向[J].汽车与安全,2007,117(9):60-65.

[12] 任洪涛,彭忆强,谢江浩.基于Qt的汽车虚拟仪表系统设计[J].西华大学学报(自然科学版),2016(6):64-67.

[13] 黄剑.虚拟仪器技术及应用综述[J].计量与测试技术,2010,37(4):42-43.

[14] 刘善坤,窦立谦,宗群,等.车载虚拟仪表及诊断系统的设计与实现[J].计算机应用与软件,2016,33(8):229-223.

DESIGNANDAPPLICATIONOFAUTOMOBILEVIRTUALINSTRUMENTBASEDONVC++

Yu Yanjuan
(ZhangzhouInstituteofTechnology,Zhangzhou363000,Fujian,China)

Virtual instrument technology is a new developing technology that combines computer technology with instrumentation technology. Its low-cost, high-efficiency features reflects a unique advantage in the rapidly changing automotive monitoring industry. The design of this paper is based on VC++ development and design platform, using MFC visualization, frame structure design features, and the design uses object-oriented C++ language combined with graphics processing software PlotLab. The design has a high versatility and good scalability, and it has been successfully tested and run stable.

Virtual instrument VC++ Object-oriented PlotLab

2017-01-09。余燕娟,硕士,主研领域:家电与仪表自动化。

TP391.9

A

10.3969/j.issn.1000-386x.2017.08.023

猜你喜欢

控件仪表波形
基于时域波形掩护的间歇采样干扰对抗研究
浙江中控自动化仪表有限公司
浙江中控自动化仪表有限公司
基于Halbach阵列磁钢的PMSM气隙磁密波形优化
基于.net的用户定义验证控件的应用分析
用于SAR与通信一体化系统的滤波器组多载波波形
全新迈腾B7L车喷油器波形测试
关于.net控件数组的探讨
奔驰E260车行驶过程中仪表灯熄灭
宝马745Li车制动灯常亮且组合仪表上多个故障灯点亮