Подача данных на input subVI после Anychronous call&forget

Простейшие вопросы в области инженерной разработки
dakishi
assistant
assistant
Сообщения: 120
Зарегистрирован: 05 сен 2019, 21:01
Версия LabVIEW: 2019
Контактная информация:

Подача данных на input subVI после Anychronous call&forget

Сообщение dakishi »

Добрый вечер!
Есть программа которая на различных стадиях 1,2,3... (машина состояний с индексами 1,2,3 ..., условно ) рассчитывает некоторые величины, соответственно это v1,v2,.... Я вызываю один раз, когда мне нужно, по кнопке, окно моего SubVI с помощью asynchronous call and forget (это я сделал, см. рис. или файл).
Задача, которую я пытаюсь реализовать:
После вызова, в каждой последующей стадии k+1,k+2,.... в этот SubVI забрасывается соответственно значение v1, v2,... и он что то с ними делает (обновляет график с учетом поступающих значений, например). Между стадиями - соответственно, он ожидает поступление новых значений и ничего не делает.

Моя проблема:
1) Как к нему обратиться и передать значение в i-ой стадии? С ожиданием значения я разобрался. Я не могу понять, как строить программу в плане передачи значения работающему в режиме Asychronous call and Forget подприбору.
Можете сказать, про какой VI мне нужно почитать ?

2) Полагаю - использование ссылки на subVI (на рисунке убрать close reference) и какого то VI похожего на asynchronous call. По окончанию работы я, соответственно, закрываю эту ссылку. В таком случае понадобиться каждый раз проверять, действительна ли ссылка, которую я буду кидать из состояние в состояние, но каким VI эту проверку выполнять ?
Вложения
Asynchronous call.JPG
Asynchronous Call and Forget.vi
(12.3 КБ) 95 скачиваний
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Подача данных на input subVI после Anychronous call&forg

Сообщение dadreamer »

>> Как к нему обратиться и передать значение в i-ой стадии? С ожиданием значения я разобрался. Я не могу понять, как строить программу в плане передачи значения работающему в режиме Asychronous call and Forget подприбору.
Сконфигурируйте один из входов вашего SubVI в виде ссылки (reference) на очередь или уведомитель строкового типа. Это и будет ваша команда, которую вы в любой момент можете отправить в SubVI. Нужно только непрерывно читать очередь / уведомитель в SubVI, чтобы не пропустить команду. Также опционально можно сделать и выход аналогичного типа для отображения состояния SubVI. Вторая проблема при таком подходе должна сама "рассосаться".
dakishi
assistant
assistant
Сообщения: 120
Зарегистрирован: 05 сен 2019, 21:01
Версия LabVIEW: 2019
Контактная информация:

Re: Подача данных на input subVI после Anychronous call&forg

Сообщение dakishi »

[quote=="dadreamer"]>> Как к нему обратиться и передать значение в i-ой стадии? С ожиданием значения я разобрался. Я не могу понять, как строить программу в плане передачи значения работающему в режиме Asychronous call and Forget подприбору.
Сконфигурируйте один из входов вашего SubVI в виде ссылки (reference) на очередь или уведомитель строкового типа. Это и будет ваша команда, которую вы в любой момент можете отправить в SubVI. Нужно только непрерывно читать очередь / уведомитель в SubVI, чтобы не пропустить команду. [/quote]

Спасибо! Возник вопрос - если я хочу отправлять enum-состояния моему VI через очередь, то как я вижу, на примере такого SubVI, он принимает только строки - это можно как то изменить ?
Вложения
Queue problem.JPG
Server.vi
(11.04 КБ) 82 скачивания
States.ctl
(3.83 КБ) 82 скачивания
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Подача данных на input subVI после Anychronous call&forg

Сообщение dadreamer »

Тогда поменяйте тип очереди со строкового на числовой. Или же переводите enum в строку перед отправкой. На принимающей стороне потребуется корректно распарсить команду. Я обычно использую разделитель, например "::", и передаю через очередь набор параметров. Ещё, как вариант, сделать тип очереди кластером, в котором определить необходимые параметры (у вас уже что-то похожее изображено на диаграмме).
dakishi
assistant
assistant
Сообщения: 120
Зарегистрирован: 05 сен 2019, 21:01
Версия LabVIEW: 2019
Контактная информация:

Re: Подача данных на input subVI после Anychronous call&forg

Сообщение dakishi »

[quote=="dadreamer"]
Тогда поменяйте тип очереди. [/quote]

[quote=="dadreamer"]
Ещё, как вариант, сделать тип очереди кластером.
[/quote]

Это как раз я пытаюсь сделать - не могу понять, как поменять тип - обычным подключением нужного типа данных ко входу это у меня не получается.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Подача данных на input subVI после Anychronous call&forg

Сообщение dadreamer »

dakishi, на вход element data type инструмента Obtain Queue надо подать константу нужного типа. Потом ПКМ на выходе queue out -> Create -> Control / Indicator. Получившийся контрол или индикатор с панели копируете на панель вашего SubVI, перепривязываете входы-выходы и т.п.
Вложения
2020-02-16_23-07-56.jpg
dakishi
assistant
assistant
Сообщения: 120
Зарегистрирован: 05 сен 2019, 21:01
Версия LabVIEW: 2019
Контактная информация:

Re: Подача данных на input subVI после Anychronous call&forg

Сообщение dakishi »

[quote=="dadreamer"]dakishi, на вход element data type инструмента Obtain Queue надо подать константу нужного типа. Потом ПКМ на выходе queue out -> Create -> Control / Indicator. Получившийся контрол или индикатор с панели копируете на панель вашего SubVI, перепривязываете входы-выходы и т.п.[/quote]

