Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LabView - учеб. пособия / LabVIEW Руководство пользователя

.pdf
Скачиваний:
922
Добавлен:
03.03.2016
Размер:
4.63 Mб
Скачать

пользуются в LabVIEW. Более подробно об использовании структур последовательности см. в разделах Использование структур последовательности и Предостережение от чрезмерного использования структур последовательности в настоящей Главе.

Имеется два типа структур последовательности: Flat Sequence (развернутая последовательность) и Stacked Sequence (сложенная последовательность).

Структура Flat Sequence

Структура Flat Sequence (развернутая последовательность), показанная слева, отображает все кадры одновременно и исполняет последовательно слева направо, пока не выполнится последний кадр. Используйте структуру Flat Sequence, чтобы исключить использование локальных переменных последовательности (sequence locals) и улучшить читаемость блок-диаграммы. Когда Вы добавляете или удаляете кадры в структуре Flat Sequence, размеры границ структуры автоматически изменяются. Для переупорядочивания кадров в структуре Flat Sequence используйте команды редактирования cut (вырезать) и paste (вставить), чтобы перенести содержимое из одного кадра в другой.

Структура Stacked Sequence

Структура Stacked Sequence (сложенная последовательность), показанная слева, располагает кадры один над другим, поэтому одновременно Вы можете видеть только один кадр. Кадры исполняются в последовательном порядке: сначала кадр 0, затем кадр 1 и т.д., пока не выполнится последний кадр. Структура Stacked Sequence возвращает данные только после того, как выполнится последний кадр. Используйте структуру Stacked Sequence в тех случаях, когда Вы хотите сэкономить место на блок-диаграмме.

Идентификатор селектора последовательности, показанный слева, расположен на верхней границе структуры Stacked Sequence. Он содержит номер текущего кадра и интервал номеров существующих кадров. Используйте идентификатор селектора последовательности для перемещения между кадрами и переупорядочивания кадров. Метка кадра в структуре Stacked Sequence подобна метке селектора варианта в структуре Case. Метка кадра содержит номер кадра в центре и стрелочки инкремента и декремента по бокам. Щелкайте эти стрелки для прокрутки доступных кадров. Вы можете также щелкнуть стрелочку «вниз» в поле метки кадра и выбрать

171

нужный кадр из спадающего меню. Чтобы изменить порядок кадров в структуре Stacked Sequence, щелкните правой кнопкой границу кадра, выберите из контекстного меню пункт Make This Frame и выберите нужный номер для этого кадра.

В отличие от метки селектора варианта, нельзя вести свои обозначения для меток кадров. Когда Вы добавляете, удаляете или переупорядочиваете кадры в структуре Stacked Sequence, LabVIEW автоматически устанавливает в метках кадров нужные номера.

Использование структур последовательности

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

Внутри каждого кадра структуры последовательности, как и на остальной блок-диаграмме, порядок выполнения узлов определяется зависимостью по данным. Более подробно о зависимости по дан-

ным см. в разделе Зависимость по данным и искусственная зависимость по данным в Главе 5 Построение блок-диаграммы.

Туннели на структурах Stacked Sequence могут иметь только один источник данных, в отличие от структур Case. Выход такого источника может поступать от любого кадра, но данные покидают структуру Stacked Sequence только тогда, когда будут выполнены все кадры, а не только этот конкретный кадр. Также как и в структуре Case данные от входных туннелей доступны во всех кадрах.

Чтобы передать данные от одного кадра к любому другому кадру структуры Stacked Sequence, используйте терминал переменной последовательности (sequence local terminal), показанный слева. Стрелка, направленная наружу, появляется на терминале локальной переменной кадра, который содержит источник данных. Терминал на всех последующих кадрах содержит входящую стрелку, показывающую, что этот терминал служит источником данных для этих кадров. На всех кадрах, предшествующих кадру с источником данных подключенному к терминалу локальной переменной, использовать этот терминал нельзя.

172

Примеры использования структур последовательности можно най-

ти в библиотеке examples\general\structs.llb.

