新聞中心

EEPW首頁(yè) > 物聯(lián)網(wǎng)與傳感器 > 設(shè)計(jì)應(yīng)用 > 基于C++ Builder的自動(dòng)變速器電控單元實(shí)車試驗(yàn)數(shù)據(jù)采集系統(tǒng)

基于C++ Builder的自動(dòng)變速器電控單元實(shí)車試驗(yàn)數(shù)據(jù)采集系統(tǒng)

作者:羅君贇 周凡華 邱緒云 吳小清 時(shí)間:2008-08-29 來(lái)源:微計(jì)算機(jī)信息 收藏

  3.2模擬量、數(shù)字量采集子函數(shù)

本文引用地址:http://butianyuan.cn/article/87550.htm

  在確定了采集程序的程序框圖和界面之后,就要著手編寫采集中最重要的兩個(gè)子函數(shù)了,即模擬量和數(shù)字量采集子函數(shù)。廠家提供的動(dòng)態(tài)連接庫(kù)(DLL)中包含了進(jìn)行操作的C/C++函數(shù),在C++Builder下可對(duì)這些函數(shù)進(jìn)行調(diào)用,就可以很方便的對(duì)系統(tǒng)進(jìn)行設(shè)置、采樣和數(shù)據(jù)處理。以下通過(guò)對(duì)模擬量的采集來(lái)概要說(shuō)明。

  使用時(shí)先在程序中聲明,即把含有函數(shù)聲明的.h文件包含在程序體中。然后利用項(xiàng)目管理器將包含函數(shù)實(shí)體的.lib文件加入到項(xiàng)目中。這樣在程序體中就可以調(diào)用其中的函數(shù)了,具體的模擬量子函數(shù)代碼如下:
  float readvoltage(int device,int channel)              //參數(shù)為設(shè)備號(hào)、通道號(hào)
  { ………………                            //變量定義、說(shuō)明等
  lDevNum=device;
  usChan=channel;
  dwErrCde = DRV_DeviceOpen(lDevNum, &lDriverHandle);  //打開設(shè)備
    if (dwErrCde != SUCCESS)
    { ErrorHandler(dwErrCde);}
  ptAIConfig.DasChan = usChan;                         //配置設(shè)備
  ptAIConfig.DasGain = 0;
  dwErrCde = DRV_AIConfig(lDriverHandle, &ptAIConfig);
  if (dwErrCde != SUCCESS)
  { ErrorStop(&lDriverHandle, dwErrCde);}
  ptAIVoltageIn.chan = usChan;                         //讀一個(gè)數(shù)據(jù)
  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)閉設(shè)備
  if (dwErrCde != SUCCESS)
  { ErrorStop(&lDriverHandle, dwErrCde);}
  return fVoltage;                                     //返回采集數(shù)據(jù)
  }
  
   同理,數(shù)字量采集子函數(shù)也是類似的操作。

  3.3多媒體定時(shí)器

  由于多媒體定時(shí)器具有很好的實(shí)時(shí)性和較高的優(yōu)先級(jí),最高定時(shí)可達(dá)1ms,所以我們這個(gè)數(shù)據(jù)采集系統(tǒng)采用多媒體定時(shí)器來(lái)定時(shí)。需要的系統(tǒng)資源為:#include <mmsystem.h>;在borland環(huán)境下首先需要將winmm.lib文件通過(guò)implib命令轉(zhuǎn)化為borland下的格式,然后將相應(yīng)的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ù)中加入定時(shí)內(nèi)自己要做的內(nèi)容,本系統(tǒng)即要加入
                        //模擬量、數(shù)字量采集子函數(shù)的調(diào)用和存儲(chǔ)數(shù)據(jù)等語(yǔ)句
  }

  首先調(diào)用void start_timer(double m_time_val)啟動(dòng)多媒體定時(shí)器,多媒體定時(shí)器將每隔一個(gè)時(shí)間間隔調(diào)用void WINAPI callbackfunction(UINT uID,UINT MSG,DWORD DWUSER,DWORD DW1,DWORD DW2)函數(shù),通過(guò)改變time_interval的值可以改變時(shí)間間隔(time_interval的單位是毫秒),在定時(shí)結(jié)束時(shí)調(diào)用void end_timer()來(lái)終止定時(shí)。

  3.4存儲(chǔ)數(shù)據(jù)

  本數(shù)據(jù)采集系統(tǒng)還將把采集到的數(shù)據(jù)存儲(chǔ)起來(lái),以便將來(lái)對(duì)這些數(shù)據(jù)進(jìn)行分析?,F(xiàn)在最常用的數(shù)據(jù)庫(kù)就是微軟的Access,而C++Builder對(duì)數(shù)據(jù)庫(kù)也有較好的操作,所以我們采取將數(shù)據(jù)存入Access的方案來(lái)實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)?;镜牟僮鞑襟E如下:

  ●使用ADO組件頁(yè)中的ADOTable組件來(lái)連接存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)庫(kù)。

  ●由于ADOTable組件只負(fù)責(zé)連接數(shù)據(jù)庫(kù),無(wú)法取得數(shù)據(jù)庫(kù)文件內(nèi)的字段數(shù)據(jù),所以我們?nèi)缘檬褂肈ata Access組件頁(yè)中的DataSource組件來(lái)實(shí)現(xiàn),將它的DataSet屬性指定為ADOTable1(即前一步驟加入的ADOTable組件名稱)。

  ●往數(shù)據(jù)庫(kù)存數(shù)據(jù)的過(guò)程即是新增記錄的過(guò)程,所以只需添加幾句簡(jiǎn)單的語(yǔ)句:

  ADOTable1->Insert();
  ADOTable1->FieldValues["voltage1"]=voltage1;
  …………
  ADOTable1->Post();

  首先調(diào)用Insert方法創(chuàng)建一個(gè)緩沖區(qū)(即成為編輯模式),接著進(jìn)行數(shù)據(jù)字段值的編輯,當(dāng)我們完成數(shù)據(jù)輸入的操作后,必須調(diào)用Post方法,或者將當(dāng)前的數(shù)據(jù)位置移到另一筆數(shù)據(jù)上,這樣才會(huì)將新增的記錄內(nèi)容寫入到數(shù)據(jù)庫(kù)。

  4 結(jié)論

  試驗(yàn)結(jié)果表明本文基于Borland 開發(fā)的汽車自動(dòng)變速器)實(shí)車試驗(yàn)數(shù)據(jù)采集系統(tǒng),能夠滿足車載分析試驗(yàn)臺(tái)的要求,這為的開發(fā)和優(yōu)化控制策略打下基礎(chǔ)。

  參考文獻(xiàn)

  [1]楊宗志. C++Builder數(shù)據(jù)庫(kù)程序設(shè)計(jì)[M]. 北京:清華大學(xué)出版社,2001
  [2]潘旭峰,等. 現(xiàn)代汽車電子技術(shù)[M]. 北京:北京理工大學(xué)出版社,2001
  [3]史惠康. Borland 實(shí)用編程技術(shù)[M]. 北京:中國(guó)水利水電出版社,1999

  第一作者簡(jiǎn)介:羅君贇,男,1981年2月22日出生,上海人,車輛工程碩士研究生在讀,研究方向?yàn)樽詣?dòng)變速箱的研究與開發(fā)。


上一頁(yè) 1 2 下一頁(yè)

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