Plotly-Dash集成nidaqmx时出现name 'task'未定义报错如何解决
问题解决方案
错误根因
你遇到的name 'task'未定义报错和Dash、nidaqmx的兼容性无关,属于基础的变量未实例化问题。你单独运行nidaqmx采集代码时会先创建NI采集任务实例,合并代码时遗漏了这一步骤。
适配当前代码的修复方案
你当前的逻辑是点击开关后执行单次采集,最稳妥的方案是每次触发采集时新建任务,采集完成后自动释放资源,不需要修改全局逻辑,只需要调整update_output回调函数的内容:
def update_output(on, value_1, value_2): if on is True: sample_rate = float(value_1) # 这里原来转成float会报错,nidaqmx要求采样点数为整数 samples_to_acq = int(value_2) wait_time = samples_to_acq/sample_rate channel_name = 'cDAQBAYO1Mod1/ai0' cont_mode = AcquisitionType.CONTINUOUS units_g = nidaqmx.constants.AccelUnits.G # 新增:用上下文管理器创建任务,执行完自动释放资源 with nidaqmx.Task() as task: task.ai_channels.add_ai_accel_chan(channel_name, units = units_g) task.timing.cfg_samp_clk_timing(sample_rate, sample_mode = cont_mode, samps_per_chan=samples_to_acq) ydata = task.read(number_of_samples_per_channel=samples_to_acq) xdata = np.linspace(0, wait_time,samples_to_acq) trace_1 = go.Scatter( x = list(xdata), y = list(ydata) ) layout = go.Layout(title = 'Oscilograma') fig = go.Figure(data = [trace_1], layout = layout) return (fig) else: raise PreventUpdate
连续实时采集适配方案
如果你需要开关打开后持续采集数据并刷新前端,需要将任务设置为全局变量,同时做以下调整:
- 全局位置声明任务变量:
task = None - 启动服务时关闭重载机制,避免Debug模式下重复创建任务:
if __name__ == '__main__': app.run_server(port=3040, debug=True, use_reloader=False)
- 回调中判断任务状态,开关打开时初始化任务、持续读取数据,开关关闭时销毁任务释放资源。
内容的提问来源于stack exchange,提问作者Eduardo
相关产品推荐
相关产品推荐

