学会​NI-​DAQmx10​个​函数,​解决​80%​的​数据​采集​应用​问题

内容

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%​的​数据​采集​应用​问题​的​功能。 下面​将​详细​介绍​这些​函数,​帮助​用户​理解​其​功能​及其​所​适用​的​应用​类型。

注意: 本文​档​所​引用​的​范​例​可​通过​下列​文​档​的​位置​介绍​找到: Windows​中​适用​于​LabVIEW​及​文本​编​程​语言​的​NI-​DAQmx​范​例​位置

DAQ​助手

Tools»Create/​Edit DAQmx Tasks [CVI]
Project»Add New Item»DAQmx Task [.NET]






 

DAQ​助手​可​通过​图形​化​界面​让​用户​交互​式​地​创建、​编辑、​运行​NI-​DAQmx​虚拟​通道​和​任务。 NI-​DAQmx​虚拟​通道​包含​DAQ​设备​上​的​一个​物理​通道​以及​该​物理​通道​的​配置​信息,​比如​输入​范围​和​自​定义​缩​放。 NI-​DAQmx​任务​就是​一个​包含​虚拟​通道、​定​时、​触发​信息、​以及​其他​与​采集​和​生成​相关​的​属性​的​集合。 下​图​显示​了​如何​配置​DAQ​助手​来​实现​有限​应变​测量。

 


下列​文​档​描述​了​DAQ​助手​在​LabVIEW、​LabWindows/​CVI​以及.NET​中的​应用:

NI-​DAQmx Express VI​指南
在​LabWindows/​CVI​中​使用​DAQ​助手
在​Measurement Studio​中​使用​DAQ​助手

DAQ​助手​还​可​生成​代码,​用于​配置​和/​或​执行​指定​的​采集​或​生成。 DAQ​助手​帮助使用​DAQ​助手​自动​生成​LabVIEW​代码文​档​均​描述​了​在​LabVIEW​中​实现​该​操作​的​步骤。 下​图​显示​的是​DAQ​助手​一个​实例​及其​自动​生成​的​配置​和​LabVIEW​代码​范​例。


DAQ​助手​提供​的​灵活​性​和/​或​性能​有时​无法​满足​某些​数据​采集​应用。 这些​应用​可能​需要​以下​简单​但​强大​的​NI-​DAQmx​函数。

 


NI-​DAQmx​创建​虚拟​通道



Library»NI-​DAQmx»Channel Creation/​Configuration [CVI]

Task.Channel.CreateChannel Property [.NET]








“NI-​DAQmx​创建​虚拟​通道”函数​可​创建​一个​虚拟​通道​并​将​其​添加​至​任务, 也​可​用于​创建​多个​虚拟​通道​并​将​其​全部​添加​至​任务。 如​未​指定​任务,​该​函数​将​自动​创建​一个​任务。 “NI-​DAQmx​创建​虚拟​通道”函数​包含​多个​实例, 这些​实例​对应​虚拟​通道​执行​的​具体​测量​或​生成​类型。

在​LabVIEW​中​创建​通道

下​图​显示​的是“NI-​DAQmx​创建​虚拟​通道”VI​四​个​不同​实例​的​范​例。


​“NI-​DAQmx​创建​虚拟​通道”函数​不同​实例​的​输入​端​各不相同, 但​某些​输入​对于​大部分​(即使​不是​全部)​函数​实例​都是​通用​的。 例如,​指定​虚拟​通道​使用的物理​通道(模拟​输入​和​模拟​输出)、线路(数字)或计数器需要​同​一个​输入。 此外,​模拟​输入、​模拟​输出​和​计数​器​操作​根据​信号​的​最小​和​最大​预​估​值​使用最小值最大值输入​来​配置​和​优​化​测量​和​生成。 此外,​多种​类型​的​虚拟​通道​可​进行自​定义​扩展。 下列​LabVIEW​程序​框​图​中,“NI-​DAQmx​创建​虚拟​通道”VI​用于​创建​热电​偶​虚拟​通道。

 

