Введение в виртуальные приборы labview

Обзор некоторых виртуальных приборов среды LabVIEW в помощь разработчику (+ исходники)

Введение в виртуальные приборы labview

За последние годы работы в среде LabVIEW приходилось иметь дело с разными задачами, решение которых вытекало в создание простых и не очень простых виртуальных приборов(ВП). Специализация моей работы – это проектирование различных алгоритмов для анализа биомедицинских сигналов. И как у любого разработчика за несколько лет у меня накопилось большое количество кода разной сложности. Для всех виртуальных приборов, которые по той или иной причине мне жалко было удалять, я создал папку, куда и сохранял все. В данной статье мне хотелось бы привести некоторую выборки из моего LabVIEW-портфолио.

Выборка имеет достаточно эклектичный характер, и многие приборы опытные разработчики могут воспроизвести сами за несколько минут. Поэтому, полагаю данная статья может пригодится в основном для начинающих LabVIEW-разработчиков. Большинство представленного кода можно так или иначе найти на LabVIEW – форумах или в экземплах среды. Исходники прилагаю в конце статьи (версия 9.0).

В начале хотелось бы привести пару ВП, которые относятся к разряду очень простых, но возможно кому-то необходимых.

Нормализация сигнала

В LabVIEW есть встроенная функция нормализации сигнала Normalization.vi, но ее работа нас не удовлетворила, поскольку неясно было, как получить на ее выходе массив в жестко заданных пределах. В итоге был разработан подприбор, в данном случае реализующий нормализацию входного массива в значениях от 0 до 100. Согласитесь, это иногда необходимо.

Введение в виртуальные приборы labview

Удаление нулей из массива

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

Введение в виртуальные приборы labview

Чтение данных с Bluetooth — устройства.

Данный прибор был заимствован на ni.com, когда стояла задача приема данных с нагрудного датчика фирмы Polar. Пользователь англоязычного форума успешно реализовал код получения данных с устройства, но раскодирование BT-строки и перевод ее в значения пульса пришлось немного модернизировать. Топик можно просмотреть здесь. Помимо датчика пульса к виртуальному прибору успешно подсоединялось и другое BT-устройство.

Введение в виртуальные приборы labview

Конвертирование видео в графические файлы

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

Введение в виртуальные приборы labview

Введение в виртуальные приборы labview

Запуск VLC плеера из LabVIEW

При решении проблемы запуска видео в ходе работы прибора, например, при нажатии кнопки, я искал удобную реализацию, но встроенный в LabVIEW Windows Media Player показал нестабильную работу. Тогда взгляд остановился на использовании решения на базе платформы .NET с подключением внешнего VLC плеера. Работает достаточно стабильно и используется в настоящее время в составе программы для лабораторных исследований.

Введение в виртуальные приборы labview

Сплайн-интерполяция сигнала

Часто в задачах цифровой обработки сигналов требуется производить процедуру интерполяцию. Иногда, потому что исходный сигнал слишком «угловатый» или тогда, когда для удобства отображения на графическом индикаторе требует бо’льшего количества точек сигнала. Попросту если из 10 точек сигнала надо сделать 100 такая процедура как раз и применяется. В своих ВП очень часто я прибегал к сплайн-интерполяции, немного разглаживая сигнал и увеличивая количество выборок. Похожую реализацию других видов интерполяции можно найти в примерах среды LabVIEW.

Введение в виртуальные приборы labview

Введение в виртуальные приборы labview

Нестандартная фильтрация сигнала

При работе с массивами ритмограмм(набор мгновенных значений частоты сердечных сокращений за определенный промежуток времени) возникала проблема удаления артефактов/аномальных значений, возникающих ввиду различных причин при записи пульса. Одним из возможных решений удаления таких выбросов из исходного массива является нижеприведенный прибор. На вид код не является простым, но по сути он реализует процедуру линейного соединения двух соседних чисел между которыми был найден выброс. А затем отыскивается середина этого отрезка, на которое и заменяется найденное аномальное значение. Если встречаются два соседних артефакта, тогда берем и соединяем их крайних соседей. И делим отрезок не на две, а на три части и т.д.

Введение в виртуальные приборы labview

Введение в виртуальные приборы labview

Линейная аппроксимация случайных чисел

Следующий код реализует линейную аппроксимация набора чисел, в данном примере это случайные числа. Данная операция была необходима для построения скатерграммы – графического регрессионного анализа ритмограммы, используемом при оценки вариабельности ритма сердца. Наряду с линейной аппроксимация в LabVIEW имеются примеры и других видов аппроксимаций.

Введение в виртуальные приборы labview

Введение в виртуальные приборы labview

