基于C++ Builder的自动变速器电控单元实车试验数据采集系统
3.2模拟量、数字量采集子函数
本文引用地址:https://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 C++ Builder开发的汽车自动变速器电控单元(ECU)实车试验数据采集系统,能够满足车载分析试验台的要求,这为ECU的开发和优化控制策略打下基础。
参考文献
[1]杨宗志. C++Builder数据库程序设计[M]. 北京:清华大学出版社,2001
[2]潘旭峰,等. 现代汽车电子技术[M]. 北京:北京理工大学出版社,2001
[3]史惠康. Borland C++ Builder实用编程技术[M]. 北京:中国水利水电出版社,1999
第一作者简介:罗君贇,男,1981年2月22日出生,上海人,车辆工程硕士研究生在读,研究方向为自动变速箱电控单元的研究与开发。
评论