在.NET​中​创建​通道

大部分​NI-​DAQmx .NET​库​中的​类​无法​直接​被​初始​化, 这些​类​被​用作 类​的​子​对象。

这些​类​包含​了​某​个​特定​通道​类型​的​专用​属性。 例如:计数器等​属性​只​适用​于​计数​器,​且​只能在CIChannelCIChannel类​中​找到。 用户​可在​NI-​DAQmx .NET​类​库​中将​下列​通道​类型​与​某​个 关联​起来:

模拟​输入​通道​— 类

模拟​输出​通道​— 类

数字​输入​通道​— 类

数字​输出​通道​— 类

计数​器​输入​通道​— 类

计数​器​输出​通道​— 类

任务类​包含​一个​适用​于​六种​通道​类型​的​通道​集合​属性: 、 、 、 、 和 。 用户​可​使用​通道​集合​中​任意​一种​创建​通道​的​方法​创建​通道。

建立​了​一个​新的“任务”对象​后,​通过​调​用“通道”类​中​相应​的​成员​函数​即可​创建​和​分配​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 Reference Help。 以下​程序​片段​是​这​两​个​函数​的​应用​范​例。

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 Digital - Finite Output.vi
Thermocouple - Continuous Input.vi
CVI Write Dig Port
Cont Thrmcpl Samples-​Int Clk
.NET WriteDigPort
ContAcqThermocoupleSamples_IntClk

 

NI-​DAQmx​触发


Library»NI-​DAQmx»Triggering [CVI]

Task.Triggers Property [.NET]

 

“NI-​DAQmx​触发”函数​可​用于​对​触发​进行​配置​来​执行​指定​操作。 常用​的​操作是开始​触发参考​触发。 开始​触发​用于​启动​采集​或​生成, 参考​触发​则​用于​在​一​组​采集​样本​中​创建​预​触发​数据​结束​后​和​后​触发​数据​开始​前​的​位置。 可​对​这​两​个​触发​进行​配置,​使​其​发生​在​数字​边沿、​模拟​边沿、​或​模拟​信号​进入​或​离开​窗口​时。

在​LabVIEW​中​创建​触发

在​下面​的​LabVIEW​程序​框​图​中,​开始​触发​和​参考​触发​均已​通过“NI-​DAQmx​触发”VI​进行​配置,​可​发生​在​数字​边沿​上来​进行​模拟​输入​操作。


​许多​数据​采集​应用​程序​需要​在​一个​设备​上​实现​不同​功能​区域​的​同步​(例如,​模拟​输出​和​计数​器), 而​其他​的​程序​也​需要​在​多个​设备​之间​实现​同步。 为了​实现​这些​同步,​触发​信号​必须​在​单​个​设备​的​不同​功能​区域​间​或​在​不同​的​设备​间​进行​路​由。 NI-​DAQmx​则​可​自动​执行​这些​路​由。 使用“NI-​DAQmx​触发”函数​时,​所有​有效​的​触发​信号​均可​作为输入​到​函数​中。 例如,​在​下面​的“NI-​DAQmx​触发”VI​中,​设备​2​的​开始​触发​信号​可用​作​设备​1​的​开始​触发​源,​而无​需​进行​任何​显​式​路​由。

 

在.NET​中​创建​触发

创建“任务”对象​和“通道”后,​用户​可以​调​用“任务.​触发”集合​中的​方法​将​触发​添加​至​任务​中。 以下​程序​代码​显示​了​创建“数字​边沿​开始​触发”:

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 Reference Help。 以下​程序​代码​显示​了​如何​使用​该​函数​从​PFI0​接收​数字​开始​触发​信号​并​在​该​线路​中​寻找​上升​边沿。

char        startTrigger[256] = "Dev1/​PFI0";
int         startEdge = 0; // rising edge

DAQmxCreateTask("",&taskHandle));

DAQmxCreateAIVoltageChan(taskHandle, chan, "", DAQmx_Val_Cfg_Default, min, max, DAQmx_Val_Volts, NULL);