В завершении статьи хотелось бы особенно поблагодарить всех тех людей, которые помогали мне в решении многих, порой непростых задач. Особенно хотелось бы выразить слова благодарности сообществу LabVIEW Portal за бесценную помощью в реализации множества алгоритмов и моем профессиональном возрастании.

Введение в виртуальные приборы labview

Программы в LabView называются виртуальными приборами или ВП (Virtual Instruments — VI), поскольку их внешний вид и поведение имитируют физические приборы, такие как осциллографы и мульти метры. Каждый ВП использует функции, которые обрабатывают входные данные от пользовательского интерфейса или иных источников и отображают информацию либо перемещают ее в другие файлы или другие компьютеры.

Виртуальные приборы содержат три следующих компонента:

  • Лицевая панель (Front panel)–Служит в качестве пользовательского интерфейса.
  • Блок диаграмма (Block diagram)–Содержит графический исходный код, который определяет функционирование ВП.
  • Иконка и соединительная панель (Icon and connector pane)– идентифицируют ВП таким образом, чтобы его можно было использовать в другом ВП. ВП внутри другого ВП называется виртуальным под прибором – ВПП (SubVI). ВПП соответствует подпрограмме (процедуре) в текстов ориентированных языках программирования.

Для создания кода виртуального прибора используется палитра компонентов, содержащая стандартный набор готовых ВП, позволяющих реализовывать сложные алгоритмы. Панель инструментов показана на рисунке 1.

Введение в виртуальные приборы labview

Рис. 1 – Панель инструментов для создания блок-диаграммы

Введение в виртуальные приборы labview

Рис. 2 – Панель инструментов для создания лицевой панели

Введение в виртуальные приборы labview

Программы в LabView называются виртуальными приборами или ВП (Virtual Instruments — VI), поскольку их внешний вид и поведение имитируют физические приборы, такие как осциллографы и мульти метры. Каждый ВП использует функции, которые обрабатывают входные данные от пользовательского интерфейса или иных источников и отображают информацию либо перемещают ее в другие файлы или другие компьютеры.

Виртуальные приборы содержат три следующих компонента:

  • Лицевая панель (Front panel)–Служит в качестве пользовательского интерфейса.
  • Блок диаграмма (Block diagram)–Содержит графический исходный код, который определяет функционирование ВП.
  • Иконка и соединительная панель (Icon and connector pane)– идентифицируют ВП таким образом, чтобы его можно было использовать в другом ВП. ВП внутри другого ВП называется виртуальным под прибором – ВПП (SubVI). ВПП соответствует подпрограмме (процедуре) в текстов ориентированных языках программирования.

Для создания кода виртуального прибора используется палитра компонентов, содержащая стандартный набор готовых ВП, позволяющих реализовывать сложные алгоритмы. Панель инструментов показана на рисунке 1.

Введение в виртуальные приборы labview

Рис. 1 – Панель инструментов для создания блок-диаграммы

Введение в виртуальные приборы labview

Рис. 2 – Панель инструментов для создания лицевой панели

LabVIEW — первое знакомство

В относительно небольшой статье мне хотелось бы рассказать о языке программирования LabVIEW. Этот весьма любопытный продукт к сожалению не пользуется широкой популярностью, и мне хотелось бы в некоторой степени восполнить имеющийся пробел.

Введение в виртуальные приборы labview

Что же такое «LabVIEW»?

LabVIEW — это один из основных продуктов компании National Instruments. Прежде всего надо отметить, что LabVIEW — это аббревиатура, которая расшифровывается как Laboratory Virtual Instrumentation Engineering Workbench. Уже в названии прослеживается ориентация на лабораторные исследования, измерения и сбор данных. Действительно, построить SCADA — систему в LabVIEW несколько проще чем при использовании «традиционных» средств разработки. В данной статье мне хотелось бы показать, что возможная область применения LabVIEW несколько шире. Это принципиально иной язык программирования, или если хотите целая «философия» программирования. Функциональный язык, заставляющий несколько иначе мыслить и порой предоставляющий совершенно фантастические возможности для разработчика. Является ли LabVIEW языком программирования вообще? Это спорный вопрос — здесь нет стандарта, как, например ANSI C. В узких кругах разработчиков мы говорим, что пишем на языке «G». Формально такого языка не существует, но в этом и заключается прелесть этого средства разработки: от версии к версии в язык вводятся всё новые конструкции. Сложно представить, что в следующей реинкарнации Си появится, например, новая структура для for-цикла. А в LabVIEW такое вполне возможно.
Впрочем надо заметить, что LabVIEW входит в рейтинг языков программирования TIOBE, занимая на данный момент тридцатое место — где-то между Прологом и Фортраном.

