转自:http://www.ni.com/product-documentation/2835/zhs/
目录
- NI-DAQmx:减少开发时间,提升系统系能
- DAQ 助手
- NI-DAQmx虚拟通道创建函数
- NI-DAQmx触发
- NI-DAQmx 定时
- NI-DAQmx开始任务
- NI-DAQmx 读取
- NI-DAQmx 写入
- NI-DAQmx 结束前等待
- NI-DAQmx任务清楚
- NI-DAQmx属性
- 结论
NI-DAQmx入门指南系列旨在帮助用户了解NI-DAQmx编程的基础知识。从使用Measurement & Automation Explorer (MAX)验证设备运行情况到使用LabVIEW编程数据采集应用,本系列将通过视频和文本教程为您一一介绍。 本系列既适用于希望学习使用DAQ助手的初学者,也适合需要使用NI-DAQmx高级功能的有经验用户。
1. NI-DAQmx:减少开发时间,提升系统系能
自从NI-DAQmx发布以来,NI数据采集(DAQ)硬件用户一直在充分利用软件的诸多特性来节省开发时间,并提高数据采集应用程序的性能。
其中一个能节省大量开发时间的特性是NI-DAQmx应用程序编程接口(API),该接口适用于各种设备功能和设备系列。也就意味着在一个多功能设备的所有功能都可通过同一功能集(模拟输入、模拟输出、数字I/O和计数器)进行编程。而且,数字I/O设备和模拟输出设备也可由同一个功能集进行编程。在LabVIEW中,多态机制使得这些都成为可能。一个多态VI可接受多种数据类型,用于一个或多个输入和/或输出终端。NI-DAQmx API对于所有可支持的编程环境都是一样的。用户只需学习运用一个功能集,便可在多种编程环境下对大部分的NI数据采集硬件进行编程。
另一个能够提升开发体验的NI-DAQmx特性是DAQ助手。这个工具可帮助用户无需编程,仅通过图形化界面配置各种简单或复杂的数据采集任务,即可创建应用。此外,因为触发和/或时钟信号必须手动路由,因此通常很难实现同步性,而使用NI-DAQmx,这将变得轻而易举,NI-DAQmx可以在一个设备上不同的功能区域间以及在多个设备上自动进行信号路由。
使用NI-DAQmx搭建的数据采集应用将受益于NI-DAQmx这一专门针对最优化系统性能而设计的架构。该架构以一个高效的状态模型为基础,去除了不必要的重复配置。将这些系统占用去除后,配置和采集过程都得到了优化。另外,由于内存映射寄存器的存在,单点I/O采样率可达到50 kS/s以上。
NI-DAQmx构架的另一个重要特性是测量多线程。NI-DAQmx的多线程性可实现同时进行多个数据采集操作,从而大大提高了多操作应用的性能,同时极大地简化此类应用的编程。
用户只需学习几个函数,即可开始享受这些特性所带来的好处。事实上, NI-DAQmx的10个函数提供了解决80%的数据采集应用问题的功能。下面将详细介绍这些函数,帮助用户理解其功能及其所适用的应用类型。
注意:本文档中所引用的范例都可在以下位置中找到。
LabVIEW | 帮助»查找范例»硬件输入和输出»DAQmx |
LabWindows/CVI | 帮助»查找范例»硬件输入和输出»DAQmx |
.NET | C:\Documents and Settings\All Users\Documents\National Instruments\NI-DAQ\Examples\DotNET2.0 or C:\Program Files\National Instruments\MeasurementStudioVS2005\DotNET\Examples |
2. DAQ 助手
工具»创建/编辑DAQmx任务[CVI]
项目»添加新项目»DAQmx任务[.NET]
DAQ助手可通过图形化界面让用户交互式地创建、编辑、运行NI-DAQmx虚拟通道和任务。每个NI-DAQmx虚拟通道由DAQ设备上的一个物理通道以及该物理通道的配置信息,比如输入范围和自定义缩放。一个NI-DAQmx任务就是一个包含虚拟通道、定时、触发信息、以及其他与采集和生成相关的属性的集合。下图显示了如何配置DAQ助手来实现有限应变测量。
![](https://i-blog.csdnimg.cn/blog_migrate/b7358f0ba26bb7d6002b3091fef02a83.gif)
下列文档描述了DAQ助手在LabVIEW,LabWindows/CVI,和 .NET中的应用:
NI-DAQmx Express VI 指南
LabWindows/CVI中DAQ助手的使用
Measurement Studio中DAQ助手的使用
DAQ助手还可生成代码,用于配置和/或执行指定的采集或生成。《DAQ助手帮助》以及《使用DAQ助手自动生成LabVIEW代码》文档均描述了在LabVIEW中实现该操作的步骤。下图显示的是DAQ助手一个例程及其自动生成的配置和LabVIEW代码范例。
![](https://i-blog.csdnimg.cn/blog_migrate/0e18e8ff0f0f3a058aa61c1191cd7dc1.gif)
DAQ助手提供的灵活性和/或性能有时无法满足某些数据采集应用。这些应用可能需要以下简单但强大的NI-DAQmx函数。
3. NI-DAQmx虚拟通道创建函数
库»NI-DAQmx»通道创建/配置 [CVI]
Task.Channel.CreateChannel属性 [.NET]
“NI-DAQmx虚拟通道创建”函数可以创建一个虚拟通道并将它添加至任务,也可用于创建多个虚拟通道,并将它们都添加至一个任务中。如果没有指定某个任务,则该函数自动创建一个任务。“NI-DAQmx虚拟通道创建”函数包含无数个的例程,这些例程对应虚拟通道执行的特定测量或生成类型。
在LabVIEW中创建通道
下图显示的是四个不同NI-DAQmx Create Virtual Channel VI例程的范例。
![](https://i-blog.csdnimg.cn/blog_migrate/3e75603b97a89b43bafe2a656083c12c.gif)
“NI-DAQmx虚拟通道创建”函数的输入根据不同函数例程而有所不同,然而,某些输入对大部分(即使不是全部)函数的例程都是通用的。例如指定虚拟通道所采用物理通道(模拟输入和模拟输出)、线路(数字)或计数器需要同一个输入。此外,模拟输入、模拟输出和计数器操作根据信号的最小和最大预估值使用最小值和最大值输入来配置和优化测量和生成。而且,多种类型的虚拟通道可进行自定义扩展。在下面的LabVIEW程序框图中,NI-DAQmx Create Virtual Channel VI用于创建热电偶虚拟通道。
![](https://i-blog.csdnimg.cn/blog_migrate/e5baa766a6dbe8dbb21dc5d200482a53.gif)
在.NET中创建通道
大部分NI-DAQmx .NET库中的类无法直接被初始化,这些类将被用作任务类的子对象。
这些类包含了某个特定通道类型的专用属性。例如:“计数”等属性只适用于计数器,并只能在CIChannel和CIChannel的类中找到。用户可以在NI-DAQmx .NET类库中将以下通道类型与某个 任务 关联起来。
模拟输入通道——AIChannel类
模拟输出通道——AOChannel类
数字输入通道——DIChannel类
数字输出通道——DOChannel类
计数输入通道——CIChannel类
计数输出通道——COChannel类
任务类包含一个适用于六种通道类型(AIChannels, AOChannels, DIChannels, DOChannels, CIChannels和 COChannels)的通道集合属性。用户可以使用通道集合中多种通道创建方法的某一方法来创建通道。
建立了一个新的任务对象后,通过调用通道类中的相应函数即可创建和分配AIChannel对象。以下的程序片段用于创建一个简单的模拟输入电压通道:
analogInTask = new Task();
AIChannel myChannel;
myChannel = analogInTask.AIChannels.CreateVoltageChannel(
"dev1/ai1", //The physical name of the channel
"myChannel", //The name to associate with this channel
AITerminalConfiguration.Differential, //Differential wiring
-10, //10v minimum
10, //10v maximum
AIVoltageUnits.Volts //Use volts
);
在C/C++中创建任务
DAQmxCreateTask()函数可用于创建任务, DAQmxCreateAIVoltageChan()函数则用于创建模拟输入电压通道。关于创建不同测试类型的通道的信息,请查看“NI-DAQmx 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);
练习范例:
LabVIEW | Write Dig Port.vi |
Cont Acq Thermocouple Samples-Int Clk.vi | |
CVI | Write Dig Port |
Cont Thrmcpl Samples-Int Clk | |
.NET | WriteDigPort |
ContAcqThermocoupleSamples_IntClk |
4. NI-DAQmx触发
库»NI-DAQmx»触发 [CVI]
Task.Triggers属性[.NET]
“NI-DAQmx触发”函数可用于对触发进行配置来执行指定操作。最常用的操作是开始触发和参考触发。开始触发用于启动采集或生成,参考触发则用于在一组采集样本中创建预触发数据结束后和后触发数据开始前的位置。可对这两个触发进行配置,使其发生在数字边沿、模拟边沿、或模拟信号进入或离开窗口时。
在LabVIEW中创建触发
在下面的LabVIEW程序框图中,开始触发和参考触发均已通过NI-DAQmx Trigger VI进行配置,可发生在数字边沿上来进行模拟输入操作。
许多数据采集应用程序需要在一个设备上实现不同功能区域的同步(例如:模拟输出和计数器),而其他的程序也需要在多个设备之间实现同步。为了实现这些同步性,触发信号必须在单个设备的不同功能区域间或在不同的设备间进行路由。而NI-DAQmx则可自动执行这些路由。在使用NI-DAQmx触发函数时,所有有效的触发信号均可作为源输入到函数中。例如,在下面的NI-DAQmx Trigger VI中,设备2的开始触发信号可用作设备1的开始触发源,而无需进行任何显式路由。
![](https://i-blog.csdnimg.cn/blog_migrate/bf36d9c2d59cddb2fcd7c159f69c63dc.gif)
在.NET中创建触发
创建任务对象和通道后,用户可以调用Task.Triggers集合中的方法将触发添加至任务中。以下代码片段用于创建“数字边沿开始触发”:
analogInTask = new Task();
DigitalEdgeStartTriggerEdge triggerEdge = DigitalEdgeStartTriggerEdge.Rising;
analogInTask.AIChannels.CreateVoltageChannel( ... );
analogInTask.Triggers.StartTrigger.ConfigureDigitalEdgeTrigger("PFI0", triggerEdge);
基于发送至ConfigureDigitalEdgeTrigger函数的参数,设备会根据内部或外部的触发线判断是否存在上升或下降数字边沿,然后再开始采集数据。上面的程序代码用于将设备配置为根据PFI 0判断上升数字边沿触发。
在C/C++中创建触发
DAQmxCfgDigEdgeStartTrig()函数可用于创建数字边沿开始触发。关于创建其他不同的触发,请查看”NI-DAQmx C参考帮助”。以下程序代码显示了如何使用该函数从PFI0接收数字开始触发信号并在该线路中寻找上升边沿。
char startTrigger[256] = "Dev1/PFI0";
int startEdge = 0; // rising edgeDAQmxCreateTask("",&taskHandle));
DAQmxCreateAIVoltageChan(taskHandle, chan, "", DAQmx_Val_Cfg_Default, min, max, DAQmx_Val_Volts, NULL);
DAQmxCfgDigEdgeStartTrig(taskHandle, startTrigger, startEdge);
《NI-DAQmx定时和同步特性》文档中介绍了更多关于借助NI-DAQmx使用“NI-DAQmx触发”函数来实现同步的信息。
Examples to Examine:
LabVIEW | Acq&Graph Voltage-Int Clk-Dig Start&Ref.vi |
Cont Acq&Graph Voltage-Int Clk-Analog Start.vi | |
CVI | Acq-Int Clk-Dig Start&Ref |
Cont Acq-Int Clk-Anlg Start | |
.NET | AcqVoltageSamples_IntClkDigStartAndRef |
ContAcqVoltageSamples_IntClkAnalogStart |
5. NI-DAQmx 定时
库»NI-DAQmx»定时 [CVI]
Task.Timing属性[.NET]
“NI-DAQmx定时”函数用于对硬件定时的数据采集操作进行定时配置,包括指定操作是连续执行还是有限执行、选择采集或生成的样本数量以进行有限操作、以及需要时创建缓冲区。
对于需要采样定时(模拟输入,模拟输出,计数器)的操作,“NI-DAQmx定时”函数的采样时钟例程可用于设置采样时钟源和采样速率,采样时钟源可以是内部也可以是外部的信号源。采样时钟能够控制采集或生成样本的速率。每个时钟脉冲将启动任务中每个虚拟通道的样本采集或生成。
在LabVIEW中配置任务定时
下面的LabVIEW程序框图显示的是如何使用NI-DAQmx Timing VI的采样时钟例程来配置使用外部采样时钟的连续模拟输出生成。
为了实现数据采集程序间的同步,定时信号必须以与触发信号同样的方式在一个设备的不同功能区域间或在多个设备间进行路由。NI-DAQmx可自动完成这些路由。所有有效的定时信号都可作为“NI-DAQmx定时”函数的输入源。例如,在以下DAQmx Timing VI中,设备的模拟输出采样时钟信号可用作模拟输入通道采样时钟的信号源,而无需进行任何显式路由。
![](https://i-blog.csdnimg.cn/blog_migrate/f749ecaad4b81ae8f09f1fa13cd8fe81.gif)
《NI-DAQmx定时和同步特性》文档中介绍了更多关于借助NI-DAQmx使用“NI-DAQmx定时”函数来实现同步的信息。
由于所测信号可提供定时,因此大多数计数器操作都不需要采样定时。这些应用应使用“NI-DAQmx定时”函数的隐式例程。在以下LabVIEW程序框图中,NI-DAQmx Timing VI的隐式例程用于以指定的采样数量将缓冲脉冲宽度采集配置为有限值。
![](https://i-blog.csdnimg.cn/blog_migrate/a412d1a52e0f7364b2200e10ef3e91d2.gif)
在.NET中配置任务定时
Channel.Timing.ConfigureSampleClock()函数用于设置采样时钟源、采样时钟速率,以及采集或生成的样本数量。以下代码片段根据连接到设备上的PFI 0的外部采样时钟创建了一个连续采样。
analogInTask = new Task();
analogInTask.AIChannels.CreateVoltageChannel( ... );
analogInTask.Timing.ConfigureSampleClock(
"/Dev1/PFI0", // external clock source line or use "" for internal clock
10000, // expected rate of external clock or actual rate of internal clock
SampleClockActiveEdge.Rising, // acquire on rising or falling edge of ticks
SampleQuantityMode.ContinuousSamples, // continuous or finite samples
1000 // number of finite samples to acquire or used for buffer size if continuous
);
在C/C++中配置任务定时
DAQmxCfgSampClkTiming函数用于配置C或C++中的任务定时。以下代码片段是该函数应用于一个10000赫兹的内部时钟的范例。
char clockSource[256] = "";
float64 rate = 10000;DAQmxCfgSampClkTiming(taskHandle, clockSource, rate, DAQmx_Val_Rising, DAQmx_Val_ContSamps, 1000);
某些数据采集设备针对数字I/O操作采用的是握手定时模式。握手协议通过与外部设备进行定时信号的请求和确认交互来传输样本。”NI-DAQmx定时”函数的握手例程可用于为数字I/O操作配置握手定时模式。
练习范例:
LabVIEW | Cont Gen Voltage Wfm-Ext Clk.vi |
Meas Buffered Semi-Period-Finite.vi | |
CVI | Cont Gen Volt Wfm-Ext Clk |
Buff Semi-Period-Finite | |
.NET | ContGenVoltageWfm_ExtClk |
MeasBuffered_SemiPeriodFinite |
6. NI-DAQmx开始任务
库»NI-DAQmx»任务配置/控制»开始任务[CVI]
Task.Start方法[.NET]
在引言中我们提过,NI-DAQmx使用的状态模型已去除了不必要的重复配置,可实现更高的效率和最佳的性能。该状态模型包含一个任务的五个状态。关于每一个状态的详细信息可在NI-DAQmx关键概念»任务»任务状态模型下的 NI-DAQmx帮助中找到。
“NI-DAQmx开始任务”函数可以将一个任务显式转换成运行状态。在运行状态下,任务将进行指定的采集和生成。当“NI-DAQmx读取”函数运行而“NI-DAQmx开始任务”函数未运行时,任务将隐式转换成运行状态或自动启动。这种隐式转换也会发生在“NI-DAQmx写入”函数在指定的自动开始输入驱动下运行但“NI-DAQmx开始任务”函数未运行时。
虽然不一定需要,但包含硬件定时的采集或生成的任务最好使用“NI-DAQmx开始任务“函数来显式启动。而且,如果需要多次执行“NI-DAQmx读取”函数或“NI-DAQmx写入”函数(比如在一个循环中),则应使用“NI-DAQmx开始任务”函数。否则任务会由于不断重复开始和停止而影响执行性能。更多关于“NI-DAQmx开始任务”函数的使用信息可在NI-DAQmx关键概念»任务» 显式开始任务下的NI-DAQmx帮助中找到。
在LabVIEW中开始任务
以下LabVIEW程序框图显示的是模拟输出生成仅包含单个软件定时的采样而无需使用“NI-DAQmx开始”函数的情况。
![](https://i-blog.csdnimg.cn/blog_migrate/207b783e046993e50c87b2c7bbb0d15e.gif)
相反地,下面的LabVIEW程序框图显示的是多次执行”NI-DAQmx读取”函数从计数器读取数据而必须使用“NI-DAQmx开始”函数的情况。
![](https://i-blog.csdnimg.cn/blog_migrate/77d7d586b2a2361122f70059b9ce260a.gif)
在.NET中开始任务
Start()函数用于在任务对象中开始任务。下面的代码是Start()函数的一个使用范例。
analogInTask = new Task();
analogInTask.AIChannels.CreateVoltageChannel( ... );
analogInTask.Timing.ConfigureSampleClock( ... );
analogInTask.Start();
在C/C++中开始任务
DAQmxStartTask()函数可用于开始任务,该函数的一个应用代码范例如下。
DAQmxStartTask(taskHandle);
练习范例:
LabVIEW | Gen Dig Pulse Train-Continuous.vi |
Cont Acq 0-20mA Current Samples-Int Clk.vi | |
CVI | Dig Pulse Train-Cont |
Cont 0-20mA Samps-Int Clk | |
.NET | GenDigPulseTrain_Continuous |
ContAcq0_20mACurrentSamples_IntClk |
7. NI-DAQmx 读取
库»NI-DAQmx»读取函数 [CVI]
ChannelReader类[.NET]
“NI-DAQmx读取”函数可从指定的采集任务中读取样本。针对不同的函数例程可选择不同的采集类型(模拟、数字、或计数器)、虚拟通道数量、采样数量和数据类型。指定的采样数量从DAQ板卡上的FIFO传输到RAM中的PC缓存后,“NI-DAQmx读取”函数再将样本从PC缓存转移到应用程序开发环境(ADE)内存中。
在LabVIEW中读取数据
下图显示的是四个不同 “NI-DAQmx读取”VI例程的范例。
![](https://i-blog.csdnimg.cn/blog_migrate/50b9f9e7390d7866942a42f0ebc651f1.gif)
可读取多个采样的“NI-DAQmx读取”函数例程包括一个用于指定函数执行时每个通道需要读取的采样数量的输入。对于有限采集,将每通道采样数指定为-1,函数将等待所有请求的样本采集完毕,然后再对这些样本进行读取。对于连续采集,如果将每通道采样数指定为-1,则函数执行时将读取当前缓存区中的所有样本。在以下LabVIEW程序框图中,NI-DAQmx Read VI已进行配置,可从多个模拟输入虚拟通道读取多个采样,然后将数据以波形的方式返回。而且,由于每通道采样数输入已设置为常数10,每次执行VI时将从每个虚拟通道读取10个样本。
在.NET中读取数据
读取NI-DAQmx .NET库需要使用读取器和流对象。该编程模式与.NET Framework读取文件和网络I/O的方式相似。
DaqStream 类包含与I/O相关的属性(如CurrentReadPosition)和获取原始I/O的方法。流属性用于获取某个指定任务相对应的DaqStream类例程。用户无法直接获得DaqStream类的例程。
为了在NI-DAQmx库中进行读取,需要创建一个读取器例程,并在构造器中传递DaqStream类的例程。然后调用读取器类上的方法来读取数据,代码如下所示:
analogInTask = new Task();
analogInTask.AIChannels.CreateVoltageChannel( ... );
//Create the reader and attach it to the stream
AnalogSingleChannelReader reader = new AnalogSingleChannelReader(analogInTask.Stream);
//Perform the read
double[] data = reader.ReadMultiSample(100);
在C/C++中读取数据
DAQmxReadAnalogF64()函数用于读取C或C++中的模拟输入任务的模拟数据。更多有关读取函数的信息,请查看”NI-DAQmx C参考帮助”。以下是使用该函数从单一通道中读取1000个采样的一个代码范例。
int numRead = 0;
DAQmxReadAnalogF64(taskHandle, 1000, 10.0, DAQmx_Val_GroupByScanNumber, data, 1000, &numRead, NULL);
练习范例:
LabVIEW | Acq One Sample.vi |
Read Dig Chan.vi | |
CVI | One Sample |
Read Dig Chan | |
.NET | AcqOneVoltageSample |
ReadDigChan |
8. NI-DAQmx 写入
库»NI-DAQmx»写入函数[CVI]
ChannelWriter类[.NET]
“NI-DAQmx写入”函数用于将样本写入指定的生成任务中。针对不同的函数例程可选择不同的生成类型(模拟或数字)、虚拟通道数量、采样数量和数据类型。“NI-DAQmx写入”函数将样本从应用程序开发环境(ADE)写入到PC缓存中。然后这些样本从PC缓存传输到DAQ板卡FIFO以进行生成。
每个“NI-DAQmx写入”函数的例程包含一个自动开始输入,用于在任务没有显式启动时判定该函数是否隐式启动任务。本文“NI-DAQmx开始任务”一节已介绍过,显式启动硬件定时的生成任务时应使用“NI-DAQmx开始任务”函数。如果需要多次执行“NI-DAQmx写入”函数,则还应使用该函数来使性能最优化。
在LabVIEW中写入数据
下图显示了四个不同NI-DAQmx Write VI例程的范例。
![](https://i-blog.csdnimg.cn/blog_migrate/d9a215ce164ab3e98fe127b2fce3ba55.gif)
下面的LabVIEW程序框图用于实现有限模拟输出生成,其中一个“False”布尔常量连接至NI-DAQmx Write VI的自动开始输出,这是由于该生成是硬件定时的。NI-DAQmx Write VI已进行配置,可将一个通道的多个模拟输入数据样本以模拟波形的形式写入任务。
![](https://i-blog.csdnimg.cn/blog_migrate/e8e9b749784c502a300c064fe58271cf.gif)
在.NET中写入数据
写入NI-DAQmx .NET库需要使用写入器和流对象。该过程与上述数据读取过程相似。
执行写入操作需要创建一个写入器例程,并在构造器中传递DaqStream类的例程。然后调用写入器类上的方法来写入数据,代码如下所示:
analogOutTask = new Task();
analogOutTask.AOChannels.CreateVoltageChannel( ... );
//Create the writer and attach it to the stream
AnalogSingleChannelWriter writer = new AnalogSingleChannelWriter(analogOutTask.Stream);//Perform the write
double[] data = writer.WriteMultiSample(100);
在C/C++中写入数据
DAQmxReadAnalogF64()函数用于写入模拟数据。更多关于写入其他数据形式的信息,请查看“NI-DAQmx C参考帮助”。以下是写入1000个模拟数据样本的代码片段。
int written = 0;
DAQmxWriteAnalogF64(taskHandle, 1000, 0, 10.0, DAQmx_Val_GroupByChannel, data, &written, NULL);
练习范例
LabVIEW | Gen Voltage Update.vi |
Write Dig Chan.vi | |
CVI | Volt Update |
Write Dig Chan | |
.NET | GenVoltageUpdate |
WriteDigChan |
9. NI-DAQmx 结束前等待
库»NI-DAQmx»任务配置/控制»结束前等待[CVI]
Task.WaitUntilDone方法[.NET]
“NI-DAQmx结束前等待”函数用于等待数据采集完毕后结束任务。该函数可确保指定的采集或生成完成后任务才停止。大多数情况下,“NI-DAQmx结束前等待”函数用于有限操作的情况。一旦该函数执行完毕,则表示有限采集或生成已完成,任务可在不影响操作的情况下停止。此外,超时输入可用于指定最长等待时间。如果采集或生成没有在该时间内完成,则函数将退出并生成一个相应错误。
在LabVIEW结束前等待
以下LabVIEW程序框图中的NI-DAQmx Wait Until Done VI用于确认有限模拟输出完成后才将任务清除。
![](https://i-blog.csdnimg.cn/blog_migrate/392a743373e355db70b37fbab3cd01db.gif)
在.NET中结束前等待
更多关于在.NET中使用该函数的信息,请查看随附的GenMultVoltUpdates_IntClk范例。
在C/C++中结束前等待
DAQmxWaitUntilTaskDone()函数用于等待直至缓存区的所有样本均生成完毕。该函数在写入或开始函数之后调用。
练习范例
LabVIEW | Gen Dig Pulse.vi |
Gen Mult Volt Updates-Int Clk.vi | |
CVI | Dig Pulse |
Mult Volt Updates-Int Clk | |
.NET | GenDigPulse |
GenMultVoltUpdates_IntClk |
10. NI-DAQmx任务清楚
库»NI-DAQmx»任务配置/控制»清除任务[CVI]
Task.Dispose方法[.NET]
NI-DAQmx任务清除函数用于清除指定的任务。如果任务正在运行,则函数将先停止任务,然后释放任务所有的资源。一旦任务被清除后,除非再次创建,否者该任务无法再使用。所以,如果需要再次使用任务,则应使用“NI-DAQmx停止任务”函数来停止任务,而不是将其清除。
对于连续操作,应使用“NI-DAQmx任务清除”函数来停止实际的采集或生成。
在LabVIEW中清除任务
在下面的LabVIEW程序框图中,连续脉冲序列通过计数器来生成。脉冲序列将连续输出直至退出While循环,然后开始执行NI-DAQmx Clear Task VI。
![](https://i-blog.csdnimg.cn/blog_migrate/f935f010811aea29124c7ae2e1e9019b.gif)
在.NET中清除任务
任务完成读取或写入后,只需调用Task.Dispose方法就完成了。
在C/C++中清除任务
任务完成读取或写入后,使用DAQmxClearTask()函数。
练习范例
LabVIEW | Cont Gen Voltage Wfm-Int Clk.vi |
Count Digital Events.vi | |
CVI | Cont Gen Volt Wfm-Int Clk |
Cnt Dig Events | |
.NET | ContGenVoltageWfm_IntClk |
CountDigEvents |
11. NI-DAQmx属性
属性[CVI]
属性[.NET]
通过“NI-DAQmx属性”可以访问与数据采集操作相关的的所有属性。这些属性可通过“NI-DAQmx属性”写入来进行设置,并且当前的属性值也可以通过“NI-DAQmx属性”读取。
前面我们已讨论过,许多属性可使用NI-DAQmx函数进行设置。比如,采样时钟源和采样时钟工作沿属性可通过“NI-DAQmx定时”函数进行设置。然而,一些较少使用的属性只能通过“NI-DAQmx属性”来进行设置。
在LabVIEW中使用属性(属性节点)
在LabVIEW中,一个“NI-DAQmx属性节点”可用于写入或读取多个属性。例如,下面的“LabVIEW NI-DAQmx定时属性节点”先设置了采样时钟源,然后读取采样时钟源,最后设置采样时钟工作沿。
![](https://i-blog.csdnimg.cn/blog_migrate/4b37850552192b5fa5bc35a230e1546e.gif)
在下面的LabVIEW程序框图中,“NI-DAQmx通道属性节点”用于启用硬件低通滤波器,然后设置了滤波器的截止频率以便进行应变计测量。
在.NET中使用属性
我们在“定时”部分已介绍过,许多属性是通过任务对象内部的子类和集合进行设置。以下代码片段是NI-DAQmx属性使用的一个常见范例。
//Create a new NI-DAQmx Task
Task t = new Task();
//Access the subobject properties of the Task class
t.Timing.SamplesPerChannel = 1000;
在C/C++中使用属性
为了获取或设置任务的不同属性,每一个属性都有其相应的获取和设置函数。如需了解更多信息,可在“NI-DAQmx C属性”下的““NI-DAQmx C参考帮助””中查看属性列表及其功能。
练习范例
LabVIEW | Cont Acq Strain Samples.vi |
Cont Acq Accel Samples-Int Clk-Analog Start.vi | |
CVI | Cont Strain Samples |
Cont Accel Samps-Int Clk-Anlg Start | |
.NET | AcqStrainSamples |
ContAcqAccelSamp_IntClk_AnalogStart |
12. 结论
NI-DAQmx可通过多种方式来帮助用户节省开发时间并提高数据采集应用的性能,其中一种方式是提供仅需使用少量函数却可实现大部分功能的API。事实上,用户只需学习本文介绍的10个函数,便可解决80%的数据采集应用问题。