新闻中心

EEPW首页 > 物联网与传感器 > 设计应用 > 基于C++ Builder的自动变速器电控单元实车试验数据采集系统

基于C++ Builder的自动变速器电控单元实车试验数据采集系统

作者:罗君贇 周凡华 邱绪云 吴小清时间:2008-08-29来源:微计算机信息收藏

  3.2模拟量、数字量采集子函数

本文引用地址:http://www.eepw.com.cn/article/87550.htm

  在确定了采集程序的程序框图和界面之后,就要着手编写采集中最重要的两个子函数了,即模拟量和数字量采集子函数。厂家提供的动态连接库(DLL)中包含了进行操作的C/C++函数,在C++Builder下可对这些函数进行调用,就可以很方便的对系统进行设置、采样和数据处理。以下通过对模拟量的采集来概要说明。

  使用时先在程序中声明,即把含有函数声明的.h文件包含在程序体中。然后利用项目管理器将包含函数实体的.lib文件加入到项目中。这样在程序体中就可以调用其中的函数了,具体的模拟量子函数代码如下:
  float readvoltage(int device,int channel)              //参数为设备号、通道号
  { ………………                            //变量定义、说明等
  lDevNum=device;
  usChan=channel;
  dwErrCde = DRV_DeviceOpen(lDevNum, &lDriverHandle);  //打开设备
    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;                         //读一个数据
  ptAIVoltageIn.gain = 0;                  
  ptAIVoltageIn.TrigMode = 0;           
  ptAIVoltageIn.voltage = &fVoltage;      
  dwErrCde = DRV_AIVoltageIn(lDriverHandle, &ptAIVoltageIn);
  if (dwErrCde != SUCCESS)
  { ErrorStop(&lDriverHandle, dwErrCde);}
  dwErrCde = DRV_DeviceClose(&lDriverHandle);         //关闭设备
  if (dwErrCde != SUCCESS)
  { ErrorStop(&lDriverHandle, dwErrCde);}
  return fVoltage;                                     //返回采集数据
  }
  
   同理,数字量采集子函数也是类似的操作。

  3.3多媒体定时器

  由于多媒体定时器具有很好的实时性和较高的优先级,最高定时可达1ms,所以我们这个数据采集系统采用多媒体定时器来定时。需要的系统资源为:#include <mmsystem.h>;在borland环境下首先需要将winmm.lib文件通过implib命令转化为borland下的格式,然后将相应的lib加到工程里。具体的多媒体定时器代码如下:
  void start_timer(double m_time_val)        //启动多媒体定时器,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()                   //终止定时
  { timeKillEvent(g_TIMEID);
  timeEndPeriod(0);
  }
  void WINAPI callbackfunction(UINT uID,UINT MSG,DWORD DWUSER,DWORD DW1,DWORD DW2)
  {                       //在此函数中加入定时内自己要做的内容,本系统即要加入
                        //模拟量、数字量采集子函数的调用和存储数据等语句
  }

  首先调用void start_timer(double m_time_val)启动多媒体定时器,多媒体定时器将每隔一个时间间隔调用void WINAPI callbackfunction(UINT uID,UINT MSG,DWORD DWUSER,DWORD DW1,DWORD DW2)函数,通过改变time_interval的值可以改变时间间隔(time_interval的单位是毫秒),在定时结束时调用void end_timer()来终止定时。

  3.4存储数据

  本数据采集系统还将把采集到的数据存储起来,以便将来对这些数据进行分析。现在最常用的数据库就是微软的Access,而C++Builder对数据库也有较好的操作,所以我们采取将数据存入Access的方案来实现数据的存储。基本的操作步骤如下:

  ●使用ADO组件页中的ADOTable组件来连接存储数据的数据库。

  ●由于ADOTable组件只负责连接数据库,无法取得数据库文件内的字段数据,所以我们仍得使用Data Access组件页中的DataSource组件来实现,将它的DataSet属性指定为ADOTable1(即前一步骤加入的ADOTable组件名称)。

  ●往数据库存数据的过程即是新增记录的过程,所以只需添加几句简单的语句:

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

  首先调用Insert方法创建一个缓冲区(即成为编辑模式),接着进行数据字段值的编辑,当我们完成数据输入的操作后,必须调用Post方法,或者将当前的数据位置移到另一笔数据上,这样才会将新增的记录内容写入到数据库。

  4 结论

  试验结果表明本文基于Borland 开发的汽车自动变速器)实车试验数据采集系统,能够满足车载分析试验台的要求,这为的开发和优化控制策略打下基础。

  参考文献

  [1]杨宗志. C++Builder数据库程序设计[M]. 北京:清华大学出版社,2001
  [2]潘旭峰,等. 现代汽车电子技术[M]. 北京:北京理工大学出版社,2001
  [3]史惠康. Borland 实用编程技术[M]. 北京:中国水利水电出版社,1999

  第一作者简介:罗君贇,男,1981年2月22日出生,上海人,车辆工程硕士研究生在读,研究方向为自动变速箱的研究与开发。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