DAQmxCfgDigEdgeStartTrig(taskHandle, startTrigger, startEdge);
 

 

NI-​DAQmx​的​定​时​和​同步​特性文​档​中​介绍​了​更多​关于​借助​NI-​DAQmx​使用“NI-​DAQmx​触发”函数​来​实现​同步​的​信息。

练习​范​例:

LabVIEW Voltage - Finite Input.vi
Voltage - Continuous Input.vi
CVI Acq-​Int Clk-​Dig Start&Ref
Cont Acq-​Int Clk-​Anlg Start
.NET AcqVoltageSamples_IntClkDigStartAndRef
ContAcqVoltageSamples_IntClkAnalogStart

 

NI-​DAQmx​定​时


Library»NI-​DAQmx»Timing [CVI]

Task.Timing Property [.NET]







​“NI-​DAQmx​定​时”函数​用于​对​硬件​定​时​的​数据​采集​操作​进行​定​时​配置, 包括​指定​操作​是​连续​执行​还是​有限​执行、​选择​采集​或​生成​的​样本​数量​以​进行​有限​操作、​以及​需要​时​创建​缓冲​区。

​对于​需要​采样​定​时​(模拟​输入、​模拟​输出​和​计数​器)​的​操作,“NI-​DAQmx​定​时”函数的采样​时钟实例​可​用于​设置​采样​时钟​源​和​采样​速率,​采样​时钟​源​可以​是​内部​也可以​是​外部​的​信号​源。 采样​时钟​能够​控制​采集​或​生成​样本​的​速率。 每​个​时钟​脉冲​将​启动​任务​中​每​个​虚拟​通道​的​样本​采集​或​生成。

 

在​LabVIEW​中​配置​任务​定时


​下面​的​LabVIEW​程序​框​图​显示​的是​如何​使用“NI-​DAQmx​定​时”VI​的“采样​时钟”实例​来​配置​使用​外部​采样​时钟​的​连续​模拟​输出​生成。


​为了​实现​数据​采集​程序​间​的​同步,​定​时​信号​必须​以​与​触发​信号​同样​的​方式​在​一个​设备​的​不同​功能​区域​间​或​在​多个​设备​间​进行​路​由。 NI-​DAQmx​可​自动​完成​这些​路​由。 所有​有效​的​定​时​信号​都可​作为“NI-​DAQmx​定​时”函数的输入。 例如,​在​以下“DAQmx​定​时”VI​中,​设备​的​模拟​输出​采样​时钟​信号​可用​作​模拟​输入​通道​采样​时钟​的​信号​源,​而无​需​进行​任何​显​式​路​由。


NI-​DAQmx​的​定​时​和​同步​特性文​档​中​介绍​了​更多​关于​借助​NI-​DAQmx​使用“NI-​DAQmx​定​时”函数​来​实现​同步​的​信息。

​由于​所​测​信号​可​提供​定​时,​因此​大​多数​计数​器​操作​都​不需要​采样​定​时。 这些​应用​应​使用“NI-​DAQmx​定​时”函数的隐式实例。 在​以下​LabVIEW​程序​框​图​中,“NI-​DAQmx​定​时”VI​的​隐​式​实例​用于​以​指定​的​采样​数量​将​缓冲​脉冲​宽度​采集​配置​为​有限​值。


在.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 Voltage - Continuous Output.vi
Counter - Read Pulse Width and Frequency (Finite).vi
CVI Cont Gen Volt Wfm-​Ext Clk
Buff Semi-​Period-​Finite
.NET ContGenVoltageWfm_ExtClk
MeasBuffered_SemiPeriodFinite

 

NI-​DAQmx​开始​任务


Library»NI-​DAQmx»Task Configuration/​Control»Start Task [CVI]

