

Содержание
Руководство для слушателя
A. Описание курса ........................................................................................................................ |
vi |
Б. Что необходимо для начала занятий...................................................................................... |
vii |
В. Установка программного обеспечения курса....................................................................... |
vii |
Г. Задачи курса............................................................................................................................ |
viii |
Д. Условные обозначения ............................................................................................................ |
ix |
Занятие 1 Основные методики разработки
А. Архитектура виртуальных приборов с единственным циклом |
........................................1-2 |
|
Б. Распараллеливание задач....................................................................................................... |
1-6 |
|
Упражнение 1-1. |
Изучение распараллеливания задач....................................................... |
1-8 |
В. Архитектуры с несколькими циклами................................................................................. |
1-9 |
|
Г. Синхронизация шаблона разработки.................................................................................. |
1-13 |
Занятие 2 Передача данных между несколькими циклами
A. Переменные............................................................................................................................. |
|
2-2 |
Б. Функциональные глобальные переменные........................................................................ |
2-11 |
|
Упражнение 2-1. |
Работа с переменными.......................................................................... |
2-14 |
В. Состояния конкуренции...................................................................................................... |
2-23 |
|
Упражнение 2-2. |
Модель работы банка............................................................................ |
2-30 |
Г. Синхронизация передачи данных ...................................................................................... |
2-33 |
|
Упражнение 2-3. |
Проект: Очередь данных....................................................................... |
2-37 |
Упражнение 2-4. |
(Необязательное) Проект с использованием глобальных |
|
|
переменных............................................................................................. |
2-52 |
Занятие 3 Оптимизация существующих ВП
A. Переработка и оптимизация «вторичного» кода................................................................. |
3-2 |
|
Упражнение 3-1. |
Переработка кода приложения............................................................... |
3-5 |
Б. Типичные трудности и ошибки........................................................................................... |
3-23 |
|
Упражнение 3-2. |
Концепция: Типичные проблемы......................................................... |
3-27 |
Занятие 4 Управление интерфейсом пользователя
A. Архитектура сервера ВП....................................................................................................... |
4-2 |
Б. Узлы свойств........................................................................................................................... |
|
4-3 |
Упражнение 4-1. ВП Температурная уставка..................................................................... |
4-5 |
|
В. Ссылки на элементы управления.......................................................................................... |
4-9 |
|
Упражнение 4-2. |
Задание имен графиков......................................................................... |
4-13 |
Г. Узлы вызовов........................................................................................................................ |
|
4-23 |
Упражнение 4-3. |
Свойства лицевой панели ВП............................................................... |
4-24 |
Занятие 5 Расширенные возможности файловых операций ввода/вывода
A. Форматы файлов..................................................................................................................... |
5-2 |
|
Б. Двоичные файлы..................................................................................................................... |
5-5 |
|
Упражнение 5-1. .................................................................. |
ВП для записи BMP файлов |
5-12 |
В. TDM Файлы........................................................................................................................... |
|
5-20 |
Упражнение 5-2. ....................................................................... |
ВП Запись TDM файлов |
5-32 |
Упражнение 5-3. ................................................................................. |
Запрос TDM файла |
5-47 |
Занятие 6 Создание и самостоятельное использование приложений
А. Возможности LabVIEW для управления разработкой проектов....................................... |
6-2 |
|
Упражнение 6-1. |
Средства управления разработкой проектов LabVIEW....................... |
6-5 |
Б. Подготовка приложения......................................................................................................... |
6-7 |
|
В. Создание приложения и программы установки.................................................................. |
6-8 |
|
Упражнение 6-2. |
Создание самостоятельного приложения............................................ |
6-10 |
Приложение A |
|
|
Дополнительная информация и ресурсы

Руководство для слушателя
Благодарим вас за приобретение учебного курса LabVIEW Основы II: Разработка. Вы сможете приступить к разработке приложений сразу же по завершению выполнения упражнений курса. Руководство к курсу и сопровождающее его программное обеспечение понадобится вам при прохождении двухдневного обучения, ориентированного на самостоятельное выполнение упражнений.
Посетите ni.com/training для ознакомления с расписанием курсов, получения аннотаций и методических указаний к ним, а также информации об учебных центрах и для предварительной регистрации на курсы.
Примечание. Для получения доступных обновлений руководства к курсу перейдите на страницу ni.com/info и введите информационный код rdlvc2.
Учебный курс LabVIEW Основы II: Разработка является частью цикла образовательных курсов, разработанных для повышения вашего профессионального уровня разработки приложений в LabVIEW, а также помогающих вам подготовиться к сдаче квалификационного экзамена на ступень Сертифицированного Разработчика (NI Certified LabVIEW Developer) и
Сертифицированного Архитектора (NI Certified LabVIEW Architect). На странице ni.com/training вы найдете более подробную информацию о сертификационной программе
National Instruments.
A. Описание курса
При помощи данного курса вы детально изучите концепции программирования в LabVIEW, технологии, особенности, функции и виртуальные приборы, на основе которых вы сможете создать законченные приложения измерительно-контрольной техники, управления технологическими процессами и устройствами, системы сбора и анализа данных, генерации отчетов.
Предполагается, что перед началом курса вы имеете представление о работе в ОС семейства Windows (либо Macintosh или UNIX); что вы умеете алгоритмизировать задачи при помощи техники диаграмм или блок-схем, а также что вы прошли обучение по программе курса LabVIEW Основы I: Введение или эквивалентной.
I

Руководство к курсу разделено на Занятия, на каждом из которых рассматривается определенная теме или несколько тем. Каждое занятие включает:
•Введение, рассказывающее о теме занятия и предметах, с которыми вы познакомитесь
•Подробное изложение материала изучаемых тем
•Набор Упражнений для усвоения пройденного материала
•Дополнительные упражнения с усложненными заданиями – выполняются в оставшееся время
•Итоги занятия, в которых кратко суммируются важнейшие сведения о рассмотренной теме и полученные в ходе занятия знания
Некоторые упражнения в курсе предусматривают использование многофункциональной карты ввода-вывода данных (DAQустройства), подключенной к специальной испытательной терминальной коробке (DAQ Signal Accessory), оснащенной датчиком температуры, простым функциональным генератором и индикаторными светодиодами.
Упражнения, для выполнения которых необходимо наличие указанного аппаратного обеспечения, помечены значком, показанным слева. Конечно, вы можете использовать любые имеющиеся в наличии устройства сбора данных (DAQ) производства National Instruments и подключать к ним различные доступные источники сигнала, например, стандартный генератор сигналов.
Б. Что необходимо для начала занятий
Для того чтобы приступить к выполнению занятий, убедитесь в наличии следующих компонентов:
Компьютер с установленной ОС Windows 2000 или более современной. Данный курс рассчитан на использование ОС
Windows XP
Многофункциональный модуль сбора данных (DAQустройство), сконфигурированное как Устройство 1 (Device 1) при помощи утилиты Measurement & Automation Explorer (MAX)
Испытательная терминальная коробка (DAQ Signal Accessory), соединительный кабель и проводники
Установленная на компьютере среда разработки LabVIEW Professional Development System версии 8.0 или более современной
II

Компакт-диск к курсу LabVIEW Основы II: Разработка, с
которого вы скопируете следующие папки с файлами:
Упражнения |
Каталог содержит ВП для использования в |
курсе |
|
|
|
Решения |
Каталог содержит выполненные |
упражнения курса |
В. Установка программного обеспечения курса
Выполните следующие действия для установки программного обеспечения курса.
1.Установите компакт-диск с материалами курса в CD-привод вашего компьютера. На экране появится меню автозапуска
LabVIEW Basics Course Material Setup.
2.Нажмите кнопку Далее (Next).
3.Выберите режим типичной установки - Typical и нажмите кнопку Установить (Install).
4.При завершении работы мастера установки нажмите кнопку
Завершение (Finish).
5.Программа установки создала в корне вашего жесткого диска
C:\ каталоги Упражнения и Решения.
Файлы упражнений расположены в каталоге
C:\Упражнения\LabVIEW Основы II.
Исправление или удаление материалов курса
Вы можете исправить или удалить материалы данного учебного курса при помощи вкладки Установка и удаление программ из
Панели управления Windows. При исправлении материалов уже установленные виртуальные приборы курса и прочие вспомогательные файлы будут заменены на исходные, не редактированные версии. Воспользуйтесь удалением материалов курса, если вы уверены, что они никогда вам более не понадобятся на данном компьютере.
Г. Задачи курса
Настоящий курс подготовит вас по следующим направлениям:
•Понимание процесса разработки виртуальных приборов
•Знание некоторых, наиболее общих архитектур программирования ВП
III

•Создание эффективных пользовательских интерфейсов (лицевых панелей)
•Эффективная передача данных между параллельно выполняющимися процессами
•Использование расширенных технологий файлового вводавывода
•Применение LabVIEW для создания законченных приложений
•Использование Узлов Свойств и Узлов Вызова в ваших ВП
Эти знания понадобятся вам при разработке итогового учебного проекта, в котором вы также используете свои ВП, созданные по ходу курса. Каждый из этих ВП является не только примером изучаемых методик и возможностей LabVIEW, но и частью более крупномасштабного проекта, реализуемого в течение всего курса.
В этом курсе не рассматриваются следующие вопросы:
•Методы программирования в LabVIEW, уже изученные в курсе
LabVIEW Основы I: Введение
•Назначение и подробности использования всех виртуальных приборов, функций и объектов. Обращайтесь ко встроенной справочной системе LabVIEW для получения детальной информации, не рассмотренной в настоящем курсе.
•Разработка полного законченного приложения всеми слушателями курса; используйте утилиту поиска примеров NI Example Finder, которую можно вызвать из меню Help » Find Examples, для загрузки и внедрения встроенных в LabVIEW примеров в создаваемый вами виртуальный прибор.
Д. Условные обозначения
Следующие условные обозначения используются на страницах данного руководства:
Символ » обозначает последовательность вызова пунктов вложенных меню и разделов диалоговых окон для выполнения
»какого-либо действия. Например, последовательность File»Page Setup»Options обозначает, что сначала необходимо выбрать меню File, затем пункт Page Setup и, наконец, раздел Options в диалоговом окне.
Эта иконка обозначает дополнительную справочную информацию.
Эта иконка обозначает примечание, содержащее важную информацию.
IV

bold
italic
monospace
monospace bold
monospace italic
Platform
Эта иконка обозначает предупреждение, советующее Вам обратить особое внимание на действие, которое может вызвать повреждение устройства, удар током, потерю данных или сбой операционной системы.
Эта иконка обозначает, что в упражнении требуется встраиваемое DAQ устройство
Жирным шрифтом выделены пункты меню и опции диалоговых окон, которые необходимо выбирать при работе с программным обеспечением. Жирный текст обозначает также названия параметров, элементов управления и кнопок на лицевой панели, самих диалоговых окон и их разделов, меню и палитр.
Курсивом обозначены переменные, фразы с особым значением, перекрестные ссылки и ключевые термины. Этим шрифтом обозначен также текст, представляющий собой шаблон для обязательного введения слова или значения.
Данным шрифтом обозначен текст или символы, который вы должны ввести с клавиатуры, участки кода, примеры программ и написания команд. Этот шрифт также используется для имен разделов жестких дисков, путей, папок, программ, подпрограмм, устройств, функций, операций, переменных, файлов и их расширений.
Жирным шрифтом такого типа обозначаются сообщения, которые компьютер автоматически выводит на экран. Данным шрифтом выделяются также линии кода, отличающиеся от других примеров.
Данный шрифт с курсивом обозначает текст, представляющий собой шаблон для обязательного введения слова или значения.
Текстом с таким шрифтом обозначается платформа. Вся информация, которая следует за ним, относится только к указанной платформе.
V

1
Основные методики разработки
Вы можете улучшить свои программы, разрабатываемые в LabVIEW или других языках программирования, если вы будете соблюдать определенные методики и архитектуры разработки. На этом занятии мы обсудим две различные архитектуры программирования – с единственным циклом и с множеством циклов. Архитектуры также подразделяются на шаблоны разработки.
Архитектура виртуальных приборов с единственным циклом включает в себя шаблоны разработки: простой ВП (simple VI), ВП общего назначения (general VI) и ВП машина состояний (state machine).
Архитектура виртуальных приборов с множеством циклов, в свою очередь, подразделяется на: ВП с параллельными циклами
(parallel loop VI), шаблон «ведущий –ведомый» (master/slave) и «производитель-потребитель» (producer/consumer).
Правильный выбор шаблона в самом начале разработки является ключевым моментом, определяющим эффективность создаваемого ВП LabVIEW.
Темы
A. Архитектура виртуальных приборов с единственным циклом
Б. Распараллеливание
В. Архитектура виртуальных приборов с множеством циклов
Г. Привязка ко времени (синхронизация) шаблона разработки
1-1

A. Архитектура виртуальных приборов с единственным циклом
В Учебном курсе LabVIEW Основы I:Введение вы уже в общих чертах познакомились с тремя основными архитектурами разработки в LabVIEW – простой ВП, ВП общего назначения и машина состояния.
Шаблоны разработки Простого ВП
Для решения задач проведения вычислений или автоматизации лабораторных измерений вам не потребуется сложная архитектура программирования. Вся ваша программа может состоять из одного виртуального прибора, который выполняет измерения, производит вычисления и затем отображает результаты на дисплее или сохраняет их на диск. Такие простые ВП обычно не предусматривают, например, особых процедур для запуска и остановки приложения – пользователь просто щелкает мышкой по кнопке Пуск (Run). Эта архитектура пригодна для простых приложений и для функциональных компонент внутри сложного проекта. Впоследствии вы можете преобразовать эти простые ВП в ВПП, которые станут составными частями функционально более сложного приложения.
На Рисунке 1-1 приведена блок-диаграмма ВП Определить предупреждения (Determine Warnings), созданного в курсе LabVIEW Основы I:Введение. Этот ВП выполняет несложную задачу – выводит определенные сообщения пользователю в зависимости от набора параметров, поданных на вход. Этот ВП можно легко использовать в качестве ВПП, задав параметр «уровень тревоги».
Обратите внимание, что этот ВП не предусматривает пользовательского управления запуском и остановкой прибора. Более того, все объекты блок-диаграммы соединены между собой проводниками данных, реализующими концепцию выполнения кода в соответствии с «потоком данных» (dataflow). Таким образом задается последовательность выполнения всех операций. Например, функция Не Равно (Not Equal) не будет выполнена до тех пор, пока не выполнятся функции Больше или Равно (Greater Than or Equal), Меньше или Равно (Less Than or Equal), и затем обе функции Выбора (Select).
1-2

Рисунок 1-1. Архитектура Простого ВП
Шаблоны разработки ВП Общего назначения
Шаблон разработки ВП Общего назначения состоит из трех основных фаз, каждая из которых содержит код, организованный согласно иным Шаблонам разработки. Эти три фазы описаны в следующей таблице:
Начало |
На этой фазе считываются |
|
конфигурационные параметры из |
|
файлов, инициализируется аппаратное |
|
обеспечение, пользователь |
|
запрашивается о введении |
|
необходимых данных |
Главное приложение |
Эта фаза содержит как минимум один |
|
цикл, который выполняется до тех пор, |
|
пока либо пользователь не примет |
|
решение о завершении работы, либо |
|
программа завершится по другим |
|
причинам – например, по завершении |
|
операций ввода-вывода. |
Завершение |
Здесь осуществляется запись файлов |
|
конфигураций и данных на диск и |
|
выполняются процедуры завершения |
|
открытых сессий связи с аппаратными |
|
средствами и возвращение их в |
|
исходное состояние. |
Рисунок 1-2 иллюстрирует архитектуру виртуальных приборов общего назначения.
1-3

