基于C++ Builder的自動(dòng)變速器電控單元實(shí)車(chē)試驗數據采集系統
3.2模擬量、數字量采集子函數
本文引用地址:http://dyxdggzs.com/article/87550.htm在確定了采集程序的程序框圖和界面之后,就要著(zhù)手編寫(xiě)采集中最重要的兩個(gè)子函數了,即模擬量和數字量采集子函數。廠(chǎng)家提供的動(dòng)態(tài)連接庫(DLL)中包含了進(jìn)行數據采集操作的C/C++函數,在C++Builder下可對這些函數進(jìn)行調用,就可以很方便的對數據采集系統進(jìn)行設置、采樣和數據處理。以下通過(guò)對模擬量的采集來(lái)概要說(shuō)明。
使用時(shí)先在程序中聲明,即把含有函數聲明的.h文件包含在程序體中。然后利用項目管理器將包含函數實(shí)體的.lib文件加入到項目中。這樣在程序體中就可以調用其中的函數了,具體的模擬量數據采集子函數代碼如下:
float readvoltage(int device,int channel) //參數為設備號、通道號
{ ……………… //變量定義、說(shuō)明等
lDevNum=device;
usChan=channel;
dwErrCde = DRV_DeviceOpen(lDevNum, &lDriverHandle); //打開(kāi)設備
if (dwErrCde != SUCCESS)
{ ErrorHandler(dwErrCde);}
ptAIConfig.DasChan = usChan; //配置設備
ptAIConfig.DasGain = 0;
dwErrCde = DRV_AIConfig(lDriverHandle, &ptAIConfig);
if (dwErrCde != SUCCESS)
{ ErrorStop(&lDriverHandle, dwErrCde);}
ptAIVoltageIn.chan = usChan; //讀一個(gè)數據
ptAIVoltageIn.gain = 0;
ptAIVoltageIn.TrigMode = 0;
ptAIVoltageIn.voltage = &fVoltage;
dwErrCde = DRV_AIVoltageIn(lDriverHandle, &ptAIVoltageIn);
if (dwErrCde != SUCCESS)
{ ErrorStop(&lDriverHandle, dwErrCde);}
dwErrCde = DRV_DeviceClose(&lDriverHandle); //關(guān)閉設備
if (dwErrCde != SUCCESS)
{ ErrorStop(&lDriverHandle, dwErrCde);}
return fVoltage; //返回采集數據
}
同理,數字量采集子函數也是類(lèi)似的操作。
3.3多媒體定時(shí)器
由于多媒體定時(shí)器具有很好的實(shí)時(shí)性和較高的優(yōu)先級,最高定時(shí)可達1ms,所以我們這個(gè)數據采集系統采用多媒體定時(shí)器來(lái)定時(shí)。需要的系統資源為:#include <mmsystem.h>;在borland環(huán)境下首先需要將winmm.lib文件通過(guò)implib命令轉化為borland下的格式,然后將相應的lib加到工程里。具體的多媒體定時(shí)器代碼如下:
void start_timer(double m_time_val) //啟動(dòng)多媒體定時(shí)器,m_time_val的單位是秒
{ TIMECAPS TC;
UINT TIMERES=0;
UINT TIMEID;
m_time_val*=1000;
int time_interval;
time_interval=(int)m_time_val;
if(timeGetDevCaps(&TC,sizeof(TIMECAPS))!=TIMERR_NOERROR)
{ exit(0);}
timeBeginPeriod(TIMERES); TIMEID=timeSetEvent(time_interval,TIMERES,&(LPTIMECALLBACK)callbackfunction,0,TIME_PERIODIC);
g_TIMEID=TIMEID;
}
void end_timer() //終止定時(shí)
{ timeKillEvent(g_TIMEID);
timeEndPeriod(0);
}
void WINAPI callbackfunction(UINT uID,UINT MSG,DWORD DWUSER,DWORD DW1,DWORD DW2)
{ //在此函數中加入定時(shí)內自己要做的內容,本系統即要加入
//模擬量、數字量采集子函數的調用和存儲數據等語(yǔ)句
}
首先調用void start_timer(double m_time_val)啟動(dòng)多媒體定時(shí)器,多媒體定時(shí)器將每隔一個(gè)時(shí)間間隔調用void WINAPI callbackfunction(UINT uID,UINT MSG,DWORD DWUSER,DWORD DW1,DWORD DW2)函數,通過(guò)改變time_interval的值可以改變時(shí)間間隔(time_interval的單位是毫秒),在定時(shí)結束時(shí)調用void end_timer()來(lái)終止定時(shí)。
3.4存儲數據
本數據采集系統還將把采集到的數據存儲起來(lái),以便將來(lái)對這些數據進(jìn)行分析?,F在最常用的數據庫就是微軟的Access,而C++Builder對數據庫也有較好的操作,所以我們采取將數據存入Access的方案來(lái)實(shí)現數據的存儲?;镜牟僮鞑襟E如下:
●使用ADO組件頁(yè)中的ADOTable組件來(lái)連接存儲數據的數據庫。
●由于A(yíng)DOTable組件只負責連接數據庫,無(wú)法取得數據庫文件內的字段數據,所以我們仍得使用Data Access組件頁(yè)中的DataSource組件來(lái)實(shí)現,將它的DataSet屬性指定為ADOTable1(即前一步驟加入的ADOTable組件名稱(chēng))。
●往數據庫存數據的過(guò)程即是新增記錄的過(guò)程,所以只需添加幾句簡(jiǎn)單的語(yǔ)句:
ADOTable1->Insert();
ADOTable1->FieldValues["voltage1"]=voltage1;
…………
ADOTable1->Post();
首先調用Insert方法創(chuàng )建一個(gè)緩沖區(即成為編輯模式),接著(zhù)進(jìn)行數據字段值的編輯,當我們完成數據輸入的操作后,必須調用Post方法,或者將當前的數據位置移到另一筆數據上,這樣才會(huì )將新增的記錄內容寫(xiě)入到數據庫。
4 結論
試驗結果表明本文基于Borland C++ Builder開(kāi)發(fā)的汽車(chē)自動(dòng)變速器電控單元(ECU)實(shí)車(chē)試驗數據采集系統,能夠滿(mǎn)足車(chē)載分析試驗臺的要求,這為ECU的開(kāi)發(fā)和優(yōu)化控制策略打下基礎。
參考文獻
[1]楊宗志. C++Builder數據庫程序設計[M]. 北京:清華大學(xué)出版社,2001
[2]潘旭峰,等. 現代汽車(chē)電子技術(shù)[M]. 北京:北京理工大學(xué)出版社,2001
[3]史惠康. Borland C++ Builder實(shí)用編程技術(shù)[M]. 北京:中國水利水電出版社,1999
第一作者簡(jiǎn)介:羅君贇,男,1981年2月22日出生,上海人,車(chē)輛工程碩士研究生在讀,研究方向為自動(dòng)變速箱電控單元的研究與開(kāi)發(fā)。
評論