用C语言给NI数据采集卡编程序实现多路数据的同时采集

本文分享了两个实用的NI数据采集卡程序,分别实现六路数据的有限采集与保存,以及多路数据的实时连续采集与保存。采用参考单端接地方式,详细展示了如何使用NIDAQmx库配置采集任务、读取数据并记录到文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:https://blog.youkuaiyun.com/lubilie969/article/details/78438613
因为写的上一篇NI数据采集卡的程序有人留言说想要实现多路数据的同时采集,我没有及时回复,深感抱歉,在此写一篇关于NI数据采集卡的多路数据同时采集的程序

第一个程序实现的功能:六路数据同时采集,采集有限个数据,并且保存到txt文档中。采用的是参考单端接地的方式,参考单端接地指的是我们测量的每一路的值是该路相对AI GND的电压值。对参考单端接地不了解的话可以看NI-DAQmx C Reference help

不多说,上程序。

#include <stdio.h>
#include “NIDAQmx.h”
#pragma comment(lib,“NIDAQmx.lib”)
#include
using namespace std;

#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else

int main(void)
{
int32 error=0;
int32 per_num;
float64 data[6000];
TaskHandle taskHandle=0;
char errBuff[2048]={’\0’};
DAQmxErrChk (DAQmxCreateTask("",&taskHandle));
DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,“Dev2/ai0:5”,"",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));
DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",20000,DAQmx_Val_Rising,DAQmx_Val_ContSamps,1000));

DAQmxErrChk (DAQmxSetAITermCfg(taskHandle,"Dev2/ai0:5",DAQmx_Val_RSE));
//DAQmxErrChk (DAQmxRegisterEveryNSamplesEvent(taskHandle,DAQmx_Val_Acquired_Into_Buffer,PER_NUM0,0,EveryNCallback,this));
//DAQmxErrChk (DAQmxRegisterDoneEvent(taskHandle,0,DoneCallback,NULL));

/*********************************************/
// DAQmx Start Code
/*********************************************/
DAQmxErrChk (DAQmxStartTask(taskHandle));
DAQmxErrChk(DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByScanNumber,data,6000,&per_num,NULL));
FILE *fp1=fopen("data1.txt","w+");

for(int l=0;l<6000;l++)
{
	fprintf(fp1,"%f",data[l]);
	fputc('\n',fp1);
}
fclose(fp1);

Error:
if( DAQmxFailed(error) )
DAQmxGetExtendedErrorInfo(errBuff,2048);
if( taskHandle!=0 ) {
/*********************************************/
// DAQmx Stop Code
/*********************************************/
DAQmxStopTask(taskHandle);
DAQmxClearTask(taskHandle);
}
if( DAQmxFailed(error) )
printf(“DAQmx Error: %s\n”,errBuff);
printf(“End of program, press Enter key to quit\n”);
getchar();
return 0;
}
这个程序实测过,可以使用,希望能够对大家有帮助。
第二个程序实现的功能是对多路数据进行实时连续的采集与保存,采用的也是参考单端接地的方式。程序如下:

#include <stdio.h>
#include “NIDAQmx.h”
#pragma comment(lib,“NIDAQmx.lib”)
#include
using namespace std;

#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else

int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData);
int32 CVICALLBACK DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData);

float64 data[6000];

int main(void)
{
int32 error=0;
TaskHandle taskHandle=0;
char errBuff[2048]={’\0’};

/*********************************************/
// DAQmx Configure Code
/*********************************************/
DAQmxErrChk (DAQmxCreateTask("",&taskHandle));
DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev2/ai0:5","",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));
DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",1000,DAQmx_Val_Rising,DAQmx_Val_ContSamps,1000));

DAQmxErrChk (DAQmxSetAITermCfg(taskHandle,"Dev2/ai0:5",DAQmx_Val_RSE));
DAQmxErrChk (DAQmxRegisterEveryNSamplesEvent(taskHandle,DAQmx_Val_Acquired_Into_Buffer,1000,0,EveryNCallback,NULL));
DAQmxErrChk (DAQmxRegisterDoneEvent(taskHandle,0,DoneCallback,NULL));

/*********************************************/
// DAQmx Start Code
/*********************************************/
DAQmxErrChk (DAQmxStartTask(taskHandle));

printf("Acquiring samples continuously. Press Enter to interrupt\n");
getchar();

Error:
if( DAQmxFailed(error) )
DAQmxGetExtendedErrorInfo(errBuff,2048);
if( taskHandle!=0 ) {
/*********************************************/
// DAQmx Stop Code
/*********************************************/
DAQmxStopTask(taskHandle);
DAQmxClearTask(taskHandle);
}
if( DAQmxFailed(error) )
printf(“DAQmx Error: %s\n”,errBuff);
printf(“End of program, press Enter key to quit\n”);
getchar();
return 0;
}

