Лаб вью. Различные приемы программирования в NI LabVIEW

Лаб вью. Различные приемы программирования в NI LabVIEW



NI LabVIEW - среда потокового графического программирования. При написании программы в LabVIEW, пользователь задает последовательность операций преобразования потока данных с помощью блок-диаграммы. На блок-диаграмме помещаются изображения функциональных узлов, соединенных проводниками, по которым поток данных переходит от одного узла к другому. Также, в LabVIEW имеется ряд инструментов, нарушающих парадигму потокового программирования, однако, позволяющих в значительной степени расширить функциональность разработанных в нем приложении.

Что такое прием программирования

Термин «прием программирования» объединяет в себе выбор различных языков программирования, вычислительных моделей, уровней абстракции, методов работы с кодом и представления алгоритмов. На протяжении многих лет National Instruments развивала функционал LabVIEW, чтобы обеспечить поддержку большего количество различных приемов программирования.


Вы можете представить на блок-диаграмме код, написанный с использованием разных приемов, так же как и потоковый код G, а LabVIEW скомпилирует инструкции для соответствующих целевых устройств (обычные настольные ПК, платформы с ОСРВ, ПЛИС, мобильные устройства, встраиваемые устройства на базе ARM)

Рис.1. Широкий спектр платформ и приемом программирования в LabVIEW



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

Программирование на языке G
Появление потокового программирования в 1986 действительно было инновационным. Последовательность выполнения операций с данными в языке G определяется не порядком их следования, а наличием данных на входах этих узлов. Операторы, не связанные потоком данных, выполняются параллельно в произвольном порядке.

Узлы диаграммы представляют собой простые инструкции или их наборы - функции, виртуальные приборы (ВП). Выполнение инструкций узла происходит только после того, как на всех входных терминалах узла появляются данные. После выполнения инструкций его результат передается через выходные терминалы узла на входы следующих узлов.


Рис.2. В этом примере происходит сложение A и B, умножение полученной суммы на C и отображение результата


На рис.2 представлен пример математического выражения на языке G. Диаграмма состоит из двух узлов (сложение и умножение) и трех входов (A, B и С). Вначале происходит сложение A и B. Код узла умножения не выполняется до тех пор, пока на оба его входные терминалы не поступят данные, а, следовательно, он ожидает результата выполнения узла сложения. Как только результат сложения поступит на первый вход узла умножения, его код (A+B)*C будет выполнен.

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

Интерактивная настройка как основа программирования
В 2003 году National Instruments выпустила NI LabVIEW 7 Express, в котором впервые появилась технология Экспрессных Виртуальных Приборов (экспресс-ВП) - технология, призванная еще больше упростить процесс разработки алгоритмов приложения. В отличие от обычных ВП, экспресс-ВП представляют собой абстрактные структуры языка, реализующие прием программирования, основанный на интерактивной настройке компонентов.


Рис.3. Палитра Экспресс-ВП, размещение Экспресс-ВП на блок-диаграмме и отображение Экспресс-ВП в режиме пиктограммы


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

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

Достаточно указать в настройках экспресс-ВП DAQ Assistance каналы чтения/записи и сконфигурировать такие параметры как частота дискретизации, шкалирование, синхронизация и триггеры. Кроме того, экспресс-ВП предоставляет возможность предварительно собрать данные с устройства для проверки правильности выбранных настроек сбора данных.


Рис.4. Экспресс-ВП DAQ Assistant Express VI значительно упрощает настройку синхронизации запуска и параметров каналов



Рис.5. Код на языке G, эквивалентный экспресс-ВП DAQ Assistant


Несмотря на все свои преимущества Экспресс-ВП не предоставляют возможности низкоуровневого управления и настройки режима работы с устройством, которое реализуется с помощью обычных виртуальных приборов. Пользователи, недавно познакомившиеся с LabVIEW, могут использовать встроенную функцию, преобразующую ранее настроенный экспресс-ВП в последовательность из обычных ВП. Это может помочь новичкам изучить низкоуровневый код. Достаточно выбрать строку Open Front Panel в контекстном меню экспресс-ВП на блок-диаграмме. Следует отметить, что любой экспресс-ВП может быть заменен комбинацией нескольких обычных ВП, к тому же, версия LabVIEW Professional Development System позволяет создавать собственные экспресс-ВП.

Поддержка сценариев.m файлов
С помощью модуля LabVIEW MathScript RT, вы можете импортировать, редактировать и выполнять сценарии *.m файлов, традиционно используемые в области математического моделирования и анализа, обработки сигналов и сложных математических вычислений. Вы можете использовать их совместно с кодом на языке G и создавать самостоятельные приложения для настольных ПК или оборудования, работающего в режиме реального времени.

Существует несколько способов работы с MathScript в LabVIEW. Для работы со сценариями в интерактивном режиме используется окно MathScript, показанное на рис. 6


Рис.6. Интерактивная разработка текстовых алгоритмом в окне MathScript


