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

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

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

данных входного массива. Вы можете предотвратить поступление в цикл While Loop значений по умолчанию, используя функцию Array Size. Функция Array Size определяет количество элементов в массиве. Сконфигурируйте цикл While Loop так, чтобы он остановил выполнение, когда наступит итерация, номер которой совпадет с размером входного массива.

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

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

В дополнение к применению циклов для чтения и обработки элементов массивов, циклы For Loop и While Loop можно использовать для построения массивов. Подсоедините выход ВП или функции, помещенных внутри цикла, к границе этого цикла. Если Вы используете цикл While Loop, щелкните правой кнопкой образовавшийся туннель и выберите из контекстного меню пункт Enable Indexing. В цикле For Loop автоиндексация активна по умолчанию. Выходом туннеля будет массив, каждый элемент которого будет содержать выходное значение ВП или функции, полученные на соответствующей итерации цикла.

Примеры построения массивов можно найти в библиотеке examples\general\arrays.llb.

Сдвигающие регистры и узел обратной связи в циклах

Для передачи значений из одной итерации цикла For Loop или While Loop к следующим итерациям используйте либо сдвигающий регистр (shift register), либо узел обратной связи (Feedback Node).

Сдвигающие регистры

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

161

итерации. К началу следующей итерации LabVIEW сдвигает эти данные в сдвигающем регистре, и они появляются на выходе терминала на левой границе цикла. Чтобы создать сдвигающий регистр, щелкните правой кнопкой левую или правую границу цикла и выберите из контекстного меню Add Shift Register.

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

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

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

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

162

Figure 8-2. Несколько сдвигающих регистров

Многоступенчатые сдвигающие регистры

Многоступенчатые (stacked) сдвигающие регистры дают доступ к данным от нескольких предыдущих итераций. Чтобы создать многоступенчатый сдвигающий регистр щелкните правой кнопкой левый терминал и выберите из контекстного меню Add Element. Многоступенчатый сдвигающий регистр запоминает значения от нескольких предыдущих итераций и передает эти значения к следующим итерациям.

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

Figure 8-3. Многоступенчатый сдвигающий регистр

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

163

Замещение сдвигающих регистров туннелями

Для замещения сдвигающего регистра туннелем, когда отпадает необходимость в передаче данных от одной итерации цикла к другой, щелкните правой кнопкой сдвигающий регистр и выберите из контекстного меню Replace with Tunnels.

Если Вы замещаете туннелем выходной терминал сдвигающего регистра в цикле For Loop, то соединение с любым узлом снаружи цикла разорвется, поскольку в цикле For Loop индексация по умолчанию активна. Щелкните правой кнопкой туннель и выберите из контекстного меню Disable Indexing at Source, чтобы отключить индексацию и автоматически исправить разорванный проводник. Если же Вы хотите, чтобы индексация оставалась активной, удалите неисправный проводник и соединенный с ним индикаторный терминал, щелкните правой кнопкой туннель и выберите Create Indicator.

Более подробно об индексации в циклах см. раздел Автоиндексация циклов в настоящей Главе.

Замещение туннелей сдвигающими регистрами

Для замещения туннеля сдвигающим регистром, при необходимости передавать данные из одной итерации в следующую, щелкните правой кнопкой туннель и выберите из контекстного меню Replace with Shift Register. Если на противоположной стороне границы цикла туннель отсутствует, то LabVIEW создаст пару терминалов сдвигающего регистра. Если же туннель на противоположной стороне границы цикла существует, то LabVIEW заместит туннель, который Вы щелкнули, терминалом сдвигающего регистра, а курсор превратится в иконку сдвигающего регистра. Щелкните туннель на противоположной стороне цикла, чтобы заместить туннель на сдвигающий регистр, или щелкните блок диаграмму, чтобы поместить сдвигающий регистр на границе строго напротив другого терминала сдвигающего регистра. Если терминал сдвигающего регистра появляется позади туннеля, сдвигающий регистр окажется не присоединенным.

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