int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData)
{
int32 error=0;
char errBuff[2048]={’\0’};
static int totalRead=0;
int32 read=0;
float64 dddd=0.001;
//float64 data[6000],last=0;

/*********************************************/
// DAQmx Read Code
/*********************************************/
DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByScanNumber,data,6000,&read,NULL));
if( read>0 ) {
	for(int i=0;i<6000;i=i+6)
	{
		cout<<data[i]<<endl;
	}
	FILE *fp2=fopen("data2.txt","w+");
	for(int l=0;l<6000;l++)
	 {
		 fprintf(fp2,"%f",data[l]);
		 fputc(',',fp2);
		 fprintf(fp2,"%f",dddd*l);
		 fputc('\n',fp2);
	 }
	fclose(fp2);
}

Error:
if( DAQmxFailed(error) ) {
DAQmxGetExtendedErrorInfo(errBuff,2048);
/*********************************************/
// DAQmx Stop Code
/*********************************************/
DAQmxStopTask(taskHandle);
DAQmxClearTask(taskHandle);
printf(“DAQmx Error: %s\n”,errBuff);
}
return 0;
}

int32 CVICALLBACK DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData)
{
int32 error=0;
char errBuff[2048]={’\0’};

// Check to see if an error stopped the task.
DAQmxErrChk (status);

Error:
if( DAQmxFailed(error) ) {
DAQmxGetExtendedErrorInfo(errBuff,2048);
DAQmxClearTask(taskHandle);
printf(“DAQmx Error: %s\n”,errBuff);
}
return 0;
}