Чтобы использовать сценарии *.m в приложении LabVIEW и объединить возможности текстового и графического программирования, следует использовать узел MathScript, который изображен на рис.7. Использование узла MathScript позволяет внедрить текстовые алгоритмы в код ВП и использовать графические возможности интерфейса для управления параметрами сценария (кнопки, слайдеры, регуляторы, графики и прочие элементы).


Рис.7. Узел MathScript обеспечивает простое использование сценариев.m в коде на языке G


Модуль LabVIEW MathScript RT имеет собственный обработчик сценариев *.m и не требует установки стороннего программного обеспечения. Использование узла MathScript позволяет объединить в одном приложении преимущества текстовых алгоритмов, высокую степень интеграции LabVIEW с оборудованием, интерактивный интерфейс пользователя и прочие приемы программирования, рассматриваемые в этой статье.

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


Рис.8. Объектно-ориентированный поход основан на классах (пример на изображении) и связанных с ним свойствах и функциях ВП


Использование ООП в LabVIEW стало возможным начиная с версии 8.2

Основные преимущества этого подхода таковы:

  • . Инкапсуляция: Инкапсуляция - это объединение данных и методов в класс таким образом, что доступ к ним осуществляется только через ВП, которые являются членами класса. Такой подход позволяет обособить участки кода и гарантировать, что их изменение не повлияет на код остальной части программы.
  • . Наследование: Наследование позволяет использовать имеющиеся классы в качестве основы для описания новых классов. При создании нового класса, он наследует типы данных и ВП члены класса и, таким образом, реализует свойства и методы родительского класса. Также возможно добавить собственные ВП для изменения функциональности класса.
  • . Динамическая диспетчеризация: Определение методов возможно с помощью нескольких одноименных ВП в иерархии классов. Такой способ называется динамической диспетчеризацией, поскольку решение о том, какой именно ВП будет вызван принимается на этапе выполнения программы.
Эти особенности ООП позволяют сделать код более понятным и масштабируемым, а также, в случае необходимости, ограничить доступ к ВП.

Моделирование и имитация
Моделирование и имитация физических систем - популярный подход в разработке систем, которые описываются дифференциальными уравнениями. Изучение модели позволяет выявить характеристики динамических систем и разработать регулирующий узел с требуемым поведением.

На рис.9 представлен цикл Control & Simulation Loop, который осуществляет решение дифференциального уравнения с помощью алгоритмов, встроенных в LabVIEW, в режиме реального времени за определенный промежуток времени. Этот подход к программированию также основан на потоке данных, как и язык G, однако, обычно называется потоком сигналов. Как показано на рис.9, вы можете сочетать методы математического моделирования с другими методами, такими как потоки данных языка G и узел MathScript Node.


Рис. 9. На имитационной диаграмме показаны распространение сигнала, оборудование ввода/вывода и узел MathScript.


Цикл Control & Simulation Loop поддерживает функции, которые используются для реализации моделей линейных стационарных систем на устройствах с установленной ОС реального времени. Вы можете использовать эти функции для определения дискретных моделей путем задания передаточной функции, полюсно-нулевой диаграммы и системы дифференциальных уравнений. Средства анализа во временной и частотной областях, такие как функции «time-step response» или «Bode plot», позволяют вам интерактивно анализировать поведение открытых и замкнутых циклов управления/моделирования. Вы также можете использовать встроенные средства конвертации моделей, разработанных в среде программирования The MathWorks, Inc. Simulink®, что позволит использовать их в среде LabVIEW. Эти динамические системы могут быть установлены на устройства с ОС реального времени минуя различные этапы преобразования программы благодаря функциональности библиотеки LabVIEW Real-Time Module, которая отлично подходит для разработки прототипов систем управления и приложений программно-аппаратного моделирования.

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


Рис. 10. Модуль LabVIEW Statechart описывает систему на основе диаграммы состояний.


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

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

VHDL для ПЛИС
Модуль LabVIEW FPGA позволяет использовать язык G для написания кода для ПЛИС. Однако, как и в случае с другими методиками разработки, вы можете использовать написанный ранее код или просто иметь возможность выбора способа реализации программы. Большинство ПЛИС программируются с помощью языка текстового языка потокового программирования VHDL. Вместо того, чтобы переписывать уже имеющиеся IP-блоки на языке G, вы можете импортировать VHDL код с помощью узла Component-Level IP (CLIP). Обычно требуется наличие файла CLIP XML для настройки интерфейса между элементами блок-диаграммы, однако в LabVIEW имеется мастер импорта CLIP, позволяющий выполнить эту настройку автоматически. Он выводит перечень входов и выходов IP-блока, которые можно перетащить с помощью мыши на блок-диаграмму и использовать в работе приложения, как показано на рис. 11.


Рис. 11. Узел CLIP.


