Event structure labview пример

LabVIEW — графичексое программирование

Событие (Event Structure)

Структура Событие (Event Structure) имеет одну или более поддиаграмм или вариантов событий, из которых только один выполняется при обращении к структуре.

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

Overview

Table of Contents

1. Procedural-Driven and Event-Driven Architectures

Events are caused by actions the user performs. For example, clicking the mouse generates a mouse event, pressing a key on the keyboard generates a keyboard event, and so on. When a system event occurs, the operating system is responsible for identifying and responding to the event. Different operating systems implement this process in various ways. However, all operating systems respond to the system event by broadcasting a system event message. Any application running on the system can react to the system event by executing code written for that specific system event.

In procedural-driven or top-down architectures, the application executes a set of instructions in a specified sequence to perform a task. The structure and sequence of the program, not user actions, control the execution order of a procedural-driven application. The program execution begins in main and then flows through method calls and control statements in a fairly predictable manner.

In an event-driven program, the program first waits for events to occur, responds to those events, then returns to waiting for the next event. How the program responds depends on the code written for that specific event. The order in which an event-driven program executes depends on which events occur and on the order in which those events occur. While the program waits for the next event, it frees up CPU resources that might be used to perform other processing tasks.

2. Using Events in LabVIEW

In LabVIEW, you can use the Event structure to handle events in an application. As with a Case structure, you can add multiple cases to the Event structure. You can then configure those cases to handle one or more events. When those events occur, LabVIEW executes the corresponding case. The following block diagram shows an example Event structure.

You configure events by right-clicking the Event structure border and selecting Edit Events Handled by This Case from the shortcut menu. Use the Edit Events dialog box that appears to edit single or multiple cases.

Using the Event structure minimizes the CPU usage because the VI no longer must continually poll the front panel for changes. In contrast to polling, the Event structure does not lose user events because the structure uses an event queue to store user events and handle the user events in the order in which they occur.

3. Types of Events

A given event can either be static or dynamic and a static event can be either a notify event or a filter event. Static events are only for interactions with the front panel. Static, notify events are the most common and only react to what has occurred on the front panel. An example for a static, notify event would be a “Value Change” for an OK button. Static, filter events catch an event performed by the user before LabVIEW processes that event. The code within the Event Structure can then decide if that event should be processed or not. An example of a filter even would be a “Panel Close?” for the user clicking the close on the front panel. In the Edit Events window, filters have red arrows and notifies have green arrows.

There are times when you want to include events that don’t occur on the front panel. This is when you need to register a dynamic event. Using dynamic events will allow your Event Structure to react to code happening anywhere on your block diagram. An example of all these events is attached to this webpage.

Customer Reviews

x>y dispalys erroneous results after first event — 30.11.2012

By Rand Olmsted, SoundOff Signal.

Given that the x>y LED indicator is inside the User Event structure the event should always fire from the Randnum loop. If it does not then x>y indicates always true after the first time the event fires. Leave Generate User Event in the loop with no condition. Move the case statement to the event structure. Problem solved. Better yet, do away with the popup. The LED switching is sufficient. I received a call while this VI was running and by the time I got done I had to click Ok 20 times.

By Mike Maher, NOAA.

Agree with the other comments. It would be nice if this articled linked to a tutorial on event structures, which I’ve been looking for now for some time.

definately need a good tutorial — 18.04.2008

By sydney faria, Pratt & Whitney Aircraft Corp.

Having just started using LabVIEW 8.5 and needing to make a popup window activated from a mouse event such as dbl click, then figuring out which controI in an array of controls the mouse was over in the original window in my ultimate goal after figuring out the event mechanism.

Two Thumbs Up! — 17.04.2008

Conveys information to the point. The VI provided is also used in some of NI’s tutorial classes.

Detailed examples are needed — 01.02.2006

By Patrick Allen, Patrick Allen.

I really want to make use of this structure. But I’m having a difficult time fully understanding it. More info and downloads are needed.

Needs MUCH more info — 22.06.2004

