1

我正在尝试编写一个利用 NI-DAQmx 的 python 包装器的 API,并且需要有一个可以跨模块编辑的任务的全局列表。

这是我到目前为止所尝试的:

1) 创建了一个可导入的任务字典,每当调用 ni-daqmx 时都会更新该字典。函数端点处理来自 HTTPS 请求的数据,我保证它不仅仅是 ni-daqmx 库本身的无意义包装器。

例如,在启动时,会创建以下内容:

#./daq/__init.py__
import nidaqmx
# ... other stuff ...#
TASKS = {}

然后,用户可以通过调用此端点来创建任务

#./daq/task/task.py
from daq import TASKS

# ... 

def api_create_task_endpoint(task_id):
    try:
        task = nidaqmx.Task(new_task_name=task_id)
        TASKS[task_id] = task
    except Exception:
        # handle it

到这里为止的所有东西都可以正常工作。我可以得到任务列表,并且任务保持打开状态。我也尝试过显式调用task.control(nidaqmx.constants.TaskMode.TASK_RESERVE),但无论如何下面的代码都会给我同样的问题。

当我尝试向任务添加通道时,无论我如何设置状态,它都会在函数调用结束时关闭。

#./daq/task/channels.py
from daq import TASKS

def api_add_channel_task_endpoint(task_id, channel_type, function):
    # channel_type corresponds to ni-daqmx channel modules (e.g. ai_channels).
    # function corresponds to callable functions (e.g. add_ai_voltage_chan)
    # do some preliminary checks (e.g. task exists, channel type valid)
    channels = get_chans_from_json_post()
    with TASKS[task_id] as task:
        getattr(getattr(task, channel_type), function)(channels)
        # e.g. task.ai_channels.add_ai_voltage_chan("Dev1/ai0")

这显然是关闭任务。当我api_create_task_endpoint(task_id)再次调用时,我收到DaqResourceWarning任务已关闭且不再存在的消息。

我同样尝试使用此处设置 TaskMode task.control,但无济于事。

我希望能够通过将任务存储在模块范围的TASKS字典中来对其进行编辑,但不能将任务保持打开足够长的时间来执行此操作。

2) 我还尝试使用 NI-MAX 保存功能来实现这一点。这样做的问题是除非任务已经包含通道,否则无法保存任务,我不一定想在创建任务后立即执行此操作。

我试图通过添加一些默认行为来解决这个问题,该api_create_task_endpoint()行为只是添加一个随机频道,该频道在用户添加的第一个频道上被删除。问题是,在没有 GUI 的情况下添加通道后,我找不到任何文档来从任务中删除通道(这是在 CENTOS 上运行的,所以 GUI 是非启动器)。

非常感谢您的帮助!

4

1 回答 1

0

我没有为 NI-DAQmx 使用 Python 绑定,但是

with TASKS[task_id] as task:

看起来它会在更新后立即停止并清除任务,因为程序流离开了with块并且Task.__exit__()执行。

因为您希望在使用 Python 模块时这些任务仍然存在,所以我的建议是task.control()在您需要更改任务状态时使用。

于 2020-01-20T22:05:39.153 回答