164

гающего регистра с другим туннелем, щелкните его правой кнопкой, выберите из контекстного меню Enable Indexing и соедините туннель с узлом.

Более подробно об индексации в циклах см. раздел Автоиндексация циклов в настоящей Главе.

Узел обратной связи

Узел обратной связи (Feedback Node), показанный слева, появляется автоматически в циклах For Loop или While Loop только тогда, когда Вы подсоединяете выход ВПП, функции или группы ВПП или функций к входу того же ВП, функции или группы. Подобно сдвигающему регистру узел обратной связи запоминает данные, когда цикл завершает итерацию, посылает это значение на следующую итерацию цикла. Таким образом могут передаваться данные любого типа. Стрелка на узле обратной связи показывает направление потока данных.

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

Например, цикл For Loop на Figure 8-4 повторяется 10 раз. Узел обратной связи передает значение от предыдущей итерации цикла к туннелю до того, как это значение попадет на вход функции Add. Значение в этом туннеле всегда является значением из предыдущей итерации. На последней итерации цикла узел обратной связи содержит последнее значение, которое в данном случае равно 45, но это значение не передается в туннель или в числовой индикатор. Когда этот ВП завершит работу, в числовом индикаторе будет значение 36, которое является значением не с последней итерации, а с предпоследней итерации цикла.

165

Figure 8-4. Прохождение предпоследнего значения за пределы цикла For Loop

Цикл на Figure 8-5 также повторяется 10 раз. Однако, узел обратной связи передает в каждой итерации цикла значение от предыдущей итерации только на вход функции Add. На последней итерации цикла узел обратной связи передает значение (36) от предыдущей итерации только на вход функции Add. Функция Add прибавляет к значению (9), которое генерирует терминал итераций, значение (36) поступившее из узла обратной связи и отправляет результат в туннель. Когда этот ВП завершит работу в числовом индикаторе будет

45.

Figure 8-5. Прохождение последнего значения за пределы цикла For Loop

Инициализация узлов обратной связи

Чтобы добавить инициирующий терминал на границе цикла для его инициализации, щелкните правой кнопкой узел обратной связи и выберите из контекстного меню пункт Initializer Terminal. Когда Вы берете узел обратной связи с палитры или если Вы преобразуете инициированный сдвигающий регистр в узел обратной связи, то инициирующий терминал на границе цикла появится автоматически. Инициализация узла обратной связи устанавливает начальное значение, которое появляется на выходе узла обратной связи на первой итерации цикла после запуска ВП. Если Вы не инициализи-

166

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

Замещение сдвигающего регистра узлом обратной связи

Чтобы заместить сдвигающий регистр узлом обратной связи, щелкните правой кнопкой сдвигающий регистр и выберите из контекстного меню пункт Replace with Feedback Node. Чтобы заместить узел обратной связи сдвигающим регистром, щелкните правой кнопкой узел обратной связи и выберите из контекстного меню пункт Replace with Shift Register.

Управление синхронизацией

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

Более подробно об использовании функции ожидания в цикле для оптимизации затрат памяти см. раздел Memory and Speed Optimization в Главе 6 LabVIEW Style Guide руководства LabVIEW Development Guidelines.

Структуры выбора и последовательности

Структуры Case (вариант), Stacked Sequence (сложенная последовательность), Flat Sequence (развернутая последовательность) и Event (событие) могут содержать несколько поддиаграмм. Структура Case выполняет одну из нескольких поддиаграмм в зависимости от значения, поданного на ее вход. Структуры Stacked Sequence и Flat Sequence выполняют все свои поддиаграммы последовательно одна за другой. Структура Event выполняет свои поддиаграммы в зависимости от того, как пользователь взаимодействует с ВП.

167

Структура Case

Структура Case (вариант), показанная слева, имеет две или больше поддиаграмм или вариантов. Единовременно только одна поддиаграмма является видимой и исполняется только один из вариантов. Входная величина структуры определяет, какой из вариантов (поддиаграмма) будет исполняться. Структура Case подобна операторам select case или if…then…else текстовых алгоритмических языков.

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