Рисунок 1-2. Шаблон разработки ВП Общего назначения
На приведенной блок-диаграмме поток данных по проводникам кластера ошибки (error cluster) управляет ходом выполнения трех фрагментов кода. Цикл по условию не будет выполняться до тех пор, пока ВП Старт (Start VI) не закончит выполнение и не возвратит управление по кластеру ошибки. Соответственно, ВП Стоп (Stop VI) не будет выполнен, пока основной программный код в Цикле по условию не завершится и данные из кластера ошибки не выйдут за пределы цикла. Функция программной задержки (Wait) необходима в большинстве циклических процедур, особенно тех, что ожидают действий пользователя через объекты лицевой панели – без задержки эти циклы будут выполняться с максимально возможной скоростью и тем самым бесполезно загрузят большую часть ресурсов компьютера. Функция Задержки переводит выполнение цикла в асинхронный режим, даже если вы подключите величину 0 миллисекунд к терминалу интервала ожидания. Если, как в предыдущем примере, в цикле производится ожидание действий пользователя, имеет смысл увеличить интервал ожидания до величины, характерной для времени реакции человека – большинство пользователей не сможет заметить задержки в 100...200 миллисекунд между щелчком мыши на лицевой панели и началом выполнения соответствующего действия.
Для простых приложений главный рабочий цикл очевиден по сути и прост для понимания. Если же ваше приложение содержит сложный пользовательский интерфейс или многозадачную структуру, включающую обработку действий пользователя, синхронизацию процессов ввода-вывода и т.д., фаза главного приложения, естественно, усложнится.
Шаблон разработки ВП: Машина Состояний
Шаблон разработки ВП Машина состояний, по сути, является модификацией ВП общего назначения. Машина состояний обычно включает фазы Начала и Завершения, а вот фаза Главного
1-4

приложения представляет собой структуру Варианта (Case structure), расположенную внутри цикла. Такая организация ВП дает вам возможность на каждой итерации цикла запускать различные фрагменты кода, в зависимости от входных параметров (условий). Каждый вариант структуры определяет состояние алгоритма («машины») в данной итерации, отсюда и следует название архитектуры. Этот шаблон разработки хорошо подходит для реализации задач, легко разделяемых на более простые подзадачи, такие как обработка интерфейса пользователя.
Типичная машина состояния в LabVIEW состоит из главного цикла по условию (While Loop), структуры Варианта (Case structure) и сдвигового регистра (Shift Register). Каждое состояние машины оформлено в виде отдельного варианта структуры (Case). Вы размещаете в нем виртуальные подприборы и другие участки кода, выполняющиеся при данном определенном условии. Сдвиговый регистр хранит информацию о состояниям, реализованных в предыдущих итерациях цикла. Диаграмма машины состояния ВП с 5 вариантами функционирования (состояниями) приведена на Рисунке 1-3. Рисунок 1-4 также показывает неактивные, «скрытые» состояния машины.
Рисунок 1-3. Машина состояний в «Начале»
1-5

Рисунок 1-4. Состояния: Ожидание (по умолчанию), Событие 1, Событие 2 и Завершение
При использовании архитектуры машины состояний ВП вы разрабатываете перечень возможных событий (или состояний) и затем ставите им в соответствие варианты выбора (Case). В предыдущем примере, ВП имеет возможные состояния Начало, Ожидание, Событие 1, Событие 2, и Завершение. Список состояний хранится в константе перечислимого типа (enumerated constant). Каждому состоянию соответствует вариант в структуре (Case structure). Выходные данные каждого варианта определяют, какой вариант будет выполнен следующим. Сдвиговый регистр хранит соответствующее значение «управляющей» константы. Если в каком-либо из вариантов будет зафиксирована ошибка, сразу же будет вызван вариант Завершения.
Архитектура машины состояния делает диаграмму ВП более компактной, и, тем самым, более легкой в чтении, восприятии и отладке. Еще одно преимущество этой архитектуры заключается в том, что во время выполнения каждого варианта принимается решение о выборе следующего варианта, в отличие от структуры последовательности (sequence structures), которая не может выполнять варианты в произвольном порядке.
Интересно, что в возможности «обойти» какой-либо вариант заключается также и определенный недостаток архитектуры машины состояния. Если два состояния (две задачи) будут вызваны в один и тот же момент времени, реализовано будет одно из них, а другое утеряно. Это может привести к трудно выявляемым (из-за отсутствия воспроизводимости) и поэтому трудно исправимым ошибкам. Более сложные вариации архитектуры машины состояния ВП могут содержать дополнительный код, который организует очереди событий или состояний (queue of events/states), таким образом ни одно из состояний утеряно не будет. Очереди событий будут детально обсуждаться в следующем разделе.
1-6

Б. Распараллеливание задач
Распараллеливание является одним из методов выполнения нескольких задач в одно и то же время. Рассмотрим конкретный пример – генерация и отображение двух синусоидальных колебаний с различными частотами. Для реализации этой задачи поместим ВПП, генерирующий первое колебание в один цикл, а второй ВПП – в другой независимый цикл. LabVIEW будет автоматически выполнять эти задачи параллельно (одновременно).
Сложность программирования параллельных задач заключается в передаче данных между несколькими циклами без использования проводников данных. Дело в том, что при проведении проводников между циклами они перестают работать параллельно. Так, в примере с синхронной генерацией двух синусоидальных колебаний для осуществления одновременной остановки генерации придется организовать совместный доступ двух циклов к одной кнопке «Стоп» так, как показано на Рисунке
1-5.
Рисунок 1-5. Лицевая панель ВП с параллельными циклами.
Проверьте, что изменится в работе ВП, если вы попытаетесь передать данные с управляющей кнопки при помощи проводника.
Метод 1 (Неправильный!)
Поместите терминал Управления циклами за пределами обоих циклов и подключите его проводниками к обоим терминалам условия, как показано на Рисунке 1-6. Логический элемент Управление циклами передает свое значение на вход обоих циклов, так что терминал управления циклом будет считан всего лишь один раз, еще до начала выполнения циклов. Если на вход циклов будут передано логическое состояние «ИСТИНА», то циклы будут выполняться бесконечно. Переключение кнопки в
1-7

выключенное состояние («ЛОЖЬ») не приведет к остановке циклов, потому что во время итераций циклов считывания состояния этой кнопки уже не происходит.
Рисунок 1-6. Параллельные циклы. Пример реализации Метода 1.
Метод 2 (Неправильный!)
Переместите терминал Управления циклами внутрь Цикла 1, как показано на следующей блок-диаграмме. При этом состояние кнопки будет считываться при каждой итерации цикла, и, таким образом мы добьемся правильного завершения Цикла 1 при переключении кнопки. А вот Цикл 2 в этой ситуации даже не начнет выполняться до тех пор, пока не получит данные на все входы. Цикл 1 передаст данные на выход только по завершении выполнения (после нажатия кнопки), следовательно Цикл 2 будет дожидаться завершения Цикла 1 – таким, образом, выполнение циклов не будет параллельным. Кроме того, Цикл 2 произведет всего лишь одну итерацию, потому что на вход его условного терминала от выключенной в Цикле 1 кнопки придет логическое состояние «ЛОЖЬ».
Рисунок 1-7. Параллельные циклы. Пример реализации Метода 2.
Решение
Одним из вариантов решения проблемы может быть запись и считывание состояния логического элемента управления через файл на диске. В этом случае снимается ограничение,
1-8
накладываемое принципом управления по потоку данных, поскольку каждый цикл обращается к файлу независимо. Однако такой путь решения не является оптимальным, поскольку время обращения к диску довольно велико и потребует больших затрат ресурсов компьютера. Существенно более совершенной модификацией этого метода является прямое обращение циклов к ячейке оперативной памяти компьютера, хранящей состояние логического элемента управления. На Занятии 2: Передача данных между несколькими циклами, вы получите детальную информацию о способах реализации этого метода.
1-9
Упражнение 1-1. Изучение распараллеливания задач
Цель
Познакомиться с задачами, которые эффективно выполнять в нескольких параллельных циклах.
Описание работы
1.Откройте ВП Параллельные_Циклы.exe, расположенный в папке C:\УпражненияLabVIEW Основы II\Параллельные циклы.
2.Следуйте указаниям, приведенным в приборе.
3.Закройте приложение по завершении упражнения.
Конец Упражнения 1-1
1-10

В. Архитектуры с несколькими циклами
Итак, в предыдущем Упражнении вы познакомились с несколькими различными причинами использования распараллеливания. В этом разделе описаны некоторые другие шаблоны разработки со множеством циклов: параллельные циклы, ведущий-ведомый и производитель-потребитель.
Шаблон разработки: Параллельные Циклы
Некоторые приложения требуют, чтобы программа реагировала сразу на несколько воздействий и выполняла одновременно несколько задач. Одним из способов разработки главной части такого приложения является выделение отдельного цикла для решения каждой задачи. Например, вы можете назначить каждой кнопке лицевой панели по циклу – для обслуживания систем меню, для реагирования на срабатывание триггеров ввода-вывода и т.д. На Рисунке 1-8 показан вариант реализации подобного шаблона разработки.
Рисунок 1-8. Шаблон разработки: Параллельные Циклы
Эта структура обладает достаточной очевидностью и хорошо подходит для создания ВП с простыми меню, каждый из пунктов которых выполняет свою определенную задачу. Архитектура параллельных циклов позволяет обслуживать множество независимых задач одновременно. В данном шаблоне выполнение одной из задач не препятствует одновременному выполнению других. Так, если пользователь нажатием на кнопку вызовет диалоговое окно, операции ввода-вывода в другом цикле параллельно продолжат выполнение. Тем не менее, шаблон разработки с параллельными циклами требует от вас организации
1-11

связи и синхронизации между циклами. Кнопка Стоп во втором цикле на Рисунке 1-8 является локально переменной. Как обсуждалось в предыдущем разделе, вы не можете использовать проводники для передачи данных между циклами, поскольку это не даст им выполняться параллельно. Вместо этого вам придется использовать технологию «передачи сообщений» (messaging technique) для обмена данными между процессами.
Вы изучите локальные переменные, уведомители и очереди сообщений для коммуникации между параллельными процессами на Занятии 2: Передача данных между несколькими циклами.
Шаблон разработки Ведущий-ведомый
Шаблон разработки Ведущий-ведомый также состоит из нескольких параллельных циклов. Каждый из циклов может иметь свою собственную скорость выполнения итераций. При этом в данном шаблоне выделяется один «ведущий» цикл, который осуществляет управление остальными («ведомыми») и координацию их работы посредством технологии «передачи сообщений», как показано на Рисунке 1-9.
Рисунок 1-9. Шаблон разработки Ведущий-ведомый
Шаблон ведущий-ведомый используется, например, когда вам необходимо организовать реакцию ВП на управляющие воздействия от пользовательского интерфейса при одновременном осуществлении операций аппаратного вводавывода. Так, предположим, вам нужно измерять и протоколировать медленно меняющееся напряжение каждые 5 секунд. Соответствующий ВП будет собирать данные с заданного аппаратного интерфейса и отображать их на графике с интервалом в 100мс. ВП должен также обеспечивать пользователю возможность изменения параметров сбора данных на каждой итерации. Для решения подобных задач наиболее хорошо подходит шаблон ведущий-ведомый. Ведущим является цикл, обслуживающий интерфейс пользователя. Отдельные циклы, реализующие сбор данных и отображение их на графике, являются ведомыми.
Используя в данном ВП стандартный шаблон ведущий-ведомый, вы размещаете функции, осуществляющие сбор данных, в двух
1-12
раздельных циклах, каждый из которых управляется ведущим циклом, в свою очередь управляемым элементами пользовательского интерфейса с лицевой панели. Такая организация алгоритма гарантирует отсутствие влияния процессов сбора данных друг на друга, а также отсутствие влияния на них любых временных задержек, обусловленных пользовательским интерфейсом (например, обслуживанием интерактивных диалоговых окон).
Особенное преимущество шаблон ведущий-ведомый обеспечивает для управляющих приложений. Рассмотрим, например, виртуальный прибор для управления свободно перемещающимся манипулятором робота посредством кнопок на лицевой панели. Такое приложение требует эффективного, точного и быстрого реагирования, поскольку несвоевременный приход команд управления чреват повреждением как манипулятора, так и окружающих его объектов. Например, если оператор подал команду остановки возвратного движения манипулятора, а управляющая программа в это время занята отслеживанием вращения его шарнира, то весьма вероятным становится столкновение манипулятора с опорной платформой робота. Для предотвращения подобной ситуации воспользуемся шаблоном ведущий-ведомый, где внутри ведущего цикла разместим пользовательский интерфейс, а каждой управляемой функции манипулятора будет сопоставлен свой ведомый цикл. Поскольку каждая функция робота будет работать в индивидуальном цикле и в любом случае получит необходимый минимум процессорного времени, система становится надежной и управляемой.
Для работы приложения, организованного по шаблону ведущийведомый, принципиально важно, чтобы никакие два цикла не могли осуществлять запись в один участок памяти общего доступа. Более подробно о совместном доступе к данным будет рассказано на Занятии 2.
Ответная реакция ведомого цикла на команды ведущего не должна занимать слишком много времени. Если в процессе обработки данных ведомым циклом ведущий успевает послать ему несколько команд («сообщений»), то ведомый цикл реально принимает только последнюю. В этом случае существует риск потери данных или команд управления. Поэтому при использовании шаблона разработки «ведущий-ведомый» следует обеспечивать большее быстродействие ведомых циклов по сравнению с ведущим.
Шаблон разработки «Производитель-потребитель».
Шаблон разработки «производитель-потребитель», по сути, основан на шаблоне «ведущий-ведомый», но обеспечивает лучший обмен данными между циклами, работающими с разными скоростями. Подобно «ведущему-ведомому», шаблон «производитель-потребитель» выделяет задачи, «производящие»
1-13

и «потребляющие» данные, в разные циклы, причем работающие с различными периодами итераций. Для передачи данных от циклов-«производителей» к циклам-«потребителям» используются очереди данных (data queues). Очереди также позволяют буферизировать данные.
Примечание. Под буфером понимается область памяти, которая накапливает и временно хранит данные, передаваемые различными устройствами или, как в данном случае, программными циклами.
Используйте шаблон «производитель-потребитель» при необходимости в сборе потоков данных и обработке их в определенной последовательности. Предположим, вы хотите создать ВП для сбора и обработки сигналов именно в той последовательности, в которой они были получены. Шаблон «производитель-потребитель» идеально подходит для решения подобных задач, поскольку буферизированный ввод – «производство» данных – идет значительно быстрее, чем обработка – «потребление». Вы даже можете поместить блок- «производитель» и блок-«потребитель» данных в тело одного и того же цикла, но очередь обработки не может быть пополнена новыми данными до тех пор, пока первая их порция не будет полностью обработана. На Рисунке 1-10 показан пример реализации описанного приложения, в котором цикл- «производитель» пополняет очередь данных, а цикл- «потребитель» считывает состояние очереди и обрабатывает поступившие данные.
Примечание. Функции Очереди (Queue) позволяют вам накапливать наборы данных и распределять их между параллельно выполняющимися циклами или даже между несколькими ВП. На Занятии 2 будет подробнее рассматриваться работа с очередями.
1-14

Рисунок 1-10. Шаблон разработки «Производитель-потребитель».
Этот шаблон разработки позволяет циклу-«потребителю» обрабатывать данные со скоростью, которую он сможет обеспечивать, в то время как цикл-«производитель» будет ставить в очередь обработки вновь поступающие данные.
По такой схеме можно создавать ВП для анализа сетевых коммуникаций, что потребует как минимум двух циклов, работающих одновременно, но с разной скоростью. Первый из них будет непрерывно опрашивать линии связи и обнаруживать коммуникационные пакеты данных. Задача второго будет анализировать эти пакеты. В данном примере первый цикл выступает в качестве «производителя» данных, а второй – «потребителя». Передача пакетов, полученных первым циклом, второму циклу через очередь данных позволяет осуществить эффективную буферизацию сетевого потока. За счет буферизации обработку пакетов можно вести параллельно приему и во время пауз в связи, что снижает вероятность потери информации, поскольку сбор пакетов идет быстрее, чем их анализ.
Г. Синхронизация шаблона разработки
В этом разделе обсуждаются две методики синхронизации – синхронизация выполнения и программное управление синхронизацией. Синхронизация выполнения – это методика, высвобождающая ресурсы процессора для выполнения других
1-15