This isn’t a tutorial, it’s a brief description of event programming. I wthink it would be much more useful for an actual tutorial. For example, make a simple VI with a controller that will do one event if the input control goes above a certain value, do another event if the input control goes below a certain value, and does another event if the user tries to close the window. This would actually show how to make a VI with different types of events work in parallel.

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

Типы данных
В LabVIEW имеет богатый набор типов данных разделим их для простоты на группы:

  • Логический — классический тип Bool, принимает два значения — Истина (True) или Ложно (False), Отображаются на БД зеленым цветом.
  • Целочисленные — делятся на знаковые ( I8, I16, I32, I64) и беззнаковое (U8, U16, U32, U64). Цифра после буквы, это число бит которые занимает тип. Отображаются на БД синим цветом.
  • Числа с плавающей точкой — делятся на по точности представления (а значит и количеству битов) на расширенной, двойной, одинарной точности и тип называемый Fixet-Point, в котором можно задать нужную точность для дробной и целой части. Отображаются на БД оранжевым цветом, а Fixet-Point серым
  • Комплексные числа — числа с мнимой единицей, также делятся на по точности представления. Отображаются на БД оранжевым цветом.
  • Строковые — очень часто применяемый тип данных, замечу что символ и строка в LabVIEW понятия тождественны, точнее символов в принципе и нет. Отображаются на БД розовым цветом.
  • Массивы — тип, который представляет из себя объединение одинаковый типов. Отображаются на БД тем цветом элементами которого образован, но более толстыми линиями. Если же размерность массива двойная (массив из массивов) или тройная, то отображается двойной или тройной линией цветом элементов.
  • Кластеры — тип, который представляет из себя объединение разных типов. Если элементы кластера относятся к разным видом типов, то он отображается толстой розовой линией. Если образован только целочисленными и/или числами с плавающей точкой то толстой темно оранжевой линией(см.рис.).
  • Variant — особый тип, к которому можно привести любой другой тип. Используется для взаимодействия с компонентами ActiveX, .NET и т.д. Отображаются на БД толстым серым цветом.
  • Другие типы — в LabVIEW помимо основных имеются другие типы данных, которые не встречаются в классических языках программирования. Например, refnum — подобие указателя. Но о них в следующих статьях


Запоминать и заучивать наизусть все эти типы нет смысла, достаточно знать основные и понимать что они обозначают. Если хотите узнать к какому типу относится переменная или константа, то достаточно вызывать Context Help, значок вопроса на БД или CTRL+H. И навести мышку на объект. Таким же методом можно узнать назначение того или иного узла, или подпрограммы.

Чтобы задать объекту тип нужно щелкнуть правой кнопкой по нему и затем выбрать Representation -> нужный тип.

Наиболее часто используется строковый, целочисленный и логический типы данных. Передача и прием данных с периферии (СОМ, USB, Ethernet) производится через строковый тип. Все кнопки, и индикаторы состояния описываются типом Boolean. Из целочисленных часто используется U8 (принимает значения от 0..255). А массив из элементов этого типа можно преобразовать в строку. А также часто используется I32 — как индекс всех циклов.

Массивы
Как было сказано выше массив это упорядоченное объединение одинаковых типов. Причем этим типом может быть и другой массив, или кластер. Для создания массива существует несколько методов:
1. Путем объединения с помощью узла Build Array (ПК -> Programming -> Array -> Build Array). Этот элемент может растягиваться, для этого нужно поднести мышку к верхнему или нижнему краю и протянуть, добавив нужное количество входных элементов. Затем на вход этого узла нужно подать элементы, которые добавляются в массив. Оставлять входы пустыми нельзя — будет ошибка (разрушенная стрелка запуска, см. рис.), тоже произойдет при добавлении разнотипных элементов (при добавлении числа и строки например). Если объединяются схожие типы и возможно их преобразование к общему типу — это будет происходить автоматически к более широкому виду, при этом это преобразование будет показано красным шариком (см. рис.)

