我正在尝试编写一个利用 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 是非启动器)。
非常感谢您的帮助!