Тема: LabVIEW – среда разработки виртуальных приборов Лектор: доцент каф. ОФ Склярова Елена Александровна Строковые функции Строки представляют собой последовательности отображаемых и неотображаемых символов в стандарте ASCII. Часто строки используются в качестве простых текстовых сообщений. В процессе управления приборами цифровые данные передаются в виде символьных строк, которые преобразуются затем в цифры. Процедура запоминания цифровых данных в файле также может потребовать их строковой организации. Строки Строка (string) - это последовательность отображаемых и служебных ASCII символов. Строки используются для самых разных целей, как правило - для создания текстовых сообщений, в различных диалоговых окнах, для сохранения данных в файл и т.п. На лицевой панели строки отображаются в виде таблиц (tables), текстовых полей (text entry boxes), и меток (labels). Строковые регуляторы и индикаторы находятся в палитрах Controls>>Text Controls и Controls>>Text Indicators соответственно. Естественно, можно менять их форму и размеры, а так же (чего нет у числовых), добавить полосу прокрутки - для этого щелкнуть правой кнопкой мыши и выбрать в меню Visible Items>>Scrollbar. Строки Можно выбрать один из четырех способов отображения текстовых данных (в контекстном меню, по правому щелчку мыши): Normal Display - в этом режиме строка отображается "как есть", отображаются только печатаемые символы, непечатаемые не отображаются (или отображаются в виде квадратиков). Пример: There are four display types. is a backslash. '' Codes Display - в этом режиме для всех непечатаемых символов отображается их "слэш-код" (\n - это, к пример, код перехода на новую строку). Пример: There\sare\sfour\sdisplay\stypes.\n\\\sis\sa\sbackslash Password Display - ну, тут все просто - все символы отображаются в виде звездочек: ***************************** Hex Display - в этом режиме вместо символов показывается их ASCII код в шестнадцатеричном виде: 5468 6572 6520 6172 6520 666F 7572 2064 6973 706C 6179 2074 7970 6573 2E0A 5C20 6973 2061 2062 6163 6B73 6C61 7368 2E. Таблицы Состоит из следующих элементов: 1 - текущая ячейка (определяется индексами, обозначается синим уголком). 2 - заголовки столбцов. 3,4 - полосы прокрутки. 5 - заголовки строк. 6,7 - индексы (для строк и столбцов, обозначают текущую ячейку). Строковые функции Строковые функции Строковые функции Функция возвращает число символов (байтов) в строке. На вход строка (string) может быть подана строка, кластер строк или массив кластеров строк. Функция объединяет входные строки и одномерные массивы строк в единственную выходную строку. Функция заменяет одну или все образцы подстроки другой подстрокой. Функция преобразует строку в соответствии с заданным форматом. Например, преобразует строковые данные в массив действительных чисел. Функция удаляет часть строки и заменяет удаленную часть строки содержимым подстроки. Строковые функции Строковые функции Функции для работы со строками: Их довольно много разных, и расположены они все в палитре Functions>>All Functions>>String. Рассмотрим несколько для примера: String Length - возвращает длину строки (количество символов в строке). Concatenate Strings - объединение строк, делает из нескольких поданных на вход строк или массива строк одну большую строку. Чтобы изменить количество входных терминалов можно просто растянуть функцию за границу, либо щелкнуть правой кнопкой мыши и выбрать "Add Input" в контекстном меню. String Subset - возвращает подстроку, начиная с символа с номером offset (нумерация начинается с нуля) и длиной length. Match Pattern - осуществляет поиск в строке по шаблону (регулярное выражение), начиная с символа offset и выдает результат поиска в виде трех подстрок - само совпадение с шаблоном, строка до, и строка после (before substring, match substring , after substring). Строковые функции Преобразование чисел в строку, используя Build Text Express VI Подпрограмма Build Text, расположенная в палитре Functions>>Output, позволяет осуществить конкатенацию (слияние) строк, по ходу дела преобразуя числа в строки, если это нужно. При помещении этого VI на диаграмму появляется окно настройки, в котором можно задать параметры преобразования: Строковые функции Как видно, все довольно просто. Вводим текст шаблона, в котором с помощью %% выделяем переменные (вместо имени переменной будет подставлено ее значение). Выбираем, в каком виде и с какой точностью будет отображаться число при преобразовании его в строку. В результате получим примерно следующее: Строковые функции Преобразование строка->число Для осуществления обратного преобразования существует специальная функция - Scan From String. Она осуществляет поиск в строке в соответствии с заданным шаблоном, и выдает результат поиска в виде числа. Естественно, для того чтобы поиск был успешным, в строке должны содержаться нужные символы - а именно, числа 09, +, -, e, E, и период (.). Пример: Строковые функции Здесь в результате поиска будет найдено число 1.28E+2, что, если перевести в человеческий вид, равно 128. %f - это тот самый формат, что соответствует числам с плавающей точкой. Чтобы этот формат изменить, можно щелкнуть правой кнопкой мыши по функции, и выбрать в контекстном меню "Edit Scan String". Появится окно, в котором можно будет задать нужные параметры и получить строку для нужного формата: Примеры Перевод строки в массив с заданными параметрами (5 знаков впереди, 3 знака после запятой) Примеры Считывание из файла с 3мя знаками с преобразованием в массив Примеры Поэлементная запись данных в строку Примеры Примеры Примеры Примеры Примеры Типы данных в LabVIEW К числу простых скалярных типов данных относятся: вещественные числа (оранжевые терминалы и провода) повышенной точности, двойной точности, одинарной точности – в LabVIEW обозначаются соответственно EXT, DBL, SGL; целые числа со знаком (синие терминалы и провода) 32,16- и 8-разрядные - соответственно I32, I16, I8; неотрицательные целые числа без знака (синие терминалы и провода) 32-,16- и 8-разрядные соответственно U32, U16, U8; Массивы (array) Массив – пронумерованный, непрерывный, неограниченный набор однотипных данных. Каждый элемент массива имеет набор индексов, соответствующий размерности массива: одномерный – 1 индекс, двумерный – 2 индекса и т.д. Графически массив выглядит как прямоугольная область, через которую можно просматривать элементы массива. Рядом с левым верхним углом этой области отображаются индексы. В LabVIEW элементы массива нумеруются по строкам от нуля. Массивы Array Size - - возвращает число элементов в массиве. Если массив многомерный, то результатом выполнения функции будет массив, число элементов в котором равно размерности. Например, результатом применения этой функции к следующему одномерному массиву [1,6,5,3,4] будет число 5. Initialize Array - - создает массив нужной размерности с нужным числом элементов в каждой размерности и заполняет его значениями, определяемыми терминалом element. Чтобы добавить измерение, нужно "растянуть" кубик функции. Array Subset - - возвращает часть массива (подмассив элементов), начиная с некого (определяется терминалом index) и длиной, определяемой терминалом length. Например, если применить эту функцию к массиву [1,6,5,3,4] с аргументами index=1 и length=2, результатом будет массив [6,5]. Build Array - - с помощью этой функции можно добавить элементы в массив, или построить из нескольких массивов массив большей размерности. Кубик можно растягивать. Для того, чтобы при соединении двух массивов получить массив той же размерности, нужно щелкнуть правой кнопкой мыши на функции и в контекстном меню выбрать "Concatenate Inputs". Index Array - - возвращает элемент или подмассив массива с указанным номером (index). Пример: для нашего массива [1,6,5,3,4] эта функция с аргументом 2 вернет число 5. Кластеры Кроме массивов, в LabVIEW есть кластеры. От массивов они отличаются тем, что кластер - это объединение элементов разных типов (как пучок проводов в телефонном кабеле). Аналогом кластеров в обычных текстовых языках программирования служат структуры. Кластеры удобно использовать для уменьшения количества связей на диаграмме. Или для уменьшения количества терминалов у SubVI. Максимальное количество терминалов, которые можно привязать к элементам передней панели SubVI равно 28. Поэтому, если число индикаторов и регуляторов превышает это значение, то не остается ничего другого, как объединить часть элементов в кластер:) Кластеры Чтобы объединить несколько индикаторов или регуляторов в кластер, нужно выбрать в панели Controls>>All Controls>>Array & Cluster инструмент cluster, поместить его на лицевую панель, и затем внутрь рамки поместить нужные индикаторы/регуляторы. Так же можно сделать кластерную константу (для этого из палитры Cluster выбрать cluster constant и поместить на блок-схему, потом перетащить внутрь нужные элементы). Если нужна константа с теми же элементами, что и на передней панели - то щелкаем на ней правой кнопкой мыши и выбираем "Create>>Constant". Кстати, это работает не только с кластерами. Кластеры Порядковые номера элементов кластера. Элементы кластера имеют порядковый номер, связанные с их позицией внутри оболочки кластера. Первый объект, помещенный внутрь кластера имеет номер 1, второй - 2 и так далее. При удалении/добавлении элементов происходит автоматическая смена номеров. Порядок элементов определяет то, в какой последовательности будут идти выходы для этих элементов в функциях Bundle и Unbundle. Посмотреть порядок и изменить его можно, щелкнув правой кнопкой мыши по границе кластера, и выбрав в контекстном меню " Reorder Controls In Cluster". Кластеры 1. Кнопка подтверждения 2. Кнопка отмены 3. Курсор 4. Старое значение порядка 5. Новое значение Для того, чтобы изменить порядковый номер элемента, нужно набрать новый номер в окошке Click to set to text и потом щелкнуть на нужном элементе. Не забудьте сохранить сделанные изменения, нажав на кнопку OK. Помните, что два кластера с одними и теми же элементами, но с разным порядком расположения этих элементов будут считаться разными по структуре, и их нельзя будет связать между собой. Функции для работы с кластерами Эти функции находятся в палитре Functions>>All Functions>>Cluster и позволяют создавать кластеры и управлять ими. Сборка кластеров. Используйте функцию Bundle для того, чтобы объединить отдельные элементы в кластер или чтобы изменить значения отдельных элементов в уже существующем кластере. Изменить количество терминалов у функции можно просто растянув ее, или щелкнуть правой кнопкой мыши и выбрать Add Input. Если вы соедините вход cluster с каким-нибудь кластером, то число входов для элементов должно совпадать с числом элементов в этом кластере. Функции для работы с кластерами Если вход cluster подключен, то можно подсоединить только те элементы, значение которых вы хотите изменить. Пример: есть кластер, состоящий из трех элементов. Можно использовать функцию bundle для того, чтобы изменить значение элемента Command, так, как показано на рисунке: Функции для работы с кластерами Замена и доступ к элементам кластера. Используйте функцию Bundle by Name для того, чтобы получить доступ к элементу кластера по его имени (метке). Эта функция работает почти так же, как и функция Bundle, но она ссылается на элементы кластера, используя их имена. Число входов не обязательно должно совпадать с числом элементов в кластере - вы можете обратиться только к тем элементам, которые нужны. Пример: с помощью функции Bundle by Name изменяем значения элементов Command и Function. Если в процессе работы над программой понадобится добавить в кластер еще один элемент или изменить порядок элеменов, то при использовании функции Bundle by Name менять все будет не нужно, т.к. порядок и состав элементов в кластере не важен, а важны только имена. Функции для работы с кластерами Разборка кластеров. Есть две функции для того, чтобы разбить кластер обратно на отдельные элементы - это функции Unbundle и Unbundle by Name. Думаю, по аналогии с функциями образования кластеров все должно быть понятно. В этом примере исходный кластер "расщепляется" с помощью этих двух функций. С помощью функции Unbundle by Name можно оставить только те элементы, которые нас интересуют в данный момент. При использовании обычной функции Unbundle будут возвращены все существующие элементы кластера. Локальные (Local Variable) и глобальные (Global Variable) данные Конструкция "глобальные данные" и соответствующая технология LabVIEW позволяют создать данные, которые будут использоваться различными ВП. Локальные (Local Variable) и глобальные (Global Variable) данные Гораздо чаще используется конструкция "локальные данные" (Local Variable). Ключевые аспекты использования локальных данных таковы: 1. Local Variable можно рассматривать как копию терминала какого-либо элемента передней панели. Таким образом, можно использовать один и тот же элемент передней панели в различных частях кода ВП. Например, можно остановить два параллельно работающих цикла While нажатием на одну кнопку "Стоп" Локальные (Local Variable) и глобальные (Global Variable) данные 2. Использование конструкции "локальные данные" позволяет преодолеть разницу между режимами работы элемента пользовательского интерфейса"регулятор" и "индикатор". Т.е. можно программно изменять значения регуляторов и считывать значения с индикаторов. Local Variable может работать в режиме чтения или записи данных, режим переключается через всплывающее меню. На рис. 20 приведен пример расчета N! С использованием локальных переменных. Недостатком такого приема является низкая скорость работы, поскольку на каждой итерации требуется обращение к передней панели. Пример создания ВП Постановка задачи. Пусть требуется разработать виртуальный прибор для циклической генерации случайного числа в заданном диапазоне с проверкой на допустимость значения и записью измеренных значений в файл. Исходные данные для разработки ВП могут быть представлены следующей таблицей. Разработка передней панели Разработка передней панели Разработка блок-диаграммы Алгоритм работы ВП может быть такой: 1. начало (запуск виртуального прибора) 2. запрашиваем у оператора имя файла для сохранения результатов, открываем выбранный файл. Удаляем с графика результаты предыдущего эксперимента. Удаляем элементы из таблицы. 3. ожидаем нажатие на кнопку "Пуск" 4. определяем время старта, переходим в режим "измерений. 5. циклически, через dt=500 мс. выполняем следующие действия: • определяем время со старта; • генерируем случайное число 0-1. Умножаем на значение регулятора "Диапазон", получаем число 0-Диапазон; • определяем текущее значение уставки; • сравниваем результат измерения с уставкой, при превышении зажигаем лампу "Авария"; • отображаем на график следующие данные: Диапазон, Уставка, измеренное значение; Алгоритм работы ВП может быть такой: • формируем строку со значением времени, для чего преобразуем число (время в секундах) в строковый вид – формат числа с плавающей точкой, 3 знака после запятой; • формируем строку с полями Диапазон, Уставка, измеренное значение, разделенными табуляцией, в конце символ перевода строки. Формат преобразования – число с плавающей точкой, 2 знака после запятой; • формируем итоговую строку для записи в файл в виде время – табуляция – строка с предыдущего этапа; • записываем итоговую строку в файл; • передаем текущее время и измеренное значение на выходные индексирующие туннели цикла, чтобы можно было после завершения работы построить таблицу время-значение; • проверяем условие завершения цикла – нажатие оператором на кнопку "Стоп" 6. после завершения цикла на шаге №4 закрываем файл, получаем одномерные массивы с выходных индексирующих туннелей цикла, формируем двумерный массив время-значение и отображаем на переднюю панель. 7. конец: Графики в LabView LabView обладает широким инструментарием для вывода данных в виде графиков и диаграмм. 1. График Waveform Chart Этот график имитирует работу самописца. Находится этот график (как и все остальные, впрочем) в палитре Controls>>Graph Indicators. Графики в LabView На рисунке цифрами обозначены: 1 - название графика (можно поменять на любое другое) 2,3 - названия осей. Аналогично, обозначаем как нам удобно 4 - панель управления осями (название, включение-выключение Autoscale и т.п.) 5 - панель управления изображением (двигать туда-сюда, зум и все такое) 6 - список графиков. Названия и вид отображения настраиваются по вкусу. Графики в LabView У Waveform Chart есть три разных способа скроллирования(обработки) поступающих данных. Выбрать нужный способ можно щелкнув по графику правой кнопкой мыши, и выбрав в меню Advanced>>Update Mode один из режимов (Strip Chart, Scope Chart, или Sweep Chart). В режиме Strip Chart данные показываются непрерывным потоком, идя слева направо. В режиме Scope Chart данные тоже идут слева направо, но как только график доходит до конца окна, оно очищается и новые данные опять идут сначала. Режим Sweep Chart похож на экран ЭКГ. Все почти так же, как в режиме Scope Chart, но теперь на экране одновременно показывается текущая порция данных и предыдущая порция. Они разделяются красной линией. Вывод данных на график Waveform Chart выводит скалярные данные (т.е. просто числа). Поэтому, чтобы вывести что-то на график - просто подключите к его терминалу нужный объект. Чтобы получать данные непрерывно, можно сделать цикл (так оно обычно и происходит). Пример, сложение двух случайных чисел. Графики Waveform Graph и XY Graph Эти графики находятся в палитре Controls>>Graph Indicators. График Waveform Graph служит для отображения функций типа y=f(x), где каждому значению х соответствует одно единственное значение y. График отображает массив значений y, при этом по оси х значения распределены равномерно. XY graphs отображает любой набор точек с заданными координатами (х,y). На вход графика подается двумерный массив с координатами точек. График Waveform Graph Кроме того, на вход графика Waveform Graph можно подавать кластер из трех элементов - начальное значение x, приращение dx и массив значений y. Чтобы отобразить на Waveform Graph 2 графика одновременно, нужно подать на вход 2D массив. Тогда каждый столбец массива интерпретируется как отдельный набор данных y, и выводится на график. Так же можно подать на вход кластер - начальное значение x, приращение dx и двумерный массив. График XY Graph Чтобы вывести один график, на вход XY Graph надо подать кластер с двумя массивами - в одном из которых значения x, а в другом - значения y, соответственно. Также можно подать массив из кластеров, в каждом из которых содержится по два значения - x и y. Пример: создан кластер с двумя массивами чисел. Значения этого кластера выводятся на график: Файлы в LabVIEW Файл – это совокупность связанных записей (кластеров), хранящихся во внешней памяти компьютера и рассматриваемых как единое целое. Обычно файл однозначно идентифицируется указанием имени файла, его расширения и пути доступа к файлу. Операции с файлом: •Открытие и закрытие файлов •Чтение данных из файла и запись в файл •Перемещение, переименование файлов и каталогов •Изменение атрибутов файла Файловые функции LabVIEW находятся в палитре Functions>>All Functions>>File I/O. С помощью этих функций и подпрограмм можно выполнять все вышеперечисленные операции с файлами. Функции для работы с файлами в LabVIEW можно разделить на две группы: функции высокого уровня, функции низкого уровня. Файлы в LabVIEW Функции для работы с файлами в LabVIEW можно разделить на две группы: •функции высокого уровня, •функции низкого уровня. Функции высокого уровня Эти функции очень удобны в использовании, так как можно с помощью одной функции сразу сделать все операции с файлом открыть, записать, закрыть. Находятся эти функции, как уже говорилось, в палитре File I/O, в верхней строке. Файлы в LabVIEW Write to Spreadsheet File - Преобразует одномерный или двумерный массив чисел в строку и записывает эту строку в файл. Файл создается и открывается автоматически, или дописывается в уже существующий. Есть возможность выбрать разделитель. В итоге, получается файл - текстовая таблица с числами, разделенными табуляцией, например. Read From Spreadsheet File - То же, что и предыдущая функция, только наоборот - читает из файла). Write Characters to File - записывает строку в новый или уже существующий файл. Создание, открытие, запись, закрытие производятся автоматически. Read Characters From File - чтение строки из файла. Открывает файл, читает из него, закрывает файл. Read Lines From File - читает строки из текстового или бинарного файла. Binary File VIs - несколько функций для работы с бинарными файлами чтение, запись и т.п. Данные могут быть целыми, или с плавающей точкой. Файлы в LabVIEW Функции низкого уровня Open/Create/Replace File - открывает существующий файл, создает новый или заменяет уже существующий. Если путь не задан, будет выдано диалоговое окно, в котором можно будет выбрать нужный путь. Read File - чтение данных из файла. Write File - запись данных в файл. Close File - закрывает файл. Использование этих функций оправдано, когда нужна высокая скорость работы (например, в приложениях реального времени). Файлы в LabVIEW Пример 1 Записать случайные числа в файл. Файлы в LabVIEW Пример 2 записать числа в файл используя функции высокого уровня. Программирование в LabVIEW Параллельное программирование становится все более необходимым, поскольку позволяет максимально эффективно использовать возможности многоядерных процессоров и многопроцессорных систем. Программирование на LabVIEW подразумевает создание графического кода (G) в виде диаграммы, что является существенным отличием от традиционных текстовых языков. Подобный подход называется потоковым программированием. Вместо последовательности выполняющихся друг за другом команд, код на LabVIEW представляет данные и операции, которые соединяются между собой, а компилятор LabVIEW автоматически определяет последовательность выполнения команд. Это также означает, что два параллельных участка кода (ветви диаграммы) независимы и могут быть выполнены на разных ядрах процессора. Программирование в LabVIEW Программирование в LabVIEW Параллелизм задач Параллелизм задач подразумевает, что несколько операций могут быть выполнены независимо друг от друга. На рис. приведен пример подобных задач: операции фильтрации сигнала и БПФ независимы, а следовательно могут быть выполнены на многоядерных процессорах одновременно. Программирование в LabVIEW Параллелизм данных Параллельные данные – это независимые секции одного набора данных, которые могут быть обработаны независимо друг от друга с последующим объединение результатов. На рис. показан пример отдельной обработки правого и левого каналов аудиосигнала. Программирование в LabVIEW Конвейеризация задач Конвейеризация задач представляет собой метод обработки данных последовательностью функций, которые передают друг другу соответствующие блоки данных в разных итерациях цикла. В LabVIEW конвейеризация задач организуется с помощью инструмента feedback node или сдвиговых регистров. Программирование в LabVIEW Пример: задача с использованием параллельных циклов. Лекция окончена Нажмите клавишу <ESC> для выхода