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

LabView _lab (МУ к лабораторным работам)

.pdf
Скачиваний:
92
Добавлен:
09.02.2015
Размер:
462.54 Кб
Скачать

Лабораторная работа №11

ИЗУЧЕНИЕ РАСПАРАЛЛЕЛИВАНИЯ ЗАДАЧ И ПРИВЯЗКА КО ВРЕМЕНИ

Цель работы Познакомиться с использованием шаблонов разработки со множеством циклов: параллельные циклы, ведущий-ведомый и производитель-потребитель.

1.1. Основные сведения

Параллельные Циклы

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

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

Рисунок 1. Шаблон разработки: Параллельные Циклы

1 - При составлении данных лабораторных работ использовались упражнения и материалы Учебного курса LabVIEW Основы II: Разработка фирмы National Instruments.

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

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

параллельными циклами требует от вас организации связи и синхронизации между циклами. Кнопка Стоп во втором цикле на Рисунке 1- 8 является локально переменной.

Ведущий-ведомый

Шаблон разработки Ведущий-ведомый также состоит из нескольких параллельных циклов. Каждый из циклов может иметь свою собственную скорость выполнения итераций. При этом в данном шаблоне выделяется один «ведущий» цикл, который осуществляет управление остальными ведомыми») и координацию их работы посредством технологии «передачи сообщений», как показано на Рисунке 2.

Рисунок 2. Шаблон разработки Ведущий-ведомый

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

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

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

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

чтобы никакие два цикла не могли осуществлять запись в один участок памяти общего доступа. Ответная реакция ведомого цикла на команды ведущего не должна занимать слишком много времени. Если в процессе

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

Производитель-потребитель

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

Рисунок 3. Шаблон разработки «Производитель-потребитель»

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

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

Привязка к системному времени

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

Рассмотрим использование шаблона разработки машина состояний для системы мониторинга температуры. Так, от системы может требоваться непрерывный сбор температурных данных в течение 5 минут. Если вы просто запустите процесс сбора данных и укажете ему время выполнения 5 минут, то никакие другие процессы (например, обработка действий пользователя) уже не будут выполнены. Чтобы предусмотреть возможность параллельной обработки иных задач, необходимо предусмотреть

возможность слежения за остатком реального времени выполнения из запущенного процесса. Если вы используете функции ожидания Wait (ms) или Wait Until Next ms Multiple для синхронизации функции, выполняющейся в течение длительного времени, складывается ситуация, при которой функция ожидания завершает работу еще до выполнения той функции, для синхронизации которой она предназначена. Хорошим решением является

считывание текущего системного времени внутри синхронизируемого виртуального прибора, как показано на Рисунке 4.

Рисунок 4. Программная синхронизация при помощи функции чтения даты/времени Get Date/Time In Seconds

Функция Get Date/Time In Seconds, подключенная к левому терминалу сдвигового регистра, «привязывает» цикл к текущему системному времени. В каждой итерации время считывается вновь (вызовом функции Get Date/Time In Seconds внутри цикла) и производится его сравнение со временем запуска. Если разность времен превышает интервал ожидания,

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

функция чтения системного времени и даты Get Date/Time In Seconds подходит лучше, чем функция Секундомера (Tick Count), так как в промежутках между вызовами значение, возвращаемое Секундомером, равно 0.

1.2.Программа работы

1.Открыть файл Параллельные циклы.vi.

2.Используя локальную переменную выполнить одновременную остановку циклов без нарушения независимости их работы.

3.При помощи клавиш Alt+PrtSc записать и сохранить в файле .doc скриншот блок-схемы программы.

4.Открыть файл Машина состояний.vi.

5.Используя Get Date/Time In Seconds выполнить алгоритм контроля интервала выполнения Главного приложения.

6.При помощи клавиш Alt+PrtSc записать и сохранить в файле .doc скриншоты блок-схемы программы и лицевой панели.

1.3.Содержание отчета

1.Ответы на вопросы, содержащиеся в программе работы.

2.Скриншоты программ по п.п. 1, 4 программы работы.

Контрольные вопросы

1.Для каких целей используется распараллеливание процессов?

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

3.В чем цель синхронизации данных?

4.В каких случаях целесообразно использование функции чтения системного времени и даты Get Date/Time In Seconds?

Лабораторная работа №2

ИСПОЛЬЗОВАНИЕ ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ И ОЧЕРЕДЬ ДАННЫХ

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

2.1.Основные сведения

Использование переменных для обмена данными между

несколькими ВП

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

