目录
项目背景
本次项目需要利用NI采集卡:NI 9232,振动加速度传感器:PCB 356A44对待测量产品进行震动方面的测量,并输出时域数据与频域数据;
IDE:Qt Creator
Qt版本:Qt 5.7.0 MSVC2013 32bit
编译器:Microsoft Visual C++ Compiler 12.0(x86)
NI-DAQmx是什么?
NI-DAQmx是用于与NI数据采集(DAQ)设备通信并控制设备的驱动程序软件。它包含一个用途广泛的函数和VI库,可从LabVIEW或LabWindows/CVI中调用库函数,对NI设备进行编程。
具体流程
创建任务
如果使用此函数创建任务,则必须使用DAQmxClearTask来销毁它。 如果在循环中使用此函数,NI DAQmx会在循环的每次迭代中创建一个新任务。完成任务后,请在循环中使用DAQmxClearTask函数,以避免分配不必要的内存。
Input | taskName | const char [] | 分配给任务的名称。 此名称可能会在内部更改。如果您使用的是C API,请调用DAQmxGetTaskName验证名称是否在创建过程中更改。 |
Output | taskHandle | TaskHandle * | 对此函数中创建的任务的引用。 |
Return Value | status | int32 | 函数在出现错误或警告时返回的错误代码。值为0表示成功。正值表示警告。负值表示错误。 |
int Ret = DAQmxCreateTask("NI Collect", &taskHandle);
if(Ret!=0)
{
std::string strMessage = "CreateTask false创建任务失败,错误代码:"+std::to_string(Ret);
CLogShow::Instance()->Add(strMessage.c_str());//写入日志文件
return false;
}
创建使用加速度计测量加速度的通道
创建使用加速度计测量加速度的通道,并将通道添加到使用taskHandle指定的任务中。
Input | taskHandle | TaskHandle | 将此函数创建的通道添加到的任务。 |
physicalChannel | const char [] | 用于创建虚拟通道的物理通道的名称。您可以指定物理通道的列表或范围。 | |
nameToAssignToChannel | const char [] | 要分配给创建的虚拟通道的名称。如果未指定名称,NI DAQmx将使用物理通道名称作为虚拟通道名称。如果为nameToAssignToChannel指定自己的名称,则在其他NI DAQmx函数中引用这些通道时必须使用这些名称。 | |
terminalConfig | int32 | 通道的输入端子配置。 | |
minVal | float64 | 期望测量的最小值(单位)。 | |
maxVal | float64 | 期望测量的最大值(单位)。 | |
units | int32 | 用于从通道返回加速度测量值的单位。 | |
sensitivity | float64 | 传感器的灵敏度。该值以您使用sensivityUnits输入指定的单位为单位。请参阅传感器文档以确定该值。 | |
sensitivityUnits | int32 | 灵敏度的单位。 | |
currentExcitSource | int32 | 激发源。 | |
currentExcitVal | float64 | 传感器所需的励磁量,以安培为单位。 | |
customScaleName | const char [] | 要应用于通道的自定义比例的名称。若要使用此参数,必须将单位设置为DAQmx_Val_FromCustomScale。如果未将单位设置为DAQmx_Val_FromCustomScale,则必须将customScaleName设置为NULL。 | |
Return Value | status | int32 | 函数在出现错误或警告时返回的错误代码。值为0表示成功。正值表示警告。负值表示错误。 |
float64 minVal = -10;//最小值
float64 maxVal =10;//最大值
float64 sensitivity = 50;//灵敏度
Ret = DAQmxCreateAIAccelChan(taskHandle,m_strPhysicalChannel.c_str(),"",DAQmx_Val_PseudoDiff,minVal,maxVal,DAQmx_Val_AccelUnit_g,sensitivity,DAQmx_Val_mVoltsPerG,DAQmx_Val_Internal,0.004,NULL);
if(Ret!= 0)
{
std::string strMessage = "加速度通道创建失败:"+std::to_string(Ret);
CLogShow::Instance()->Add(strMessage.c_str());
return false;
}
设置耦合
DAQmx_Val_AC | 从信号中去除直流偏移。 |
DAQmx_Val_DC | 允许NI DAQmx测量所有信号。 |
DAQmx_Val_GND | 从测量中去除信号,只测量接地。 |
Ret = DAQmxSetAICoupling(taskHandle, m_strPhysicalChannel.c_str(), DAQmx_Val_AC);
if(Ret!=0)
{
std::string strMessage = "设置耦合方式失败:"+std::to_string(Ret);
CLogShow::Instance()->Add(strMessage.c_str());
return false;
}
配置采样时钟
int iPackNum = iTime/1000;//10s重复10次
int32 SampsPerChan = iFrequence*iPackNum;//每个通道的采样总数500000
Ret = DAQmxCfgSampClkTiming(taskHandle, "", (float)iFrequence, DAQmx_Val_Rising, DAQmx_Val_FiniteSamps, SampsPerChan);
if(Ret != 0)//错误代码-200477表示无法配置采样时钟,可能是由于设备不支持所需的采样时钟源或采样时钟速率导致的。//采样频率50000,需要采集500000个数据后退出任务
{
std::string strMessage = "4配置采样率失败,错误代码:"+std::to_string(Ret);
CLogShow::Instance()->Add(strMessage.c_str());
return false;
}
启动任务
Ret = DAQmxStartTask(taskHandle);
if(Ret!= 0)//错误代码-200478通常表示采集任务无法启动,可能是由于设备未准备好或采集任务未正确配置导致的。
{
std::string strMessage = "5启动任务失败,错误代码:"+std::to_string(Ret);
CLogShow::Instance()->Add(strMessage.c_str());
return false;
}
读取数据
taskHandle | 是任务句柄,表示要读取的任务; |
numSampsPerChan | 是每个通道要读取的样本数; |
timeout | 是等待数据可用的超时时间; |
fillMode | 表示当读取的样本数小于 numSampsPerChan 时,是否使用默认值填充缺失数据; |
readArray | 是用于存储读取数据的数组; |
arraySizeInSamps | 是 readArray 的大小(以样本数为单位); |
sampsPerChanRead | 是实际读取的样本数; |
reserved | 保留参数,应设置为 nullptr。 |
int32 ArraySizeInSamps = iFrequence*iPackNum; //样本数组大小
int32 SamesPerChanRead;//读取之后实际读取的样本数会存入这里;
Ret = DAQmxReadAnalogF64(taskHandle,SampsPerChan,10.0,DAQmx_Val_GroupByChannel,pBuffer->begin(),ArraySizeInSamps,&SamesPerChanRead,NULL);//阻塞采集,每秒采集50000个数据,采集满500000个数据才退出
if(Ret!= 0)//错误代码-200478通常表示采集任务无法启动,可能是由于设备未准备好或采集任务未正确配置导致的。
{
std::string strMessage = "6读取数据失败,错误代码:"+std::to_string(Ret);
CLogShow::Instance()->Add(strMessage.c_str());
return false;
}
停止任务
DAQmxStopTask(taskHandle);
清除任务
DAQmxClearTask(taskHandle);