Асинхронный вызов VI

Общие принципы, проектирование, модуляризация, темплейты и шаблоны
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Асинхронный вызов VI

Сообщение Borjomy_1 »

Предлагаю следующее:
При выходе из основного цикла экземпляр посылает событие, которое ловит вызывающая программа.
Вложения
Запуск.png
Экземляр.png
Аватара пользователя
dadreamer

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

Re: Асинхронный вызов VI

Сообщение dadreamer »

Shamrel писал(а):Тогда как-то так:
Да, суть всю уловили :wink: По ошибкам ещё хочу сказать.

Ошибки из Саб-ВИ наверно не обязательно в регистр отправлять, т.к. ошибка, произошедшая раз в одном потомке, нарушит механизм ожидания "Wait On Asynchronous Call" - он будет крутиться вхолостую по "законам жанра" :labview: . Такие ошибки надо как-то отдельно обрабатывать. Тем более что все эти Саб-ВИ должны выполняться независимо друг от друга. Кроме того, эту ошибку не надо пропускать через Close Reference:
error in describes error conditions that occur before this node runs. With the following exception, this input provides standard error in functionality.

This node runs normally even if an error occurred before this node runs.
Ошибку из "Wait On Asynchronous Call" можно также обрабатывать, при желании. На практике мне попадался только таймаут, но возможны и какие-то другие ошибки из стандартного перечня.
Аватара пользователя
Shamrel
beginner
beginner
Сообщения: 38
Зарегистрирован: 02 мар 2017, 12:15
Версия LabVIEW: 2015

Re: Асинхронный вызов VI

Сообщение Shamrel »

Развил идею dadreamer, о user events. Получилось как-то так:
Родитель. Вызываем потомка.
Родитель. Вызываем потомка.
Родитель. Ждем события от потомка.
Родитель. Ждем события от потомка.
Потомок. Генерируем событие о нажатии кнопки.
Потомок. Генерируем событие о нажатии кнопки.
Благодарю!
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Асинхронный вызов VI

Сообщение Blackman »

На рис показан более гибкий способ открытия референса для асинхронного (ACBR) или синхронного (CBR) вызова :vi: .
Вложения
Open ref for ACBR node FP.PNG
Open ref for ACBR node FP.PNG (18.68 КБ) 10202 просмотра
Аватара пользователя
Shamrel
beginner
beginner
Сообщения: 38
Зарегистрирован: 02 мар 2017, 12:15
Версия LabVIEW: 2015

Re: Асинхронный вызов VI

Сообщение Shamrel »

Blackman, спасибо.
Я тоже обнаружил этот способ. Но я пока теряюсь в этих референсах. Потому пользуюсь осторожно, согласно примерам из документации.
Вроде и почитал, но интуитивного понимания нет, чем отличается строготипизированный референс (вроде как содержит описание панели подключения) от статического референса (тупо ссылка на файл на жестком диске?). И что за референс на выходе функции "Open VI Reference Function ", и чем он отличается от первых двух?
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Асинхронный вызов VI

Сообщение Kosist »

Shamrel писал(а):Blackman, спасибо.
Я тоже обнаружил этот способ. Но я пока теряюсь в этих референсах. Потому пользуюсь осторожно, согласно примерам из документации.
Вроде и почитал, но интуитивного понимания нет, чем отличается строготипизированный референс (вроде как содержит описание панели подключения) от статического референса (тупо ссылка на файл на жестком диске?). И что за референс на выходе функции "Open VI Reference Function ", и чем он отличается от первых двух?
Позвольте мне вставить свои 5 копеек =)
Строготипизированный референс говорит сам за себя - Вы можете таким способом запустить лишь виайки с точно такой же панелью подключения. Если вызываемая виайка будет иметь иной Connector Pane, то будет ошибка.
Статический референс - ему все равно на панель подключения, Вы получаете лишь ссылку на виайку.
А эти ссылки, и выход функции "Open VI Reference Function" - в принципе, это одно и то же. Но, при помощи функции Open VI Reference Function Вы можете установить значения флага, с которым вызывается виайка (вход option), что необходимо для Start Asynchronous Call, и т.д. Плюс, строготип. референс функция Open VI Reference Function в качестве входа type specifier VI Refnum, для получения инфы о панели подключения...
Мы делили апельсин - много наших полегло...
Аватара пользователя
dadreamer

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

Re: Асинхронный вызов VI

Сообщение dadreamer »

Shamrel писал(а):И что за референс на выходе функции "Open VI Reference Function ", и чем он отличается от первых двух?
Open VI Reference отдаёт вам инициализированный референс, то есть :vi: уже открыт, под его работу выделена отпределённая область в памяти :labview: , создан data space под все структуры и т.п. То есть, с таким референсом дальше можно спокойно работать через Call By Reference и Start Async. Call. А тот референс, что вы размещаете на БД или панели, не инициализирован. Это просто константа, такая же, как те, что лежат в палитре Refnum. Если вы кастанёте такой ref в U32 (Type Cast), то увидите, что он равен нулю. Инициализированный ref никогда нулю не равен и он вообще говоря уникален в текущем контексте программы.
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Асинхронный вызов VI

Сообщение Blackman »

А тот референс, что вы размещаете на БД или панели, не инициализирован. Это просто константа, такая же, как те, что лежат в палитре Refnum. Если вы кастанёте такой ref в U32 (Type Cast), то увидите, что он равен нулю. Инициализированный ref никогда нулю не равен и он вообще говоря уникален в текущем контексте программы.
Если речь идет о статическом референсе, то это большое заблуждение. :think:
Вложения
Test VI References.png
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Асинхронный вызов VI

Сообщение Kosist »

Согласен с Blackman, т.к. такой код работает без проблем, без функции Open VI Reference:
Open FP.PNG
Open FP.PNG (5.76 КБ) 10175 просмотров
Может, dadreamer, Вы имели ввиду просто функцию Static VI Reference? Тогда да, без добавленной в нее виайки ссылка будет "указывать в никуда"...
Мы делили апельсин - много наших полегло...
Аватара пользователя
dadreamer

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

Re: Асинхронный вызов VI

Сообщение dadreamer »

Blackman писал(а):Если речь идет о статическом референсе, то это большое заблуждение. :think:
Речь об этом.
Вложения
2017-03-05_20-13-55.jpg
2017-03-05_20-13-55.jpg (26.98 КБ) 10169 просмотров
2017-03-05_20-17-36.jpg
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Асинхронный вызов VI

Сообщение Blackman »

И что здесь проверять? Значок в левом верхнем углу константы говорит сам за себя)
Вложения
Strict Viref constant.PNG
Strict Viref constant.PNG (53.08 КБ) 10133 просмотра
Ответить

Вернуться в «Модели программирования»