задач. Программное управление синхронизацией осуществляет временную привязку во время работы длительных процессов.
Синхронизация выполнения
Вы можете осуществить «привязку» ко времени шаблона разработки как в явном виде, так и на основе событий, происходящих по ходу выполнения ВП. Явная привязка осуществляется при помощи функций, предписывающих процессору передать управление другим задачам на заданный промежуток времени, например функции Wait Until Next ms Multiple. Если синхронизация построена на обработке событий, программа ожидает наступления какого-либо события для выполнения определенных функций, а на период такого ожидания предоставляет процессорное время другим задачам.
Явная синхронизация используется в шаблонах разработки «ведущий-ведомый», «производитель-потребитель» и машина состояний. Эти шаблоны на этапе выполнения осуществляют опрос состояния тех или иных устройств и ход программы определяется результатом опроса.
Определение. Опросом (Polling) называется процесс, осуществляющий периодические обращения к какому-либо устройству за предоставлением данных. В LabVIEW, например, это означает, что функции блок-диаграммы постоянно запрашивают готовность данных, чаще всего от пользовательского интерфейса.
На приведенном на Рис. 1-11 примере реализации шаблона «ведущий-ведомый» использованы цикл по условию (While Loop) и структура Варианта (Case) для главного цикла, который постоянно выполняется и опрашивает пользовательский интерфейс в ожидании определенного события – нажатия пользователем какой-либо кнопки. Если это событие наступает, главный («ведущий») цикл отправляет об этом сообщение «ведомому». Для того, чтобы «ведущий» цикл при опросе интерфейса не расходовал лишних ресурсов процессора, его необходимо синхронизировать. В данном случае это легко сделать при помощи функции ожидания Wait (ms), определяющую период итераций цикла. Использование функций «привязки ко времени» (или синхронизации) - Wait (ms) или Wait Until Next ms Multiple является необходимым во всех шаблонах разработки, содержащих структуры циклического повторения. Если в цикле не будет таких функций, LabVIEW выделит ему все процессорное время и тем самым сделает невозможной работу других фоновых процессов и приложений.
1-16

Рисунок 1-11. Шаблон разработки «ведущий-ведомый»
Обратите внимание, что «ведомый» цикл не содержит никаких форм временной привязки. Использование функций синхронизации через сообщения, таких как Очереди (Queues) и Уведомители (Notifiers) является наиболее правильным способом синхронизации «ведомых» структур. «Ведомый» цикл с функцией Уведомителя (Notifier) ожидает прихода сообщения, и только после этого начинает выполнение. Таким образом создается эффективный алгоритм, не расходующий впустую ресурсов процессора. Синхронизация осуществляется путем ожидания события.
Когда вы применяете шаблон разработки с синхронизацией, основанной на событиях, вам не приходится заботиться об определении точных временных интервалов. Это обусловлено тем, что выполнение функций и итерации циклов разрешается только в моменты времени, когда наступили определенные события.
Программное управление синхронизацией
Во множестве приложений, которые вы создаете, та или иная операция должна выполняться в течение определенного промежутка времени. Рассмотрим использование шаблона разработки машина состояний для системы мониторинга температуры. Так, от системы может требоваться непрерывный сбор температурных данных в течение 5 минут. Если вы просто запустите процесс сбора данных и укажете ему время
1-17

выполнения 5 минут, то никакие другие процессы (например, обработка действий пользователя) уже не будут выполнены. Чтобы предусмотреть возможность параллельной обработки иных задач, необходимо предусмотреть возможность слежения за остатком реального времени выполнения из запущенного процесса.
В курсе LabVIEW Основы 1: Введение, вы уже пользовались программным управлением интервалом времени между вводом нескольких блоков данных, как показано на Рис. 1-12. Обратите внимание на методику отслеживания остатка времени при помощи Экспресс-ВП Elapsed Time.
Рисунок 1-12. Использование Экспресс-ВП Elapsed Time
Если вы используете функции ожидания Wait (ms) или Wait Until Next ms Multiple для синхронизации функции, выполняющейся в течение длительного времени, складывается ситуация, при которой функция ожидания завершает работу еще до выполнения той функции, для синхронизации которой она предназначена. Хорошим решением является считывание текущего системного времени внутри синхронизируемого виртуального прибора, как показано на Рис. 1-13.
1-18

Рисунок 1-13. Программная синхронизация при помощи функции чтения даты/времени Get Date/Time In Seconds
Функция Get Date/Time In Seconds, подключенная к левому терминалу сдвигового регистра, «привязывает» цикл к текущему системному времени. В каждой итерации время считывается вновь (вызовом функции Get Date/Time In Seconds внутри цикла) и производится его сравнение со временем запуска. Если разность времен превышает интервал ожидания, выполнение данного состояния завершается и управление передается следующим фрагментам программы. Для такого способа применения функция чтения системного времени и даты Get Date/Time In Seconds подходит лучше, чем функция Секундомера (Tick Count), так как в промежутках между вызовами значение, возвращаемое Секундомером, равно 0.
На Занятии 2, Передача данных между несколькими циклами,
будет подробно рассмотрена более совершенная методика синхронизации через функциональные глобальные переменные.
1-19

Контрольные вопросы
1. Программное управление синхронизацией разрешает процессору выполнять другие задачи.
а. Правильно
б. Неправильно
2. Синхронизация выполнения – это методика, высвобождающая ресурсы процессора для выполнения других задач.
a. Правильно
б. Неправильно
3. Для передачи данных между параллельными циклами можно использовать проводники.
a. Правильно
б. Неправильно
1-20

Ответы на контрольные вопросы
1.Неправильно: Описано назначение синхронизации выполнения.
2.Правильно: Синхронизация выполнения – это методика, высвобождающая ресурсы процессора для выполнения других задач.
3.Неправильно: При соединении циклов проводниками данных циклы перестают работать параллельно.
1-21

Примечания
1-22

2
Передача данных между несколькими циклами
На первом занятии, Основные методики разработки, вы познакомились с проблемами передачи данных между несколькими циклами, выполняющимися параллельно. На данном занятии описываются способы обмена данными между несколькими циклами. Эти способы обмена включают использование переменной (variable), уведомителя (notifier) и очереди (queue). Вы также узнаете о программных решениях, применяемых в рамках данных методов, для преодоления рассмотренных трудностей.
Темы:
A. Переменные
Б. Функциональные Глобальные Переменные
В. Состояния конкуренции
Г. Синхронизация передачи данных
2-1

А. Переменные
В LabVIEW в отличие от текстовых языков программирования порядок выполнения элементов блок-диаграммы определяется потоком данных, а не последовательностью команд. Поэтому возможно создание такой блок-диаграммы, в которой операции выполняются одновременно. Например, можно одновременно запустить два Цикла по условию, которые будут выводить результаты на лицевую панель. Эта ситуация показана на следующем рисунке.
Однако если вы используете проводники для передачи данных между параллельными структурами блок-диаграммы, они уже не смогут выполняться одновременно. Параллельные структуры могут представлять собой два параллельных цикла без какойлибо зависимости потоков данных на одной блок-диаграмме либо два отдельных ВП, вызываемых в один момент времени.
Блок-диаграмма, показанная на рисунке 2-1, не будет выполнять два цикла параллельно из-за наличия проводника, соединяющего два ВПП.
2-2

Рисунок 2-1. Циклы по условию с зависимостью данных из-за наличия проводника
Проводник создает зависимость данных, поскольку второй цикл не начнет выполняться до тех пор, пока не закончит выполнение первый цикл и не передаст данные через свой тоннель. Чтобы запустить два цикла параллельно, необходимо удалить проводник, а для передачи данных между ВПП использовать другой способ, такой как переменную.
Под переменными (variables) в LabVIEW понимаются такие элементы блок-диаграммы, которые позволяют получать доступ либо сохранять данные не на блок-диаграмме, а в другом месте. Действительное расположение данных зависит от типа переменной. Локальные переменные (Local variables) хранят данные в элементах управления и индикаторах лицевой панели. Глобальные переменные (Global variables) и однопроцессные переменные общего доступа (single process shared variables) – в
специальных областях памяти, к которым можно получить доступ из нескольких ВП. Функциональные глобальные переменные хранят данные в сдвиговых регистрах цикла по условию. Но вне зависимости от того, где переменные хранят данные, они позволяют обойти принцип потока данных, передавая информацию из одного места в другое без соединений проводником. По этой причине переменные весьма полезны в архитектурах с параллельными структурами. Однако при использовании переменных может возникнуть ряд проблем, например состояния конкуренции (race conditions).
Использование переменных в отдельном ВП
Для передачи данных внутри отдельного ВП используются локальные переменные (local variables).
Создание локальных переменных
Для создания локальной переменной щелкните правой кнопкой мыши на объекте лицевой панели или терминале блок-диаграммы и выберите в контекстном меню опцию Create»Local Variable (Создать»Локальная переменная). Иконка локальной переменной объекта появится на блок-диаграмме.
2-3

Другой способ создания локальной переменной состоит в выборе опции Local Variable в палитре Functions»All Functions»Structures (Функции»Все функции»Структуры).
Появится узел локальной переменной, показанный ниже, который ещё не сопоставлен с элементом управления или индикатором.
Для сопоставления щелкните правой кнопкой мыши на узле и выберите из списка Select Item контекстного меню объект лицевой панели. В этом списке показаны все элементы лицевой панели, имеющие собственные ярлыки.
Как видим, LabVIEW использует собственные ярлыки для сопоставления локальных переменных с объектами лицевой панели, поэтому не забывайте снабжать элементы управления и индикаторы собственными ярлыками (если по каким-то причинам их нет).
Запись и считывание из локальных переменных
После создания локальной или глобальной переменной из нее можно считать или в нее можно записать данные. По умолчанию, созданная переменная принимает данные. Такой тип переменной ведет себя подобно индикатору и называется write local или global. При записи новых данных в локальную или глобальную переменную, соответствующий элемент управления либо индикатор меняет свое значение на новое.
Переменную можно настроить таким образом, чтобы она вела себя подобно источнику данных. Такая переменная называется read local или global. Для этого щелкните правой кнопкой мыши на переменной и выберите в контекстном меню опцию Change To Read (Изменить на считывание). При исполнении данного узла ВП считывает данные из соответствующего элемента управления либо индикатора.
Для обратного изменения, то есть, чтобы данные поступали с блок-диаграммы, щелкните правой кнопкой мыши на переменной и выберите из контекстного меню опцию Change To Write (Изменить на запись).
Отличить локальные переменные, работающие на считывание и на запись, можно таким же образом, как и элементы управления и индикаторы. Переменная read local (global) имеет жирные границы, как у элемента управления. Переменная write local (global) имеет тонкие границы, как у индикатора.
Примеры использования локальных переменных
В параграфе Распараллеливание задач первого занятия Основные методики разработки вы видели пример ВП, в котором
2-4

используются параллельные циклы. На лицевой панели этого ВП находится выключатель, который останавливает генерацию данных, и два графических индикатора, отображающие эти данные. На блок-диаграмме данные для каждого из графиков генерируются в отдельных Циклах по условию, позволяя задавать индивидуальные временные характеристики генерации. Терминал Управление циклами останавливает оба цикла. В рассматриваемом примере оба цикла должны совместно использовать выключатель для остановки своей работы в один момент времени.
Для того чтобы оба графика обновлялись, как мы запланировали, Циклы по условию должны выполняться параллельно. Соединение циклов проводником, передающим данные выключателя, делает их выполнение последовательным, а не параллельным. На рисунке 2-2 показана блок-диаграмма ВП, использующего локальную переменную для передачи данных выключателя.
Цикл 2 считывает локальную переменную выключателя. После нажатия на выключатель, его терминал передаст значение Ложь на терминал условия выхода из Цикла 1. Тем временем, Цикл 2 считает значение локальной переменной (Ложь) и передаст его на свой терминал условия выхода. Таким образом, циклы будут выполняться параллельно и остановятся одновременно после нажатия единственного выключателя на лицевой панели.
Рисунок 2-2. Локальная переменная используется для остановки параллельно выполняющихся циклов
Используя локальную переменную, можно записывать или считывать значения из элемента управления/индикатора лицевой панели. Запись значения в локальную переменную напоминает передачу данных в любой другой терминал. Однако локальная переменная позволяет произвести запись, даже если она принадлежит элементу управления, или считывание, если индикатору. В сущности, используя локальную переменную, мы можем использовать объект лицевой панели и как источник и как приемник данных.
2-5
Например, если программа требует от пользователя регистрации при входе в систему, то при каждом новом входе можно очищать значения окон Имя Пользователя и Пароль. Используйте локальную переменную для считывания строк Имя Пользователя и Пароль при входе пользователя в систему, и записи пустых строк в эти элементы управления при его выходе.
Использование переменных для обмена данными между несколькими ВП
Переменные можно использовать для организации доступа и передачи данных между несколькими ВП, выполняющимися одновременно. Локальная переменная может использоваться совместно в пределах только одного ВП, а глобальная переменная – среди нескольких ВП. Например, предположим, что у вас есть два ВП, выполняющихся одновременно. Каждый из ВП содержит Цикл по условию, в котором происходит запись данных на развертку осциллограмм. В первом ВП имеется кнопка остановки работы обоих ВП. Для того чтобы она работала правильно, необходимо использовать глобальную переменную. Если бы оба цикла находились на блок диаграмме одного ВП, то для одновременной остановки циклов можно было бы использовать локальную переменную.
Однопроцессная переменная общего доступа (single process shared variable) используется точно таким же образом, что и глобальная переменная. Она очень похожа на локальную или глобальную переменную, но позволяет использовать данные совместно в локальной сети. Переменная общего доступа может быть однопроцессной либо сетевой (network published). Хотя в данном курсе вы не будете изучать сетевые переменные, в будущем вы сможете легко их использовать, изучив однопроцессные переменные.
Если необходим обмен данными между несколькими ВП в пределах одного компьютера, применяйте глобальную переменную. Тем более, если вы не используете файл проекта. Если же в будущем вам понадобится обмениваться информацией между несколькими ВП на разных компьютерах, тогда придется применять однопроцессную переменную общего доступа.
Создание глобальных переменных
Глобальные переменные используются для обмена данными между несколькими ВП, выполняющимися одновременно. Глобальные переменные являются встроенными объектами LabVIEW. При создании глобальной переменной LabVIEW автоматически создает глобальный ВП, у которого есть лицевая панель, но нет блок-диаграммы. Для определения типа данных, содержащихся в глобальной переменной, необходимо добавить элементы управления и индикаторы на лицевую панель
2-6

глобального ВП. По существу, эта лицевая панель – просто контейнер, из которого несколько ВП могут получать данные.
Например предположим, что имеется два ВП, выполняющихся одновременно. Каждый ВП содержит цикл While Loop и записывает данные в развертку осциллограммы. Первый ВП содержит логический элемент управления, которым мы хотим останавливать оба ВП. В этом случае необходимо использовать глобальную переменную. Если бы оба цикла находились на блокдиаграмме одного ВП, то для остановки циклов можно было бы использовать локальную переменную.
Выберите в палитре Functions глобальную переменную, показанную ниже, и поместите её на блок-диаграмму.
Дважды щелкните по этому узлу – появится лицевая панель глобального ВП. Поместите на нее элементы управления и индикаторы, как это происходит с обыкновенным ВП.
Для идентификации глобальных переменных LabVIEW использует собственные ярлыки объектов, так что не забывайте оставлять собственные ярлыки элементов управления и индикаторов и вводите для них какие-либо описательные имена.
Вы можете создать несколько отдельных глобальных ВП, каждый
содним объектом лицевой панели, или же один глобальный ВП с несколькими объектами лицевой панели. Глобальный ВП второго типа более эффективен, поскольку таким образом вы можете сгруппировать связанные по смыслу переменные. На блок диаграмме ВП может одновременно находиться несколько узлов глобальной переменной, которые соотнесены с элементами управления и индикаторами лицевой панели глобального ВП. Данные узлы глобальной переменной являются либо копиями первого узла, который вы поместили на блок-диаграмму ВП, либо узлами различных глобальных ВП. Так же как и в случае обычных ВПП вы можете поместить глобальные ВП на блокдиаграмму какого-либо виртуального прибора. Каждый раз, когда вы помещаете новый узел глобальной переменной на блокдиаграмму, LabVIEW создает новый ВП, сопоставленный только
сэтим узлом и его копиями.
На рисунке 2-3 приведена лицевая панель глобальной переменной, содержащая числовой, строковый и кластерный элементы управления. Как видим, на панели инструментов, в отличие от обычной лицевой панели, отсутствуют кнопки Run,
Stop и т.д.
2-7