Предостережение от чрезмерного использования структур последовательности

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

Если Вам необходимо управлять порядком выполнения, рассмотрите уже существующую зависимость по данным между узлами. Например, Вы можете использовать ошибку ввода/вывода (error I/O) для управления порядком выполнения ввода/вывода. Более подробно об ошибке ввода/вывода см. в разделе Обработка оши-

бок в Главе 6 Запуск и отладка виртуальных приборов.

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

Stacked Sequence на Figure 8-6.

173

Figure 8-6. Обновление состояния индикатора из разных кадров структуры Stacked

Sequence

Поскольку все кадры структуры Stacked Sequence выполняются до того, как данные покинут эту структуру, только один кадр может назначить значение в индикатор Status.

Вместо этого используйте структуру Case и цикл While Loop, как показано на Figure 8-7.

Figure 8-7. Обновление состояния индикатора из разных вариантов структуры

Case

Каждый вариант в структуре Case эквивалентен кадру структуры последовательности. Каждая итерация цикла While Loop выполняет следующий вариант. Индикатор Status отображает состояние ВП для каждого варианта. Индикатор Status обновляется в варианте, который предшествует варианту, в котором вызывается соответствующий ВПП, поскольку данные покидают структуру Case после каждого ее выполнения на очередной итерации цикла.

В отличие от структуры последовательности, структура Case может выдать данные для завершения цикла While Loop во время исполнения любого варианта. Например, если в процессе выполнения первого теста возникла ошибка, структура Case может выдать на терминал условия FALSE, чтобы завершить цикл. В противопо-

174

ложность этому, структура последовательности вынуждена выполнить все ее кадры, даже если произойдет ошибка.

Замещение структур последовательности

Чтобы преобразовать структуру Flat Sequence в структуру Stacked Sequence, щелкните правой кнопкой структуру Flat Sequence и выберите из контекстного меню пункт Replace with Stacked Structure. Чтобы преобразовать структуру Stacked Sequence в структуру Flat Sequence, щелкните правой кнопкой структуру Stacked Sequence и выберите из контекстного меню пункт Replace»Replace with Flat Sequence.

175

9. Событийно управляемое программирование

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

"Примечание. Возможность событийно управляемого программирования доступна только в пакетах LabVIEW Full Development System и LabVIEW Professional Development System. Вы сможете запускать ВП, по-

строенные с этой возможностью, в LabVIEW Base Package, но не сможете реконфигурировать событийно управляемые компоненты.

Более подробно…

Более подробно относительно использования событий в вашем приложении см. справочную систему LabVIEW Help.

Что такое события?

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

В событийно управляемой программе события, происходящие в системе, оказывают непосредственное влияние на исполняемый по-

176

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

Зачем использовать события?

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

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

177

Компоненты структуры Event

Используйте структуру Event (событие), показанную слева, для обработки событий в ВП. Структура Event работает подобно структуре Case с встроенной функцией Wait On Notification (ожидать при уведомлении). Структура Event может иметь несколько вариантов, каждый из которых является от-

дельной процедурой обработки события. Вы можете конфигурировать каждый вариант для обработки одного или более событий, но только одно из них может наступать единовременно. Когда структура Event выполняется, она ожидает наступления хотя бы одного из указанных событий, затем выполняется вариант, соответствующий этому событию. Структура Event заканчивает выполнение после обработки в точности одного события. При этом не возникает зацикливания при обработке нескольких событий. Подобно функции Wait On Notification структура Event задает временной интервал (time out) в течение которого ожидается уведомление о событии. Когда это наступает, выполняется специфический вариант

Timeout.

Метка селектора события в верхней части структуры Event, показанная слева, указывает, какие события вызывают исполнение отображаемого в данный момент варианта. Для

просмотра других вариантов щелкните стрелочку «вниз», расположенную сразу за именем события, и выберите из выпадающего меню нужный вариант. Вы можете также установить курсор над меткой селектора и, удерживая клавишу <Ctrl>, вращать колесико мыши.