Поскольку NI использует ПЛИС Xilinix и набор программных инструментов Xilinx в модуле LabVIEW FPGA, вы можете использовать генератор ядер Xilinx для создания совместимого ядра. Вы также можете использовать набор разработчика Xilinx Embedded для создания любого программного микропроцессора. И, наконец, множество сторонних разработчиков предоставляют различные типы IP-блоков для управления шинами, обработки сигналов и специфических ядер.

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

Узел Inline C Node похож на узел Formula Node и предоставляет дополнительные возможности низкоуровневого программирования и поддержку файлов заголовков без лишних накладных расходов на вызовы процедур. Вы можете использовать узел Inline C Node для встраивания любого кода на языке C, включая операторы #defines, которые синтаксически заключены в округлые скобки в коде C.

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

Для решение этих задач LabVIEW предоставляет широкий спектр различных инструментов. Во-первых, LabVIEW может осуществлять вызов функций библиотеки DLL, а также задействовать интерфейсы ActiveX и.NET.

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

В случае, если у вас есть исходный код C, который вы хотите использовать в своем приложении на LabVIEW, вы можете скомпилировать библиотеку DLL и подключить ее с помощью узла Call Library Function. К примеру, вы можете организовать параллельные вычисления с помощью алгоритмов, написанных на C, в то время как управлением параллельно выполняющимися потоками будет заниматься программа, написанная на LabVIEW. Для упрощения работы с внешними библиотеками в LabVIEW есть мастер импорта (Import Shared Library Wizard), который позволяет автоматически создать или обновить враппер для вызова соответствующих библиотек (Windows .dll файл, Mac OS .framework файл или Linux .so файл).

Также, с помощью System Exec.vi, можно использовать интерфейс командной строки операционной системы.

Комбинация нескольких приемов программирования в одной среде разработки дает возможность повторно использовать алгоритмы, разработанные на других языках. Кроме того, разработчик может сочетать в одном приложении высокоуровневые и низкоуровневые операции, делая код более гибким и наглядным. Различные уровни абстракции позволяют представить сложные алгоритмы в наглядном виде, и в то же время сохраняется возможность контроля приложения и оборудования на низком уровне. Благодаря тесной интеграции с оборудованием, вы можете использовать оба подхода для работы с сигналами на платформах с многоядерными процессорами, ПЛИС и процессорами встраиваемых систем.

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

Simulink® - зарегистрированная торговая марка компании The MathWorks, Inc.

ARM, Keil, и µVision торговые марки и зарегистрированные торговые марки ARM Ltd or its subsidiaries.



Здравствуйте, коллеги!

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

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

LabVIEW - это один из основных продуктов компании National Instruments . Прежде всего надо отметить, что LabVIEW - это аббревиатура, которая расшифровывается как Lab oratory V irtual I nstrumentation E ngineering W orkbench. Уже в названии прослеживается ориентация на лабораторные исследования, измерения и сбор данных. Действительно, построить 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 лежит парадигма потоков данных. В вышеприведённом примере константа и терминал индикатора соединены между собой линией. Эта линия называется Wire. Можно назвать её «проводом». По проводам передаются данные от одних элементов другим. Вся эта концепция называется Data Flow. Суть Блок Диаграммы - это узлы (ноды), выходы одних узлов присоединены ко входам других узлов. Узел начнёт выполнение только тогда, когда прибудут все необходимые для работы данные. На диаграмме вверху две ноды. Одна из них - константа. Этот узел самодостаточен - он начинает выполнение немедленно. Второй узел - индикатор. Он отобразит данные, которые передаёт константа (но не сразу, а как только данные прибудут от константы).

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

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

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

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

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

Как уже упоминалось, все элементы будут выполняться параллельно. Вам не нужно задумываться о том, как распараллелить задачу на несколько потоков, которые можно выполнять параллельно на нескольких процессорах. В последних версиях можно даже явно указать на каком из процессоров должен выполняться тот или иной while-цикл. Сейчас существуют надстройки и для текстовых языков, позволяющие запросто добиться поддержки многопроцессорных систем, однако так просто, как на 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 - это интерпретатор и блок-диаграммы постоянно интерпретируются ядром. После разговоров с инженерами NI выяснилось, что это не так. LabVIEW - это компилятор (качество кодогенерации, впрочем оставляет желать лучшего). Зато компиляция происходит «на лету» - в любой момент разработки программа всегда готова к запуску. Также LabVIEW-код может быть скомпилирован в полноценный исполнямый файл, который может быть запущен на компьютере без установленной LabVIEW (правда он требует LabVIEW Run-Time). Также можно собрать установочный пакет-инсталлятор, сторонних утилит типа InstallShield при этом не требуется.

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

Практически у всех разработчиков устройств на микроконтроллерах, будь то любители или профессионалы, рано или поздно возникает необходимость подключить микроконтроллерный девайс к его «старшему брату», а именно к PC. Вот тогда и встает вопрос, а какой софт использовать для обмена с микроконтроллером, анализировать и обрабатывать полученные от него данные? Часто для обмена МК с компьютером используют интерфейс и протокол RS232 — старый добрый COM порт в той или иной реализации.

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

