You need to enable JavaScript to run this app. Plotly-Dash集成nidaqmx时出现name 'task'未定义报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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    

连续实时采集适配方案

如果你需要开关打开后持续采集数据并刷新前端,需要将任务设置为全局变量,同时做以下调整:

  1. 全局位置声明任务变量:task = None
  2. 启动服务时关闭重载机制,避免Debug模式下重复创建任务:
if __name__ == '__main__':
    app.run_server(port=3040, debug=True, use_reloader=False)
  1. 回调中判断任务状态,开关打开时初始化任务、持续读取数据,开关关闭时销毁任务释放资源。

内容的提问来源于stack exchange,提问作者Eduardo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 05:54:04