Основы программирования LabVIEW Dataflow. data flow (= dataflow) поток данных - общий термин, относящийся к алгоритмам или архитектурам параллельных вычислений, в которых выполнение каждой операции производится при готовности всех её операндов, при этом последовательность выполнения команд заранее не задаётся. Впервые графическую модель вычислений, управляемых потоком данных, предложил в 1968 г. в своей докторской диссертации сотрудник Стэнфордского университета Дуайн Эдэмс (он же ввел термин dataflow ) Итак, в LabVIEW используется алгоритм поток данных (или Data Flow). Определение того, что это такое, дано выше, поэтому давайте рассмотрим два простых примера, чтобы понять, как с этим жить (осознавать это программисту в LabVIEW нужно, иначе можно долго мучиться от неуловимых багов и нестабильности работы программы). Пример один, все просто: два числа складываются, затем от результата отнимается 50 и общий результат выводится в поле индикатора Result. Заметьте, что операция сложения начнется только тогда, когда будут доступны два числа, операция вычитания только после операции сложения, и никак иначе. Ход выполнения программы однозначно определен. А теперь еще один пример: Тут не все так радужно, как в предыдущем примере. Что выполнится быстрее, сложение или вычитание? А может, функция рандома - кубики? Никто не знает, потому что все эти операции имеют на входе нужные данные одновременно, и поэтому выполняться будут как попало - случайно. Этого нужно избегать, используя дополнительные программные средства, о которых речь будет идти несколько позже. Нужно всегда четко осознавать, в какой последовательности будут выполняться узлы программы. http://labview.webhost.ru/?Dataflow Ветвления. При программировании часто ход дальнейшего выполнения программы зависит от какого-либо условия. Например, если случилось А, то делай Б, а если случилось В, то делай Г. В текстовых языках программирования ветвления реализуются при помощи конструкций типа if-else, case, switch и т.п. Естественно, в LabVIEW тоже есть все возможности для организации ветвлений. Функция Select.Рассмотрим один из способов - функцию Select. - вот она. Находится в палитре Functions>>Express Comparison. Эта функция выбирает одно из двух 1 значений, в зависимости от того, какое значение (True или False) на третьем входе.Пример: Здесь с помошью этой функции выбирается, в каком виде отображать температуру - по Цельсию или по Фаренгейту.Другие способы создания ветвлений, которые позволяют реализовать более сложные алгоритмы, мы рассмотрим в следующих уроках. http://labview.webhost.ru/?%C2%E5%F2%E2%EB%E5%ED%E8%FF Formula Node Этот элемент позволяет поместить в блок-схему текстовый код, который выполняет некие математические операции. Это может быть удобно, например, для программирования сложных выражений со многим числом переменных. Или, для более простого интегрирования в LabView уже существующего кода (например, написанного для MATLAB).Ввод и вывод данных из основного кода в Formula Node осуществляется просто - нужно просто щелкнуть по границе правой кнопкой мыши, и выбрать Add Input или Add Output. Выражения внутри Formula Node отделяются друг от друга точкой с запятой (;), как принято во всех нормальных языках программирования:)Formula Node, в том числе, можно использовать для организации ветвлений в программе - пример на рисунке: Здесь представлены два способа, как сделать одно и то же (на примере вычисления квадратного корня - с проверкой входных данных).Более подробную информацию о Formula Node, возможных функциях, операциях, синтаксисе и т.п. можно найти в справке LabVIEW.Замечание: в LabVIEW есть еще Formula Express VI (находится в палитре Functions>>Arithmetic & Comparison), который можно использовать для вычисления различных математических функций (что-то типа инженерного калькулятора). Опять же, более подробно об этом можно узнать в справке. http://labview.webhost.ru/?Formula_Node Цикл For. Цикл For (For Loops) выполняет находящийся внутри рамки код определенное число раз. Если вы программировали на любом другом языке программирования, то вам должно быть понятно, о чем идет речь. Посмотрите на картинку: 2 Тут изображен цикл For в LabVIEW, блок-схема этого процесса и тот же самый цикл в обычном текстовом языке программирования.Цикл For находится в палитре Functions>>All Functions>>Structures. Так же, можно поместить этот цикл следующим образом: щелкнуть на границе цикла While правой кнопкой мыши, и в контекстном меню выбрать "Replace with For Loop". - count, определяет, сколько раз будет выполняться цикл (нужно подключить, например, константу к этому терминалу). - выдает номер текущей итерации (аналогично тому, как в цикле While).Пример: Данный VI в течение 100 секунд генерирует случайное число каждую секунду и выводит его на индикатор. Функции задержки (Wait Functions). - функция Wait Until Next, выдает значение миллисекундного счетчика, и ждет когда это значение достигнет заранее заданного (определенного нами). - функция Wait, просто ждет, заранее заданное нами число миллисекунд. Эти функции находятся в палитреFunctions>>Execution Control. Типы данных. В Labview численные данные могут иметь следующий вид: знаковые (signed) и беззнаковые (unsigned) целые (integer) разной битности (8-bit, 16-bit, or 32-bit), числа с плавающей точкой (floating-point), тоже разной битности, или комплексные числа.Если к двум терминалам одной функции подключить числа разных типов, то результат будет возвращен в более большом (или широком) формате. Пример: 3 Так же, формат данных может меняться принудительно, если для выполнения какой-либо функции нужен определенный формат, а на вход подается другой. Пример: Здесь происходит автоматическое преобразование числа с плавающей точкой в 32битное беззнаковое целое. Аналогично, знаковое 32-битное целое число тоже преобразуется, в беззнаковое. http://labview.webhost.ru/?%D6%E8%EA%EB_For Цикл While. В LabVIEW, как и в других языках программирования, тоже есть циклы. И функции, и подпрограммы, и даже переменные. LabVIEW - это тоже язык программирования, только графический:) В этом уроке мы рассмотрим цикл While (While Loop). Это цикл, аналогичный циклам "Do Loop" и "Repeat-Until Loop" в обычных текстовых языках программирования. Чтобы было понятнее, посмотрите на картинку: 1 - Так выглядит цикл While в LabVIEW. Код, который находится внутри рамки цикла, будет выполняться до тех пор, пока не будет выполнено условие - Condition met? примет значение true. 2- Это блок-схема данного процесса (цикла то есть). 3- Тот же самый цикл в обычном текстовом языке программирования. Чтобы создать такой цикл, нужно зайти в палитру Functions>>Execution Control и выбрать там While Loop соответственно. Затем нужно растянуть рамку по полю до нужных вам размеров, вставить что-нибудь (например, кнопку), что будет условием завершения - и все, цикл готов. - это терминал завершения цикла. Цикл будет выполняться до тех пор, пока этот терминал не получит определенное булевское значение (в данном случае - пока на терминал не поступит true). - счетчик итераций, начальное значение всегда 0 (на первом шаге цикла), в дальнейшем при каждом проходе увеличивается на 1. 4 Вообще, есть два условия завершения цикла - Stop If True и Continue if True. Переключение между ними делается просто - щелчок правой кнопкой мыши по значку терминала, и выбрать нужное из контекстного меню. Давайте рассмотрим два примера, чтобы было понятнее: Этот цикл будет выполняться до тех пор, пока число, которое выдает SubVI не станет больше 10, при значении регулятора Enable равном true. Тогда два true в сумме дадут тоже true, и цикл завершится (Stop if true). А здесь ситуация обратная - цикл будет выполняться до тех пор, пока на выходе получается значение true. Как только получится False, цикл завершится (Continue if True). В общем-то, все довольно просто и логично. Туннели. Небольшое, но важное замечание. В LabVIEW такие вот "рамочные" структуры встречаются довольно часто (есть еще цикл For, case structure и т.п.). Данные могут пересекать границу рамки по "туннелям". Посмотрите на картинку: Синий квадратик на границе цикла - это и есть тот самый туннель. Прим этом важно понимать, что данные пойдут по туннелю только тогда, когда цикл закончится. Поэтому, в результате выполнения этой программы на индикаторе Iteration Number будет показан только номер последней итерации. http://labview.webhost.ru/?%D6%E8%EA%EB_While Автоиндексация. В этом разделе мы поговорим о таком понятии, как автоиндексация (или auto-indexing). Понятие само по себе не сложное, но важное. Если 5 соединить массив с туннелем на границе цикла For или While, то внутри этого цикла можно работать с элементами этого массива, используя автоиндексацию. Посмотрите на рисунок - здесь в цикле генерится случайное число, которое потом выводится из цикла через туннель. При этом числа автоматически индексируются и образуют массив. Для этого ничего делать не надо - достаточно просто провести связь от выходного терминала функции рандома наружу цикла. Обратите внимание, после туннеля нить становится более толстой, и на туннеле стоит пара квадратных скобок - обозначение массива.Если же вы не хотите, чтобы на выходе был массив (например, нужно только последнее число), то автоиндексацию можно отключить - для это нажмите правой кнопкой мыши по туннелю и выберите "Disable Indexing". АДля циклов For автоиндексирование включено по умолчанию, для циклов While - отключено (но можно и включить, правой кнопкой по туннелю, и выбрать "Enable Indexing").Можно создать двумерный массив, использовав вложенные циклы: Внутренний цикл соответствует столбцам, внешний - строкам в массиве. Т.е. в результате выполнения данного примера получится таблица 6х4.Если присоединить массив с циклом For (как показано на рисунке), то значение терминала Count будет приравнено к размеру массива. Таким образом, цикл выполнится ровно столько раз, каково количество элементов в массиве. Может быть удобно, если заранее неизвестно, какого размера получится массив. http://labview.webhost.ru/?%C0%E2%F2%EE%E8%ED%E4%E5%EA%F1%E0%F6% E8%FF Строки. Строка (string) - это последовательность отображаемых и служебных ASCII символов. Строки используются для самых разных целей, как правило - для создания текстовых сообщений, в различных диалоговых окнах, для сохранения данных в файл и т.п.На лицевой панели строки отображаются в виде таблиц(tables), текстовых полей (text entry boxes), и меток (labels).Строковые регуляторы и индикаторы находятся в 6 палитрах Controls>>Text Controls и Controls>>Text Indicators соответственно. Естественно, можно менять их форму и размеры, а так же (чего нет у числовых), добавить полосу прокрутки - для этого щелкнуть правой кнопкой мыши и выбрать в меню Visible Items>>Scrollbar.Можно выбрать один из четырех способов отображения текстовых данных (в контекстном меню, по правому щелчку мыши): 1. Normal Display - в этом режиме строка отображается "как есть", отображаются только печатаемые символы, непечатаемые не отображаются (или отображаются в виде квадратиков). Пример: There are four display types. is a backslash. 2. '' Codes Display - в этом режиме для всех непечатаемых символов отображается их "слэш-код" (кто c изучал, тот поймет. Для тех кто не изучал - \n - это, к пример, код перехода на новую строку). Пример: There\sare\sfour\sdisplay\stypes.\n\\\sis\sa\sbackslash. 3. Password Display - ну, тут все просто - все символы отображаются в виде звездочек:***************************** 4. 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. Таблицы Таблица - это отображение 2D массива из строк. Есть таблицы-индикаторы, и таблицы-регуляторы:) Находятся в палитрах Controls>>Text Indicators и Controls>>All Controls>>List & Table соответственно. Состоит из следующих элементов: 1 - текущая ячейка (определяется индексами, обозначается синим уголком). 2 - заголовки столбцов. 3,4 - полосы прокрутки. 5 заголовки строк. 6,7 - индексы (для строк и столбцов, обозначают текущую ячейку). http://labview.webhost.ru/?%D1%F2%F0%EE%EA%E8 7 Строковые функции. Или если по-русски, то функции для работы со строками:) Их довольно много разных, и расположены они все в палитре 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 на диаграмму появляется окно настройки, в котором можно задать параметры преобразования: Как видно, все довольно просто. Вводим текст шаблона, в котором с помощью %% выделяем переменные (вместо имени переменной будет подставлено ее значение). Выбираем, в каком виде и с какой точностью будет отображаться число при преобразовании его в строку.В результате получим примерно следующее: 8 Преобразование строка->число. Для осуществления обратного преобразования существует специальная функция - Scan From String. Она осуществляет поиск в строке в соответствии с заданным шаблоном, и выдает результат поиска в виде числа. Естественно, для того чтобы поиск был успешным, в строке должны содержаться нужные символы - а именно, числа 0-9, +, -, e, E, и период (.). Пример: Здесь в результате поиска будет найдено число 1.28E+2, что, если перевести в человеческий вид, равно 128. %f - это тот самый формат, что соответствует числам с плавающей точкой. Чтобы этот формат изменить, можно щелкнуть правой кнопкой мыши по функции, и выбрать в контекстном меню "Edit Scan String". Появится окно, в котором можно будет задать нужные параметры и получить строку для нужного формата: Естественно, строку формата можно написать и вручную (если вы понимаете, как это сделать). Все необходимые данные для этого можно найти в справке LabVIEW. Ссылки: http://labview.webhost.ru/?%D1%F2%F0%EE%EA%EE%E2%FB%E5_%F4%F3%ED %EA%F6%E8%E8 Массивы. Массив (Array) - это набор данных одного и того же типа. Массивы могут быть разной размерности. Одномерный - просто набор чисел, двумерный - таблица с этими числами и т.п. На каждую размерность в массиве может приходиться максимум 2^31-1 элементов.Можно создать массив из данных следующих типов: numeric, Boolean, path, string, waveform, и cluster. Нельзя создать массив из массивов, однако можно сделать cluster (о кластерах будет подробно рассказано в следующих разделах).Элементы в массиве упорядочены, каждый из них имеет номер (index). Номера начинаются с нуля, как и положено. Создание Array Controls и Indicators. Чтобы создать регулятор или индикатор массива, выберите "Array" в палитре Controls>>All Controls>>Array & Cluster и поместите его на лицевую панель. Затем перетащите внутрь рамки массива какой-нибудь уже имеющийся регулятор или индикатор нужного вам типа данных. Все, готово. 9 Примерно вот так выглядит массив (array) на лицевой панели. 1 - это индекс массива, 2 - элементы этого массива.Чтобы изменить размерность массива, щелкните на индексе и выберите в контекстном меню "Add Dimension". Как уже говорилось, двумерный массив - это таблица. Чтобы массив был более наглядным, можно растянуть область элементов до нужного вам размера: Помните, что размерность массива и количество элементов в нем не определяются видом массива на лицевой панели (например, у того же двумерного массива можно сделать зону элементов состоящей только из одно видимого). Так же, можно добавить на блок-диаграмму массив-константу (это может быть полезно, например, для передачи данных в SubVI). Для этого нужно в палитре unctions>>All Functions>>Array выбрать "array constant" и поместить ее на поле диаграммы, а затем перетащить внутрь рамки константу нужного типа.Функции для работы с массивами Рассмотрим основные функции, которые используются при работе с массивами в LabVIEW. Все эти функции находятся в палитре Functions>>All Functions>>Array.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 10 Array - возвращает элемент или подмассив массива с указанным номером (index). Пример: для нашего массива [1,6,5,3,4] эта функция с аргументом 2 вернет число 5. Полиморфизм Полиморфизм, наследование и инкапсуляция. Что-то из ООП:)Функции, которые находятся в палитрах Functions>>Express Numeric и Functions>>All Functions>>Numeric полиморфные. Это означает, что на вход этим функциям можно подавать данные разных типов, в том числе не только скалярные - но и массивы. Например, функцию add можно использовать для сложения массива и скаляра, или двух массивов. Пример: при сложении массива [1,3,2] и числа 2 получится массив [3,5,4]. При сложении двух массивов [1,3,2] и [3,5,4] получится массив [4,8,6]. Если в двух массивах разное число элементов, то в результате сложения получится массив, число элементов в котором равно числу элементов в самом маленьком из двух массивов. Например, при сложение массива [3,1,2,3] с массивом [1,2,1] получим в результате [4,3,3]. http://labview.webhost.ru/?%D4%F3%ED%EA%F6%E8%E8_%E4%EB%FF_%F0%E0 %E1%EE%F2%FB_%F1_%EC%E0%F1%F1%E8%E2%E0%EC%E8 Кластеры. Кроме массивов, в LabVIEW есть кластеры. От массивов они отличаются тем, что кластер - это объединение элементов разных типов (как пучок проводов в телефонном кабеле). Аналогом кластеров в обычных текстовых языках программирования служат структуры. Кластеры удобно использовать для уменьшения количества связей на диаграмме. Или для уменьшения количества терминалов у SubVI. Максимальное количество терминалов, которые можно привязать к элементам передней панели SubVI равно 28. Поэтому, если число индикаторов и регуляторов превышает это значение, то не остается ничего другого, как объединить часть элементов в кластер:) Чтобы объединить несколько индикаторов или регуляторов в кластер, нужно выбрать в панели Controls>>All Controls>>Array & Cluster инструмент cluster, поместить его на лицевую панель, и затем внутрь рамки поместить нужные индикаторы/регуляторы. Так же можно сделать кластерную константу (для этого из палитры Cluster выбрать cluster constant и поместить на блок-схему, потом перетащить внутрь нужные элементы). Если нужна константа с теми же элементами, что и на передней панели - то щелкаем на ней правой кнопкой мыши и выбираем "Create>>Constant". Кстати, это работает не только с кластерами. Порядковые номера элементов кластера. Элементы кластера имеют порядковый номер, связанные с их позицией внутри оболочки кластера. Первый объект, помещенный внутрь кластера имеет номер 1, второй - 2 и так далее. При удалении/добавлении элементов происходит автоматическая смена номеров. Порядок элементов определяет то, в какой последовательности будут идти выходы для этих элементов в функциях Bundle и Unbundle. Посмотреть порядок и изменить его можно, щелкнув правой кнопкой мыши по границе кластера, и выбрав в контекстном меню " Reorder Controls In Cluster". 11 1. Кнопка подтверждения2. Кнопка отмены3. Курсор 4. Старое значение порядка5. Новое значениеДля того, чтобы изменить порядковый номер элемента, нужно набрать новый номер в окошке Click to set to text и потом щелкнуть на нужном элементе. Не забудьте сохранить сделанные изменения, нажав на кнопку OK.Помните, что два кластера с одними и теми же элементами, но с разным порядком расположения этих элементов будут считаться разными по структуре, и их нельз http://labview.webhost.ru/?%CA%EB%E0%F1%F2%E5%F0%FB Функции для работы с кластерами. Эти функции находятся в палитре Functions>>All Functions>>Cluster и позволяют создавать кластеры и управлять ими. Сборка кластеров. Используйте функцию Bundle для того, чтобы объединить отдельные элементы в кластер или чтобы изменить значения отдельных элементов в уже существующем кластере. Изменить количество терминалов у функции можно просто растянув ее, или щелкнуть правой кнопкой мыши и выбрать Add Input. Если вы соедините вход cluster с каким-нибудь кластером, то число входов для элементов должно совпадать с числом элементов в этом кластере. Если вход cluster подключен, то можно подсоединить только те элементы, значение которых вы хотите изменить. Пример: есть кластер, состоящий из трех элементов. 12 Можно использовать функцию bundle для того, чтобы изменить значение элемента Command, так, как показано на рисунке: Замена и доступ к элементам кластера. Используйте функцию Bundle by Name для того, чтобы получить доступ к элементу кластера по его имени (метке). Эта функция работает почти так же, как и функция Bundle, но она ссылается на элементы кластера, используя их имена. Число входов не обязательно должно совпадать с числом элементов в кластере - вы можете обратиться только к тем элементам, которые нужны. Пример: с помощью функции Bundle by Name изменяем значения элементов Command и Function.Если в процессе работы над программой понадобится добавить в кластер еще один элемент или изменить порядок элеменов, то при использовании функции Bundle by Name менять все будет не нужно, т.к. порядок и состав элементов в кластере не важен, а важны только имена. Разборка кластеров. Есть две функции для того, чтобы разбить кластер обратно на отдельные элементы - это функции Unbundle и Unbundle by Name. Думаю, по аналогии с функциями образования кластеров все должно быть понятно. 13 В этом примере исходный кластер "расщепляется" с помощью этих двух функций. С помощью функции Unbundle by Name можно оставить только те элементы, которые нас интересуют в данный момент. При использовании обычной функции Unbundle будут возвращены все существующие элементы кластера. http://labview.webhost.ru/?%D4%F3%ED%EA%F6%E8%E8_%E4%EB%FF_%F0%E0 %E1%EE%F2%FB_%F1_%EA%EB%E0%F1%F2%E5%F0%E0%EC%E8 Case Structures. структура Case позволяет осуществить выбор одного из двух (или более) случаев, и выполнить в зависимости от этого выбора нужную подпрограмму. Case structure похожа на конструкцию if...then...else в обычных текстовых языках программирования (а еще больше на Select case:)Как это работает? Очень просто на поле диаграммы ставится рамочка Case structure, сверху в ней есть переключатель случаев . Щелкая по стрелкам, можно посмотреть какие случаи доступны (по умолчанию только два - true и false соответственно). На вход подается какое-то значение, и в зависимости от него выбирается нужный случай. Если на вход подается булево число, то значений всего два (как уже говорилось). Если подать целое, или например строку, то значений может быть 2^31 - 1. Для каждого предусмотренного значения можно написать свою подпрограмму (переключаться между ними можно, щелкая по стрелочкам). Одно из значений выбирается значением по умолчанию (default), и подпрограмма соответствующая этому значению будет выполнена, если на вход будет подано любое значение, для которого подпрограмма не задана. Например, если заданы случаи для чисел 1,2,3 а на вход подать число 4, то будет выполнена дефолтная подпрограмма.Рассмотрим пример: 14 Здесь в зависимости от шкалы происходит или не происходит пересчет градусов по Цельсию в градусы по Фаренгейту. В принципе, тут было бы достаточно функции Select, но у Case structure более широкие возможности - ведь внутрь рамки можно добавить еще много чего более сложного:) Плюс, выбор осуществить можно не из двух, а гораздо большего числа случаев, что с помощью той же Select организовать можно, но довольно коряво. Туннели. В Case structure можно использовать туннели. При этом, если подать чтото на вход, то туннель появится для всех случаев. Можно использовать, можно не использовать - по желанию. С выходными туннелями несколько сложнее. Их тоже можно не подключать в каждой подпрограмме. При этом туннель будет отображаться в виде белых квадратных скобок. Если в каждом случае что-то (не обязательно одно и то же, главное чтобы тип данных совпадал) будет подключено к туннелю, то квадратик туннеля будет заполнен сплошным цветом. Если щелкнуть по туннелю правой кнопкой мыши и выбрать Use Default If Unwired, то для случаев с не подключенным туннелем, будет использоваться значение из дефолтного случая (как нетрудно догадаться по названию опции). http://labview.webhost.ru/?Case_Structures График Waveform Chart. В LabVIEW в качестве встроенных средств вывода имеется несколько различных типов графиков и диаграмм. В этом разделе мы как раз ими и займемся. Точнее, рассмотрим первый тип графика: Waveform Chart. Этот график имитирует работу самописца (если кто забыл, это такая штука когда прокручивается рулон с бумагой, а перо на ней рисует снимаемый сигнал:). Находится этот график (как и все остальные, впрочем) в палитре Controls>>Graph Indicators. 15 На рисунке цифрами обозначены:1 - название графика (можно поменять на любое другое)2,3 - названия осей. Аналогично, обозначаем как нам удобно4 - панель управления осями (название, включение-выключение Autoscale и т.п.)5 - панель управления изображением (двигать туда-сюда, зум и все такое)6 - список графиков. Названия и вид отображения настраиваются по вкусу.У Waveform Chart есть три разных способа скроллирования поступающих данных. Выбрать нужный способ можно щелкнув по графику правой кнопкой мыши, и выбрав в меню Advanced>>Update Mode один из режимов (Strip Chart, Scope Chart, или Sweep Chart). По умолчанию стоит режим Strip Chart. В режиме Strip Chart данные показываются непрерывным потоком, идя слева направо. В режиме Scope Chart данные тоже идут слева направо, но как только график доходит до конца окна, оно очищается и новые данные опять идут сначала. Режим Sweep Chart похож на экран ЭКГ. Все почти так же, как в режиме Scope Chart, но теперь на экране одновременно показывается текущая порция данных и предыдущая порция. Они разделяются красной линией. В общем, описывать словами это все довольно муторно лучше попробуйте сами, посмотрите как что выглядит в разных режимах - и сразу все поймете:) Вывод данных на график. Waveform Chart выводит скалярные данные (т.е. просто числа). Поэтому, чтобы вывести что-то на график - просто подключите к его терминалу нужный объект. Чтобы получать данные непрерывно, можно сделать цикл (так оно обычно и происходит). 16 Чтобы показывать несколько графиков одновременно, нужно объединить несколько скалярных значений в кластер, и уже кластер присоединить к терминалу графика: http://labview.webhost.ru/?%C3%F0%E0%F4%E8%EA_Waveform_Chart Графики Intensity Graph и Intensity Chart. Эти графики используются для отображения таких данных, как например снимок CCD камеры, или топографические данные, или карта температур и т.п. На вход подается двумерный массив, номер элемента в массиве определяет его координаты на графике, а значение элемента - цвет точки на графике График является как бы трехмерным, но в качестве третьей координаты используется цвет http://labview.webhost.ru/?%C3%F0%E0%F4%E8%EA%E8_Intensity_Graph_%E8_Int ensity_Chart Графики Waveform Graph и XY Graph. Эти графики находятся в палитре Controls>>Graph Indicators. График Waveform Graph служит для отображения функций типа y=f(x), где каждому значению х соответствует одно единственное значение y. График отображает массив значений y, при этом по оси х значения распределены равномерно. XY graphs отображает любой набор точек с заданными координатами (х,y). На вход графика подается двумерный массив с координатами точек. 17 Waveform Graph. Кроме того, на вход графика Waveform Graph можно подавать кластер из трех элементов - начальное значение x, приращение dx и массив значений y.Чтобы отобразить на Waveform Graph 2 графика одновременно, нужно подать на вход 2D массив. Тогда каждый столбец массива интерпретируется как отдельный набор данных y, и выводится на график. Так же можно подать на вход кластер - начальное значение x, приращение dx и двумерный массив.Другой способ: на вход графика подать массив кластеров, в каждом кластере должен содержаться массив со значениями y.Примеры: XY Graph. Чтобы вывести один график, на вход XY Graph надо подать кластер с двумя массивами - в одном из которых значения x, а в другом - значения y, соответственно.Также можно подать массив из кластеров, в каждом из которых содержится по два значения - x и y.Чтобы вывести несколько графиков одновременно, нужно подать на вход массив из кластеров, в каждом из которых содержится по два массива со значениями для x и y. Другой способ: подать на вход массив кластеров, в каждом кластере содержится массив точек графика. Каждая точка - это кластер с двумя значениями, х и y. Ссhttp://labview.webhost.ru/?%C3%F0%E0%F4%E8%EA%E8_Waveform_Gra ph_%E8_XY_Graphылки: SubVI. Создадим подпрограмму, которая будет переводить градусы Цельсия в градусы Фаренгейта. Пункт номер один - создаем лицевую панель как на рисунке. Для этого выбираем в палитре регуляторов Controls>>Numeric Controls и находим там Numeric Controlсоответственно. Аналогично, заходим в Controls>>Numeric Indicators и выбираем там Numeric Indicator. Меняем ярлыки по вкусу (необязательно как на рисунке, главное чтоб было понятно:). Все, лицевая панель готова. Нажимаем Ctrl+E и переходим к блок схеме: 18 Функции умножения и сложения находятся в палитре функций в разделе Functions>>Arithmetic & Comparison>>Express Numeric. Константы находятся там же, но можно сделать проще - щелкнув на нужном входе функции правой кнопкой мыши, выбрать Create Constant. Все, программа готова, теперь сделаем из нее подпрограмму:) Для этого сначала отредактируем значек - двойной щелчок по нему откроет редактор. Рисуем тут что душе угодно, но лучше что-нибудь осмысленное, чтоб самим потом легче было. Привыкайте всегда править значек, когда делаете сабви - чтоб потом не путаться. Следующий важный шаг - добавляем коннекторы. Для этого щелкаем правой кнопкой мыши по значку, затем в контекстном меню выбираем "Show Connector". Т.к. элементов на лицевой панели всего два, автоматически будет создано два коннектора: - вот так примерно. Осталась самая малость. Щелчок на поле коннектора, затем щелчок на нужном элементе (Numeric Control, например. Курсор при этом будет в виде катушки ниток). Повторяем со вторым элементом:) Вот и все, сохраняем VI. Теперь можно легко вызвать его из другой своей программы. Работа с файлами. Файловые функции находятся в палитре Functions>>All Functions>>File I/O. С помощью этих функций и подпрограмм можно делать все необходимые при работе с файлами операции: Открытие и закрытие файлов Чтение данных из файла и запись в файл Перемещение, переименование файлов и каталогов Изменение атрибутов файла Создание, редактирование и чтение конфигурационных файлов Функции для работы с файлами в LabVIEW можно разделить на четыре группы: функции высокого уровня, функции низкого уровня, "продвинутые" (advanced) и экспресс-функции. 19 Функции высокого уровня. Эти функции очень удобны в использовании, так как можно с помощью одной функции сразу сделать все операции с файлом - открыть, записать, закрыть. Естественно, они менее эффективны чем функции низкого уровня. Но, если производительность не критична (например, нужно записать в файл собранные данные в конце работы программы), то лучше и проще использовать как раз эти функции. Находятся эти функции, как уже говорилось, в палитре File I/O, в верхней строке.Write to Spreadsheet File - Преобразует одномерный или двумерный массив чисел в строку и записывает эту строку в файл. Файл создается и открывается автоматически, или дописывается в уже существующий. Есть возможность выбрать разделитель. В итоге, получается файл - текстовая таблица с числами, разделенными табуляцией, например. Очень удобно, можно открыть во многих приложениях (тот же Origin к примеру).Read From Spreadsheet File - То же что и предыдущая функция, только наоборот - читает из файла:) Write Characters to File - записывает строку в новый или уже существующий файл. Создание, открытие, запись, закрытие производятся автоматически.Read Characters From File - чтение строки из файла. Открывает файл, читает из него, закрывает файл.Read Lines From File - читает строки из текстового или бинарного файла.Binary File VIs несколько функций для работы с бинарными файлами чтение, запись и т.п. Данные могут быть целыми, или с плавающей точкой. Функции низкого уровня. Используйте следующие функции для выполнения основных операций с файлами: Open/Create/Replace File - открывает существующий файл, создает новый или заменяет уже существующий. Если путь не задан, будет выдано диалоговое окно, в котором можно будет выбрать нужный путь. Read File - чтение данных из файла. Write File - запись данных в файл. Close File - закрывает файл.Более подробно - в справке LabVIEW :)Использование этих функций оправдано, когда нужна высокая скорость работы (например, в приложениях реального времени). Чтобы было более понятно, посмотрите пример: Здесь происходит запись данных в цикле. Такое часто встречается, например при сборе данных - в течение какого-то времени считываются показания приборов, и данные записываются в файл. Естественно, что выгоднее один раз открыть файл (перед началом записи), потом все записать, и в конце закрыть, чем повторять эти операции каждый раз в течение каждого шага. http://labview.webhost.ru/?%D0%E0%E1%EE%F2%E0_%F1_%F4%E0%E9%EB%E0 %EC%E8 Создание отчетов. Microsoft Word и Microsoft Excel – мощные и широко распространенные приложения, которые в том числе используются для создания отчетов. Из-за их популярности, некоторые программисты в LabVIEW создавали приложения ActiveX, для того чтобы иметь возможность генерировать отчеты в формате Word и Excel. Однако, сложность интерфейса ActiveX для офисных приложений 20 делала создание таких программ достаточно затруднительным. Используя LabVIEW Report Generation Toolkit (набор инструментов для создания отчетов), вам не придется изучать сложную структуру документов Word и Excel для создания отчетов. Создание отчетов в LabVIEW предоставляет набор гибких в настройке и простых в использовании функций. Так же, т создание отчетов в формате Word и Excel интегрировано в уже существующие функции из набораReport Generation. LabVIEW Report Generation Toolkit встраивается в палитру Functions»Report Generation. Когда вы устанавливает Report Generation Toolkit, старые функции в палитре Report Generation заменяются новыми, с поддержкой форматов Microsoft Word и Excel, так же как стандартных и HTML форматов. Toolkit также включает две новые субпалитры, которые предоставляют доступ к некоторым низкоуровневым функциямWord и Excel. VI высокого уровня из палитры Report Generation имеют те же имена и наборы коннекторов, что и старые функции для генерации отчетов из LabVIEW 6.х , т.е. все старые программы использующие эти функции будут работать без переделывания кода после установки нового модуля генерации отчетов. Выбор формата отчета Как узнать, какой из четырех доступных форматов отчета использовать? Во-первых, нужно выбирать тот формат совместимый с методом, который вы собираетесь использовать для публикации отчета. Если вы хотите распечатать ваш отчет, вы можете выбирать между типами standard,Word, и Excel. Если вы хотите отправить ваш отчет по электронной почте программно, вам нужно использовать формат Word или Excel. В таблице ниже приведена суммарная информация по типам отчетов и способам их распространения. Также, убедитесь, что компьютер, который вы используете для чтения созданных вами отчетов, имеет необходимое программное обеспечение (Internet Explorer , Microsoft Office и т.п., которое может понадобиться в процессе работы). В обратном случае, вы сможете использовать только стандартный тип отчета. Аналогично, если вы планируете создавать отчеты на одном компьютере, а читать их 21 будут на другом (нескольких), при отсутствии на них необходимого софта создание отчетов в других формах кроме стандартной будет бесполезно. И наконец, нужно учитывать, что стандартный и HTML тип отчетов предоставляют гораздо меньшее количество возможностей форматирования, чем отчеты в форматах Word и Excel. Основные операции генерации отчетов Следующие операции можно использовать во всех четырех типах отчетов. Вставить текст Вставить таблицы Вставить изображение лицевой панели, элементов управления, рисунков из файлов Вставить гиперссылку Определить различные параметры слоев (заголовок, шрифт, ориентацию и т.п.) Каждая программа генерации отчета строится по одной и той же схеме. New Report.vi нужно вызвать вначале, чтобы определить тип отчета (Стандартный, HTML, Word, или Excel), а затем можно начать заполнять отчет данными, используя различные VI из панели report generation. После того как отчет создан, его можно сохранить, распечатать или отправить по почте. В конце программы нужно закрыть все ссылки, используя Dispose Report VI. Приведенный ниже VI, к примеру, создает новый документ Word, вставляет заголовок, таблицу, рисунок из файла (используя Append Text to Report.vi, Append Table to Report.vi и AppendImage to Report.vi), затем распечатывает отчет (используя Print Report.vi). Затем все созданные ссылки закрываются, используя Dispose Report.vi. Дополнительные операции создания отчетов. Отчеты в формате Word/Excel являются гораздо более продвинутыми, чем стандартный или HTML формат. В них вы можете так же вставлять таблицы, картинки, ссылки, текст, но с большим количеством возможностей форматирования текста и объектов. Дополнительное форматирование. Используя формат отчета Word/Excel, вы можете установить большое разнообразие форматирующих параметров, таких как шрифт, атрибуты абзаца (для Word), границы, заливка и т.п. Так же можно соединять-разъединять ячейки таблиц, управлять размерами колонок и столбцов. Другими словами, вы можете создать отчет, выглядящий так, как вам нужно и профессионально отформатированный. Шаблоны. Создание больших отчетов со сложным форматированием – процесс, занимающий много времени. Лучший способ увеличить производительность – это создать шаблон отчета, содержащий компоненты, которые являются общими для всех отчетов и поля, которые будут заполняться данными. После того, как вы создадите и сохраните такой шаблон, вы сможете генерировать отчеты, открывая шаблон отчета, вставляя нужные данные в поля, и показывая, печатая или сохраняя полученный в результате отчет. Как Word, так и Excel, предоставляют различные способы для вставки пустых полей в документы и сохраняют шаблоны. В ворде, самый простой путь задать пустые 22 поля, которые в дальнейшем будут заполняться данными – это использовать закладки. В Excel – используя именованные диапазоны. Затем с помощью определенного VI вы вставите ваши данные в эти поля (используя доступ через Microsoft Office parameterscluster). Создание собственных функций. Инструменты для создания отчетов содержат функции, которые можно использовать для вызова макросов наVisual Basic Applications непосредственно из LabVIEW. Эту возможность можно использовать для того, чтобы создать собственные функции при необходимости. Т.е., если нужно сделать что-то, что не позволяет стандартный инструментарий, можно написать свой скрипт на VBA, и затем вызвать его в тексте программыLabVIEW. http://labview.webhost.ru/?%D1%EE%E7%E4%E0%ED%E8%E5_%EE%F2%F7%E5 %F2%EE%E2 23