Спасибо! Можете сказать, можно ли сделать как то просто ссылку на SubVI со входами и выходами и работать с ней, и, соответственно, в очередь кидать команды на ввод?
Последний раз редактировалось dakishi 17 фев 2020, 18:29, всего редактировалось 1 раз.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Подача данных на input subVI после Anychronous call&forg

Сообщение dadreamer »

>> Спасибо! Можете сказать, можно ли сделать как то просто ссылку на SubVI со входами и выходами и работать с ней ?
Можете подробнее расписать, зачем это нужно и чего хотите добиться? Предложенный мной вариант не подходит?
dakishi
assistant
assistant
Сообщения: 120
Зарегистрирован: 05 сен 2019, 21:01
Версия LabVIEW: 2019
Контактная информация:

Re: Подача данных на input subVI после Anychronous call&forg

Сообщение dakishi »

[quote=="dadreamer"]>> Спасибо! Можете сказать, можно ли сделать как то просто ссылку на SubVI со входами и выходами и работать с ней ?
Можете подробнее расписать, зачем это нужно и чего хотите добиться? Предложенный мной вариант не подходит?[/quote]

Я выношу некоторые вычисления в отдельное окно. В моей задаче довольно много входных/выходных параметров - всё это загонять в класс или строку менее читабельно для программиста в отличии от ссылки где все выходы/выходы подписаны при наведении и есть описание.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Подача данных на input subVI после Anychronous call&forg

Сообщение dadreamer »

Я так понял, вам не хочется протягивать внутрь SubVI множество входных параметров и тянуть из SubVI множество выходных? Если так, то специально для этого придумали пару :vi: Get Control Values by Index и Set Control Values by Index. Можно из любого SubVI прочитать и записать любые контролы/индикаторы на FP. Вкупе с Variant'ом и его атрибутами чудесная штука. Если ещё завернуть в Malleable VIs, вообще можно не париться насчёт передаваемых типов данных. Если же я не так понял, то возможно кто-то ещё подскажет. А что касается совета с очередями/уведомителями и Start Asynchronous Call, то я сам их часто использую именно в таком виде, как и описал. Запускаю параллельно пачку SubVI, пока они крутятся, кидаю им команды, отслеживаю состояние.
dakishi
assistant
assistant
Сообщения: 120
Зарегистрирован: 05 сен 2019, 21:01
Версия LabVIEW: 2019
Контактная информация:

Re: Подача данных на input subVI после Anychronous call&forg

Сообщение dakishi »

[quote=="dadreamer"]Я так понял, вам не хочется протягивать внутрь SubVI множество входных параметров и тянуть из SubVI множество выходных? Если так, то специально для этого придумали пару :vi: Get Control Values by Index и Set Control Values by Index.[/quote]

Интересно, что в Help написано про работу с контролами, но она тянет и индикаторы из SubVI. Можете сказать, как с синхронизацией - опция, после подачи input перенимает окончательное значение output при первом же изменении output ?
Artem.spb

Activity Автор
professor
professor
Сообщения: 3391
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: Подача данных на input subVI после Anychronous call&forg

Сообщение Artem.spb »

[quote=="dakishi"]Интересно, что в Help написано про работу с контролами, но она тянет и индикаторы из SubVI. Можете сказать, как с синхронизацией - опция, после подачи input перенимает окончательное значение output при первом же изменении output ?[/quote]
Под контролом в данном случае понимается любой активный элемент панели управления.
Естественно, метод чтения выдаст текущее значение элемента в момент запроса. Так что можно отслеживать изменение контрола.
Вот только расточительный это способ.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Подача данных на input subVI после Anychronous call&forg

Сообщение dadreamer »

>> Интересно, что в Help написано про работу с контролами, но она тянет и индикаторы из SubVI.
И контролы, и индикаторы можно читать/писать, также как с помощью локальных переменных. Вообще, внутри :labview: контрол от индикатора только одним флагом отличается. В скриптинге есть даже проверка на то, чем является объект.

>> Можете сказать, как с синхронизацией - опция, после подачи input перенимает окончательное значение output при первом же изменении output ?
Я не понял вопроса. Перефразируйте, пожалуйста.
dakishi
assistant
assistant
Сообщения: 120
Зарегистрирован: 05 сен 2019, 21:01
Версия LabVIEW: 2019
Контактная информация:

Re: Подача данных на input subVI после Anychronous call&forg

Сообщение dakishi »

[quote=="dadreamer"]
>> Можете сказать, как с синхронизацией - опция, после подачи input перенимает окончательное значение output при первом же изменении output ?
Я не понял вопроса. Перефразируйте, пожалуйста.[/quote]

Имел ввиду, что функция при подаче input "сразу же" подает результат вычислений на output - т.е. при первом change output функция делает присвоение и закрывается.
Как ответил только что Artem.spb, я так понимаю, так оно и есть.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Подача данных на input subVI после Anychronous call&forg

Сообщение dadreamer »

Что запись, что чтение - однократные операции, выполнились, а дальше программист сам решает, что ему делать. Если надо непрерывно читать/писать, то делает это в цикле. Для синхронизации использовать можно, но есть специально заточенные под это инструменты, такие как UE, очереди, семафоры. Ни к чему изобретать лишний велосипед, который получится совсем не лучше встроенного функционала. Если совсем вломы тащить очередь внутрь SubVI, можно в основном :vi: сделать индикатор типа "очередь", на этапе инициализации заполнить его действительным значением и далее в SubVI получать эту очередь через Get Control Values by Index.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»