Рисунок 2-3. Лицевая панель глобальной переменной
После того, как вы создали лицевую панель глобального ВП, сохраните его и возвратитесь на блок-диаграмму исходного ВП. Теперь необходимо выбрать объект глобального ВП, с которым вы будете работать. Для этого щелкните правой кнопкой мыши по глобальной переменной и выберите в разделе Select Item контекстного меню объект лицевой панели. В этом списке содержатся все объекты лицевой панели, имеющие собственные ярлыки.
Можно также щелкнуть левой кнопкой мыши (в режиме
Operating tool или Labeling tool) по глобальной переменной и выбрать из всплывающего меню объект лицевой панели.
Если возникла необходимость использовать глобальную переменную в других ВП, выберите в палитре Functions»All Functions»Select a VI (Функции»Все Функции»Выбрать ВП).
По умолчанию, глобальной переменной назначается первый объект с собственным ярлыком, который вы поместили в глобальный ВП. Чтобы назначить глобальной переменной данные другого объекта, щелкните правой кнопкой мыши по глобальной переменной и выберите в разделе Select Item контекстного меню нужный объект лицевой панели.
Создание Однопроцессных Переменных Общего доступа
При работе с переменными общего доступа необходимо использовать файл проекта. Для создания однопроцессной переменной общего доступа (single process shared variable)
щелкните правой кнопкой мыши по иконке My Computer в окне обозревателя проекта Project Explorer и выберите в контекстном меню опцию New»Variable (Новый объект»Переменная).
2-8

Появится диалоговое окно Shared Variable, как показано на рисунке 2-4.
Рисунок 2-4. Диалоговое окно настройки свойств переменной общего доступа
В меню Variable Type выберите тип переменной Single Process. Назовите переменную и присвойте ей тип данных. После создания переменной она автоматически появится в новой библиотеке в файле проекта. Сохраните библиотеку. По мере необходимости вы можете добавлять в неё новые переменные. В списке в окне проекта можно выбрать переменную и перенести её непосредственно на блок-диаграмму. Для выбора режима работы переменной – запись или считывание – используйте контекстное меню. Не забывайте также про кластеры ошибок, с помощью которых можно управлять потоком данных.
Проблемы при использовании переменных
Локальные и глобальные переменные являются более совершенными концепциями среды разработки LabVIEW. По своей сути они не подчиняются принципу потока данных. При использовании локальных и глобальных переменных блокдиаграммы становятся трудными для восприятия и понимания их работы. Поэтому пользоваться ими нужно с осторожностью. Злоупотребление переменными, как например использование их вместо соединительной панели или применение их для организации доступа к значениям в каждом кадре структуры Последовательности, может привести к неожиданному поведению ВП. Чрезмерное их употребление, как например, во избежание длинных проводников через всю блок-диаграмму или вместо использования принципа потока данных, уменьшает производительность ВП.
2-9

Часто переменные используются не по назначению. На рисунке 2-5 показан пример приложения для управления светофором, реализованного в виде машины состояний. Каждое состояние обновляет цвета для следующего состояния, формируя последовательность переключения цветов. В показанном состоянии движение в направлении восток-запад разрешено – светофор имеет зеленый цвет, а в направлении север-юг – запрещено, цвет светофора – красный. Этот этап длится 4 секунды, что задается функцией паузы Wait (ms).
Рисунок 2-5. Слишком много используемых переменных
Пример на рисунке 2-6 выполняет в точности ту же задачу, но более эффективно и имеет более понятную блок-диаграмму. Обратите внимание, что блок-диаграмму в этом примере более легко прочитать и понять по сравнению с предыдущим примером, и все благодаря уменьшению количества используемых переменных. Размещение индикаторов в Цикле по условию, но вне структуры Варианта, приводит к их обновлению при смене состояний без использования переменных. По сравнению с первым этот ВП гораздо проще модифицировать для будущих приложений, например, при добавлении указателя левого поворота.
2-10

Рисунок 2-6. Уменьшение использования переменных
Инициализация переменных
Перед запуском ВП необходимо проконтролировать, чтобы локальные и глобальные переменные содержали заранее определенные данные. В противном случае переменные могут содержать такие данные, которые вызовут неправильное поведение ВП.
Если вы не инициализируете переменную перед первым запуском ВП, она будет содержать значение, принятое по умолчанию для ассоциированного объекта лицевой панели.
На рисунке 2-7 приведен пример типичной ошибки при использовании переменных. Общая переменная синхронизирует терминалы условий выхода из двух циклов. При первом запуске этот пример выполниться нормально, поскольку значение по умолчанию для логических переменных – Ложь (False). При нажатии на кнопку Стоп этот элемент управления запишет в переменную значение Истина (True). Поэтому при следующих запусках ВП нижний цикл остановится после одной итерации, если, конечно, первый цикл не обновит значение переменной достаточно быстро.
2-11

Рисунок 2-7. Неправильная инициализация переменной общего доступа
На рисунке 2-8 показана правильная реализация ВП. Инициализация переменной перед началом выполнения циклов гарантирует, что второй цикл не будет сразу же остановлен.
Рисунок 2-8. Правильная инициализация переменной общего доступа
Б. Функциональные глобальные переменные
Неинициализированные сдвиговые регистры циклов по условию и с фиксированным числом итераций можно использовать для хранения данных. Однако это возможно лишь до тех пор, пока ВП не выгружен из памяти компьютера. При этом в регистре сохраняется его последнее значение. Таким образом, цикл по условию, помещенный в отдельный ВПП, совместно со сдвиговыми регистрами можно использовать для хранения,
2-12

считывания и записи данных. Использование данного способа напоминает использование глобальной переменной, поэтому его часто называют функциональной глобальной переменной. Преимуществом данного метода по сравнению с обычной глобальной переменной заключается в возможности управлять доступом к данным в сдвиговом регистре. Функциональная глобальная переменная общего вида содержит неинициализированный сдвиговый регистр с однократно выполняющимся циклом по условию или с фиксированным числом итераций. Эта ситуация показана на рисунке 2-9.
1 Неинициализированный сдвиговый регистр
Рисунок 2-9. Структура функциональной глобальной переменной
Функциональная глобальная переменная обычно содержит воздействующий входной параметр, который определяет задачу, выполняемую ВП. В свою очередь, в ВП используется неинициализированный сдвиговый регистр цикла по условию для хранения результата операции.
На рисунке 2-10 показана простейшая функциональная глобальная переменная с возможностью записи и считывания значения.
2-13

Рисунок 2-10. Функциональная глобальная переменная с возможностью записи и считывания значения.
В этом примере при установке режима «Задать» данные поступают в ВП и сохраняются в сдвиговом регистре. При установке режима «Считать» данные извлекаются из сдвигового регистра.
Хотя вы можете использовать функциональные глобальные переменные в качестве обычных глобальных переменных, как показано в предыдущем примере, они особенно полезны при работе со сложными структурами данных, такими как стек или упорядоченный буфер. Также они используются для организации доступа к глобальным ресурсам, таким как файлы, приборы и устройства сбора данных, с которыми нельзя ассоциировать обычную глобальную переменную.
Примечание. Функциональная глобальная переменная представляет собой ВПП без повторного входа (not reentrant). Это означает, что в случае вызова этого ВПП из различных программ, используется одна и та же копия ВПП.
Следовательно, в каждый момент времени возможен только один вызов ВПП.
Использование функциональной глобальной переменной для измерения времени
Одним из самых полезных применений функциональной глобальной переменной является измерение временных интервалов при работе ВП. Многие ВП, предназначенные для
2-14

измерительных задач и автоматизации, требуют той или иной формы измерения времени. Часто прибору либо измерительному устройству необходимо некоторое время для инициализации, которое необходимо определять и принимать во внимание при работе ВП. С этой целью вы можете создать функциональную глобальную переменную для измерения времени между вызовами данного ВП, как показано на рисунке 2-11.
Рисунок 2-11. Функциональная глобальная переменная для определения рабочего времени
В варианте «Время работы» определяются текущая дата и время, выраженное в секундах, которые вычитаются из данных, хранящихся в сдвиговом регистре. Вариант «Время обнуления» служит для инициализации функциональной глобальной переменной, записывая известное временное значение.
Заметим, что экспресс ВП Elapsed Time выполняет те же функции, что и данная глобальная переменная. Однако преимущество её использования заключается в том, что функциональность глобальной переменной может быть легко изменена, например, путем добавлена опция паузы.
2-15
Упражнение 2-1. Работа с переменными
Цель
Использовать переменные для записи и считывания данных из элемента управления
Описание работы
Вы работаете над проектом LabVIEW, в котором будет создана метеостанция, измеряющая значение температуры. Температура измеряется каждые пол секунды, анализируется на предмет слишком большого или малого её значения и затем пользователь оповещается о том, существует ли опасность перегрева или переохлаждения. При возникновении предупреждений программа сохраняет данные.
С помощью двух элементов управления на лицевой панели задаются уставки – верхний и нижний пределы температуры. Однако ничто не мешает пользователю установить нижний предел выше верхнего.
Ваша задача заключается в том, чтобы с помощью переменных установить нижний предел равным верхнему в случае, если пользователь задал нижний больше верхнего.
2-16
Разработка
ВП данного проекта уже созданы. Ваша задача состоит лишь в их модификации, так чтобы верхний и нижний пределы сравнивались в случае необходимости.
Определения состояний
В следующей таблице описаны состояния в машине состояний.
Состояние |
Описание |
Следующее |
|
состояние |
|||
|
|
||
Сбор данных |
Устанавливает |
Анализ |
|
|
отсчет времени в |
|
|
|
ноль, получает |
|
|
|
данные с датчика |
|
|
|
температуры и |
|
|
|
считывает значения |
|
|
|
элементов |
|
|
|
управления |
|
|
|
|
|
|
Анализ |
Определение |
Сохранение данных в |
|
|
опасного уровня |
случае возникновения |
|
|
|
опасной ситуации; |
|
|
|
Проверка времени, |
|
|
|
если всё в порядке |
|
|
|
|
|
Сохранение |
Сохранение данных |
Поверка времени |
|
данных |
в ASCII файл, |
|
|
|
данные в котором |
|
|
|
разделяются |
|
|
|
символом |
|
|
|
табуляции |
|
|
|
|
|
|
Поверка |
Проверяет, больше |
Сбор данных, если |
|
времени |
или равно |
время истекло; |
|
|
прошедшее время |
Проверка времени, |
|
|
0.5 секунды |
если 0.5 секунды ещё |
|
|
|
не прошло. |
Изменение значения нижнего предела температуры должно происходить после того, как оператор введет новое значение, но перед тем, как это значение задаст опасный уровень. Поэтому необходимо ввести изменения либо в состояния Сбор данных и Анализ, либо создавать новое состояние между двумя указанными.
Перед выбором какого-либо возможного варианта, изучите принцип действия состояний Сбор данных и Анализ:
2-17
Откройте проект Метеостанция, расположенный в папке
C:\Упражнения\LabVIEW основы II\Переменные.
Откройте ВП Интерфейс метеостанции.
Изучите содержимое состояний Сбор данных и Анализ, которые соответствуют вариантам Сбор данных и Анализ структуры Варианта.
Варианты разработки
Вы можете воспользоваться следующими тремя вариантами модификации данного проекта.
Вариант |
Описание |
Преимущества/Недостатки |
|
|
|
1 |
Добавьте структуру |
Недостаток: в состояние |
|
Варианта в состояние |
Сбор данных добавляется |
|
Сбор данных для |
ещё одна задача. Таким |
|
инициализации |
образом, вместе со сбором |
|
элементов управления |
данных параллельно будет |
|
перед тем, как |
выполняться ещё одна |
|
локальная переменная |
задача. |
|
запишет значения в |
|
|
кластер. |
|
2 |
Добавьте ещё одно |
Возможность управления |
|
состояние в машину |
при возникновении |
|
состояний для |
состояния. |
|
проверки элементов |
|
|
управления и |
|
|
возвращения их в |
|
|
исходное состояние в |
|
|
случае |
|
|
необходимости. |
|
3 |
Измените ВПП |
Простота реализации, |
|
Определить |
поскольку часть кода уже |
|
предупреждения для |
находится на блок- |
|
возвращения |
диаграмме. Однако, если |
|
элементов управления |
использовать уже |
|
в исходное состояние. |
имеющуюся |
|
|
функциональность, часть |
|
|
данных будет неизменно |
|
|
теряться при возвращении |
|
|
элемента управления |
|
|
нижним пределом в |
|
|
исходное состояние. |
В данном упражнении в качестве решения будет использоваться второй вариант.
2-18

Новые определения состояний для варианта 2
В следующей таблице описаны новые определения состояний, которые вы будете создавать на следующем этапе.
Состояние |
Описание |
Следующее |
|
состояние |
|||
|
|
||
Сбор данных |
Получает данные с |
Проверка пределов |
|
|
датчика температуры, |
|
|
|
подключенного к каналу |
|
|
|
AI0, и считывает |
|
|
|
значения элементов |
|
|
|
управления |
|
|
|
|
|
|
Проверка |
Считывает значения |
Анализ |
|
пределов |
элементов управления и |
|
|
|
устанавливает нижний |
|
|
|
предел равным верхнему, |
|
|
|
если верхний предел |
|
|
|
имеет величину, |
|
|
|
меньшую нижнего |
|
|
|
|
|
|
Анализ |
Определение опасного |
Сохранение данных |
|
|
уровня |
в случае |
|
|
|
возникновения |
|
|
|
аварийной |
|
|
|
ситуации; Проверка |
|
|
|
времени, если всё в |
|
|
|
порядке |
|
|
|
|
|
Сохранение |
Сохранение данных в |
Поверка времени |
|
данных |
ASCII файл, данные в |
|
|
|
котором разделяются |
|
|
|
символом табуляции |
|
|
|
|
|
|
Поверка |
Проверяет, больше или |
Сбор данных, если |
|
времени |
равно прошедшее время |
время истекло; |
|
|
0.5 секунды |
Проверка времени, |
|
|
|
если 0.5 секунды |
|
|
|
ещё не прошло. |
Создание ВП
1.Если проект Метеостанция.lvproj еще не открыт, откройте его. Он находится в папке
C:\Упражнения\LabVIEW Основы II\Переменные.
Примечание. Если у вас нет устройства сбора данных и испытательной коробки, то вместо указанных файлов воспользуйтесь файлами,
находящимися в папке C:\Упражнения\LabVIEW Основы II\Без аппаратных средств\Переменные.
2-19
2. Добавьте состояние Проверка пределов в машину состояний.
В окне обозревателя проекта Project Explorer двойным щелчком мыши откройте определитель типа элемента управления Состояния метеостанции.ctl, который задает состояния для машины состояний.
Щелкните правой кнопкой мыши по элементу управления и выберите в контекстном меню опцию редактирования вариантов Edit Items.
Добавьте вариант в соответствии с таблицей 2-1. Будьте внимательны, не добавляйте пустого варианта.
Таблица 2-1. Значения элемента управления с перечислением
Вариант |
Значение цифрового индикатора |
|
|
Сбор данных |
0 |
|
|
Проверка пределов |
1 |
|
|
Анализ |
2 |
|
|
Сохранение данных |
3 |
|
|
Проверка времени |
4 |
|
|
Сохраните и закройте элемент управления.
Если ВП Интерфейс метеостанции не открыт,
откройте его двойным щелчком мыши на соответствующем элементе в окне Project Explorer.
Откройте блок-диаграмму
Щелкните правой кнопкой мыши на структуре Варианта машины состояний и выберите в контекстном меню опцию
Add Case for Every Value (Добавить Вариант для каждого значения). Поскольку элемент управления с перечислением имеет новое значение, то в структуре Варианта появится новый вариант.
3.Значения элементов управления верхним и нижним пределами теперь будут считываться в состоянии Проверка пределов вместо состояния Сбор данных, как это было раньше.
2-20

Рисунок 2-12. Завершенное состояние Сбор данных.
Отредактируйте состояние Сбор данных в структуре Варианта.
Для константы Следующее Состояние выберите значение Проверка пределов.
Скопируйте константу Следующее Состояние, удерживая нажатой клавишу <Ctrl> и перетаскивая копию наружу цикла по условию.
Также во вне цикла переместите элементы управления Верхняя и Нижняя уставки.
Измените размер функции Bundle by Name, сократив его до одного элемента, как показано на рисунке 2-12.
Отредактируйте состояние Проверка пределов в структуре Варианта.
Поместите в тело этого варианта элементы управления Верхняя и Нижняя уставки, а также константу Следующее Состояние.
4.Следующим состоянием после Проверки пределов должно быть состояние Анализа.
Константу Следующее состояние внутри варианта Проверка пределов присоедините к выходному тоннелю структуры.
Измените значение этой константы, выбрав Анализ.
2-21

