基于VC++的汽车虚拟仪表设计与应用
2017-08-12余燕娟
余 燕 娟
(漳州职业技术学院 福建 漳州 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