Может ли LabVIEW VI определить, подключен ли один из его выходных терминалов? - PullRequest
4 голосов
/ 18 августа 2010

В LabVIEW возможно ли изнутри определить, подключен ли выходной терминал к вызывающему ВП?Очевидно, что это будет зависеть от вызывающего ВП, но, возможно, есть какой-то способ найти ответ для текущего вызова ВП.

В терминах C это будет похоже на определение функции, которая принимает аргументы, которыеуказывает, где хранить выходные параметры, но примет NULL, если вызывающий не заинтересован в этом параметре.

Ответы [ 5 ]

4 голосов
/ 19 августа 2010

Как уже было сказано, вы не можете сделать это естественным путем, но есть обходной путь, использующий ссылки на значения данных (требуется LV 2009). Это та же самая идея дать нулевой указатель на выходной аргумент. Результат вводится в качестве ссылки на значение данных (которое является указателем) и проверяется на предмет Не является ссылкой с помощью SubVI. Если это ноль, ничего не делать.

Вот SubVI (регистр true ничего не делает):

alt text

А вот зовущий ВИ:

alt text

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

2 голосов
/ 30 августа 2010

Я бы посоветовал вам поступить неправильно.Если компилятор не достаточно умен, чтобы самостоятельно выполнять вычисления, сделайте две версии этого ВП.Тот, который делает дорогой расчет, тот, который не делает.Затем создайте полиморфный VI, который позволит вам переключаться между ними.Вы уже знаете, во время разработки, какую версию вы хотите (потому что вы подключаете выходной терминал или нет), поэтому просто используйте правильную версию полиморфного ВП.

В качестве альтернативы, передайте переменную, которая включаетили выписать регистр Case для дорогой части вашего расчета.

1 голос
/ 18 августа 2010

Как сказал Underflow, основной ответ - нет.

Вы можете посмотреть здесь , чтобы получить, пожалуй, самый официальный и подробный ответ, который когда-либо будет предоставлен NI..

Расширяя аналогию, вы можете сделать это в LV, за исключением того, что LV не имеет понятия нуля, как в C.Вы можете увидеть пример этого здесь .

Обратите внимание, что код в предоставленной ссылке Underflow не будет работать в исполняемом файле, потому что диаграммы по умолчанию удаляются при сборке EXE и потомуRTE не поддерживает некоторые свойства и методы, используемые там.


Извините, я понял, что неправильно понял вопрос.Я думал, что вы спрашиваете о входе, поэтому идея, которую я предложил, не применима.Ограничения, которые я указал, действительно применяются.

Почему вы хотите это сделать?Может быть другое решение.

1 голос
/ 18 августа 2010

Как правило, нет.

Можно выполнить статический анализ кода, используя функции «сценариев». Это потребует вытягивания иерархии вызовов и отслеживания проводных ссылок.

Собирая пробную версию этого, возникают некоторые трудности. Несколько идентичных подпрограмм на одной диаграмме трудно различить. Кроме того, ссылки на терминалы, по-видимому, доступны в основном по имени, что может привести к некоторым конфликтам с терминалами с одинаковыми именами других vi.

Н.И. проделал небольшую работу над вариантом этой проблемы; проверить это .

0 голосов
/ 23 августа 2010

В общем, компилятор LV оптимизирует машинный код таким образом, что неиспользуемый код даже не встроен в исполняемый файл.

Это не относится к subVI (потому что нет никакого способа узнать, что вы не будете пытаться каким-либо образом использовать значение индикаторов, хотя LV может сделать это, если удалит FP при сборке исполняемого файла, и, возможно, сделает это) , но есть один способ применить его к subVI - встроить subVI, что должно позволить компилятору видеть, что выходные данные не используются. Вы также можете установить его приоритет на подпрограмму, что, возможно, также сделает это, но я бы не рекомендовал это.

Официально встраивание доступно только в LV 2010, но есть способы доступа к частному свойству VI в более старых версиях. Однако я бы не рекомендовал это делать, и вполне вероятно, что в 2010 году есть некоторые оптимизации в этой области, которых не было в старых версиях.

P.S. В общем, детали процесса компиляции не раскрываются и варьируются между версиями LV, так как NI настраивает компилятор. Предполагается, что весь процесс был значительно обновлен в LV 2010, и на сайте NI должна быть веб-трансляция с некоторыми подробностями.

...