Некоторые пишут подобное ПО самостоятельно на каком либо языке программирования (Delphi, C++), наделяя необходимым функционалом. Но эта задача не из легких, нужно знать, помимо самого языка, устройство операционной системы, способы работы с комуникационными портами, множество других технических тонкостей, которые отвлекают от главного — реализации алгоритма программы. В общем, быть попутно еще Windows/Unix программистом.

На фоне этих подходов резко отличается концепция виртуальных приборов (vi). В этой статье пойдет речь о программном продукте LabView фирмы Nationals Instruments. Я только начинаю осваивать этот замечательный продукт, поэтому могу допускать неточности и ошибки. Спецы поправят:-)) Собственно что такое LabView?

LabView — это среда разработки и платформа для выполнения программ, созданных на графическом языке программирования «G» фирмы National Instruments.

Говоря простым языком, LabView — Это среда создания приложений для задач сбора, обработки, визуализации информации от различных приборов, лабораторных установок и т.п. А также для управления технологическими процессами и устройствами. Однако с помощью LabView можно создавать вполне себе обычное прикладное ПО. У меня нет цели подробно описывать этот продукт и работу с ним. По LabView написаны тысячи страниц отличной документации и сотни книг. В интернете полно ресурсов, посвященных LabView, на которых можно получить ответы на все вопросы.

Цель статьи — показать насколько просто и удобно, по сравнению с традиционным программированием, можно создавать приложения для ПК и какую мощь несет в себе LabView. (На самом деле спорно, т.к. в традиционном программировании, на той же Delphi сделать не сложней. И по эффективности вряд ли хуже, если не лучше. Но для этого дельфу надо гораздо дольше изучать. Тут же все быстро и понятно почти сразу. Пару методичек проштудировал и вперед городить циферблаты всякие. Так что для программистов оно как собаке пятая нога, а вот таким далеким от компа товарищам как я — самое то. Я когда то, за полчаса, впервые увидев LabView, по тоненькой методичке сваял зверскую систему управления поливом и отоплением для конопляной теплицы. С ПИД регуляторами всякими. Вывел на потенциометры и датчики лабораторного стенда, что стоял в нашем технаре и запустил этот адский агрегат. Причем все заработало сразу, без отладки. Кстати, на LabView работает вся аппаратура адронного коллайдера, а также очень много научной аппаратуры. прим. DI HALT) Ведь большинству электронщиков чуждо программирование для PC, верно? Вот это мы и попробуем исправить. Дабы не изучать сферических вакуумных коней, поставим для себя и реализуем простенькую задачу. Задача действительно проста, но на основе нее можно понять основные принципы программирования в LabView. Мы будем использовать LabView версии 2010. Для других версий отличия будут минимальны.

Задача
У нас есть плата с микроконтроллером AVR, соединенная с компьютером по RS232. В контроллер залита прошивка, согласно которой контроллер измеряет значение напряжения на одном из входов АЦП, и передает код АЦП (от 0 до 1023) в компьютер по последовательному каналу. Необходимо написать программу для ПК, которая будет принимать поток данных от АЦП, отображать код АЦП, преобразовывать код АЦП в значение напряжения в вольтах, отображать значение напряжения в вольтах, строить график изменения напряжения во времени.

Ну наверное хватит лирики, начнем пожалуй!

Итак что нам потребуется для работы:

  • Собственно сама LabView. Можно скачать с сайта NI триал версию: http://www.ni.com/trylabview/. Также без проблем нагугливается пиратская версия. Кстати, на rutracker.org, помимо прорвы пиратских, лежит и версия под Linux на которую регистрация вроде как не требуется вообще. NI решила пойти навстречу опенсорцу?
  • Также обязательно необходимо скачать компонент NI VISA. Без этой программы LabView не «увидит» COM порт на компьютере. VISA содержит в себе функции для работы с комуникационными портами и много чего еще. Скачать ее можно с joule.ni.com . Устанавливаем LabView и VISA. Установка этого ПО стандартная, каких либо особенностей не имеет.

Первым делом нам нужно убедится, что VISA нашла в системе COM порт и корректно с ним работает. Проверить это можно так: запускаем программу Measurement & Automation. Она ставится вместе с LabView. Если она не установилась, установить можно вручную. На диске (образе с LabView она есть).

Получаем вот такую штуку:


Итак что мы имеем. Рабочая область состоит из двух больших панелей Front Panel и Block Diagram. На лицевой панели мы будем составлять интерфейс нашей программы, используя элементы управления с панели Controls. Эти элементы представляют собой привычные нам ручки переменных резисторов, светодиоды, кнопки, стрелочные приборы, экран осциллографа и т.п. Они служат для ввода информации в программу и отображения результатов выполнения. На панели Block Diagram распологается непосредственно программный код. Тут надо немного отступить и пояснить принцип программирования на LabView. Небольшой пример. Принято работу над прогой начинать с оформления интерфейса, а затем реализации алгоритма работы на блок-диаграмме. Сделаем простейшую прогу умножения двух чисел. Для этого разместим на лицевой панели путем перетаскивания три элемента управления, скажем элементы Knob и Numeric Indicator для отображения результата.

