回调:DAQmxRegisterDoneEvent()和DAQmxEveryNSamplesEvent之间的差异

时间:2019-08-15 18:15:20

标签: callback nidaqmx

试图弄清楚如何专门调用回调包装器。我们的代码处理slowTaskonTask。在slowTask期间,我处理以下两行(特定于此问题):

DAQmxCfgSampClkTiming(slowTask, "OnboardClock", GUI_RATE,
      DAQmx_Val_Rising, DAQmx_Val_ContSamps, 1);
DAQmxRegisterEveryNSamplesEvent(slowTask, DAQmx_Val_Acquired_Into_Buffer, 1,
      0, EveryNCallbackWrapper, this);

我知道在这里,每当缓冲区充满一个样本时,就会调用EveryNCallbackWrapper

对于onTask,我很难理解回调如何被调用。我查阅了NI文档,但听不懂。

DAQmxCfgSampClkTiming(onTask, "OnboardClock", ON_RATE, DAQmx_Val_Rising,
     DAQmx_Val_FiniteSamps, 100);
DAQmxRegisterDoneEvent(onTask, 0, DoneCallbackWrapper, this);

这个让我更加困惑。我相信,每当触发onTask(使用硬件触发器)时,DAQ就会以ON_RATE采样/秒的速率开始对模拟测量值进行数字化处理,一旦将100个采样采样/读取到DAQ缓冲区中,就会调用DoneCallbackWrapper()。根据此硬件触发信号保持高电平的时间长短,每当DAQ读取100个样本(触发信号为高电平)时,将调用该包装器?或者在读取100个样本之后,仅调用一次回调?

1 个答案:

答案 0 :(得分:1)

  

读取100个样本后,仅调用一次回调

由于slowTask使用DAQmx_Val_ContSamps,因此该程序要求进行一次无限(又称连续)采集,并将数据流式传输到主机。使用EveryNSamples回调程序可以使程序访问和处理设备发送的最新数据。

由于onTask使用DAQmx_Val_FiniteSamps,因此程序要求单个采集100个样本。使用Done事件可以使程序访问并处理完整的采集和完整的采集。

在您的评论更新中,程序使用

DAQmxCfgDigEdgeStartTrig(onTask, "/PXI2Slot4/PXI_Trig0", DAQmx_Val_Rising));

onTask配置digital edge start trigger。当该触发线具有上升沿时,onTask采集开始,捕获100个样本,停止并调用回调。

如果程序需要在{{1}的每个上升沿获取onTask的100个样本,则可以在NI 63xx系列设备上使用retriggerable property允许同一任务执行re-run for each trigger event

更多详细信息在X Series User Manual中:

  

AI启动触发器也可配置为可重新触发。定时引擎会响应AI启动触发信号上的每个脉冲,生成样本并转换时钟以进行配置的采集。

     

在时钟生成过程中,计时引擎会忽略AI启动触发信号。时钟生成完成后,计数器等待另一个启动触发器开始另一个时钟生成。图4-22显示了具有三个AI通道和每个触发器四个采样的可重触发模拟输入

     

illustration of retriggerable analog input signals