余 燕 娟
(漳州職業技術學院 福建 漳州 363000)
?
基于VC++的汽車虛擬儀表設計與應用
余 燕 娟
(漳州職業技術學院 福建 漳州 363000)
虛擬儀表技術是計算機技術與儀表技術結合的新興技術,其低成本、高效率的特點在瞬息萬變的汽車監測行業體現出了獨特的優勢。設計基于VC++的開發設計平臺,利用MFC可視化、框架結構設計特點,采取面向對象的C++語言結合圖形處理軟件PlotLab。該設計具有通用性高、可擴展性好的特點,已成功通過測試并且運行穩定。
虛擬儀表 VC++ 面向對象 PlotLab
汽車儀表作為人與汽車的溝通平臺,其精準性與穩定性關乎行車人員安全以及對于運行的判斷。隨著國內外汽車行業的迅猛發展,汽車種類也跟著層出不窮,不同型號的汽車中使用的儀表及指示器的結構、數量、工作原理各不相同。因此汽車儀表的檢測工作就常暴露出以下幾個問題:同一車輛不同儀表需分開進行測試;不同車輛的儀表型號區別導致硬件檢測平臺也要相應更換;檢測儀表設備價格昂貴、故障率較高。汽車儀表檢測呈現出檢測成本高、通用性差、檢測操作復雜等缺點[1,6-9]。
目前汽車儀表逐步向數字化、智能化、網絡化、微型化發展[1]。計算機技術和儀表儀器技術的完美結合誕生了虛擬儀表,汽車虛擬儀器設計也應運而生。相對汽車常規儀表,軟件虛擬儀表具備其獨特的優勢,其性能高、故障率低、成本低,同時用戶可根據需求輕松更改調試項目,因此汽車虛擬儀表更能適應當前瞬息萬變的汽車市場[2-14]。
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.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 汽車虛擬儀表檢測軟件
在搭建好汽車儀表的硬件檢測環境后,開啟汽車虛擬儀表檢測軟件,檢測項目可在軟件左部進行選擇,并點擊啟動測試。汽車的常用儀表數據都可在軟件平臺中直觀的獲取,并可通過波形圖了解到數據變化的更多特性。本軟件只關心數據接收、處理、傳遞的正確性,軟件的結構、排版等所以與系統硬件無關,保證了檢測的穩定性。通過多次實驗測試汽車虛擬儀表發軟件性能穩定、數據準確、可視性強。
軟件采用面向對象的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