NI LabVIEW — история создания

Компания National Instruments была создана в 1976 году тремя основателями — Джеффом Кодоски (Jeff Kodosky), Джеймсом Тручардом (James Truchard) и Биллом Новлиным (Bill Nowlin) в американском городе Остин (Austin), штат Техас. Основной специализацией компании являлись инструментальные средства для измерений и автоматизация производства.
Первая версия LabVIEW увидела свет спустя десять лет после создания компании — в 1986 году (это была версия для Apple Mac). Инженеры NI решили бросить вызов «традиционным» языкам программирования и создали полностью графическую среду разработки. Основным идеологом графического подхода стал Джефф. Год за годом выпускались новые версии. Первой кроссплатформенной версией (включая Windows) была третья версия, выпущенная в 1993 году. Актуальной на данный момент является версия 8.6, вышедшая в прошлом году.

В Остине и по сегодняшний день располагается головной офис компании. Сегодня в компании работают почти четыре тысячи человек, а офисы находятся почти в сорока странах (есть также офис и в России)

Моё знакомство с LabVIEW

Моё знакомство с LabVIEW произошло почти десять лет назад. Я начал трудиться по новому контракту, и мой тогдашний шеф вручил мне пачку дисков со словами «теперь ты будешь работать на этом». Я установил LabVIEW (это была пятая версия), и поигравшись некоторое время заявил, что на ЭТОМ ничего серьёзного не сделать, уж лучше я «по старинке» на Delphi… На что он мне сказал — ты просто не распробовал. Поработай недельку-другую. Через некоторое время я пойму, что ни на чём другом, кроме LabVIEW, я уже писать не смогу. Я просто влюбился в этот язык, хотя это и не была «любовь с первого взгляда».

Вообще говоря, довольно сложно сравнивать графический и текстовый языки программирования. Это, пожалуй, сравнение из разряда «PC» против «MAC» или «Windows» против «Linux» — можно спорить сколько угодно, но спор абсолютно лишён смысла — каждая система имеет право на существование и у каждой найдутся как сторонники так и противники, кроме того у каждого продукта своя ниша. LabVIEW – всего лишь инструмент, хотя и весьма гибкий.

Так что же такое LabVIEW?

LabVIEW — это кроссплатформенная графическая среда разработки приложений. LabVIEW — в принципе универсальный язык программирования. И хотя этот продукт порой тесно связан с аппаратным обеспечением National Instruments, он тем не менее не связан с конкретной машиной. Существуют версии для Windows, Linux, MacOS. Исходные тексты переносимы, а программы будут выглядеть одинаково во всех системах. Код, сгенерированный LabVIEW также может быть также исполнен на Windows Mobile или PalmOS (справедливости ради надо отметить, что поддержка PalmOS прекращена, впрочем здесь сама Palm больше виновата). Этот язык может с успехом использоваться для создания больших систем, для обработки текстов, изображений и работы с базами данных.

LabVIEW — весьма высокоуровневый язык. Однако ничто не мешает включать «низкоуровневые» модули в LabVIEW-программы. Даже если вы хотите использовать ассемблерные вставки — это тоже возможно, надо лишь сгенерировать DLL и вставить вызовы в код. С другой стороны, высокоуровневый язык позволяет запросто производить весьма нетривиальные операции с данными, на которые в обычном языке могли уйти многие строки (если не десятки строк) кода. Впрочем, ради справедливости надо отметить, что некоторые операции низкоуровневых языков (например, работу с указателями), не так просто реализовать в LabVIEW ввиду его «высокоуровневости». Разумеется, язык LabVIEW включает основные конструкции управления, имеющие аналоги и в «традиционных» языках:

  • переменные (локальные или глобальные)
  • ветвление (case structure)
  • For – циклы с проверкой завершения и без.
  • While – циклы
  • Группировка операций.

LabVIEW – программа и возможности языка

В LabVIEW разрабатываемые программные модули называются «Virtual Instruments» (Виртуальные Инструменты) или по-простому VI. Они сохраняются в файлах с расширением *.vi. VIs – это кирпичики, из которых состоит LabVIEW – программа. Любая LabVIEW программа содержит как минимум один VI. В терминах языка Си можно достаточно смело провести аналогию с функцией с той лишь разницей, что в LabVIEW одна функция содержится в одном файле (можно также создавать библиотеки инструментов). Само собой разумеется, один VI может быть вызван из другого VI. В принципе каждый VI состоит из двух частей — Блок-Диаграмма (Block Diagram) и Передняя Панель (Front Panel). Блок-диаграмма — это программный код (точнее визуальное графическое представление кода), а Передняя панель — это интерфейс. Вот как выглядит классический пример Hello, World!:

Введение в виртуальные приборы labview

В основе LabVIEW лежит парадигма потоков данных. В вышеприведённом примере константа и терминал индикатора соединены между собой линией. Эта линия называется Wire. Можно назвать её «проводом». По проводам передаются данные от одних элементов другим. Вся эта концепция называется Data Flow. Суть Блок Диаграммы — это узлы (ноды), выходы одних узлов присоединены ко входам других узлов. Узел начнёт выполнение только тогда, когда прибудут все необходимые для работы данные. На диаграмме вверху две ноды. Одна из них — константа. Этот узел самодостаточен — он начинает выполнение немедленно. Второй узел — индикатор. Он отобразит данные, которые передаёт константа (но не сразу, а как только данные прибудут от константы).

Вот чуть более сложный пример: сложение и умножение двух чисел. В традиционных языках мы напишем что-то вроде

int a, b, sum, mul;
//.
sum = a + b;
mul = a * b;

Вот как это выглядит в LabVIEW:

Введение в виртуальные приборы labview

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

А вот как выглядят while / for циклы и if / then / else структура:

Введение в виртуальные приборы labview

Как уже упоминалось, все элементы будут выполняться параллельно. Вам не нужно задумываться о том, как распараллелить задачу на несколько потоков, которые можно выполнять параллельно на нескольких процессорах. В последних версиях можно даже явно указать на каком из процессоров должен выполняться тот или иной while-цикл. Сейчас существуют надстройки и для текстовых языков, позволяющие запросто добиться поддержки многопроцессорных систем, однако так просто, как на LabVIEW, это пожалуй нигде не реализовано. (ну вот, я всё же скатился на сравнение с текстовыми языками). Если уж мы заговорили о многопоточности, то надо также отметить, что в распоряжении разработчика богатый выбор инструментов для синхронизации потоков — семафоры, очереди, рандеву, и т.д.

LabVIEW включает в себя богатые наборы элементов для построения пользовательских интерфейсов. Уж на что быстро «набрасывались» интерфейсы в Дельфи, а в LabVIEW этот процесс происходит ещё стремительнее.

Введение в виртуальные приборы labview

Стандартная поставка LabVIEW включает в себя также блоки для работы с ini файлами, реестром, функции для работы с двоичными и тестовыми файлами, математические функции, мощные инструменты для построения графиков (а куда же без этого в лаборатории-то), а в дополнение к уже упомянутой возможности вызовов DLL, LabVIEW позволяет работать с ActiveX компонентами и .net. Начиная с восьмой версии в LabVIEW была добавлена поддержка классов — язык стал объектно-ориентированным. Реализованную поддержку нельзя назвать полной, однако основные черты объектно-ориентированных языков — наследование и полиморфизм присутствуют. Также функциональность языка можно расширить дополнительными модулями, например NI Vision Toolkit – для обработки изображений и машинного зрения и другие. А при помощи модуля Applcation Builder можно сгенерировать исполняемый exe-файл. С помощью Internet Toolkit можно работать с ftp серверами, c помощью Database Connectivity Toolkit — с базами данных и т.д.

Часто можно услышать мнение, что графический код плохо читаем. Действительно, с непривычки обилие иконок и проводников несколько шокирует. Также начинающие разработчики создают программы-«простыни» и программы-«спагетти». Однако опытный LabVIEW-разработчик никогда не создаст диаграмм, превышающих размер экрана, даже если программа состоит из сотен модулей. Хорошо разработанная программа фактически «самодокументируется», поскольку в основе уже лежит графическое представление.

Введение в виртуальные приборы labview

Довольно долгое время, программируя на LabVIEW, я пребывал в полной уверенности, что LabVIEW — это интерпретатор и блок-диаграммы постоянно интерпретируются ядром. После разговоров с инженерами NI выяснилось, что это не так. LabVIEW — это компилятор (качество кодогенерации, впрочем оставляет желать лучшего). Зато компиляция происходит «на лету» — в любой момент разработки программа всегда готова к запуску. Также LabVIEW-код может быть скомпилирован в полноценный исполнямый файл, который может быть запущен на компьютере без установленной LabVIEW (правда он требует LabVIEW Run-Time). Также можно собрать установочный пакет-инсталлятор, сторонних утилит типа InstallShield при этом не требуется.

Дальнейшее и более детальное описание возможностей пакета выходит за рамки данной статьи, я же просто предлагаю попробовать (ссылки даны ниже). Как говорили великие «… единственный способ освоить новый язык программирования — писать на нём программы». Ну а опытные программисты смогут экстраполировать полученные знания на свои собственные нужды.

Источник