Task.Start Method [.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​开始​任务”函数​的​详细​信息,​请​查看何时​使用“DAQmx​开始​任务”和“DAQmx​停止​任务”VI

 

在​LabVIEW​中​开始​任务

以下​LabVIEW​程序​框​图​显示​的是​模拟​输出​生成​仅​包含​单​个​软件​定​时​的​采样​而无​需​使用“NI-​DAQmx​开始”函数​的​情况。


​相反,​下面​的​LabVIEW​程序​框​图​显示​的是​多次​执行“NI-​DAQmx​读​取”函数​从​计数​器​读​取​数据​而​必须​使用“NI-​DAQmx​开始”函数​的​情况。

 

在.NET​中​开始​任务

Start()​函数​用于​在“任务”对象​中​开始​任务。 下面​的​代码​是​Start()​函数​的​一个​使用​范​例。

analogInTask = new Task();

analogInTask.AIChannels.CreateVoltageChannel( ... );

analogInTask.Timing.ConfigureSampleClock( ... );

analogInTask.Start();

 

在​C/​C​+​+中​开始​任务

DAQmxStartTask()​函数​可​用于​开始​任务, 该​函数​的​一个​应用​代码​范​例如​下。

DAQmxStartTask(taskHandle);

 

练习​范​例:

LabVIEW Counter - Continuous Output.vi
Current - Continuous Input.vi
CVI Dig Pulse Train-​Cont
Cont 0-20mA Samps-​Int Clk
.NET GenDigPulseTrain_Continuous
ContAcq0_20mACurrentSamples_IntClk

 

NI-​DAQmx​读​取


Library»NI-​DAQmx»Read Functions [CVI]

ChannelReader Class [.NET]



“NI-​DAQmx​读​取”函数​可​从​指定​的​采集​任务​中​读​取​样本。 针对​不同​的​函数​实例​可​选择​不同​的​采集​类型​(模拟、​数字、​或​计数​器)、​虚拟​通道​数量、​采样​数量​和​数据​类型。 指定​的​采样​数量​从​DAQ​板​卡​上​的​FIFO​传输​到​RAM​中的​PC​缓​存​后,“NI-​DAQmx​读​取”函数​再​将​样本​从​PC​缓​存​转移​到​应用​程序​开发​环境​(ADE)​内存​中。

在​LabVIEW​中​读​取​数据

下​图​显示​的是​四​个​不同 “NI-​DAQmx​读​取”VI​实例​的​范​例。


​可读​取​多个​采样​的“NI-​DAQmx​读​取”函数​实例​包括​一个​用于​指定​函数​执行时每​通道​采样数的​输入。 对于​有限​采集,将每​通道​采样数指定​为-1,​函数​将​等待​所有​请求​的​样本​采集​完毕,​然后​再​对​这些​样本​进行​读​取。 对于​连续​采集,​如果将每​通道​采样数指定​为-1,​则​函数​执行​时​将​读​取​当前​缓​存​区​中的​所有​样本。 在​以下​LabVIEW​程序​框​图​中,“NI-​DAQmx​读​取”VI​已​进行​配置,​可​从​多个​模拟​输入​虚拟​通道​读​取​多个​采样,​然后​将​数据​以​波形​的​方式​返回。 而且,​由于每​通道​采样数输入​已​设置​为​常数​10,​每次​执行​VI​时​将​从​每​个​虚拟​通道​读​取​10​个​样本。

 

在.NET​中​读​取​数据

读​取​NI-​DAQmx .NET​库​需要​使用​读​取​器​和​流​对象。 该​编​程​模式​与.NET Framework​读​取​文件​和​网络​I/​O​的​方式​相似。

类​包含​与​I/​O​相关​的​属性​(如 )​和​获取​原始​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 Reference Help。 以下​是​使用​该​函数​从​单​个​通道​中​读​取​1000​个​采样​的​代码​范​例。

int numRead = 0;

DAQmxReadAnalogF64(taskHandle, 1000, 10.0, DAQmx_Val_GroupByScanNumber, data, 1000, &numRead, NULL);

 

练习​范​例:

LabVIEW Voltage - SW-​Timed Input.vi
Digital - Finite Input.vi
CVI One Sample
Read Dig Chan
.NET AcqOneVoltageSample
ReadDigChan

 

NI-​DAQmx​写​入


Library»NI-​DAQmx»Write Functions [CVI]

ChannelWriter Class [.NET]





“NI-​DAQmx​写​入”函数​用于​将​样本​写​入​指定​的​生成​任务​中。 针对​不同​的​函数​例​程​可​选择​不同​的​生成​类型​(模拟​或​数字)、​虚拟​通道​数量、​采样​数量​和​数据​类型。 “NI-​DAQmx​写​入”函数​将​样本​从​应用​程序​开发​环境​(ADE)​写​入​到​PC​缓​存​中。 然后​这些​样本​从​PC​缓​存​传输​到​DAQ​板​卡​FIFO​以​进行​生成。

每​个“NI-​DAQmx​写​入”函数​的​实例​包含​一个​自动​开始​输入,​用于​在​任务​没有​显​式​启动​时​判定​该​函数​是否​隐​式​启动​任务。 本文“NI-​DAQmx​开始​任务”一节​已​介绍​过,​显​式​启动​硬件​定​时​的​生成​任务​时​应​使用“NI-​DAQmx​开始​任务”函数。 如果​需要​多次​执行“NI-​DAQmx​写​入”函数,​则​还​应​使用​该​函数​来​使​性能​最优​化。

在​LabVIEW​中​写​入​数据

下​图​显示​的是​四​个​不同 “NI-​DAQmx​写​入”VI​实例​的​范​例。


​下面​的​LabVIEW​程序​框​图​用于​实现​有限​模拟​输出​生成,​其中​一个"False"布​尔​常量​连接​至“NI-​DAQmx​写​入”VI​的​自动​开始​输出,​这​是​由于​该​生成​是​硬件​定​时​的。 “NI-​DAQmx​写​入”VI​已​进行​配置,​可​将​一个​通道​的​多个​模拟​输入​数据​样本​以​模拟​波形​的​形式​写​入​任务。


在.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 Reference Help。 以下​是​写​入​1000​个​模拟​数据​样本​的​代码​片段。

int written = 0;

DAQmxWriteAnalogF64(taskHandle, 1000, 0, 10.0, DAQmx_Val_GroupByChannel, data, &written, NULL);

 

练习​范​例:

LabVIEW Voltage - Finite Output.vi
Digital - Finite Output.vi
CVI Volt Update
Write Dig Chan
.NET GenVoltageUpdate
WriteDigChan

 

NI-​DAQmx​结束​前​等待


Library»NI-​DAQmx»Task Configuration/​Control»Wait Until Task Done [CVI]

Task.WaitUntilDone Method [.NET]



“NI-​DAQmx​结束​前​等待”函数​用于​等待​数据​采集​完毕​后​结束​任务。 该​函数​可​用于​确保​停止​任务​前​已​完成​指定​的​采集​或​生成。 一般​情况​下,“NI-​DAQmx​结束​前​等待”函数​用于​有限​操作。 一旦​该​函数​执行​完毕,​则​表示​有限​采集​或​生成​已​完成,​任务​可在​不​影响​操作​的​情况​下​停止。 此外,超时输入​可​用于​指定​最长​等待​时间。 如果​采集​或​生成​没有​在​该​时间​内​完成,​则​函数​将​退出​并​生成​一个​相应​错误。

在​LabVIEW​结束​前​等待

以下​LabVIEW​程序​框​图​中的“NI-​DAQmx​结束​前​等待”VI​用于​确认​有限​数字​输出​完成后​才将​任务​清除。


在.NET​中​结束​前​等待

更多​关于​在.NET​中​使用​该​函数​的​信息,​请​查看​随​附​的​GenMultVoltUpdates_IntClk​范​例。

在​C/​C​+​+中​结束​前​等待

DAQmxWaitUntilTaskDone()​函数​用于​等待​直至​缓​存​区​的​所有​样本​均​生成​完毕。 该​函数​在​写​入​或​开始​函数​之后​调​用。

 

练习​范​例:

LabVIEW Digital - Finite Output.vi
Voltage - Finite Output.vi
CVI Dig Pulse
Mult Volt Updates-​Int Clk
.NET GenDigPulse
GenMultVoltUpdates_IntClk

 

NI-​DAQmx​清除​任务


Library»NI-​DAQmx»Task Configuration/​Control»Clear Task [CVI]

Task.Dispose Method [.NET]


 

“NI-​DAQmx​清除​任务”函数​用于​清除​指定​的​任务。 如果​任务​正在​运行,​则​函数​将​先​停止​任务,​然后​释放​任务​所有​的​资源。 一旦​任务​被​清除​后,​除非​再次​创建,​否​者​该​任务​无法​再​使用。 因此,​如果​需要​再次​使用​任务,​则​应​使用“NI-​DAQmx​停止​任务”函数​来​停止​任务,​而不是​将​其​清除。

对于​连续​操作,​应​使用“NI-​DAQmx​清除​任务”函数​来​停止​实际​的​采集​或​生成。

在​LabVIEW​中​清除​任务

在​下面​的​LabVIEW​程序​框​图​中,​连续​脉冲​序列​通过​计数​器​来​生成。 脉冲​序列​将​连续​输出​直至​退出​While​循环,​然后​开始​执行“NI-​DAQmx​清除​任务”VI。


在.NET​中​清除​任务

任务​完成​读​取​或​写​入​后,​调​用​Task.Dispose​方法​即可​清除​任务。

在​C/​C​+​+中​清除​任务

任务​完成​读​取​或​写​入​后,​使用​DAQmxClearTask()​函数​即可​清除​任务。

练习​范​例:

LabVIEW Voltage - Continuous Output.vi
Counter - Count Edges (Continuous Clock).vi
CVI Cont Gen Volt Wfm-​Int Clk
Cnt Dig Events
.NET ContGenVoltageWfm_IntClk
CountDigEvents

 

NI-​DAQmx​属性

Attribute [CVI]

Property [.NET]

通过“NI-​DAQmx​属性”可以​访问​与​数据​采集​操作​相关​的​的​所有​属性。 这些​属性​可​通过“NI-​DAQmx​属性”写​入来​进行​设置,​当前​的​属性​值​也可以​通过“NI-​DAQmx​属性”读​取。

前面​我们​已​讨论​过,​许多​属性​可​使用​NI-​DAQmx​函数​进行​设置。 比如,采样​时钟源采样​时钟​有效​边沿属性​可​通过“NI-​DAQmx​定​时”函数​进行​设置。 然而,​一些​较​少​使用​的​属性​只能​通过“NI-​DAQmx​属性”来​进行​设置。

在​LabVIEW​中​使用​属性​(属性​节点)

在​LabVIEW​中,​一个“NI-​DAQmx​属性​节点”可​用于​写​入​和/​读​取​多个​属性。 例如,​下面​的“LabVIEW NI-​DAQmx​定​时​属性​节点”先​设置​了​采样​时钟​源, 然后​读​取​采样​时钟​源, 最后​设置​采样​时钟​的​有效​边沿。


​在​下面​的​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 Reference Help 下​的​NI-​DAQmx C Reference Help​中​查看​属性​列表​及其​功能。

练习​范​例:

LabVIEW Strain - Continuous Input.vi
Thermocouple (with OTCD) - Continuous Input.vi
CVI Cont Strain Samples
Cont Accel Samps-​Int Clk-​Anlg Start
.NET AcqStrainSamples
ContAcqAccelSamp_IntClk_AnalogStart

 

结语

NI-​DAQmx​可​通过​多种​方式​来​帮助​用户​节省​开发​时间​并​提高​数据​采集​应用​的​性能, 其中​一种​方式​是​提供​仅​需​使用​少量​函数​却​可​实现​大部分​功能​的​API。 事实​上,​用户​只需​学习​本文​介绍​的​10​个​函数,​便可​解决​80%​的​数据​采集​应用​问题。

Was this information helpful?

Yes

No