Терминал Timeout в левом верхнем углу структуры Event, показанный слева, задает количество миллисекунд, в течение которых ожидается наступление события. По умолчанию эта величина задается равной (–1), что означает неограниченное время ожидание наступления события. Если Вы подсоедините значение к терминалу Timeout, то Вы должны определить вариант Timeout.

Узел данных события (Event Data Node), показанный слева, внешне напоминает функцию Unbundle By Name (разобрать кластер по именам). Этот узел прикреплен изнутри к левой границе каждого варианта структуры Event. Через этот узел поступают данные о событии, когда оно происходит. Вы можете изменять размеры этого узла по вертикали, чтобы добавить выходы, и можете назначить каждому выходному пункту этого узла нужный элемент данных о

178

событии. Этот узел выдает разные элементы данных в разных вариантах структуры Event в зависимости от того, для обработки какого события (событий) вы конфигурируете данный вариант. Если Вы настраиваете один вариант для обработки нескольких событий, то узел данных события выдает только те элементы данных, которые являются общими для всех этих событий.

Узел фильтра события (Event Filter Node), показанный слева, подобен узлу данных события. Этот узел прикреплен изнутри к правой границе вариантов для событий с фильтром (в названии таких событий присутствует вопросительный знак). Узел фильтра события определяет подмножество данных, доступных в узле данных события и которые можно изменять в процесс обработки события. Этот узел отображает различные данные в зависимости от того, для обработки какого события (событий) вы конфигурируете данный вариант. По умолчанию (если не подключены) элементы данных узла фильтра событий замещаются соответствующими элементами данных из узла данных события. Если Вы не подсоедините значения к входам узла фильтра событий, то эти элементы данных останутся неизмененными. Более подробно о фильтре событий см. в разделе

Уведомление и фильтр событий в настоящей Главе.

Терминалы динамических событий (Dynamic Event Terminals), один из которых показан слева, отображаются, если щелкнуть правой кнопкой структуру Event и выбрать из контекстного меню пункт

Show Dynamic Event Terminals. Эти терминалы используются только при наличии регистрации динамической событий. Более подробно об этих терминалах см. в разделах Динамическая регист-

рация событий и Динамическая модификация регистрации в на-

стоящей Главе.

"Примечание. Подобно структуре Case, структура Event может иметь туннели. Однако по умолчанию Вы не должны подсоединять выходной туннель в каждом варианте структуры Event. Все не подсоединенные туннели используют значения по умолчанию для типа данных этих туннелей. Чтобы вернуться к поведению по умолчанию, принятому для структуры Case, при котором туннели должны быть обязательно подсоединены для всех вариантов, щелкните правой кнопкой туннель и снимите птичку с пункта контекстного меню Use Default If Unwired.

179

Более подробно о значениях по умолчанию для разных типов данных см. в справочной системе LabVIEW Help.

Уведомляющие и фильтруемые события

Существуют два типа событий пользовательского интерфейса – уведомляющие и фильтруемые.

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

Фильтруемые события информируют Вас о том, что пользователь выполнил некоторое действие, до того, как LabVIEW обработает их. Это позволяет Вам настроить, каким образом программа будет реагировать на действия пользователя. Используйте фильтруемые события, чтобы участвовать в их обработке, вероятно изменяя существующую по умолчанию реакцию на данное событие. В варианте структуры Event для фильтруемого события Вы можете подтвердить или изменить данные о событии перед тем, как LabVIEW завершит его обработку, либо Вы можете полностью удалить (discard) событие, чтобы предотвратить его воздействие на ВП. Например, Вы можете настроить структуру Event на удаление события Panel Close?, что не позволит пользователю интерактивно закрыть лицевую панель ВП. Фильтруемые события содержат в конце имени знак вопроса как, например Panel Close?, чтобы помочь Вам отличать их от уведомляющих событий. Большинству фильтруемых событий соответствуют уведомляющие события с тем же именами, но без знака вопроса, который LabVIEW генерирует после фильтруемого события, если в структуре Event отсутствует вариант, в котором данное событие удаляется (discard).

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

180