5.Если верхняя уставка меньше нижней, используйте локальную переменную для записи значения верхней уставки в элемент управления Нижняя уставка.
Рисунок 2-13. Завершенное состояние Проверка пределов – вариант True
Поместите функцию Less? (Меньше?) в состояние Проверка пределов.
Поместите структуру Варианта справа от функции Less?.
Терминалы элементов управления Верхняя и Нижняя уставки присоедините к функции Less? и к структуре Варианта, как показано на рисунке 2-13.
Вызовите контекстное меню элемента управления Нижняя уставка и выберите в нём опцию Create»Local Variable (Создать»Локальная переменная).
Поместите созданную локальную переменную внутрь варианта True структуры Варианта.
Справа от структуры Варианта разместите функцию Bundle By Name (Объединить по имени)
Присоедините кластер Данные температуры ко входному терминалу input cluster функции Bundle By Name.
Увеличьте количество входов функции Bundle By Name до двух.
2-22

Для первого входа выберите Верхняя уставка Т, для второго – Нижняя уставка Т.
Поместите логическую константу False в структуру
Варианта.
Произведите соединения проводников внутри структуры, как показано на рисунке 2-13.
6.Если Верхняя уставка больше или равна нижней, значения этих элементов управления должны напрямую поступать в кластер температуры.
Рисунок 2-13. Завершенное состояние Проверка пределов – вариант False
Переключитесь на вариант False внутренней структуры Варианта
Присоедините входной тоннель с данными Верхней уставки к выходному тоннелю также Верхней уставки.
Аналогичным образом присоедините входной тоннель с данными Нижней уставки к выходному тоннелю Нижней уставки.
7.Сохраните ВП.
8.Сохраните проект.
Проверка
2-23
1. Запустите ВП.
При появлении окна с запросом введите имя файла.
Введите значение Верхней уставки меньше, чем Нижней. Ведет ли себя ВП, как ожидалось?
2.Остановите ВП после окончания работы.
3.Закройте ВП и проект.
Конец упражнения 2-1
2-24

В. Состояния конкуренции
Состояние конкуренции – это ситуация, когда последовательность событий или задач может непреднамеренно оказывать влияние на выходные данные. Состояния конкуренции
– это распространенная проблема тех программ, в которых несколько задач выполняются параллельно и обмениваются между собой данными. Рассмотрим пример, изображенный на рисунках 2-15 и 2-16.
Рисунок 2-15. Пример состояния конкуренции: Цикл 1.
Рисунок 2-16. Пример состояния конкуренции: Цикл 2.
В обоих циклах на каждой итерации увеличивается значение совместно используемой переменной. После запуска и остановки выполнения программы мы ожидаем, что результат, отображаемый на индикаторе Итоговая сумма, будет равен сумме счетчиков Отсчет 1 и Отсчет 2. Если вы запустите программу на короткое время, то действительно увидите ожидаемый результат. Однако если оставить выполняться программу на продолжительное время, значение Итоговой суммы окажется меньше суммы Отсчета 1 и Отсчета 2, поскольку в данной программе выполняется условие конкуренции.
На компьютере с одним процессором действия в подобных многозадачных программах выполняются последовательно, однако LabVIEW и операционная система быстро переключают
2-25
задачи. Поэтому создается впечатление, что задачи выполняются одновременно. В данном примере состояние конкуренции возникает в определенные моменты времени при переключении с одной задачи на другую. Заметим, что оба цикла выполняют следующие операции:
•Считывают значение общей переменной.
•Увеличивают считанное значение на единицу.
•Записывают увеличенное значение в общую переменную.
Теперь рассмотрим, что произойдет, если операции в циклах будут происходить в следующем порядке:
1.Цикл 1 считывает значение общей переменной.
2.Цикл 2 считывает значение общей переменной.
3.Цикл 1 увеличивает считанное значение на единицу.
4.Цикл 2 увеличивает считанное значение на единицу.
5.Цикл 1 записывает увеличенное значение в общую переменную.
6.Цикл 2 записывает увеличенное значение в общую переменную.
Вданном примере оба цикла записывают одно и то же значение в переменную, причем приращение от первого цикла эффективно переписывается Циклом 2. Такая ситуация вызывает состояние конкуренции, которая может привести к ошибочным результатам подсчета при работе данной программы.
Вданном конкретном примере между считыванием и записью в совместно используемую переменную существует ряд операций. Поэтому менее всего вероятно, что ВП переключится между выполнениями циклов в неподходящее время. Это объясняет, почему ВП прекрасно работает в течение небольших промежутков времени и теряет всего лишь несколько отсчетов за длительное время.
Состояния конкуренции трудно идентифицировать и отлаживать, поскольку результат выполнения зависит от порядка, в котором операционная система выполняет запланированные задачи, и последовательности возникновения внешних событий. Способы взаимодействия задач между собой и операционной системой, а также произвольные времена наступления внешних событий делают порядок выполнения операций полностью случайным. Часто код, в котором выполняется условие конкуренции, в процессе тестирования может возвращать тысячи раз один и тот же результат, однако все же может возвратить отличающийся результат в процессе работы.
2-26
Наилучший способ избежать состояний конкуренции заключается в использовании следующих методов:
•Контролирование и ограничение совместно используемых ресурсов.
•Определение и защита критических участков кода.
•Строгое задание порядка выполнения.
Контролирование и ограничение совместно используемых
ресурсов
Состояния конкуренции чаще всего возникают, когда две задачи имеют права на считывание и запись данных в какой-либо ресурс, как в выше рассмотренном примере. Ресурсом является любой объект, совместно используемый несколькими процессами. Что касается состояний конкуренции, то наиболее часто совместно используемыми ресурсами являются хранилища данных, такие как переменные. Другими примерами ресурсов могут являться файлы и ссылки на аппаратные ресурсы.
Сама возможность изменения ресурса из нескольких мест программы часто открывает путь состоянию конкуренции. Поэтому наилучшим способом избежать этого является минимизация количества общих ресурсов и количества источников записи в оставшиеся общие ресурсы. Иметь же несколько считывателей данных из общего ресурса никто не запрещает. Стремитесь лишь к тому, чтобы данные записывались в общий ресурс из одного места.
В предыдущем примере вы можете уменьшить зависимости общих ресурсов, заставляя циклы самостоятельно вести подсчет. А затем, после нажатия на кнопку Стоп, разрешить в совместный доступ итоговые отсчеты. Такой способ приводит только к однократному считыванию и записи в общий ресурс, что исключает возможность возникновения состояния конкуренции. Если все общие ресурсы имеют только один источник записи, а программа выполняется в строго определенном порядке, тогда состояния конкуренции исключены.
Защита критических участков кода
Критический участок кода – код, который может вести себя неустойчиво, если некоторый общий ресурс изменяется в процессе выполнения. При использовании многозадачных программ одна задача после начала выполнения может прерывать выполнение другой. Практически во всех современных операционных системах такая ситуация встречается регулярно. Обычно это не оказывает никакого влияния на выполнение кода. Однако когда прерывающая задача изменяет общий ресурс, который предполагается неизменным со стороны прерываемой задачи, тогда возникает состояние конкуренции.
2-27

На рисунках 2-15 и 2-16 часть кода выделена красным. Это – критические участки кода. Если один цикл прерывает другой, пока тот выполняет критический участок, может возникнуть состояние конкуренции. Один из способов исключения такой проблемы – найти и защитить критические участки кода.
Существует несколько методов защиты. Два наиболее эффективных – функциональные глобальные переменные и семафоры.
Функциональные глобальные переменные
Один из способов защиты критических участков состоит в том, чтобы поместить их в отдельные ВПП. Дело в том, что ВПП без повторного входа (non-reentrant) можно вызвать только из одного места в данный момент времени. Таким образом, помещая критический участок в ВПП, вы защищаете его от прерывания другими процессами, вызывающими ВПП. Использование архитектуры функциональной глобальной переменной особенно эффективно, так как сдвиговые регистры могут заменить менее защищенные методы хранения данных, такие как глобальные переменные или однопроцессные общие переменные. Функциональные глобальные переменные дают возможность создавать многофункциональные ВПП, которые могут обрабатывать все задачи, связанные с определенным ресурсом.
После выделения всех критических участков кода в программе, сгруппируйте их по ресурсам, к которым они обращаются, и создайте по одной функциональной глобальной переменной для каждого из ресурсов. Критические участки, выполняющие различные операции, могут стать командой для функциональной глобальной переменной, поэтому вы можете сгруппировать критические участки, выполняющие одну и ту же операцию, в одну команду, повторно используя код.
Функциональные глобальные переменные можно использовать для защиты программы, код которой приведен на рисунках 2-15 и 2-16. Просто замените совместно используемые переменные функциональной глобальной переменной, а код, увеличивающий значение счетчика, поместите внутрь этой переменной в соответствии с решениями, приведенными на рисунках 2-17, 2-18
и 2-19.
2-28

Рисунок 2-17. Использование Функциональных глобальных переменных для защиты критических участков в цикле 1.
Рисунок 2-18. Использование Функциональных глобальных переменных для защиты критических участков в цикле 2.
Рисунок 2-19. Функциональная глобальная переменная, используемая во избежание состояния конкуренции.
Семафоры
Семафоры – средства синхронизации, специально созданные для защиты ресурсов и критических участков кода. Взаимных прерываний критических участков кода можно избежать,
2-29

помещая каждый из них между ВП Acquire Semaphore и Release Semaphore (запросить и освободить семафор). По умолчанию семафор допускает захват ресурсов только одной задачей в данный момент времени. Поэтому после того, как одна из задач начала выполнять критический участок кода, другие задачи не смогут начать выполнение своих критических участков до тех пор, пока не завершит первая. Если всё сделать правильно, это исключит саму возможность возникновения состояния конкуренции.
Вы можете использовать семафоры для защиты критических участков программы, показанной на рисунках 2-15 и 2-16. Семафор с введенным именем допускает совместное использование несколькими ВП. Для этого вы должны открыть семафор в каждом ВП, затем запросить его перед критическим участком и освободить после выполнения участка кода. На рисунках 2-20 и 2-21 показано решение проблемы конкуренции с помощью семафоров.
Рисунок 2-20. Защита критического участка с помощью семафора в цикле 1
Рисунок 2-21. Защита критического участка с помощью семафора в цикле 2
Задание порядка выполнения ВП
Код, в котором поток данных неправильно используется для управления порядком выполнения программы, может вызвать
2-30

состояние конкуренции. Дело в том, что когда зависимости данных нет, а задачи зависят друг от друга, то LabVIEW может выполнять задачи в таком порядке, который создает возможность появления состояния конкуренции. Рассмотрим пример, изображенный на рисунке 2-22.
Рисунок 2-22. Простейший пример состояния конкуренции.
Код в данном примере может иметь четыре различных выходных значения, зависящие от порядка, в котором выполнялись операции.
Результат 1: Значение = (Значение*5)+2
1.Терминал считывает Значение.
2.Значение*5 сохраняется в переменной Значение.
3.Локальная переменная считывает Значение*5.
4.(Значение*5)+2 сохраняется в переменной Значение.
Результат 2: Значение = (Значение+2)*5
1.Локальная переменная считывает Значение.
2.Значение+2 сохраняется в переменной Значение.
3.Терминал считывает Значение+2.
4.(Значение+2)*5 сохраняется в переменной Значение.
Результат 3: Значение = Значение*5
1.Терминал считывает Значение.
2.Локальная переменная считывает Значение.
3.Значение+2 сохраняется в переменной Значение.
4.Значение*5 сохраняется в переменной Значение.
Результат 4: Значение = Значение+2
2-31
1.Терминал считывает Значение.
2.Локальная переменная считывает Значение.
3.Значение*5 сохраняется в переменной Значение.
4.Значение+2 сохраняется в переменной Значение.
Хотя предполагается, что данный код находится в состоянии конкуренции, он ведет себя менее случайно, чем первый рассмотренный нами пример. Это обусловлено тем, что LabVIEW обычно назначает определенный порядок выполнения операций. Однако старайтесь всё же избегать подобных ситуаций, поскольку определенный порядок выполнения и поведение программы не гарантируются. Например, порядок выполнения может меняться при запусках программы в различных условиях или после обновления версии среды LabVIEW. К счастью, состояний конкуренции такого вида легко избежать, просто контролируя поток данных.
2-32

Упражнение 2-2. Модель работы банка
Цель
Исключить возникновение состояния конкуренции.
Описание работы
Вы должны обнаружить и устранить проблему работы программного обеспечения в банке. Сервер банка должен быстро обрабатывать запросы, поступающие из большого количества источников. Для повышения эффективности работы программы на сервере используются два параллельных цикла: в одном обрабатываются вклады на счета, а во втором – снятия средств со счетов. Проблема, возникающая на сервере, состоит в потере некоторых запросов на вклады и снятия, что приводит к неправильным балансам.
Проверка
1.Откройте ВП Банк из папки C:\Упражнения\LabVIEW
Основы II\Банк.
2.Запустите ВП.
3.Познакомьтесь с программой, выполняя вклад, затем снятие средств и одновременно транзакцию.
4.Установите значение элемента управление Сумма вклада 20,
а Снимаемая сумма 10.
5.Откройте блок-диаграмму ВП Банк, во время его работы.
6.Расположите блок-диаграмму так, чтобы можно было одновременно наблюдать работу интерфейса пользователя.
7.Включите подсветку выполнения блок диаграммы, нажав кнопку Executive Highlighting на линейке инструментов.
8.Нажмите кнопку Транзакции одновременно и наблюдайте за процессом выполнения кода. Баланс должен возрасти на 10.
Обратите внимание, что либо перевод вклада, либо его снятие будет утеряно, что приведет к увеличению баланса на 20 или же уменьшению его на 10.
9. Остановите ВП.
Вы встретились с проблемой возникновения состояния конкуренции в участке кода, обрабатывающем вклады и снятие средств с отдельного счета. Хотя вы можете видеть последовательность действий, включив подсветку выполнения, в
2-33

обычном режиме операции будут выполняться случайным образом.
Устраните состояние конкуренции, защищая критические участки кода с помощью семафора. В данном ВП критические участки кода находятся в структуре Последовательности.
Изменение кода
1.Сохраните ВП под именем Банк с семафором.vi в папке
C:\Упражнения\LabVIEW Основы II\Банк.
2.Используйте семафор для защиты критических участков кода, как показано на рисунке 2-23.
Рисунок 2-23. Использование семафора
Поместите ВП Create Semaphore (Создать Семафор) слева от Циклов по условию.
Выполните соединения ВП Create Semaphore, как показано на рисунке 2-23.
Поместите один из ВП Acquire Semaphore (Запросить Семафор) в цикл обработки вкладов слева от структуры Последовательности.
Второй ВП Acquire Semaphore поместите слева от структуры Последовательности в цикл обработки снятия средств со счета.
Выполните подключения ВП Acquire Semaphore в
2-34

соответствии с рисунком 2-23.
Поместите один из ВП Release Semaphore (Освободить Семафор) в цикл обработки вкладов справа от структуры Последовательности.
Второй ВП Release Semaphore поместите справа от структуры Последовательности в цикл обработки снятия средств со счета.
Выполните подключения ВП Release Semaphore в соответствии с рисунком 2-23.
Поместите ВП Destroy Semaphore (Закрыть Семафор) справа от Циклов по условию.
Подключите ВП Destroy Semaphore, как показано на рисунке 2-23. Обратите внимание, что ВП Destroy Semaphore требует только одной ссылки на семафор.
3.Сохраните ВП.
4.Повторите шаги, описанные в разделе Проверка для тестирования изменений, внесенных в этот ВП.
5.Закройте ВП после окончания работы.
Конец Упражнения 2-2
2-35

Г. Синхронизация передачи данных
В LabVIEW очень удобно применять переменные для передачи данных между параллельно выполняющимися процессами. Однако есть методы, имеющие преимущество перед переменными, – уведомители и очереди, которые обладают возможностью синхронизовать передачу данных между параллельными процессами.
Переменные
Для организации взаимодействия между параллельными циклами необходимо использовать некоторую форму глобальных данных, разрешенных в совместный доступ. Однако использование глобальной переменной нарушает принцип потока данных LabVIEW, создает возможность возникновения состояний конкуренции и требует больших ресурсов, чем передача данных по проводникам.
Пример, показанный на рисунке 2-24, – не самая эффективная реализация программы с ведущим и ведомым процессами. В примере используется переменная, которая вызывает две проблемы – отсутствие синхронизации между процессами и возможность появления состояния конкуренции. Ведущий процесс не может сообщить ведомому о доступности данных, так что ведомый цикл должен непрерывно опрашивать переменную для определения изменения данных.
Рисунок 2-24. Реализация шаблона разработки «ведущийведомый» с использованием глобальной переменной
2-36