Ок, теперь нам необходимо реализовать собственно умножение. Переходим на панель Block diagram и видим что для каждого из наших контролов создался соответствующий значек. Лучше всего сразу перевести режим отображения в виде терминалов. Не будет так загромождаться диаграмма. Кроме того в терминалах виден тип данных, которыми оперирует тот или иной контрол. Для этого щелкаем ПКМ по значку и снимаем галку View as icon. Вверху на скрине контрол в виде терминала, внизу и справа в виде иконки. Для того чтобы настроить вид на блок-диаграмме в виде терминалов по умолчанию, нужно выбрать пункт меню Tools->Options, слева выбрать Block diagram и снять галку Place front panel terminals as icons. Очень полезно вывести контекстной справки. Вывести его можно комбинацией Ctrl+H. В этом окошке отображается информация о объекте на котором в данный момент налодится курсор. Мега удобная вещь.

Важнейшей концепцией программирования на LabView является концепция потоков данных DataFlow. Суть такова: В отличие от императивных языков программирования, где операторы выполняются в порядке следования, в LabView функции работают только если на всех входах функции есть информация (каждая функция имеет входные и выходные значения). Только тогда функция реализует свой алгоритм, а результат направляет на выход, который может быть использован другой функцией. Таким образом в пределах одного виртуального прибора функции могут работать независимо друг от друга.

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

Для соединения элементов на блок-диаграмме используется инструмент Connect Wire с панели Tools. Выбираем его и рисуем наши соединения.

Как видно, ничего сложного вроде бы нет. Но в то же время LabView позволяет решать задачи любой сложности! Епт, система управления БАК на нем сделана! Так то.

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

Итак, что нам необходимо сделать. Сначала нужно настроить и проинициализировать последовательный порт. Запустить бесконечный цикл. В цикле мы используем функцию чтения из порта и принимаем информацию. Преобразуем инфу для отображения на графике, пересчитываем код АЦП в значение напряжения в вольтах. При выходе из цикла закрываем порт.
Так в интерфейсе нашей проги не будет никаких управляющих элементов кроме кнопки Стоп, а будет лишь отображение результата, мы поступим так: сначала создадим блок-диаграмму, а потом добавим недостающие элементы на лицевую панель. Хотя делать нужно наоборот! Но в данном случае так удобнее.

На панели блок-диаграммы помещаем из палитры Structures элемент While Loop, это наш бесконечный цикл. Обводим рамкой цикла область, достаточную для размещения внутри алгоритма. В правом нижнем углу есть красная точка, щелкнем по ней ПКМ и выберем Create Control. На лицевой панели у нас тут же появится кнопка Stop. При щелчке на ней наша прога завершится.

Нужно создать контролы для функции инициализации порта. Нам вполне хватит двух — скорость порта и имя порта. Точно так же как мы создавали константу для функции чтения, создаем контролы. ПКМ на нужных входах функции инициализации и пункт

Create->Control.

Create->Control.

Нас интересуют два входа: Visa resourse name и Baud Rate (по умолчанию 9600). Таперь перейдем на лицевую панель и добавим необходимые компоненты, а именно экран отрисовки графика и метки для отображения кода АЦП и напряжения в вольтах.
Соответственно это элементы Waweform Chart c палитры Graph и два элемента Numeric Indicator с палитры Numeric.

Вернемся к блок-диаграмме и переместим появившиеся элементы внутрь цикла. Мы близимся к завершению! Единственное, нам нужно еще преобразовать строку символов, поступающих с выхода функции Read к формату, который переварят наши индикаторы. И еще реализовать простейшую математику по переводу кода АЦП в вольты. Ниже скрины лицевой панели и блок-диаграммы на данном этапе:



Для преобразования строки мы воспользуемся функцией Scan from string из палитры String. Помещаем ее внутрь цикла. Теперь математика. Для того чтобы преобразовать код АЦП в значение напряжения в вольтах нужно умножить код на величину опорного напряжения (в моем случае это пять вольт) и получившееся значение разделить на 1023 (так как АЦП имеет разрядность 10 бит). Необходимые функции умножения и деления, а также константы (5 и 1023) разместим в цикле. Скрины каждого соединения делать не буду, ибо и так картинок дофига. Приведу финальный скрин всех соединений. Там все предельно просто.


Я думаю все понятно, если будут вопросы спрашивайте в каментах. Вместе разберемся:-))) Тем временем прога готова.

Перейдем к нашему интерфейсу и немного настроим график. Выделим нижнее значение по оси Y и поставим 0. Выделем верхнее и поставим 5. Таким образом наша шкала по оси Y в диапазоне 0-5 вольт. Ну что, выбираем COM порт, вводим скорость обмена, запускаем по кнопке со стрелкой нашу прогу и яростно крутим резистор на плате, невозбранно наблюдая при этом на экране результат нашего труда. Щелкаем на кнопке Stop чтобы остановить прогу.

