Полиморфизм в LabVIEW

Шауэрман Александр А. shamrel@yandex.ru

Выглядит привычно и не вызывает никаких вопросов свойство многих встроенных модулей и структур LabVIEW динамически менять тип своих входов и выходов в зависимости от типа подключаемых данных. Проще всего это продемонстрировать на примере простой функции add – сложение. По умолчанию функция ожидает на входе тип DBL. В этом легко убедиться щелкнув правой кнопкой мыши по входу и выбрав Create Control – будет создан Numeric Control типа DBL. Если же мы изменим его тип на целый, например I32, то модуль add сменит тип ожидаемых данных, и второй терминал окрасится в синий цвет целочисленных переменных. Этот принцип сработает если на вход подать массив или даже структуру.

Пример полиморфизма в стандартных функциях

Подобным образом ведут себя многие структуры. Так, например, Case Structure адаптирует свой Selector label под тип входа (Case selector).

Полиморфизм в структурах управления

Подобное поведение функций, модулей и подприборов называется Полиморфизмом (polymorphism). Данный термин пришел в LabVIEW из объектно ориентированных языков проектирования. Полиморфизм представляет собой концепт, согласно которому одна и та же функция (модуль, метод, подприбор) может работать с разными типами данных, предоставляя программисту единый интерфейс.

Рассмотрим боевой пример. Допустим нам требуется создать подприбор, который переводит цифровой код (Code), полученный с АЦП в значение какой-либо физической величины (Value). Для простоты положим, что формула преобразования линейная:

Value = Code * A+ Offset,

где Valueзначение физической величины, Code код с АЦП, А и Offset– параметры преобразования.

При создании виртуального прибора нам может потребоваться преобразовать как одиночное значение, так и весь массив выборок сразу. В результате мы должны будем создать два различных VI (Virtual Instrument) для решения по сути однотипной задачи. При этом в своей программе мы должны будем постоянно думать, какой VI нам нужно будем использовать. Неудобно!

LabVIEW предоставляет нам удобный механизм: Polymorphic VI. Что бы создать такой VI выбираем в меню File пункт New… Там находим Polymorphic VI.

По сути это не совсем VI в классическом понимании, это скорее объединение нескольких VI в один полиморфный. Идея в том, что мы создаем один SubVI для работы с одиночными данными, второй – для работы с массивом, третий (если понадобится) – для работы с данными в виде сигнала, либо данными, оформленными в виде структуры. А затем создаем VI, который ссылается на эти SubVI, и в зависимости от того, какой тип данных будет подан на его вход, выберет нужный.

Для примера сделаем полиморфный VI для преобразования кода 16-ти битного АЦП, измеряющего напряжение в диапазоне от -10В до 10В. Значение 0000h будет соответствовать -10В, значение FFFFh - 10В. Тогда параметр А равен 20В/65536 , а параметр Offset равен -10В.

Создадим SubVI для преобразования одиночного значения и сохраним его на диск под именем ConvertSingle.vi:

И да. Я люблю для каждого VI рисовать говорящую иконку – легче будет ориентироваться на диаграмме верхнего уровня. Буковка "s" на иконке от слова "Single" – "Одиночный".
Создадим SubVI для преобразования массива значений и сохраним его под именем ConvertArray.vi:

Стоить отметить, что в этом подприборе используется предыдущий подприбор. Это удобно, так как формула преобразования реализована в одном месте, и ее можно будет при необходимости легко изменить или поправить. Буковка "A" на иконке от слова "Array" – "Массив".

Теперь создадим полиморфный VI: выбираем в меню File пункт New… Там находим Polymorphic VI. Не пугаемся, полиморфные VI отличаются от прочих VI: у них нет привычной блок-схемы и передней панели. Есть только список ссылок на другие SubVI.

Создать Polymorphic VI

Добавляем подготовленные SubVI (кнопочка Add…) и не забываем отредактировать иконку.

В результате получаем VI, который меняет свою структуру в зависимости от типа данных на входе, как показано в примере ниже:

Если с помощью двойного клика войти в первый VI, то откроется ConvertSingle.vi, если во второй - то ConvertArray.vi.

Все SubVI, которые мы собираемся объединять в полиморфный VI должны иметь одинаковую топологию (Patterns) и одинаковое расположение входных-выходных терминалов. Но в подприборах некоторые входы или выходы могут отсутствовать. Это тоже сработает.

14 января 2017
Прикрепленные файлы: 
ВложениеДатаРазмер
Иконка пакета polymorphism_labview2015.zip15/01/201730.7 КБ
Орфографическая ошибка в тексте:
Чтобы сообщить об ошибке автору, нажмите кнопку "Отправить сообщение об ошибке". Вы также можете отправить свой комментарий.