Уведомители
Более эффективная реализация шаблона «ведущий-ведомый» основана на использовании уведомителей (notifier) для синхронизации передачи данных. Уведомитель передает данные вместе с сообщением об их доступности. Использование уведомителя для передачи данных от ведущего процесса к ведомому устраняет все причины появления состояний конкуренции и обеспечивает синхронизацию, поскольку ведущий и ведомый процессы взаимодействуют по мере поступления данных. На рисунке 2-25 приведен пример реализации шаблона «ведущий-ведомый» с использованием уведомителей.
Рисунок 2-25. Шаблон разработки «ведущий-ведомый» с использованием уведомителей
Уведомитель создается перед началом выполнения циклов с помощью функции Obtain Notifier (Получить уведомителя). В основном цикле используется функция Send Notification (Послать уведомление) для уведомления подчиненного цикла с помощью функции Wait on Notification (Ждать уведомления). После завершения использования уведомителей применяется функция Release Notifier (Освободить уведомителя).
Применение уведомителей в программах с ведущим и ведомым процессами дает следующие преимущества:
•Оба цикла синхронизируются по ведущему. Ведомый цикл выполняется только после того, как ведущий цикл пошлет уведомление.
2-37

•Уведомители можно применять для создания данных, доступных глобально. Таким образом, можно посылать данные вместе с уведомлениями. На примере рисунка 2-25 видно, что функция Send Notification отправляет строку команда.
•Использование уведомителей повышает эффективность кода. Теперь нет необходимости в непрерывном опросе для определения поступления данных из ведущего цикла.
Однако использование уведомителей может иметь и неприятные последствия. Уведомитель не буферизирует данные. Если ведущий цикл пошлет новый объем данных прежде, чем ведомый цикл(ы) считает предыдущий, то данные будут просто переписаны и, таким образом, потеряны.
Очереди
Очереди похожи на уведомители за исключением того, что очередь может хранить несколько элементов данных. По умолчанию очереди работают в режиме FIFO (первым поступил – первым выводится) буфера. Поэтому первый объем данных, помещенный в очередь, будет первым выведен после запроса. Таким образом, если есть необходимость в обработке всех последовательно поступающих данных, используйте очередь. Если же необходимо обрабатывать только текущие данные, используйте уведомители.
При реализации шаблона «производитель-потребитель» очереди передают данные и синхронизируют циклы.
2-38
Рисунок 2-26. Шаблон разработки «производитель-потребитель», реализованная с помощью очередей.
Очередь создается с помощью функции Obtain Queue (Получить очередь) перед началом выполнения циклов. В цикле «производителя» функция Enqueue Element (Ввести элемент в очередь) применяется для добавления данных в очередь. В цикле «потребителя» данные из очереди удаляются с помощью функции Dequeue Element (Вывести элемент из очереди). Цикл «потребителя» не будет выполняться до тех пор, пока данные не поступят в очередь. Для окончания работы ВП с очередями используется функция Release Queue, после применения которой, функция Dequeue Element генерирует ошибку, эффективно останавливая работу цикла «потребителя». Поэтому для остановки циклов не возникает необходимости в использовании переменной для организации совместного доступа к кнопке Стоп.
Применение очередей в программах типа «производительпотребитель» дает следующие преимущества:
•Оба цикла синхронизируются по циклу «производителя». Цикл «потребителя» будет выполняться по мере поступления данных в очередь.
•Очереди можно использовать для создания глобально доступных данных. При этом устраняется возможность потери данных при их добавлении в очередь.
•Использование очередей повышает эффективность кода. Теперь нет необходимости в непрерывном опросе для определения поступления данных из цикла «производителя».
Очереди также полезны при запросах на выполнение состояний в машине состояний. При создании таких структур вы изучали, что если два состояния запрашиваются одновременно, один из запросов может быть потерян. Очередь будет сохранять запрос второго состояния и выполнит его после отработки первого запроса.
2-39
Упражнение 2-3. Проект: Очередь данных
Задача
Создать ВП, в котором используются модель «производительпотребитель» и очереди для передачи данных между циклами.
Описание работы
В процессе обучения вы создаете проект LabVIEW, реализующий метеостанцию. В течение курса вы будете вносить изменения в этот проект, чтобы он позволял измерять скорость ветра и, в случае большой скорости, выдавал штормовое предупреждение. Вам предстоит создать цикл «производителя», в котором с частотой 50 кГц будут считываться значения температуры и скорости ветра. Затем данные будут передаваться в цикл «потребителя» с помощью очередей. В цикле «потребителя» будет находиться машина состояния из исходного ВП метеостанции.
Разработка
На рисунке 2-27 показан пример шаблона разработки «производитель/потребитель» без функциональных элементов. В данном упражнении необходимо поместить машину состояний из ВП метеорологической станции в вариант No Error в цикле «потребителя». Код для сбора данных о температуре и скорости ветра необходимо внести в цикл «производителя».
2-40

Рисунок 2-27. Пример шаблона разработки «производитель/потребитель»
Блок-схема работы метеостанции приведена на рисунке 2-28. В данном упражнении вам предстоит завершить создание следующих блоков: Инициализация ресурсов, отправка и получение каждые ½ секунды данных о температуре и скорости ветра.
2-41

Рисунок 2-28. Блок-схема метеостанции
Создание ВП
1.Откройте проект Метеостанция.proj, расположенный в папке C:\Упражнения\LabVIEW Основы II\Курсовой проект.
Примечание. В случае если у вас нет устройства сбора данных и испытательной коробки, там, где это необходимо, будут даны дополнительные инструкции.
2.Из окна обозревателя проекта Project Explorer запустите ВП
Интерфейс метеостанции.
Создание ВПП Подготовка метеостанции
3. Переключитесь на блок-диаграмму.
2-42

Рисунок 2-29. Создание ВПП Подготовка метеостанции и цикла «потребителя»
4.Выделите все элементы блок-диаграммы слева от машины состояний за исключением константы Начальное состояние. Затем в меню Edit выберите опцию Create SubVI.
5.Сохраните созданный ВПП под именем Подготовка метеостанции.vi в папке C:\Упражнения\LabVIEW Основы II\Курсовой проект\Дополнительные файлы. Позже вы отредактируете данный ВП.
6.Вернитесь на блок-диаграмму ВП Интерфейс метеостанции.
Применение шаблона «производитель-потребитель»
7.Удалите функцию вычисления прошедшего времени в машине состояний.
Удалите сдвиговый регистр и логическую константу, присоединенные к экспресс ВП Elapsed Time.
Удалите логические константы в состояниях Проверка времени и Сбор данных, которые теперь ни к чему не будут присоединены.
Удалите выходной тоннель логических данных из структуры Варианта.
Удалите экспресс ВП Elapsed Time.
Нажмите сочетание клавиш <Ctrl-B> для удаления нарушенных проводников.
8.Измените ярлык кластерного элемента управления на
Метеоданные.
2-43
9.Уменьшите до минимально возможного размер машины состояния. В качестве примера возьмите рисунок 2-30. Это позволит видеть всю блок-диаграмму без прокрутки экрана, что, конечно, не оказывает влияния на функциональность ВП, поэтому при недостатке времени можете опустить данный этап.
10.Создайте структуру Варианта, окружив ею цикл по условию. При этом новый ВПП и константу Начальное состояние оставьте вне структуры Варианта.
11.Создайте ещё один Цикл по условию, окружив им структуру Варианта и константу Начальное состояние, но оставляя вне цикла новый ВПП, как показано на рисунке 2-29.
Внешний Цикл по условию – это цикл «потребителя» в рассматриваемой модели. На следующих этапах вы создадите цикл «производителя».
12.Сместите блок-диаграмму так, чтобы над циклом «потребителя» появилось свободное место.
13.Поместите в это место Цикл по условию. Это будет цикл «производителя».
14.В цикле «производителя» осуществите выборку 5000 значений температуры и скорости ветра с частотой 50 кГц. Если у вас есть устройство сбора данных (УСД) и испытательная коробка, следуйте инструкциям, находящимся в разделе С использованием аппаратного обеспечения
данного этапа. В противном случае выполняйте инструкции в разделе Без аппаратного обеспечения.
Сиспользованием аппаратного обеспечения
Поместите в цикл «производителя» помощника по сбору данных DAQ Assistant.
В интерактивном окне настройки выберите Analog Input»Voltage.
Затем выберите каналы сбора данных ai0 и ai1, удерживая при этом нажатой кнопку <Shift>.
Нажмите кнопку Finish.
Затем, когда выделена опция Voltage0, выберите масштаб Температура в выпадающем меню Custom Scaling.
Если же масштаба Температура в меню нет, выполните следующие действия:
– В выпадающем меню Custom Scaling выберите Create New,
затем Linear.
2-44
–Введите название масштаба Температура.
–Нажмите кнопку Finish.
–В поле Scaling Parameters введите наклон Slope равным 100.
–В разделе Units оставьте предмасштабными единицами PreScaled Units Volts, а после применения масштаба в поле Scaled
Units введите Градусы Цельсия.
– Нажмите кнопку OK.
Установите минимальное значение диапазона входного сигнала Signal Input Range равным 0, а максимальное 50.
На вкладке временных характеристик задачи Task Timing в поле количества считываемых выборок Samples to Read введите 5000, а для частоты выборки Rate (Hz) 50K.
Выделите Voltage1 для выполнения настроек канала измерения скорости.
Установите Max равным 1 и Min равным -1 Вольт в разделе
Signal Input Range.
Нажмите кнопку OK.
Растяните иконку DAQ Assistant, чтобы было видно терминалы кластеров входной и выходной ошибок.
Перейдите к пункту 15.
Без использования аппаратного обеспечения
В окне обозревателя Project Explorer добавьте в проект виртуальный прибор Имитатор погоды из папки
C:\Упражнения\LabVIEW Основы II\Курсовой проект\Дополнительные файлы.
Поместите копию ВП Имитатор погоды в цикл «производителя». Этот ВП имитирует процедуру сбора данных о температуре и скорости ветра.
2-45

46-2
Рисунок 2-30. Создание цикла «производителя» и очереди данных

15.Используйте очередь для передачи данных, сгенерированных в цикле «производителя», в цикл «потребителя».
16.Поместите функцию создания очереди Obtain Queue слева от цикла «производителя».
[С использованием аппаратного обеспечения] Щелкните правой кнопкой мыши по выходному терминалу DAQ Assistant и выберите в контекстном меню опцию
Create»Graph Indicator.
[Без аппаратного обеспечения] Щелкните правой кнопкой мыши по выходному терминалу ВП Weather Simulator и выберите в контекстном меню опцию Create»Graph Indicator.
Вызовите контекстное меню графика осциллограмм Waveform Graph и выберите в нем опцию Change to Control.
Измените название этого элемента управления на Данные о погоде.
Разместите терминал Данных о погоде слева от функции
Obtain Queue.
Вызовите контекстное меню терминала Данных о погоде и выберите в нем опцию Hide Control, чтобы скрыть элемент управления на лицевой панели.
Присоедините Данные о погоде к входу element data type
функции Obtain Queue.
Поместите функцию Enqueue Element внутрь цикла «производителя».
Соедините функции Enqueue Element и Obtain Queue как показано на рисунке 2-30.
Поместите функцию Release Queue справа от цикла «производителя».
Соедините функции Release Queue и Enqueue Element между собой, а кластеры ошибок со сдвиговыми регистрами в соответствии с рисунком 2-30.
17.В цикле «потребителя» удалите из очереди данные, генерируемые в цикле «производителя».
Поместите функцию Dequeue Element внутрь цикла «потребителя» над константой Начальной состояние.
2-47
Выполните подключения функции Dequeue Element внутри цикла «потребителя», как показано на рисунке 2-30.
2-48

Рисунок 2-31. Остановка циклов
2-49

18.Для остановки цикла «производителя» используйте кнопку Стоп либо линию ошибок.
Поместите внутрь цикла «производителя» функцию Or (Или).
Переместите элемент управления Стоп из состояния Проверка времени машины состояний в цикл «производителя».
Поместите внутрь цикла «производителя» функцию разделения кластера по именам Unbundle by Name.
Сделайте подключения для выполнения условий остановки цикла, как показано на рисунке 2-31.
19.Для остановки цикла «потребителя» используйте линию ошибок. После закрытия очереди любая функция, всё ещё работающая с очередью, начнет генерировать ошибку.
Поместите терминал условия выхода из внешнего Цикла по условию сразу же за функцией Dequeue Element.
Убедитесь, что терминал условия выхода работает в режиме Stop if True (Остановки при поступлении логического значения Истина).
Присоедините выходной терминал Error Out функции Dequeue Element к терминалу условия выхода из цикла
Loop Condition.
Присоедините выходной терминал Error Out функции Dequeue Element к терминалу селектора внешней структуры Варианта, как показано на рисунке 2-31. В этом случае структура будет иметь два варианта Error и No Error.
Переключитесь на вариант No Error.
Убедитесь, что код машины состояний находится в этом варианте. Если это не так, щелкните правой кнопкой по структуре и выберите в контекстном меню опцию Make This Case No Error.
Переключитесь на вариант Error. Он должен быть пуст.
Протяните проводники ссылки и кластера ошибок напрямую через вариант Error.
20.Теперь необходимо объединить кластеры ошибок и рапортовать об ошибке в конце выполнения программы.
Уберите проводник, соединяющий функцию Close File и ВП
Simple Error Handler.
2-50

Поместите ВП Merge Errors справа от функции Close File.
Соедините ВП Merge Errors и Simple Error Handler как показано на рисунке 2-31.
Рисунок 2-32. Лицевая панель ВП Подготовка метеостанции
2-51

Рисунок 2-33. Блок-диаграмма ВП Подготовка метеостанции
В заключение данного упражнения необходимо внести ряд изменений в ВП Подготовка метеостанции. Мы добавим элементы Скорость ветра, Верхний предел скорости и Время в кластер Данные о погоде, затем запустим этот ВПП в работу, если, конечно, не возникнет никаких ошибок.
21.Откройте ВП Подготовка метеостанции.
22.Поместите элемент управления Error In на лицевую панель.
23.Переключитесь на блок-диаграмму.
24.Если никаких ошибок не возникло, запустите ВП.
Все за исключением терминалов ошибок поместите в структуру Варианта.
Присоедините терминал элемента управления Error In к терминалу селектора структуры Варианта.
Убедитесь, что код блок-диаграммы находится в варианте No Error. Если это не так, щелкните правой кнопкой по структуре и выберите в контекстном меню опцию Make This Case No Error.
Присоедините кластер error in терминала селектора вариантов к терминалу error in функции
Open/Create/Replace File.
2-52

Переключитесь на вариант Error. Протяните линию ошибок через этот вариант и соедините её с терминалом error out.
25.Модифицируйте кластер данных, включив в него элементы, необходимые для метеорологической станции: Скорость ветра, Верхний предел скорости и Время.
Переключитесь на вариант No Error.
Сделайте три копии константы Температура.
Первую назовите Скорость ветра.
Вторую – Максимальная скорость ветра.
Третью – Время.
Удалите проводник, соединяющий Предупреждение с
функцией Bundle By Name.
Растяните функцию Bundle By Name, добавив ещё три элемента.
Присоедините константы к функции Bundle By Name в порядке, указанном на рисунке 2-33. Следите за соблюдением порядка.
26.Удалите терминал Кластер данных и воссоздайте его заново.
Щелкните правой кнопкой по выходу функции Bundle By Name и выберите опцию Create»Indicator из контекстного меню.
Измените имя индикатора на Метеоданные.
27.Создайте иконку и соединительную панель для данного ВПП. Пример приведен на рисунке 2-34.
|
|
Иконка и соединения |
Соединительная панель |
Рисунок 2-34. Иконка и соединительная панель ВПП Подготовка метеостанции
28.Щелкните правой кнопкой мыши по иконке в правом верхнем углу лицевой панели и выберите Edit Icon в появившемся контекстном меню.
2-53
В окне редактора Icon Editor нарисуйте простейшую иконку ВПП.
После окончания работы нажмите OK.
Снова щелкните правой кнопкой мыши по иконке и выберите в контекстном меню опцию Show Connector (Показать соединительную панель).
Щелкните правой кнопкой мыши по иконке соединительной панели и выберите опцию Disconnect All Terminals (Отключить все терминалы).
Выполните то же действие ещё раз только выберите теперь опцию Patterns (Шаблоны) и затем один из шаблонов, показанный на рисунке 2-34. Это – рекомендуемая нами соединительная панель.
Выполните назначения соединительной панели как показано на рисунке 2-34.
После окончания работы вызовите контекстное меню соединительной панели и выберите опцию Show Icon (Показать иконку).
29.Сохраните и закройте ВП.
30.Переключитесь на блок-диаграмму ВП Интерфейс метеостанции.
31.Вызовите контекстное меню ВП Подготовка метеостанции и выберите в нем опцию Relink to SubVI (Обновить подключения к ВПП).
2-54