А еще можно куски объединять в функциональные блоки, чтобы они не загромождали схему.

Практически у всех разработчиков устройств на микроконтроллерах, будь то любители или профессионалы, рано или поздно возникает необходимость подключить микроконтроллерный девайс к его “старшему брату”, а именно к PC. Вот тогда и встает вопрос, а какой софт использовать для обмена с микроконтроллером, анализировать и обрабатывать полученные от него данные? Часто для обмена МК с компьютером используют интерфейс и протокол RS232 - старый добрый COM порт в той или иной реализации.

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

Некоторые пишут подобное ПО самостоятельно на каком либо языке программирования (Delphi, C++), наделяя необходимым функционалом. Но эта задача не из легких, нужно знать, помимо самого языка, устройство операционной системы, способы работы с комуникационными портами, множество других технических тонкостей, которые отвлекают от главного - реализации алгоритма программы. В общем, быть попутно еще Windows/Unix программистом.

На фоне этих подходов резко отличается концепция виртуальных приборов (vi). В этой статье пойдет речь о программном продукте LabView фирмы Nationals Instruments. Я только начинаю осваивать этот замечательный продукт, поэтому могу допускать неточности и ошибки. Спецы поправят:-)) Собственно что такое LabView?

LabView - это среда разработки и платформа для выполнения программ, созданных на графическом языке программирования «G» фирмы National Instruments.

Говоря простым языком, LabView - Это среда создания приложений для задач сбора, обработки, визуализации информации от различных приборов, лабораторных установок и т.п. А также для управления технологическими процессами и устройствами. Однако с помощью LabView можно создавать вполне себе обычное прикладное ПО. У меня нет цели подробно описывать этот продукт и работу с ним. По LabView написаны тысячи страниц отличной документации и сотни книг. В интернете полно ресурсов, посвященных LabView, на которых можно получить ответы на все вопросы.

Цель статьи - показать насколько просто и удобно, по сравнению с традиционным программированием, можно создавать приложения для ПК и какую мощь несет в себе LabView. (На самом деле спорно, т.к. в традиционном программировании, на той же Delphi сделать не сложней. И по эффективности вряд ли хуже, если не лучше. Но для этого дельфу надо гораздо дольше изучать. Тут же все быстро и понятно почти сразу. Пару методичек проштудировал и вперед городить циферблаты всякие. Так что для программистов оно как собаке пятая нога, а вот таким далеким от компа товарищам как я - самое то. Я когда то, за полчаса, впервые увидев LabView, по тоненькой методичке сваял зверскую систему управления поливом и отоплением для конопляной теплицы. С ПИД регуляторами всякими. Вывел на потенциометры и датчики лабораторного стенда, что стоял в нашем технаре и запустил этот адский агрегат. Причем все заработало сразу, без отладки. Кстати, на LabView работает вся аппаратура адронного коллайдера, а также очень много научной аппаратуры. прим. DI HALT) Ведь большинству электронщиков чуждо программирование для PC, верно? Вот это мы и попробуем исправить. Дабы не изучать сферических вакуумных коней, поставим для себя и реализуем простенькую задачу. Задача действительно проста, но на основе нее можно понять основные принципы программирования в LabView. Мы будем использовать LabView версии 2010. Для других версий отличия будут минимальны.

Задача
У нас есть плата с микроконтроллером AVR, соединенная с компьютером по RS232. В контроллер залита прошивка, согласно которой контроллер измеряет значение напряжения на одном из входов АЦП, и передает код АЦП (от 0 до 1023) в компьютер по последовательному каналу. Необходимо написать программу для ПК, которая будет принимать поток данных от АЦП, отображать код АЦП, преобразовывать код АЦП в значение напряжения в вольтах, отображать значение напряжения в вольтах, строить график изменения напряжения во времени.

Ну наверное хватит лирики, начнем пожалуй!

Итак что нам потребуется для работы:

  • Собственно сама LabView. Можно скачать с сайта NI триал версию: http://www.ni.com/trylabview/. Также без проблем нагугливается пиратская версия. Кстати, на rutracker.org, помимо прорвы пиратских, лежит и версия под Linux на которую регистрация вроде как не требуется вообще. NI решила пойти навстречу опенсорцу?
  • Также обязательно необходимо скачать компонент NI VISA. Без этой программы LabView не “увидит” COM порт на компьютере. VISA содержит в себе функции для работы с комуникационными портами и много чего еще. Скачать ее можно с joule.ni.com . Устанавливаем LabView и VISA. Установка этого ПО стандартная, каких либо особенностей не имеет.

Первым делом нам нужно убедится, что VISA нашла в системе COM порт и корректно с ним работает. Проверить это можно так: запускаем программу Measurement & Automation. Она ставится вместе с LabView. Если она не установилась, установить можно вручную. На диске (образе с LabView она есть).