2. Если нужно создать массив из N элементов с одним одинаковым значением, тогда можно использовать Initialize Array (ПК -> Programming -> Array -> Initialize Array). Включите контекстную справка (Context Help, CTRL+H). Разместите узел Initialize Array на БД. Наведите на него мышку. В справки видно, что по умолчанию данный узел имеет 3 входа и значок, что можно увеличить число входов с помощью мыши: Element (сюда нужно подсоединить элемент массив из которого вы хотите создать). для примера зададим число 10,2 типа Double. Для этого ПК на входе, затем Create -> Constant. По умолчанию создается константа тип Double (если нужен другой тип то ПК->Representation -> нужный тип.). Вводим в нее нужное нам значение (в нашем примере 10,2). Затем размерность и число элементов (Dimension Size). Размерность задается протягиванием вниз нижней границей. Так можно создавать 2D, 3D и т.д массивы. Сделаем квадратный массивы 3 на 3 элемента, для этого протянем на одну позицию нижнюю границу, получим еще один вход. ПК на входе Create -> Constant, после вбиваем туда значение 3 и соединяем со вторым входом (см. рис.). На выходе щелкаем ПК Create -> Indicator. Переходим на ФП, и за нижний край растягиваем наш индикатор массива. Запускаем программу и получаем массив заполненных значений 10,2.

3. Часто нужен элемент управления в виде массива. Для его создания щелкните на ФП ПК-> Modern-> Array, Matrix &Cluster-> Array и разместит пустой контейнер массива на форме. Затем добавьте туда нужный элемент. Например, щелкните на ФП ПК-> Modern-> Numeric -> Dial и разместите его внутри контейнера. Также растяните его за нижний угол. Чтобы добавить размерность (сделать 2D массив) — ПК на нем — Add Demension. Далее можно вручную заполнить значения. Аналогично можно создать и массив константу, и индикатор.

4. Ну и наиболее частый способ получения массива — это как вывод данных из циклов. Если любой объект разместить внутри цикла (о циклах и структурах вообще будет чуть ниже). И вывести данные из этого цикла с индексацией то получим массив. Индикация для цикла For Loop включается автоматически, а для цикла While Loopвключается с помощью щелчка ПК на терминале вывода данных из цикла и затем Enable Indexing. Также никто не запрещает ее отключить, тогда на выходе будет значение последний итерации цикла.