这个程序也实际测试过,可以运行,希望这两个程序能对大家有帮助,谢谢观看,有问题请留言。
<think>我们被要求使用LabVIEW CVI开发针对NI PXI-4072数据采集卡采集程序。根据引用[1]中关于NI PCI-4070万用表的描述,我们可以推断NI PXI-4072也是类似的数字万用表(DMM)模块,因此开发思路应该类似:安装驱动,然后使用驱动提供的函数库进行编程。 步骤: 1. 确保硬件安装正确,包括PXI机箱、控制器和PXI-4072模块。 2. 安装NI-DMM驱动程序。因为PXI-4072是数字万用表,所以需要NI-DMM驱动。同时NI-DMM驱动通常包含在NI-DAQmx驱动中,但为了确保,最好安装完整的NI-DAQmx驱动和NI-DMM驱动。 3. 在LabVIEW CVI中,我们可以使用NI-DMM提供的函数库来编程。 开发步骤: a. 初始化会话(Session) b. 配置测量类型(如直流电压、交流电压、电阻等) c. 设置量程、分辨率等参数(可选) d. 读取测量值 e. 关闭会话 参考引用[1]中提到的:“在安装驱动后,会有万用表各种测试功能的例子”,因此我们可以先在NI Example Finder中查找相关的示例程序。 在LabVIEW CVI中,我们可以通过以下步骤找到示例: - 打开LabVIEW CVI - 选择Help -> Find Examples -> 在NI Example Finder中搜索“DMM”或“4072” 由于我们使用的是C语言,所以应该选择C语言的示例。 下面是一个简单的示例代码框架: ```c #include <stdio.h> #include <NIDMM.h> int main() { ViSession session; ViReal64 reading; ViChar buffer[256]; // 初始化会话,使用设备名称,可以在MAX中查看,例如 "PXI1Slot2" 或 "Dev1" nidmm_init("Dev1", VI_TRUE, VI_TRUE, &session); // 配置测量功能为直流电压 nidmm_ConfigureMeasurementDigits(session, NIDMM_VAL_DC_VOLTS, 10.0, 0.0001); // 设置触发方式为立即触发 nidmm_ConfigureTrigger(session, NIDMM_VAL_IMMEDIATE, 0.0); // 读取一个值 nidmm_Read(session, 10000, &reading); // 打印读数 printf("Reading: %f V\n", reading); // 关闭会话 nidmm_close(session); return 0; } ``` 注意:以上代码仅为示例,实际使用时需要根据具体需求调整参数,并检查错误。 另外,根据引用[3]中提到,NI-DAQmx提供简单、一致的API,并且是多线程的。但是请注意,NI-DMM驱动与NI-DAQmx驱动是不同的,NI-DMM是专门针对数字万用表的驱动。 对于多通道切换,如果我们需要测量多路信号,可以使用多路复用器(如PXI开关模块)配合使用。但PXI-4072本身是单通道的,所以需要外部开关切换通道。这时,我们需要编写控制开关模块的代码,然后依次切换通道并读取每个通道的值。 关于硬件配置: - 在开发前,使用NI Measurement & Automation Explorer (MAX) 来确认设备已被正确识别。 - 在MAX中,可以给设备设置别名(如“Dev1”),这样在程序中就可以使用别名来访问设备。 最后,建议参考NI官方网站上关于NI PXI-4072的文档和示例代码,这些资源会提供更详细的信息。 相关问题: 1. 如何设置NI PXI-4072的测量范围以优化精度? 2. 在LabVIEW CVI中如何处理多通道数据采集(使用开关模块)? 3. NI-DMM驱动中常用的函数有哪些?</think>### LabVIEW CVI 开发 NI PXI-4072 数据采集程序指南 #### 1. **环境准备** - **硬件连接** 将 PXI-4072 插入 PXI 机箱,通过 PCI/PXI 接口与控制器连接(确保 MAX 中识别设备)。 - **驱动安装** 安装 [NI-DAQmx 驱动](https://www.ni.com/zh-cn/support/downloads/drivers/download.ni-daqmx.html) 和 [NI-DMM 驱动](https://www.ni.com/zh-cn/support/downloads/drivers/download.ni-dmm.html),后者专用于数字万用表功能[^1]。 - **开发环境** 确保 LabVIEW CVI 已安装(推荐 2019 或更高版本)。 #### 2. **关键开发步骤** ```c #include <nidmm.h> #include <stdio.h> int main() { ViSession vi; ViReal64 reading; ViStatus status; // 初始化会话 status = niDMM_InitWithOptions("PXI1Slot2", VI_TRUE, VI_TRUE, "", &vi); if (status != VI_SUCCESS) { printf("初始化失败!错误码: %d\n", status); return -1; } // 配置直流电压测量(量程 10V,分辨率 0.001V) niDMM_ConfigureMeasurementDigits(vi, NIDMM_VAL_DC_VOLTS, 10.0, 0.001); // 设置触发模式(立即触发) niDMM_ConfigureTrigger(vi, NIDMM_VAL_IMMEDIATE, 0.0); // 读取数据 niDMM_Read(vi, 5000, &reading); // 超时 5 秒 printf("测量值: %.6f V\n", reading); // 关闭会话 niDMM_close(vi); return 0; } ``` #### 3. **功能扩展** - **多通道切换** 需配合多路复用器(如 PXI-2530): ```c niDMM_ConfigureChanList(vi, "0:7", 1.0); // 扫描 8 个通道 ``` - **高精度模式** 调整分辨率参数(如 `0.0001`)并启用滤波: ```c niDMM_SetAttributeViBoolean(vi, "", NIDMM_ATTR_ADC_CALIBRATION, VI_TRUE); ``` #### 4. **调试建议** - **MAX 测试**:在 Measurement & Automation Explorer 中验证设备功能。 - **错误处理**:使用 `niDMM_GetError()` 获取详细错误信息。 - **示例参考**:在 LabVIEW CVI 的 `Help → Find Examples` 中搜索 **"DMM"** 或 **"4072"**。 #### 5. **注意事项** - **采样率限制**:PXI-4072 的 DCV 模式最高采样率为 1.8 kS/s(详见[规格文档](https://www.ni.com/zh-cn/support/model.pxi-4072.html))。 - **校准**:定期使用 NI Calibration Executive 校准设备以保证精度[^1]。 - **多设备同步**:通过 PXI 背板触发线实现多卡同步采样。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值