NI-DAQmx
一、什么是NI-DAQmx
NI ---National Instruments
DAQ --- Data AcQuisition
mx ---Measurement eXperience
二、如何使用NI DAQ
DAQ----NI数据采集卡物理通道的概念和语法-面包板社区 (eet-china.com)
2.1、物理通道:
NI把物理通道号分成六个类别:
AI/AO:模拟量输入/输出
DI/DO:数字量输入/输出
CI/CO:计数器输入/输出
数字量输入/输出(DI/DO)比较特殊,有端口(PORT)和线(LINE)的概念,所谓端口,一般是8位的,读写端口就是同时对端口的8个位(线)同时操作,如果只操作相应端口的某一条线(实际就是某一位),可以通道物理通道控件选择线操作。
物理通道:设备号/通道号
1、物理通道由设备号(DEV1)和通道号(AI,AO等)两部分组成,中间是斜杠分隔符号。
2、物理通道号是在MAX配置板卡后自动分配的,第一块板卡是DEV0,第二块是DEV1。
3、对于AI,AO,CI,CO,通道号由通道形式(AI,AO)加上通道编号组成,比如AI0,AI5,AO1等等。
4、对于数字IO,通道号是端口(PORT0,PORT1。。)或者端口+线号组成(PORT0/LINE1等)
2.2、语法:
多通道的表示方法(可以混合):
连续方式:(用:分隔)
Dev0/ai0:4 或者 Dev0/ai0:Dev0/ai4 表示选择0--4五个AI通道。
列表方式:(用 ,分隔)
Dev0/ai1,Dev0/ai4 表示同时选择AI1和AI4两个物理通道。
2.3、8个主要流程函数
正常调用流程:
2.3.1、创建任务
DAQmxCreateTask()函数可用于创建任务
TaskHandle taskHandle=0;
DAQmxCreateTask("",&taskHandle);
2.3.2、创建虚拟通道
“NI-DAQmx创建虚拟通道”函数可创建一个虚拟通道并将其添加至任务, 也可用于创建多个虚拟通道并将其全部添加至任务。 如未指定任务,该函数将自动创建一个任务。 “NI-DAQmx创建虚拟通道”函数包含多个实例, 这些实例对应虚拟通道执行的具体测量或生成类型。
例如:DAQmxCreateAIVoltageChan()函数则用于创建模拟输入电压通道:
TaskHandle taskHandle=0;
char chan[256] = "Dev1/ai0";
float64 min = -10, max = 10;
DAQmxCreateTask("",&taskHandle);
DAQmxCreateAIVoltageChan(taskHandle, chan, "", DAQmx_Val_Cfg_Default, min, max, DAQmx_Val_Volts, NULL);
2.3.3、触发/定时
“NI-DAQmx触发”函数可用于对触发进行配置来执行指定操作。 常用的操作是开始触发和参考触发。 开始触发用于启动采集或生成, 参考触发则用于在一组采集样本中创建预触发数据结束后和后触发数据开始前的位置。 可对这两个触发进行配置,使其发生在数字边沿、模拟边沿、或模拟信号进入或离开窗口时。
“NI-DAQmx定时”函数用于对硬件定时的数据采集操作进行定时配置, 包括指定操作是连续执行还是有限执行、选择采集或生成的样本数量以进行有限操作、以及需要时创建缓冲区。
对于需要采样定时(模拟输入、模拟输出和计数器)的操作,“NI-DAQmx定时”函数的采样时钟实例可用于设置采样时钟源和采样速率,采样时钟源可以是内部也可以是外部的信号源。
采样时钟能够控制采集或生成样本的速率。 每个时钟脉冲将启动任务中每个虚拟通道的样本采集或生成。
例如:DAQmxCfgSampClkTiming函数用于配置C或C++中的任务定时
TaskHandle taskHandle=0;
char chan[256] = "Dev1/ai0";
float64 min = -10, max = 10;
DAQmxCreateTask("",&taskHandle);
DAQmxCreateAIVoltageChan(taskHandle, chan, "", DAQmx_Val_Cfg_Default, min, max, DAQmx_Val_Volts, NULL);
char clockSource[256] = "";
float64 rate = 10000;
DAQmxCfgSampClkTiming(taskHandle, clockSource, rate, DAQmx_Val_Rising, DAQmx_Val_ContSamps, 1000);
2.3.4、开始任务
“NI-DAQmx开始任务”函数可以将一个任务显式转换成运行状态。 运行状态下,任务进行指定的采集和生成。 当“NI-DAQmx读取”函数运行而“NI-DAQmx开始任务”函数未运行时,任务将隐式转换成运行状态并自动启动。 这种隐式转换也会发生在“NI-DAQmx写入”函数在指定的自动开始输入驱动下运行但“NI-DAQmx开始任务”函数未运行时。
虽然不一定需要,但包含硬件定时的采集或生成的任务最好使用“NI-DAQmx开始任务”函数来显式启动。
而且,如果需要多次执行“NI-DAQmx读取”函数或“NI-DAQmx写入”函数(比如在一个循环中),则应使用“NI-DAQmx开始任务”函数。
否则任务会由于不断重复开始和停止而影响执行性能。
例如:DAQmxStartTask()函数可用于开始任务:
DAQmxStartTask(taskHandle);
2.3.5、读/写
“NI-DAQmx读取”函数可从指定的采集任务中读取样本。 针对不同的函数实例可选择不同的采集类型(模拟、数字、或计数器)、虚拟通道数量、采样数量和数据类型。 指定的采样数量从DAQ板卡上的FIFO传输到RAM中的PC缓存后,“NI-DAQmx读取”函数再将样本从PC缓存转移到应用程序开发环境(ADE)内存中。
“NI-DAQmx写入”函数用于将样本写入指定的生成任务中。 针对不同的函数例程可选择不同的生成类型(模拟或数字)、虚拟通道数量、采样数量和数据类型。 “NI-DAQmx写入”函数将样本从应用程序开发环境(ADE)写入到PC缓存中。 然后这些样本从PC缓存传输到DAQ板卡FIFO以进行生成。
例如:DAQmxReadAnalogF64()函数用于读取C或C++中的模拟输入任务的模拟数据:
int numRead = 0;
//int32 DAQmxReadAnalogF64(TaskHandle taskHandle, int32 numSampsPerChan, float64 timeout, bool32 fillMode, float64 readArray[], uInt32 arraySizeInSamps, int32 *sampsPerChanRead, bool32 *reserved);
DAQmxReadAnalogF64(taskHandle, 1000, 10.0, DAQmx_Val_GroupByScanNumber, data, 1000, &numRead, NULL);
例如:DAQmxReadAnalogF64()函数用于写入模拟数据
int written = 0;
DAQmxWriteAnalogF64(taskHandle, 1000, 0, 10.0, DAQmx_Val_GroupByChannel, data, &written, NULL);
2.3.6、结束前等待
“NI-DAQmx结束前等待”函数用于等待数据采集完毕后结束任务。 该函数可用于确保停止任务前已完成指定的采集或生成。 一般情况下,“NI-DAQmx结束前等待”函数用于有限操作。 一旦该函数执行完毕,则表示有限采集或生成已完成,任务可在不影响操作的情况下停止。 此外,超时输入可用于指定最长等待时间。 如果采集或生成没有在该时间内完成,则函数将退出并生成一个相应错误。
例如:DAQmxWaitUntilTaskDone()函数用于等待直至缓存区的所有样本均生成完毕。 该函数在写入或开始函数之后调用。
//int32 DAQmxWaitUntilTaskDone (TaskHandle taskHandle, float64 timeToWait);
//timeToWait:-1:无限期地等待,单位:秒
DAQmxWaitUntilTaskDone(taskHandle, -1);
2.3.7、结束任务
例如:DAQmxStopTask()函数即可结束任务
DAQmxStopTask(taskHandle);
2.3.8、清理任务
“NI-DAQmx清除任务”函数用于清除指定的任务。 如果任务正在运行,则函数将先停止任务,然后释放任务所有的资源。 一旦任务被清除后,除非再次创建,否者该任务无法再使用。 因此,如果需要再次使用任务,则应使用“NI-DAQmx停止任务”函数来停止任务,而不是将其清除。
对于连续操作,应使用“NI-DAQmx清除任务”函数来停止实际的采集或生成。
例如:DAQmxClearTask()函数即可清除任务
DAQmxClearTask(taskHandle);