В левой части окна мы видим оборудование, обнаруженное в системе. Среди всего прочего находим наш COM порт. Справа есть кнопка Open Visa test panel. С помощью нее можно протестировать выбранное устройство. В случае с COM портом там можно отправить или принять заданную по умолчанию или произвольную последовательность символов. Если с портом все в порядке, можно приступать к непосредственно созданию нашей программы.

Запускаем LabView. В окне Getting Started выбираем пункт Blank Vi, тобишь новый виртуальный прибор.

Получаем вот такую штуку:

Итак что мы имеем. Рабочая область состоит из двух больших панелей Front Panel и Block Diagram. На лицевой панели мы будем составлять интерфейс нашей программы, используя элементы управления с панели Controls. Эти элементы представляют собой привычные нам ручки переменных резисторов, светодиоды, кнопки, стрелочные приборы, экран осциллографа и т.п. Они служат для ввода информации в программу и отображения результатов выполнения. На панели Block Diagram распологается непосредственно программный код. Тут надо немного отступить и пояснить принцип программирования на LabView. Небольшой пример. Принято работу над прогой начинать с оформления интерфейса, а затем реализации алгоритма работы на блок-диаграмме. Сделаем простейшую прогу умножения двух чисел. Для этого разместим на лицевой панели путем перетаскивания три элемента управления, скажем элементы Knob и Numeric Indicator для отображения результата.

Сформируем интерфейс как душа пожелает, например вот так:

Ок, теперь нам необходимо реализовать собственно умножение. Переходим на панель Block diagram и видим что для каждого из наших контролов создался соответствующий значек. Лучше всего сразу перевести режим отображения в виде терминалов. Не будет так загромождаться диаграмма. Кроме того в терминалах виден тип данных, которыми оперирует тот или иной контрол. Для этого щелкаем ПКМ по значку и снимаем галку View as icon. Вверху на скрине контрол в виде терминала, внизу и справа в виде иконки. Для того чтобы настроить вид на блок-диаграмме в виде терминалов по умолчанию, нужно выбрать пункт меню Tools->Options, слева выбрать Block diagram и снять галку Place front panel terminals as icons. Очень полезно вывести контекстной справки. Вывести его можно комбинацией Ctrl+H. В этом окошке отображается информация о объекте на котором в данный момент налодится курсор. Мега удобная вещь.

Теперь нужно добавить на блок-диаграмму функцию умножения. Щелкаем ПКМ на блок-диаграмме и из палитры Numeric выбираем функцию умножения Multiply. Преносим ее на диаграмму. Стоит заметить, что LabView имеет просто огромный набор функций. Это и различная математика, статистика, анализ сигналов, PID регулирование, обработка видео, звука и изображений. Всего не перечислишь.

Важнейшей концепцией программирования на LabView является концепция потоков данных DataFlow. Суть такова: В отличие от императивных языков программирования, где операторы выполняются в порядке следования, в LabView функции работают только если на всех входах функции есть информация (каждая функция имеет входные и выходные значения). Только тогда функция реализует свой алгоритм, а результат направляет на выход, который может быть использован другой функцией. Таким образом в пределах одного виртуального прибора функции могут работать независимо друг от друга.

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

Для соединения элементов на блок-диаграмме используется инструмент Connect Wire с панели Tools. Выбираем его и рисуем наши соединения.

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

Как видно, ничего сложного вроде бы нет. Но в то же время LabView позволяет решать задачи любой сложности! Епт, система управления БАК на нем сделана! Так то.

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

Итак, что нам необходимо сделать. Сначала нужно настроить и проинициализировать последовательный порт. Запустить бесконечный цикл. В цикле мы используем функцию чтения из порта и принимаем информацию. Преобразуем инфу для отображения на графике, пересчитываем код АЦП в значение напряжения в вольтах. При выходе из цикла закрываем порт.
Так в интерфейсе нашей проги не будет никаких управляющих элементов кроме кнопки Стоп, а будет лишь отображение результата, мы поступим так: сначала создадим блок-диаграмму, а потом добавим недостающие элементы на лицевую панель. Хотя делать нужно наоборот! Но в данном случае так удобнее.

На панели блок-диаграммы помещаем из палитры Structures элемент While Loop, это наш бесконечный цикл. Обводим рамкой цикла область, достаточную для размещения внутри алгоритма. В правом нижнем углу есть красная точка, щелкнем по ней ПКМ и выберем Create Control. На лицевой панели у нас тут же появится кнопка Stop. При щелчке на ней наша прога завершится.

Теперь вне цикла мы должны разместить функции инициализации и закрытия порта. Слева инициализация, справа закрытие. Опять же щелкаем ПКМ и выбираем функции Configure Port, Read и Close. Эти функции находятся в палитре Instrument I/O –> Serial. Функцию чтения помещаем внутрь цикла. Соединяем с помощью катушки с проводами выходы и входы функций. Для функции Read мы должны задать количество байт, которая она будет принимать. Щелкаем ПКМ на среднем входе функции Read и выбираем Create->Constant, вводим значение, например 200. На данном этапе должно получится как на скрине.

