3

在尝试使用 Python nidaqmx 包 0.5.7 版停止(和/或关闭)nidaqmx 任务时,我经常遇到分段错误。有一次我收到“非法指令”错误。

任何人都可以看到代码有问题吗?有人遇到过这个问题吗?是否有解决方案,或者您是否需要使用 NI 产品以外的其他产品?

代码片段位于子例程中,并以指示的时钟频率触发脉冲激光,同时相机抓取帧并且电机移动样本。

self.current_task = nidaqmx.Task('lissajous')
self.current_task.ao_channels.add_ao_voltage_chan(self.x_channel)
self.current_task.ao_channels.add_ao_voltage_chan(self.y_channel)
self.current_task.ao_channels.add_ao_voltage_chan(self.aom_channel)
self.current_task.timing.cfg_samp_clk_timing(rate=pulse_rate_clock, sample_mode=nidaqmx.constants.AcquisitionType.CONTINUOUS, samps_per_chan=len(x))
self.current_task.export_signals.export_signal(signal_id=nidaqmx.constants.Signal.SAMPLE_CLOCK,output_terminal="PFI1")
self.current_task.write(data, auto_start=False)
self.current_task.start()

调用函数让上述任务在从相机抓取帧的同时运行,平均每帧中有数百个激光脉冲。经过指定量的电机运动后,相机停止并调用下面的 stop_scan_pattern 子例程来停止任务并(希望)释放内存(del 调用似乎也没有帮助,所以它被注释掉了) :

def stop_scan_pattern(self):
    # stop the NIDAQmx task, release resources, clear it
    # then explicitly do away with our task object
    if self.current_task:
        self.current_task.stop()
        self.current_task.wait_until_done()
        self.current_task.close()   # stop, release, clear in DLL
        #del self.current_task       # attempt to force a cleanup
    else:
        print('No scan task to stop!')

间歇性地,但过于频繁地,我遇到了分段错误。我正在使用故障处理程序,它将问题归咎于 NI 包中 task.py 中的 stop() 方法。有时它归咎于 close(),所以我们添加了 wait_until_done() 方法来解决这个问题,现在它似乎发生在第一个 close() 中,甚至没有进入 wait_until_done()。

大约 100 个周期后会发生故障,对于基本上相同类型的操作,似乎有些日子显然很糟糕,而有些日子则没有问题。

我正在使用 USB-6343 DAQ 在 Windows 10 上运行 Python 3.6.8,nidaqmx 模块 0.5.7,VS Code 1.46.1。

任何帮助将不胜感激!

4

0 回答 0