55-2
Рисунок 2-35. Совместное использование линий ошибок циклами «производителя» и «потребителя»
32.Присоедините терминал error out функции Obtain Queue терминалу error in ВП Подготовка метеостанции.
33.В итоге блок-диаграмма вашего ВП должна быть похожа на показанную на рисунке 2-35. Проверьте, не забыли ли вы выполнить какой-либо из рассмотренных пунктов.
На данном этапе кнопка запуска ВП Run неработоспособна, поскольку проект ещё не завершён. Вы закончите работу над ним в последующих упражнениях.
Конец Упражнения 2-3
2-56
Упражнение 2-4 (Необязательное): Проект с использованием глобальных переменных
Задача
Создать проект, содержащий несколько ВП, совместно использующих данные с помощью общей однопроцессной переменной (single process shared variable).
Описание работы
Создайте ВП для генерации синусоидального сигнала. Второй ВП будет отображать синусоиду и позволит пользователю изменять время между сеансами сбора данных. Одной кнопкой Стоп необходимо останавливать оба ВП.
Разработка
Для реализации следующего алгоритма необходимы два ВП и две глобальных переменных:
•Первая совместно используемая переменная Стоп (Логический тип данных)
•Вторая общая переменная: Данные (Числовой тип данных)
•Первый ВП: генерирует синусоидальный сигнал, записывает его в переменную Данные, считывает состояние переменной Стоп для остановки цикла.
•Второй ВП: считывает данные из переменной Данные, отображает из на развертке осциллограмм, записывает состояние кнопки Стоп в переменную Стоп.
2-57
Создание ВП
1.Откройте новый проект.
2.Сохраните го под именем Глобальные данные.lvproj в
папке C:\Упражнения\LabVIEW Основы II\Глобальные данные.
3.Создайте переменную общего доступа Стоп.
Переключитесь на окно обозревателя проекта Project Explorer.
Щелкните правой кнопкой по иконке My Computer и выберите в контекстном меню опцию New»Variable.
Настройте следующие свойства переменной:
–Name: Стоп
–Data Type: Boolean
–Variable Type: Single-process
Нажмите OK для закрытия диалогового окна настройки свойств Shared Variable Properties.
Обратите внимание, что в окне Project Explorer будет создана новая библиотека для хранения переменной.
4.Сохраните библиотеку.
Вызовите контекстное меню библиотеки и выберите в нем опцию Save.
Сохраните библиотеку под именем Глобальные данные.lvlib в папке C:\Упражнения\LabVIEW
Основы II\Глобальные данные.
5.Создайте глобальную переменную Данные.
Переключитесь на окно обозревателя проекта Project Explorer.
Щелкните правой кнопкой мыши на библиотеке Глобальные данные.lvlib и выберите в контекстном меню опцию New»Variable.
Настройте следующие свойства переменной:
–– Name: Данные
2-58

–– Data Type: Double
–– Variable Type: Single-process
Нажмите OK для закрытия диалогового окна настройки свойств Shared Variable Properties.
ВП Генерация данных
1.Откройте новый ВП.
2.Сохраните ВП под именем Генерация данных.vi в папке
C:\Упражнения\LabVIEW Основы II\Глобальные данные.
3.Поместите на лицевую панель числовой индикатор Numeric Indicator.
4.Назовите его Данные.
5.Переключитесь на блок-диаграмму этого ВП.
6.Создайте блок-диаграмму, показанную на рисунке 2-36. Никаких инструкций мы вам не даем. Смотрите на ярлыки используемых функций.
Рисунок 2-36. Блок-диаграмма ВП Генерация данных без переменных
7.Сохраните ВП.
8.Запишите генерируемые данные в общую переменную Данные.
Выберите переменную совместного доступа Данные в окне Project Explorer и переместите её на блок-диаграмму ВП Генерация данных внутрь Цикла по условию.
2-59
Вызовите контекстное меню этой глобальной переменной и выберите опцию Change to Write (Изменить на запись).
Присоедините выход Sin(x) функции Sine к переменной Данные.
9.Считайте значение общей переменной Стоп для остановки Цикла по условию.
Переключитесь на окно обозревателя проекта Project Explorer.
Выберите переменную совместного доступа Стоп и переместите её на блок-диаграмму ВП Генерация данных внутрь Цикла по условию.
Присоедините переменную Стоп к терминалу условия остановки цикла Loop Condition.
10.Инициализируйте переменную Стоп.
Переключитесь на окно обозревателя проекта Project Explorer.
Выберите переменную совместного доступа Стоп и переместите её на блок-диаграмму ВП Генерация данных слева от Цикла по условию.
Вызовите контекстное меню этой глобальной переменной и выберите опцию Change to Write.
Щелкните правой кнопкой мыши на входе переменной Стоп и выберите в контекстном меню опцию Create»Constant, что создать логическую константу False.
В случае необходимости используйте инструмент Управление (Operating tool) для изменения значения логической константы.
11.Для задания порядка выполнения операций используйте кластеры ошибок переменной. Правильное соединение проводников показано на рисунке 2-37.
2-60

Рисунок 2-37. Блок-диаграмма ВП Генерация данных с использованием переменных совместного доступа
12.Сохраните ВП.
13.Закройте блок-диаграмму, а лицевую панель оставьте открытой.
ВП Считывание данных
1.Откройте новый ВП.
2.Сохраните его под именем Считывание данных.vi в папке
C:\Упражнения\LabVIEW Основы II\Глобальные
данные.
3. Создайте лицевую панель как показано на рисунке 2-38.
Рисунок 2-38. Лицевая панель ВП Считывание данных
4.Поместите на лицевую панель вертикальный ползунок
Vertical Pointer Slide и назовите его Время задержки
(мс).
2-61

Измените диапазон ползунка, вводя число 200 в верхнюю отметку шкалы.
Вызовите контекстное меню ползунка и выберите опцию
Representation»U8.
Поместите на лицевую панель развертку осциллограмм
Waveform Chart и назовите её Данные.
Измените ярлыки и диапазоны развертки по осям x и y, установив значения в соответствии с рисунком 2-38.
Поместите на лицевую панель кнопку Стоп и скройте её ярлык.
5.Откройте блок-диаграмму.
6.Создайте блок-диаграмму, как показано на рисунке 2-39. Ярлыки функций помогут вам в этом.
Рисунок 2-39. Блок-диаграмма ВП Считывание данных без использования переменных
7.Считайте значения из переменной Данные и отобразите их на развертке осциллограмм.
Переключитесь на окно обозревателя проекта Project Explorer.
Выберите переменную совместного доступа Данные и переместите её на блок-диаграмму ВП Считывание данных внутрь Цикла по условию.
Соедините выход глобальной переменной Данные с терминалом развертки осциллограмм.
8.Запишите логическое значение кнопки Стоп в переменную Стоп.
2-62

Переключитесь на окно обозревателя проекта Project Explorer.
Выберите переменную совместного доступа Стоп и переместите её на блок-диаграмму ВП Считывание данных внутрь Цикла по условию.
Вызовите контекстное меню этой глобальной переменной и выберите опцию Change to Write.
Соедините терминал кнопки Стоп с глобальной переменной Стоп.
9.Для задания порядка выполнения операций используйте кластеры ошибок переменной. Правильное соединение проводников приведено на рисунке 2-40.
Рисунок 2-40. Блок-диаграмма ВП Считывание данных с использованием переменных
10.Сохраните ВП.
11.Закройте блок-диаграмму.
12.Сохраните проект.
Проверка работы
1.Запустите ВП Генерация данных.
2.Запустите ВП Считывание данных.
3.Измените значение элемента управления Время задержки (мс).
Элемент управления Время задержки (мс) определяет частоту считывания глобальной переменной. Что произойдет, если задать время задержки равным нулю? При организации доступа к глобальным данным возможно считывание одного и того же значения более одного раза, прежде чем это значение обновится.
2-63
Или же вы вовсе можете пропустить новое значение. И всё это зависит от величины времени задержки.
4.Остановите и закройте оба ВП, а также проект после окончания работы.
Задание повышенной сложности
Создайте функциональную глобальную переменную для обработки данных кнопки Стоп и совместного использования этих данных в ВП Генерация данных и Считывание данных.
Конец Упражнения 2-4
2-64

Контрольные вопросы
1.Используйте переменные в ВП там, где это возможно.
а. Да б. Нет
2.Какая из следующих структур не может быть использована для передачи данных?
a. Семафоры
б. Функциональные глобальные переменные в. Уведомители г. Очереди
3.Какая из следующих структур должна использоваться в проекте?
a.Локальная переменная б. Глобальная переменная
в. Функциональная глобальная переменная г. Однопроцессная переменная с общим доступом
4.Какая из следующих структур не может быть использована для передачи данных между несколькими ВП?
a.Локальная переменная
б. Глобальная переменная в. Функциональная глобальная переменная
г. Однопроцессная переменная с общим доступом
2-65

Ответы на контрольные вопросы
1.Используйте переменные в ВП там, где это возможно. a. Да
б. Нет
2.Какая из следующих структур не может быть использована для передачи данных?
a. Семафоры
б. Функциональные глобальные переменные
в. Уведомители
г. Очереди
3. Какая из следующих структур должна использоваться в проекте?
a.Локальная переменная б. Глобальная переменная
в. Функциональная глобальная переменная г. Однопроцессная переменная с общим доступом
4.Какая из следующих структур не может быть использована для передачи данных между несколькими ВП?
a.Локальная переменная
б. Глобальная переменная
в. Функциональная глобальная переменная
г. Однопроцессная переменная с общим доступом
2-66

Примечания
2-67

3
Оптимизация существующих ВП
Наиболее общая проблема, с которой вы можете столкнуться, получив виртуальный прибор от других разработчиков – трудночитаемый и плохо понятный код, в который сложно внести необходимые вам изменения. Эта проблема, иногда именуемая «угасанием» программного обеспечения, чаще всего связана с тем, что в процессе разработки или модификации ВП мало внимания уделялось его структуре и организации.
«Угасание» программы можно предотвратить, своевременно проведя его переработку. Переработка – это модификация созданного программного обеспечения, призванная сделать его более легким для понимания и внесения изменении, и тем самым более экономически оправданным в долгосрочной перспективе. Переработка изменяет, оптимизирует внутреннюю структуру ВП, не меняя его функциональность и поведение.
В этом разделе вы изучите основные методы переработки и оптимизации «вторичного» кода, а также проведете эксперименты по устранению типичных ошибок, связанных с этим процессом.
Темы
A. Переработка и оптимизация «вторичного» кода
Б. Типичные проблемы и ошибки
3-1

A. Переработка и оптимизация «вторичного» кода
Если вы вовлечены в крупномасштабный и/или долгосрочный проект по разработке программного продукта, делайте свою часть максимально наглядной и «читабельной», поскольку трудозатраты ваших коллег и последователей на понимание и модификацию вашего кода могут оказаться больше, чем ваши – на его создание. Разработчики часто говорят «я потрачу меньше времени на полное переписывание этого фрагмента кода, чем на понимание данной его реализации». Действительно, в большинстве проектов модификация и обновление программного продукта требует больше ресурсов, чем его первичное создание. Таким образом, компактный, легкий для понимания и изменения код представляет большую ценность, чем громоздкий и непонятный. Как следствие, оптимальный и наглядный код имеет лучшую динамику развития и больший жизненный цикл.
Рассмотрим «вторичный» ВП, показанный на Рисунке 3-1.
Рисунок 3-1. Пример «вторичного» ВП
Вы можете переработать этот код согласно Рисунку 3-2.
3-2

Рисунок 3-2. Переработанный «вторичный» ВП
Переработанный код функционально идентичен исходному, но существенно более понятен и «читабелен». Исходный код, показанный на Рисунке 3-1, создан с нарушением многих правил разработки ВП, с которыми вы уже знакомы. В процессе переработки кода вы устраняете эти погрешности и делаете виртуальный прибор наглядным и пригодным к модификации, что реально повышает его ценность.
Еще раз отметим, что переработка ВП не должна изменять его функциональность. Даже изменение предусмотренного разработчиком способа взаимодействия ВП с пользователем или другими ВП может привести к возникновению ошибок в процессе выполнения.
Сравнение переработки и оптимизации производительности
Вы можете вносить в исходный код изменения также и с целью повышения его производительности (повышения быстродействия, снижения потребляемой памяти и т.д.). Этот процесс не следует путать с переработкой кода. Переработка кода затрагивает его внутреннюю структуру и организацию с целью упрощения восприятия и последующей модификации. Повышение производительности редко преследует подобные цели, скорее наоборот – при максимальной оптимизации код часто становится трудночитаемым. Иногда для достижения наилучших характеристик приложения разработчики жертвуют наглядностью, хотя, как показывает опыт, в долгосрочной перспективе это редко бывает оправдано.
Когда следует проводить переработку
Наиболее подходящим моментом для проведения переработки кода является стадия отладки или внесения текущих изменений и модификаций. И хотя, как уже упоминалось, если диаграмма
3-3
исходного виртуального прибора запутанна и трудночитаема, у вас вполне может появиться желание переделать код «с чистого листа», тем не менее, вам следует оценить реальную значимость этого ВП и учесть факт его общей работоспособности. Полной переделке подлежат не работающие ВП или ВП, реализующие лишь малую часть необходимой функциональности приложения (простейшие ВПП). Приступая к переработке ВП, сначала выделите в исходном ВП наиболее работоспособный и эффективный фрагмент. Далее, отталкиваясь от этого фрагмента, методично изменяйте код, не меняя его функциональности, но повышая его наглядность, масштабируемость, улучшая его структуру.
3-4

Упражнение 3-1. Переработка кода приложения
Цель
Переработать приложение «Температурная метеостанция», пополнив его функциональность.
Описание работы
Измените машину состояний, использованную в «Температурной метеостанции», добавив функцию измерения скорости ветра с выдачей уведомления «Сильный ветер» при необходимости. В файл отчета следует также включить заголовок, поясняющий смысл числовых данных.
Разработка
Элементы управления (входы) и индикаторы (выходы) интерфейса пользователя
Тип |
Имя |
|
|
Формат/Свойства |
|
|
|
|
|
Число с плавающей точной двойной |
|
Числовой элемент |
|
|
1 |
||
Верхний предел |
точности (Double Precision) |
1 |
|||
управления1 |
|
|
|||
|
|
|
Число с плавающей точной двойной |
||
Числовой элемент |
Нижний предел |
1 |
|||
управления1 |
|
|
точности1 |
|
|
Развертка |
Значения |
|
|
|
|
Осциллограммы |
|
|
|
|
|
температуры1 |
|
|
|
|
|
(Waveform Chart) |
|
|
|
|
|
Развертка |
Значения скорости |
|
|
||
Осциллограммы |
ветра |
|
|
Число с плавающей точной двойной |
|
|
|
|
|
||
|
|
|
|
точности |
|
Вертикальный регулятор- |
Предельная |
|
|
Видимый цифровой дисплей (Visible |
|
ползунок |
скорость ветра |
|
|
Items >> Digital Display) |
|
|
|
|
|
Пределы: от 0 до 100 |
|
|
|
|
|
||
Строковый индикатор1 |
Предупреждение1 |
|
|
||
Кнопка Стоп1 |
Стоп1 |
|
|
|
|
Внешние входы и выходы
•Входы:
–Текущая температура считывается с датчика,
подключенного к входному каналу AI0 платы сбора данных1.
1 Этот фрагмент кода уже предварительно написан для вас.
3-5

Формула для пересчета показаний:
Напряжение (Вольт) x 100 = Температура (0C) 1
–Текущая скорость ветра считывается с воздушного анемометра, подключенного к входному каналу AI1 платы сбора данных.
Формула для пересчета показаний:
Частота (Герц) / 100 = Скорость ветра (км/ч)
•Выходы: текстовый ASCII файл, содержащий текущую температуру12, пределы изменения температуры1, скорость
ветра, верхний предел скорости ветра, строку предупреждения1, а также метку времени каждого предупреждения. Файл должен быть снабжен заголовком.
Исходный код: диаграмма изменения состояний
Перед добавлением в проект функциональности измерения скорости ветра его диаграмма содержала следующие состояния: Сбор данных, Анализ, Сохранение данных, Проверка времени – как показано на Рисунке 3-3.
2 Этот фрагмент кода уже предварительно написан для вас.
3-6