Нужно создать контролы для функции инициализации порта. Нам вполне хватит двух - скорость порта и имя порта. Точно так же как мы создавали константу для функции чтения, создаем контролы. ПКМ на нужных входах функции инициализации и пункт

Create- >Control.

Нас интересуют два входа: Visa resourse name и Baud Rate (по умолчанию 9600). Таперь перейдем на лицевую панель и добавим необходимые компоненты, а именно экран отрисовки графика и метки для отображения кода АЦП и напряжения в вольтах.
Соответственно это элементы Waweform Chart c палитры Graph и два элемента Numeric Indicator с палитры Numeric.

Вернемся к блок-диаграмме и переместим появившиеся элементы внутрь цикла. Мы близимся к завершению! Единственное, нам нужно еще преобразовать строку символов, поступающих с выхода функции Read к формату, который переварят наши индикаторы. И еще реализовать простейшую математику по переводу кода АЦП в вольты. Ниже скрины лицевой панели и блок-диаграммы на данном этапе:

Для преобразования строки мы воспользуемся функцией Scan from string из палитры String. Помещаем ее внутрь цикла. Теперь математика. Для того чтобы преобразовать код АЦП в значение напряжения в вольтах нужно умножить код на величину опорного напряжения (в моем случае это пять вольт) и получившееся значение разделить на 1023 (так как АЦП имеет разрядность 10 бит). Необходимые функции умножения и деления, а также константы (5 и 1023) разместим в цикле. Скрины каждого соединения делать не буду, ибо и так картинок дофига. Приведу финальный скрин всех соединений. Там все предельно просто.

Я думаю все понятно, если будут вопросы спрашивайте в каментах. Вместе разберемся:-))) Тем временем прога готова.

Перейдем к нашему интерфейсу и немного настроим график. Выделим нижнее значение по оси Y и поставим 0. Выделем верхнее и поставим 5. Таким образом наша шкала по оси Y в диапазоне 0-5 вольт. Ну что, выбираем COM порт, вводим скорость обмена, запускаем по кнопке со стрелкой нашу прогу и яростно крутим резистор на плате, невозбранно наблюдая при этом на экране результат нашего труда. Щелкаем на кнопке Stop чтобы остановить прогу.

Как видите все достаточно просто. Данный пример это лишь мизерная часть всех возможностей LabView. Если кому поможет данная статья, буду рад. Только в коментах сильно не бейте я же не профи. Еще один маленький трюк. Если диаграмма стала похожа на Ктулху, можно попробовать воспользоваться кнопкой CleanUp Diagram. Она приведет диаграмму в более-менее божеский вид, но пользоваться надо осторожно. Вот результат ее работы

А еще можно куски объединять в функциональные блоки, чтобы они не загромождали схему.

Здравствуйте, коллеги!

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

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

LabVIEW - это один из основных продуктов компании National Instruments . Прежде всего надо отметить, что LabVIEW - это аббревиатура, которая расшифровывается как Lab oratory V irtual I nstrumentation E ngineering W orkbench. Уже в названии прослеживается ориентация на лабораторные исследования, измерения и сбор данных. Действительно, построить 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 лежит парадигма потоков данных. В вышеприведённом примере константа и терминал индикатора соединены между собой линией. Эта линия называется Wire. Можно назвать её «проводом». По проводам передаются данные от одних элементов другим. Вся эта концепция называется Data Flow. Суть Блок Диаграммы - это узлы (ноды), выходы одних узлов присоединены ко входам других узлов. Узел начнёт выполнение только тогда, когда прибудут все необходимые для работы данные. На диаграмме вверху две ноды. Одна из них - константа. Этот узел самодостаточен - он начинает выполнение немедленно. Второй узел - индикатор. Он отобразит данные, которые передаёт константа (но не сразу, а как только данные прибудут от константы).

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

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

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

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

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

Как уже упоминалось, все элементы будут выполняться параллельно. Вам не нужно задумываться о том, как распараллелить задачу на несколько потоков, которые можно выполнять параллельно на нескольких процессорах. В последних версиях можно даже явно указать на каком из процессоров должен выполняться тот или иной while-цикл. Сейчас существуют надстройки и для текстовых языков, позволяющие запросто добиться поддержки многопроцессорных систем, однако так просто, как на 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 - это интерпретатор и блок-диаграммы постоянно интерпретируются ядром. После разговоров с инженерами NI выяснилось, что это не так. LabVIEW - это компилятор (качество кодогенерации, впрочем оставляет желать лучшего). Зато компиляция происходит «на лету» - в любой момент разработки программа всегда готова к запуску. Также LabVIEW-код может быть скомпилирован в полноценный исполнямый файл, который может быть запущен на компьютере без установленной LabVIEW (правда он требует LabVIEW Run-Time). Также можно собрать установочный пакет-инсталлятор, сторонних утилит типа InstallShield при этом не требуется.

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

просмотров