Локальная переменная может использоваться совместно в пределах только одного ВП, а глобальная переменная среди нескольких ВП. Например, предположим, что у вас есть два ВП, выполняющихся одновременно. Каждый из ВП содержит Цикл по условию, в котором происходит запись данных на развертку осциллограмм. В первом ВП имеется кнопка остановки работы обоих ВП. Для того чтобы она работала правильно, необходимо использовать глобальную переменную. Если бы оба цикла находились на блок диаграмме одного ВП, то для одновременной остановки циклов можно было бы использовать локальную переменную. Однопроцессная переменная общего доступа (single process shared variable) используется точно таким же образом, что и глобальная переменная. Она очень похожа на локальную или глобальную переменную, но позволяет использовать данные совместно в локальной сети. Переменная общего доступа может быть однопроцессной либо сетевой (network published). Хотя в данном курсе вы не будете изучать сетевые переменные, в будущем вы сможете легко их использовать, изучив однопроцессные переменные. Если необходим обмен данными между несколькими ВП в пределах одного компьютера, применяйте глобальную переменную. Тем более, если вы не используете файл проекта. Если же в будущем вам понадобится обмениваться информацией между несколькими ВП на разных компьютерах, тогда придется применять однопроцессную переменную общего доступа.

Создание глобальных переменных

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

которого есть лицевая панель, но нет блок-диаграммы. Для определения типа данных, содержащихся в глобальной переменной, необходимо

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

Дважды щелкните по этому узлу появится лицевая панель глобального

ВП. Поместите на нее элементы управления и индикаторы, как это происходит с обыкновенным ВП. Для идентификации глобальных переменных LabVIEW использует собственные ярлыки объектов, так что не

забывайте оставлять собственные ярлыки элементов управления и индикаторов и вводите для них какие-либо описательные имена. Вы можете создать несколько отдельных глобальных ВП, каждый с одним объектом лицевой панели, или же один глобальный ВП с несколькими объектами лицевой панели. Глобальный ВП второго типа более эффективен,

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

На рисунке 5 приведена лицевая панель глобальной переменной, содержащая числовой, строковый и кластерный элементы управления. Как видим, на панели инструментов, в отличие от обычной лицевой панели, отсутствуют кнопки Run, Stop и т.д.

Рисунок 5. Лицевая панель глобальной переменной

После того, как вы создали лицевую панель глобального ВП, сохраните его и возвратитесь на блок-диаграмму исходного ВП. Теперь необходимо выбрать объект глобального ВП, с которым вы будете работать. Для этого

щелкните правой кнопкой мыши по глобальной переменной и выберите в разделе Select Item контекстного меню объект лицевой панели. В этом списке содержатся все объекты лицевой панели, имеющие собственные ярлыки. Можно также щелкнуть левой кнопкой мыши (в режиме Operating tool или Labeling tool) по глобальной переменной и выбрать из всплывающего меню объект лицевой панели. Если возникла необходимость использовать глобальную переменную в других ВП, выберите в палитре

Functions»All Functions»Select a VI (Функции»Все Функции»Выбрать ВП). По умолчанию, глобальной переменной назначается первый объект с собственным ярлыком, который вы поместили в глобальный ВП. Чтобы назначить глобальной переменной данные другого объекта, щелкните

правой кнопкой мыши по глобальной переменной и выберите в разделе Select Item контекстного меню нужный объект лицевой панели.

Очереди

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

При реализации шаблона «производитель-потребитель» очереди передают данные и синхронизируют циклы. Очередь создается с помощью функции Obtain Queue (Получить очередь) перед началом выполнения циклов. В цикле «производителя» функция Enqueue Element (Ввести элемент в очередь) применяется для добавления данных в очередь. В цикле «потребителя» данные из очереди удаляются с помощью функции Dequeue Element (Вывести элемент из очереди). Цикл «потребителя» не будет выполняться до тех пор, пока данные не поступят в очередь. Для окончания работы ВП с очередями используется функция Release Queue, после применения которой, функция Dequeue Element генерирует ошибку, эффективно останавливая работу цикла «потребителя». Поэтому для

остановки циклов не возникает необходимости в использовании переменной для организации совместного доступа к кнопке Стоп.

Применение очередей в программах типа «производитель-потребитель» дает следующие преимущества:

Оба цикла синхронизируются по циклу «производителя». Цикл «потребителя» будет выполняться по мере поступления данных в очередь.

Очереди можно использовать для создания глобально доступных данных.

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

Использование очередей повышает эффективность кода. Теперь нет

необходимости в непрерывном опросе для определения поступления данных из цикла «производителя».

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]