nidaqmx: запретить закрытие задачи после изменения в функции - PullRequest
1 голос
/ 18 января 2020

Я пытаюсь написать API, использующий преимущества оболочки python для NI-DAQmx, и мне нужно иметь глобальный список задач, которые можно редактировать в модуле.

Вот что До сих пор я пробовал:

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) I также попытался реализовать это с помощью функции сохранения NI-MAX. Проблема в том, что задачи не могут быть сохранены, если они уже не содержат каналы, что я не обязательно хочу делать сразу после создания задачи.

Я попытался обойти это, добавив в api_create_task_endpoint() некоторое поведение по умолчанию, которое просто добавляет случайный канал, который удаляется на первом канале, добавленном пользователем. Проблема в том, что я не могу найти документацию по способу удаления каналов из задачи после добавления их без GUI (это работает на CENTOS, поэтому GUI не запускается).

Большое спасибо за любую помощь!

1 Ответ

0 голосов
/ 21 января 2020

Я не использую привязки Python для NI-DAQmx, но

with TASKS[task_id] as task:

выглядит так, как будто она остановится и очистит задачу сразу после ее обновления, потому что программа поток покидает блок with и Task .__ exit __ () выполняется.

Поскольку вы ожидаете, что эти задачи будут работать, пока используется модуль Python, я рекомендую только используйте task.control(), когда вам нужно изменить состояние задачи.

...