Для определения варианта, который должен выполняться, подсоедините входную управляющую величину к входу селекторного терминала, показанного слева. К нему можно подсоединить целое число, булеву величину, строку или значение перечислительного типа. Селекторный терминал можно переместить на любое место в пределах левой границы структуры Case. Если к селекторному терминалу подключена булева величина, то структура имеет два варианта: вариант TRUE и вариант FALSE. Если к селекторному терминалу подключено целое число, строка или величина перечислительного типа, то такая структура может иметь любое количество вариантов.

Определяйте один из вариант по умолчанию (default case), чтобы вылавливать ситуацию выхода управляющего значения за заданный диапазон. В противном случае Вам необходимо явно указать список всех возможных значений на селекторном терминале. Например, если селектор является целым числом, и Вы определяете варианты для значений 1, 2 и 3, то необходимо задать вариант по умолчанию, который будет выполняться, если входная величина будет равна 4 или любому другому правильному целому значению.

Значения и типы данных селектора варианта

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

168

используется запятая. Для числовых величин задание интервала в виде 10..20 означает все числа от 10 до 20 включительно. Кроме того, можно использовать открытые интервалы. Например, ..100 представляет все числа, меньшие или равные 100, а 100.. представляет все числа большие или равные 100. Можно также комбинировать списки и интервалы, например ..5, 6, 7..10, 12, 13, 14. Когда Вы вводите значения, которые содержат перекрывающиеся интервалы в селекторной метке одного и того же варианта, то структура Case сама преобразует такую метку к более компактной форме. Предыдущий пример приведет к более компактной форме ..10, 12..14. Для строковых интервалов интервал a..c включает все a и b, но не c. Интервал a..c,c включает и последнюю величину c.

Когда Вы вводите в метку селектора варианта строку или значения перечислительного типа, то эти значения отображаются в кавычках, например “red”, “green” и “blue”. Однако, нет необходимости набирать кавычки при вводе, за исключением случаев, когда строка или перечислительное значение содержат запятую или символ интервала (“,” или “..”). В строковых значениях можно использовать специальные коды с обратным слэшем для неалфавитных символов, такие как \r для возврата каретки, \n для перевода строки и \t для табуляции. Список специальных кодов с обратным слэшем можно найти в справочной системе LabVIEW Help.

Если Вы измените тип данных проводника, подсоединенного к селекторному терминалу структуры Case, то структура Case автоматически конвертирует значения селектора варианта к новому типу данных, если это возможно. Если Вы конвертируете строку в числовое значение, например 19, в строку, то значением строки будет “19”. Если же Вы конвертируете строку в числовое значение, то LabVIEW конвертирует только те строковые значения, которые являются представлением числа. Другие значения остаются строками. Если Вы конвертируете число к булевому значению, то LabVIEW конвертирует 0 в FALSE, 1 в TRUE, а все остальные числовые значения становятся строками.

Если Вы вводите селекторное значение, не соответствующее типу объекта, присоединенного к селекторному терминалу, то это значение будет иметь красный цвет, чтобы указать, что Вы должны удалить или изменить это значение перед исполнением этой структу-

169

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

Входные и выходные туннели

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

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

Когда Вы присоединяете кластер ошибок к селекторному терминалу структуры Case, метка селектора варианта отображает два варианта Error и No Error, а граница структуры Case изменяет цвет - на красный для Error и на зеленый для No Error. Структура Case выполняет соответствующую каждому варианту поддиаграмму в зависимости от состояния ошибки. Более подробно об обработке ошибок см. в разделе Обработка ошибок в Главе 6 Запуск и отладка виртуальных приборов.

Структуры последовательности

Структура последовательности содержит одну или несколько поддиаграмм, или кадров (frames), которые выполняются последовательно один за другим. Структуры последовательности редко ис-

170