Полиморфизм в 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
– код с АЦП, А
и 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.
Добавляем подготовленные SubVI (кнопочка Add…) и не забываем отредактировать иконку.
В результате получаем VI, который меняет свою структуру в зависимости от типа данных на входе, как показано в примере ниже:
Если с помощью двойного клика войти в первый VI, то откроется ConvertSingle.vi, если во второй - то ConvertArray.vi.
Все SubVI, которые мы собираемся объединять в полиморфный VI должны иметь одинаковую топологию (Patterns) и одинаковое расположение входных-выходных терминалов. Но в подприборах некоторые входы или выходы могут отсутствовать. Это тоже сработает.
Вложение | Дата | Размер |
---|---|---|
polymorphism_labview2015.zip | 15/01/2017 | 30.7 КБ |