Рисунок 3-3. Диаграмма состояний для температурной метеостанции.
Результат: алгоритм приложения
После добавления в проект измерения скорости ветра, его архитектура меняется на шаблон разработки «производительпотребитель», причем цикл-«потребитель» содержит внутри машину состояний. Машина состояний в этом случае содержит следующие блоки: Анализ, Обработка интерфейса пользователя(ИП), Определение предупреждений, Запись данных и Остановка.
Рисунок 3-4. Алгоритм работы температурной климатической станции.
Для модификации кода в него необходимо внести следующие изменения:
1.Добавить элемент управления для ввода предельной скорости ветра и график развертки для отображения истории изменения этой скорости.
2.В разделе начальной установки предусмотреть запись заголовка в файл протокола.
3.Изменить машину состояния, расположенную в цикле- «производителе», согласно диаграмме алгоритма, приведенной на Рисунке 3-4.
Изменение машины состояний
3-7
Для добавления функции измерения скорости ветра в приложение «Температурная метеостанция», в его код необходимо внести изменения согласно следующей таблице.
Новое состояние |
|
Старое |
|
Вносимые изменения |
|
состояние |
|
||
|
|
|
|
|
Анализ |
|
Сбор данных1 |
|
Удалите ВПП Помощник по Сбору данных |
|
|
|
|
(DAQ Assistant), выделите из очереди |
|
|
|
|
входных данных среднюю частоту и |
|
|
|
|
среднюю температуру, переместите |
|
|
|
|
элементы управления и индикаторы в |
|
|
|
|
состояние Обработка ИП |
|
|
|
|
Следующее состояние: Обработка ИП |
Обработка ИП |
|
нет |
|
Объедините данные из элементов |
|
|
|
|
управления лицевой панели в кластер, |
|
|
|
|
отобразите текущие данные на графиках |
|
|
|
|
развертки. |
|
|
|
|
Следующее состояние: Определение |
|
|
|
|
предупреждений |
Определение |
|
Анализ1 |
|
Замените текущий ВПП Определение |
предупреждений |
|
|
|
Предупреждений на новый ВПП |
|
|
|
|
Расширенное Определение |
|
|
|
|
Предупреждений, в котором заданы |
|
|
|
|
предупреждения как по температуре, так и |
|
|
|
|
по скорости ветра. |
|
|
|
|
Следующее состояние: Запись данных либо |
|
|
|
|
Остановка |
Запись данных |
|
Запись данных1 |
|
Добавьте поля Скорость ветра, Предельная |
|
|
|
|
скорость ветра и Время в текстовый файл |
|
|
|
|
протокола. |
|
|
|
|
Следующее состояние: Остановка |
Стоп |
|
Проверка |
|
Удалите функцию проверки времени и |
|
|
времени1 |
|
перейдите к остановке машины состояний. |
|
|
|
|
Следующее состояние: Остановка |
1 Этот фрагмент кода уже |
предварительно написан |
для вас. |
||
|
Сбор данных1 — задача состояния, ранее известного как Сбор |
|||
|
данных, кардинально изменилась, поэтому и название состояния |
|||
|
изменилось на Анализ. Данные теперь вводятся в цикле- |
|||
|
«производителе», а не в машине состояний, там же |
|||
|
осуществляется преобразование отсчетов, полученных с платы |
|||
|
сбора данных, в физические величины (температуру и скорость |
|||
|
ветра). По этой причине название Анализ более точно отражает |
|||
|
суть выполняемых этим состоянием функций. |
|||
|
Анализ1 — старое состояние Анализа1 теперь переименовано в |
|||
|
Установку предупреждений, потому что под этим именем теперь |
|||
|
понимается новое состояние, а также с целью придания данному |
|||
|
состоянию более функционально соответствующего названия. |
|||
|
Проверка времени1 — старое состояние Проверка времени1 |
|||
|
теперь переименовано в Остановку в связи с тем, что новая |
|||
|
|
|
3-8 |

машина состояния не занимается отслеживанием времени. Эта проверка осуществляется в цикле-«производителе».
1 Этот фрагмент кода уже предварительно написан для вас.
Создание ВП
1.Откройте проект Метеостанция.proj, расположенный в папке C:/Упражнения/LabVIEW Основы II/Курсовой проект.
2.Откройте ВП Интерфейс метеостанции.vi из Окна Обозревателя Проектов (Project Explorer).
Шаг 1: Измените интерфейс пользователя
Рисунок 3-5. Лицевая панель Климатической станции
3.Создайте график развертки Значения скорости ветра.
Поместите на лицевую панель График развертки
(Waveform Chart).
Переименуйте график в «Значения скорости ветра».
3-9

Вызовите контекстное меню развертки (правым щелчком мыши в поле графика) и выберите опцию Visible Items»Digital Display (Видимые Элементы » Числовой Индикатор).
Создайте текстовую метку около числового дисплея развертки и введите единицы измерения – км/ч. Для создания свободной метки дважды щелкните правой кнопкой мыши в выбранном месте лицевой панели.
Совет. После завершения проекта поэкспериментируйте с установками шкал Х и Y развертки для оптимизации отображения данных на графике.
4.Создайте входной параметр Максимальная безопасная скорость ветра.
Поместите на лицевую панель Vertical Pointer Slide (Вертикальный регулятор-ползунок).
Вызовите его контекстное меню и выберите опцию
Properties (Свойства).
Во вкладке Appearance (Внешний вид) измените текстовую метку на Предельная скорость ветра, пометьте ее как скрытую (hide), а также сделайте видимым числовой дисплей.
Во вкладке Data Range (Диапазон данных), установите значение по умолчанию равным 50.
Во вкладке Scale (Шкала) установите пределы изменения от
0 (Minimum) до 100 (Maximum).
Щелкните ОК.
Создайте ярлык, описывающий назначение этого элемента управления – Максимальная безопасная скорость ветра (км/ч).
Если у вас есть небольшой запас времени, визуально выделите этот элемент управления при помощи вспомогательных элементов оформления.
5.Сохраните ВП.
Шаг 2: Изменение заголовка файла
6.Откройте ВП Подготовка метеостанции из окна Обозревателя проекта.
7.Запись файла протокола будет осуществляться в тот же каталог, что и файл ВП. Путь к файлу является относительным.
3-10

Поместите функцию Current VI’s Path (Путь к текущему ВП) слева от функции Open/Close/Replace (Открыть/Закрыть/Заменить).
Поместите функцию Strip Path (Разделить путь) справа от Current VI’s Path. Эта функция удалит последний компонент - имя ВП - из общей строки пути.
Поместите функцию Build Path (Создать путь) справа от функции Strip Path. Эта функция, напротив, осуществит добавление строки к исходному пути.
Щелкните правой кнопкой мыши по терминалу имени или относительного пути name or relative path функции Build Path и выберите опцию Create»Constant
(Создать»Константу) из контекстного меню.
Введите в строковую константу текст «Погода.txt».
Подсоедините проводником данных новый путь к функции
Open/Create/Replace, как показано на Рисунке 3-6.
8.Добавьте к файлу протокола заголовок, поясняющий его содержимое.
Рисунок 3-6. Диаграмма ВП Начальная установка климатической станции.
3-11

Поместите функцию Write to Text File (Записать в текстовый файл) справа от функции Open/Close/Replace.
Удалите выходные проводники, идущие от функции
Open/Close Replace.
Соедините проводники кластера ошибки (error cluster) и ссылки на файл (file Refnum) так, как показано на Рисунке
3-6.
Поместите функцию Format Into String (Форматировать в строку) над функцией записи в текстовый файл Write to Text File.
Растяните узел функции Format Into String до 14 входных терминалов.
Слева от функции Format Into String поместите строковую константу табуляции (Tab constant).
Подсоедините ее ко всем четным входам, за исключением последнего.
К последнему входу подсоедините константу перевода каретки (Carriage Return constant).
Поместите пустую строковую константу слева от функции Format Into String.
Сделайте 6 копий этой константы.
Введите в константы текст согласно Рисунку 3-6 и подсоедините константы ко входам функции в указанном порядке.
Подсоедините результирующую строку с выходного терминала функции Format Into String к входному текстовому терминалу функции Write to Text File.
9.Снабдите новую диаграмму ВП необходимыми комментариями.
10.Сохраните ВП и закройте его.
Шаг 3: Изменение машины состояний
11.Измените элемент управления Состояния метеостанции.ctl для учета новых состояний машины.
Таблица 3-1. Состояния климатической станции.ctl
|
|
|
Вариант |
|
Числовой дисплей |
|
|
|
3-12

Анализ |
0 |
|
1 |
Обработка ИП |
|
|
2 |
Определение предупреждений |
|
|
3 |
Запись данных |
|
|
4 |
Стоп |
|
|
|
Дважды щелкните по элементу управления Состояния метеостанции.ctl в окне Обозревателя проекта.
Щелкните правой кнопкой мыши по элементу управления и из контекстного меню выберите опцию Edit Items (Редактировать варианты).
Измените список согласно Таблице 3-1.
Сохраните изменения и выйдите из окна Control Editor (Редактора элементов управления) по завершении.
12.Измените порядок, добавьте или удалите варианты (cases) структуры так, как это требуется согласно логике работы ВП Интерфейс метеостанции.
Из контекстного меню Структуры варианта (Case structure)
выберите опцию Add Case for Every Value (Добавить вариант для каждого значения).
Отредактируйте варианты Структуры согласно рисункам с 3-7 по 3-11. Упростить задачу можно при помощи опций
Swap Diagram With Case (Поменять местами диаграммы с вариантом) и Delete Case (Удалить вариант) из контекстного меню Структуры варианта. Последовательность вариантов машины состояний не влияет на ее работоспособность.
Рисунок 3-7. Вариант Анализ
3-13

Рисунок 3-8. Вариант Обработка ИП
Рисунок 3-9. Вариант Определение предупреждения
3-14

Рисунок 3-10. Вариант Запись данных
Рисунок 3-11. Вариант Стоп
13. Изменения для состояния Анализ.
Рисунок 3-12. Состояние Анализ — диаграмма ВП Интерфейс метеостанции.
Удалите экспресс ВП DAQ Assistant.
Вынесите терминалы Верхняя уставка, Нижняя уставка и Значения температуры за тело Структуры варианта. Позже вы поместите эти объекты ВПП интерфейса пользователя.
Нажмите <Ctrl-B> для удаления нарушенных проводников данных.
3-15

Измените элементы, выделенные в функции Bundle by Name (Объединить по имени), на Время, Температура и Скорость ветра, в указанном порядке.
Щелкните правой кнопкой мыши по значку My Computer (Мой компьютер) в окне обозревателя проекта Project Explorer и выберите опцию Add File (Добавить файл).
Укажите файл Анализ данных.vi, находящийся в каталоге C:/Упражнения/LabVIEW Основы II/Курсовой проект/Дополнительные файлы.
Нажмите кнопку Add File (Добавить файл).
Поместите ВПП Анализ данных внутрь варианта Анализ.
–Один из методов, как это сделать – перетащить ВПП мышкой из обозревателя проекта в нужный участок диаграммы;
–Данный ВПП был предварительно создан для экономии вашего времени. Он определяет частоту синусоидального сигнала, выдаваемого анемометром, а также среднее значение температуры и обеспечивает привязку полученных данных ко времени.
Измените значение константы перечислимого типа Следующее состояние на «Обработка ИП».
Завершите необходимые соединения проводников данных на диаграмме, как показано на Рисунке 3-12.
14.Сохраните ВП.
15.Завершите состояние Обработка ИП.
3-16

Рисунок 3-13. Состояние Обработка ИП — диаграмма ВП Интерфейс метеостанции.
Переключитесь на состояние Обработка ИП.
Внесите терминалы Верхняя уставка, Нижняя уставка, Предельная скорость ветра, Значения температуры и Значения скорости ветра внутрь варианта Обработка ИП в Структуре варианта.
Поместите функцию Bundle by Name (Объединить по имени) внутрь этого же варианта.
Подключите проводник кластера Метеоданные к входному терминалу типа кластера функции Bundle by Name.
«Растяните» узел функции Bundle by Name до трех элементов.
Выберите первым элементом Верхняя уставка Т, вторым – Нижняя уставка Т, Предельную скорость ветра – третьим элементом.
Поместите функцию Unbundle by Name (Разъединить по имени) в состояние Обработка ИП.
Подсоедините кластер Метеоданные к кластерному входу функции Unbundle by Name.
«Растяните» узел функции Unbundle by Name до двух элементов.
Выберите первым элементом Температуру, вторым – Скорость ветра.
Из окна обозревателя проекта Project Explorer перетащите при помощи мыши копию элемента управления
Состояния метеостанции.ctl в вариант Обработка ИП.
Переименуйте перечислимую константу в Определить предупреждения.
Щелкните правой кнопкой мыши по логическому тоннелю, подключенному к логической функции OR (ИЛИ) и
выберите опцию Create»Constant (Создать»Константу) из контекстного меню.
Созданная константа должна иметь логическое состояние ЛОЖЬ. Тогда машина состояний не остановится на этом этапе.
Завершите соединения на диаграмме, руководствуясь Рисунком 3-13. Обратите внимание, что как только вы
3-17

соедините терминал Значения температуры, его представление изменится для обеспечения согласования типов данных.
16.Сохраните ВП.
17.Добавьте в проект Метеостанция виртуальный прибор
Определить дополнительные предупреждения и элемент управления Определить предупреждения. ВП Определить дополнительные предупреждения создает предупреждение о скорости ветра и использует в своей работе элемент управления перечислимого типа Определить предупреждения.ctl.
Рисунок 3-14. Состояние Определение предупреждения – диаграмма ВП Интерфейс метеостанции.
Переключитесь в окно обозревателя Проекта.
Щелкните правой кнопкой мыши по My Computer и выберите из контекстного меню опцию Add File (Добавить файл).
Перейдите в каталог C:/Упражнения/LabVIEW Основы
II/Курсовой проект/Дополнительные файлы.
Выберите ВП Определить дополнительные предупреждения
и файл элемента управления Определить предупреждения.ctl и щелкните Add File. Вы можете добавить сразу несколько файлов, удерживая нажатой клавишу <Ctrl>.
18.Завершите состояние Определение предупреждения.
Переключитесь на блок-диаграмму ВП Интерфейс метеостанции.
3-18

Перейдите к состоянию Определение предупреждения.
Щелкните правой кнопкой по ВПП Определить предупреждения и выберите из контекстного меню опцию
Replace»All Palettes »Select a VI (Заменить»Все палитры»Выбрать ВП).
Вновь перейдите к каталогу C:/Упражнения/LabVIEW
Основы II/Курсовой проект/Дополнительные файлы и выберите ВП Определить дополнительные предупреждения.
Щелкните OK.
Измените функцию Unbundle by Name до пяти выходных терминалов и выберите параметры: Скорость ветра, Температура, Верхний предел температуры, Нижний предел температуры и Верхний предел скорости ветра.
Осуществите подключения, как показано на Рисунке 3-14.
Установите для константы Следующее состояние значение Стоп в варианте False и значение Запись данных в варианте
True.
19.Сохраните ВП.
20.Доделайте вариант Запись данных.
Рисунок 3-15. Вариант Запись данных – диаграмма ВП Интерфейс метеостанции.
Переключитесь на вариант Запись данных.
«Растяните» узел функции Format Into String (Форматирование в Строку) до 14 входных терминалов.
3-19

Измените функцию Unbundle by Name, как показано на Рисунке 3-15.
Подсоедините функцию Unbundle by Name к функции
Format Into String согласно рисунку.
Измените значение константу Следующее состояние, установив Стоп.
21.Сохраните ВП.
22.Закончите вариант Стоп.
Рисунок 3-16. Вариант Стоп — диаграмма ВП Интерфейс метеостанции.
Переключитесь на вариант Стоп.
Проведите проводники кластера Метеоданные, ссылки на файл и кластера ошибки, как показано на Рисунке 3-16.
Из окна обозревателя проекта Project Explorer перетащите при помощи мыши копию элемента управления
Состояния метеостанции.ctl в вариант Стоп.
Для появившейся константы выберите значение Стоп.
Щелкните правой кнопкой мыши по логическому тоннелю, подключенному к логической функции OR и выберите опцию Create»Constant из контекстного меню.
Измените состояние константы на True. Теперь машина состояний должна завершить работу.
Соедините проводники данных, как показано на Рисунке 3- 16.
3-20