我正在尝试编写一个API,它利用了NI-DAQmx的python包装器,并且需要有一个可以在整个模块中编辑的全局任务列表。
以下是我到目前为止尝试过的:
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 dict中对任务进行编辑,但不能让任务保持足够长的打开时间。
2)我还尝试使用NI-MAX保存功能来实现这个功能。这样做的问题是,除非任务已经包含通道,否则无法保存这些任务,我不一定要在创建任务之后立即这样做。
我试图通过在api_create_task_endpoint()中添加一些默认行为来解决这个问题,它只是添加了一个随机通道,该通道将在用户添加的第一个通道上删除。问题是,在没有GUI的情况下添加通道后,我找不到从任务中删除通道的任何文档(这是在CENTOS上运行的,所以GUI是不启动的)。
非常感谢你的帮助!
发布于 2020-01-20 22:05:39
我还没有为NI-DAQmx使用Python绑定,但是
with TASKS[task_id] as task:
看起来它会在更新任务后立即停止并清除它,因为程序流离开with块并执行()。
因为您期望这些任务在使用Python模块时仍然存在,所以我建议您只在需要更改任务的状态时使用task.control()。
https://stackoverflow.com/questions/59796043
复制相似问题