Структуры
С помощью различных структур задается алгоритм работы программы. сейчас рассмотрим только основные структуры, а именно циклы For Loop и While Loop, структуру ветвления Case, Sequence (Flat и Staсked), Diagram Disable и чуть-чуть коснемся Formula Node.
For Loop
Разместите на БД структуру For Loop (щелчок ПК->Programming->Structures->For Loop и протяните небольшую область). Теперь все объекты размещенные внутри этой структуры буду выполняться циклически то число раз которое указано. Чтобы задать сколько раз нужно повторить цикл создайте константу привычным образом около символа N и установите число итераций 10. Внутри цикла есть счетчик итераций i (см. рис.) по нему можно узнать сколько раз уже выполнился цикл. Добавьте внутрь цикла узел умножения Multipay и ко второму входу подключите счетчик итераций i, затем создайте константу на одном из входов равную 2 (такая последовательно нужна для того чтобы создаваемая константа была типом I32, а не double по умолчанию для числовых констант). подключите выход умножения к границе цикла For Loop, затем правой кнопкой на образовавшимся выходном туннеле и Create->Indicator, этим мы создали одномерный массива. Теперь запустите на выполнение программу (CTL+R) и посмотрите на ФП значение массива (чтобы быстро найти индикатор на фронт панели можно два раза щелкнуть по терминалу индикатора.

While Loop
Разместите на БД структуру While Loop (щелчок ПК->Programming->Structures->While Loop и протяните небольшую область). Это цикл по условию, он выполняется до тех пор пока на вход Loop Condition не подать истинное значение. В остальном он аналогичен структуре For Loop, у него также имеет цикл итераций i. Также добавьте узел умножения и константу, затем соедините как показана на рисунке. Кроме того добавьте узел сравнения Greater (ПК->Programming->Comparison->Greater) и создайте на его входе константу. Выход узла сравнения подсоедините к Loop Condition. Цикл будет выполняться до тех пор пока результат умноженный на два не будет больше 50 (т.е. цикл выполнится 26 раз). Ко выходу умножения добавьте индикатор (ПК на линии выход->Create->Indicator). Чтобы при выполнении программы видеть как изменяется этот индикатор, добавьте задержку (т.к. иначе цикл очень быстро выполнится и вы увидите только результат), для этого ПК->Programming->Timing->Wait Unitil Next ms. Создайте у его входа константу равную 100 мс. Затем присоединит выход узла умножение к границе. В отличии от структуры For Loop LabVIEW по умолчанию сделал не индексированный туннель. Создайте на его выходе индикатор. Затем протяните еще одну нить с выхода узла умножения к границе, после ПК на тунели-> Enable Indexing. В этом случае создался массив. Запустите выполнение программы.

Case Structure
Это структура предназначения для ветвления алгоритма программы. Она заменяет операторы if..else и switch языка С. Разместите на БД структуру Case Structure (щелчок ПК->Programming->Structures->Case Structure и протяните небольшую область). На вход Case Selector (значок вопроса) создайте контрол. Затем создайте константу внутри структуры на вкладке True со значением 100, и выведите нить к границе, после создайте константу на вкладе False со значением 50 протяните нить к тому же туннелю. Создайте индикатора на выходе структуры. Запустите выполнение программы продолжительно (Run continuously). Нажимая на созданную кнопку Boolean можно видеть как в зависимости от ее значения выполняется та или вкладка структуры. Если подать на вход Case Selector (значок вопроса) строку, или числовую переменную, то можно сделать несколько вкладом на разные значения входной переменной. Таким образом образовать ветвление больше, чем по двум входным значениям (с помощью этого механизма реализован алгоротм State Mashin, ему будет посвящен отдельная статья). Чтобы добавить еще одну вкладку нажмите ПК на структуре ->Add Case After или Add Case before. См рисунок. Если значению на входе термина Case Selector не соответствует значение вкладок, тогда выполниться вкладка обозначенная как Default.

Flat и Staсked Sequence
Иногда необходимо явно указать порядок выполнения программы, для этого служат структуры Sequence. Разместите на БД структуры Staсked Sequence и Flat Sequence (щелчок ПК->Programming->Structures->Flat Sequence и Staсked Sequence). Эти структуры практически ни чем не отличаются. Когда нужно несколько кадров (до 6) тогда лучше использовать Flat Sequence, так как сразу видно всю блок диаграмму и она не скрыта за кадрами, да и передавать значения между кадрами проще. Когда вкладок больше или код внутри них очень объемный и не влазит в экран, тогда лучше использовать Staсked Sequence. Чтобы добавить новый кадр нужно щелкнуть правой кнопкой на структуре и выбрать Add Frame After, если нужно создать кадр после или Add Frame before, если до. Данные от кадра к кадру в Staсked Sequence передаются через локальные переменные последовательности. Для ее добавления нужно щелкнуть Add sequence local, затем ее можно перенести в удобное место и передать/считать с нее значение.

Diagram Disable Structure
Для комментирования части кода на этапе отладки используется структура Diagram Disable Structure. Все что помещено внутри этой структуры не обрабатывается компилятором LabVIEW. Для ее вызова нажмите ПК->Programming->Structures->Diagram Disable Structure. У этой структуры две вкладки Disabled (выключено) и Enabled (включено). Включение и выключение производится через щелчок правой кнопкой мыши.

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

Создание законченного EXE приложение я решил посветить отдельный следующую статью, также в ней я расскажу про проект LabVIEW, библиотеки LabVIEW и создание инсталлятора для нашего приложения. Кроме того я расскажу как настроить LabVIEW «под себя». То есть весь следующий урок будет посвящен среде LabVIEW, а не языку G.


[an error occurred while processing the directive]
Карта сайта