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

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

Task.Channel.CreateChannel Property [.NET]

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

在.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
);

练习​范​例:

.NETWriteDigPort
ContAcqThermocoupleSamples_IntClk

NI-​DAQmx​触发

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

 在.NET​中​创建​触发

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

analogInTask = new Task();

DigitalEdgeStartTriggerEdge triggerEdge = DigitalEdgeStartTriggerEdge.Rising;

analogInTask.AIChannels.CreateVoltageChannel( ... );

analogInTask.Triggers.StartTrigger.ConfigureDigitalEdgeTrigger("PFI0", triggerEdge);

基于​发送​至​ConfigureDigitalEdgeTrigger​函数​的​参数,​设备​会​根据​内部​或​外部​的​触发​线​判断​是否​存在​上升​或​下降​数字​边沿,​然后​再​开始​采集​数据。 上面​的​程序​代码​用于​将​设备​配置​为​根据​PFI 0​判断​上升​数字​边沿​触发。

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

练习​范​例:

.NETAcqVoltageSamples_IntClkDigStartAndRef
ContAcqVoltageSamples_IntClkAnalogStart

NI-​DAQmx​定​时

Task.Timing Property [.NET]

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

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

 在.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

);

某些​数据​采集​设备​针对​数字​I/​O​操作​采用​的是​握手​定​时​模式。 握手​协议​通过​与​外部​设备​进行​定​时​信号​的​请求​和​确认​交互​来​传输​样本。 “NI-​DAQmx​定​时”函数的握手实例​可​用于​为​数字​I/​O​操作​配置​握手​定​时​模式。

练习​范​例:

.NETContGenVoltageWfm_ExtClk
MeasBuffered_SemiPeriodFinite

NI-​DAQmx​开始​任务

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

 在.NET​中​开始​任务

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

analogInTask = new Task();

analogInTask.AIChannels.CreateVoltageChannel( ... );

analogInTask.Timing.ConfigureSampleClock( ... );

analogInTask.Start();

练习​范​例:

.NETGenDigPulseTrain_Continuous
ContAcq0_20mACurrentSamples_IntClk

NI-​DAQmx​读​取

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

 在.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);

练习​范​例:

.NETAcqOneVoltageSample
ReadDigChan

NI-​DAQmx​写​入

ChannelWriter Class [.NET]

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

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

 在.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);

练习​范​例:

.NETGenVoltageUpdate
WriteDigChan

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

Task.WaitUntilDone Method [.NET]

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

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

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

练习​范​例:

.NETGenDigPulse
GenMultVoltUpdates_IntClk

NI-​DAQmx​清除​任务


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

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

 在.NET​中​清除​任务

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

练习​范​例:

.NETContGenVoltageWfm_IntClk
CountDigEvents

NI-​DAQmx​属性

Property [.NET]

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

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

练习​范​例:

.NETAcqStrainSamples
ContAcqAccelSamp_IntClk_AnalogStart

结语

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值