Основы программирования в LabVIEW

реклама
И.В.Федосов
Основы программирования
в LabVIEW
Саратов 2010
ГОУ ВПО «Саратовский государственный университет
имени Н.Г. Чернышевского»
Кафедра оптики и биофотоники СГУ
И.В.Федосов
Основы программирования в LabVIEW
Учебное пособие
Саратов 2010
1
Предисловие
Данное учебное пособие ориентировано на студентов, начинающих
свое знакомство с пакетом программ National Instruments LabVIEW. Оно
содержит указания и методические рекомендации для первого
знакомства со средой программирования LabVIEW 8.5 и для освоения
элементарных навыков работы в ней.
Пособие состоит из четырех частей, и приложения. В первой части
излагаются основные приемы работы в среде программирования
LabVIEW на примере простой программы с графическим интерфейсом
пользователя. В этой части рассмотрены элементарные понятия и
особенности среды программирования. Вторая часть посвящена
приемам
работы
с
файлами.
Третья
часть
посвящена
программированию пользовательского интерфейса. В ней рассмотрены
особенности элементов управления передней панели, а также работа со
строками символов. Четвертая часть посвящена работе с массивами.
Объем данного пособия соответствует вводной части курса
программирования и цифровой обработки изображений в среде
LabVIEW разработанного автором в 2010 году и изучаемого студентам
кафедры оптики и биофотоники СГУ в рамках практических занятий по
дисциплинам «Фотография и цифровая обработка изображений»,
«Современные оптические системы» и «Оптические приборы в
биомедицинских исследованиях».
Изучение вводной части курса
завершается выполнением студентами заданий для самостоятельной
работы, примеры которых приведены в приложении.
2
1. Блок схема. Элементы управления и индикаторы
Программа в среде LabVIEW называется Virtual Instrument (VI) –
виртуальный прибор (ВП), чтобы подчеркнуть, что она предназначена
для управления лабораторным оборудованием и приборами и способна
выполнять некоторые их функции.
 Запустим программу LabVIEW 8.5, при этом откроется стартовое окно
(рис.1.1.).
 В левой части диалогового окна (Files) выберем пункт BlankVI
(пустой виртуальный прибор (ВП)).
При этом откроются два окна – Untitled Front Panel (рис.1.2) и
Untitled Block Diagram (рис.1.3). Слово Untitled – "не имеющий
наименования" указывает на то, что мы еще не назвали наш
виртуальный прибор и не сохранили его на диск компьютера.
Если окно Block Diagram скрыто, то его можно вызвать через меню
Window  Show Block Diagram или нажав клавиши <Ctrl>+<E>.
 Сохраним новый ВП. Для первого сохранения ВП в меню File любого
из этих окон выберем пункт Save.
 В открывшемся диалоговом окне выберем или создадим новую папку
для наших ВП, введем имя файла – Example01 и подтвердим
сохранение, нажав OK. Файл сохранится с расширением .vi от Virtual
Instrument – Виртуальный прибор.
Чтобы не потерять сделанную работу, время от времени следует
сохранять ВП в процессе его редактирования. Для этого можно
использовать меню File  Save, или сочетание клавиш <Ctrl>+<S>.
Рис. 1.1. Стартовое окно LabVIEW 8.5
3
Рис.1.2. Окно Front Panel (передняя
панель)
Рис.1.3. Окно Block Diagram (блоксхема)
Передняя панель (Front panel) виртуального прибора служит для
размещения на ней элементов управления и индикаторов – то есть
элементов, при помощи которых этот виртуальный прибор будет
взаимодействовать с человеком (или с другим виртуальным прибором,
как мы увидим немного позже).
Для начала создадим виртуальный прибор, который может
складывать два числа. Поместим на переднюю панель простейший
элемент управления (Control).
 Переместим указатель мыши на рабочую (клетчатую) поверхность
передней панели и нажмем правую кнопку мыши.
Рис.1.4. Меню Controls и раздел Modern
Рис.1.5. Меню Numeric. Элемент
управления Numeric Control выделен
рамкой
4
Рис.1.6.
Элементы
управления
индикатор на передней панели
и Рис.1.7.
Терминалы
элементов
управления и индикатора на блок схеме
 В появившемся меню элементов управления Controls из раздела
Modern (современные) выберем пункт Numeric (числовые,
цифровые) (рис.1.4).
 В раскрывшемся меню Numeric выберем Numeric control (числовой
элемент управления) (рис.1.5). Указатель мыши примет вид руки,
держащей пунктирные прямоугольники – контур элемента
управления.
 Переместим указатель на переднюю панель, и установим элемент,
нажав один раз на левую кнопку мыши.
 Два раза щелкнем левой кнопкой мыши на надпись Numeric над
элементом управления и введем текст: Число А.
 Добавим на переднюю панель еще один элемент управления и
назовем его Число Б;
 Аналогичным образом добавим на переднюю панель индикатор
(Controls  Modern  Numeric  Numeric Indicator). Назовем его
Сумма.
Теперь передняя панель выглядит так, как показано на рис.1.6 – на
ней расположены два элемента управления, используя которые можно
ввести в компьютер два числа, и индикатор, который будет отображать
результат операции с этими числами. А на блок схеме появились
соответствующие им терминалы (рис.1.7), при помощи которых
введенные числа Число A и Число B передаются в программу, а
результат выполнения программы выводится на индикатор Cумма.
Обратите внимание, что терминалы элементов управления
находятся слева, а индикатора – справа. Они расположены так,
потому что общепринятое направление передачи данных и сигналов на
блок схемах – слева направо, и сверху вниз. Этого правила следует
обязательно придерживаться при оформлении программ в среде
5
LabView! Выходы терминалов элементов управления (маленькие
треугольники) расположены справа на иконках этих терминалов, а
вход индикатора – слева (рис.1.7).
В среде LabView все процедуры и функции представлены виде иконок.
Поместим на нашу блок-схему иконку операции сложения.
 Нажмем правую кнопку мыши на белом поле окна блок схемы.
 В появившемся меню Functions (функции), выберем раздел
Programming (программирование)  Numeric  Add (сложить).
 Поместите на блок схему иконку оператора сложения
 Подведите курсор к иконке. По краям иконки появятся точки с
отрезками линий – контакты, при помощи которых элементы блоксхемы соединяются между собой.
 Подведите курсор к контакту x+y оператора сложения.
При этом он примет вид катушки с проводом (Wiring tool
– инструмент для соединения проводами), а внизу
появится подсказка – назначение данного контакта.
 Щелкните левой кнопкой мыши и подведите Wiring tool к терминалу
Сумма. За курсором потянется пунктирная линия – набросок
будущего провода. Его направление можно задавать, нажимая на
левую кнопку мыши. Нажатие на правую кнопку отменяет
рисование провода.
 Подведите курсор к контакту терминала Сумма и, нажав левую
кнопку мыши, соедините их между собой.
 Аналогично соедините терминал Число А и вход x оператора
сложения, а затем терминал Число Б и контакт y.
 Выделяя провода и терминалы при помощи мыши и перемещая их
при помощи клавиш <←>, <→>, <↑>и <↓>, придайте блок-схеме вид,
показанный на рис.1.8.
Рис.1.8. Элементы управления и индикатор на передней панели
6
Аккуратный вид блок схемы важен не только с эстетической точки
зрения. Блок схема должна легко читаться, иначе через несколько
минут вы уже не сможете разобраться, каким образом соединены между
собой операторы и как работает данная программа.
Поэтому не жалейте времени на то, чтобы сделать блок схему
аккуратной и понятной. Соединяя контакты проводами, следует
руководствоваться следующими правилами:
1. Передача данных в блок-схеме осуществляется слева направо.
2. Проводники ВСЮДУ на виду – их нельзя перекрывать иконками
или другими проводниками.
3. В одной точке могут соединяться НЕ БОЛЕЕ ТРЕХ
проводников (рис.1.9).
4. Блок схема должна полностью помещаться на экране монитора.
Рис.1.9. Третье правило исключает опасность перепутать
пересечение проводников в случае, если вы не заметите точку.
соединение
и
 После того, как редактирование завершено, необходимо сохранить
программу, используя меню File  Save, или сочетание клавиш
<Ctrl>+<s>.
 Теперь программа полностью готова, и ее можно запустить.
Для этого нажмем кнопку циклического выполнения
программы (Run Continuously)
 Убедимся в ее работоспособности, изменяя при помощи мыши и
клавиатуры значения в полях ввода элементов управления и
наблюдая как изменяется значение индикатора.
 Чтобы остановить выполнение программы, нажмем кнопку
прервать выполнение (Abort Execution)
7
Рис.1.10. Цикл While Loop
При запуске наша программа однократно опрашивает состояние
элементов управления, передает их значения операции сложения, а
затем результат сложения индикатору и завершается. Для того чтобы
она непрерывно отслеживала изменения состояния элементов
управления, мы использовали возможности среды программирования –
режим Run Continuously, в котором программа запускается снова и
снова сразу же после ее завершения. Теперь сделаем так, чтобы
программа самостоятельно периодически опрашивала элементы
управления, складывала полученные числа и отображала результат
сложения на индикаторе. Для этого поместим нашу программу в цикл
While Loop (while – пока, в то время как; loop – петля).
 Щелкнем правой кнопкой мыши блок-схеме и выберем в меню
Functions  Programming  Structures  While Loop
 Курсор мыши примет вид маленького пунктирного прямоугольника с
черным левым верхним уголком
 Поместим курсор левее и выше группы терминалов и процедур,
которую мы хотим заключить в цикл, нажав и удерживая левую
кнопку, обведем группу пунктирным прямоугольником.
 После того, как мы отпустим левую кнопку мыши, программа будет
выглядеть так, как показано на рис.1.10.
 Если действие не получилось с первого раза, можно его отменить,
нажав клавиши <Ctrl>+<z>.
После того, как мы поместили цикл While Loop на блоксхему, кнопка циклического выполнения заблокировалась,
а на кнопке запуска программы появилось изображение
сломанной стрелочки.
8
Это произошло потому, что среда программирования LabView проверяет
программу непосредственно в процессе ее составления. Она
обнаружила ошибку и запретила запуск программы. Выясним причину
ошибки.
 Нажмем на кнопку со сломанной стрелкой List Errors
(составить список ошибок), откроется окно списка ошибок
(рис.1.11)
Окно списка ошибок состоит из трех частей:
Items with errors (объекты с ошибками), в этом окне указан наш
виртуальный прибор Example01.vi;
1 errors and warnings (1 ошибка(и) и(или) предупреждение(ия)), это
перечень ошибок в котором указан тип ошибки – Block Diagram Errors
(ошибки в блок схеме), и ее причина – While Loop: conditional terminal
is not wired (Цикл While: не подключен провод к терминалу условия);
Details (подробности) – объяснение ошибки, выделенной в списке. В
нашем случае The conditional terminal is not wired to anything and
must be wired to a boolean data source such as a button or the result of
a comparison. (Терминал условия ни с чем не соединен и должен быть
соединен к источнику данных логического (Булева) типа, такому как
кнопка или результат сравнения).
Рис. 1.11. Окно списка ошибок
9
Чтобы выяснить, в каком именно месте блок-схемы обнаружена ошибка,
нажмем кнопку Show Error (Показать ошибку). При этом окно блоксхемы станет активным, а цикл While Loop будет кратковременно
выделен черным цветом.
Для того чтобы получить информацию о неизвестном элементе
блок-схемы, можно воспользоваться окном контекстной помощи, которое
открывается при нажатии клавиш <Ctrl>+<H>. В этом окне появляется
описание каждого элемента блок схемы, на который помещен указатель
мыши. Более подробное описание каждого элемента блок схемы, а
также ссылки на примеры его использования можно найти в справочной
системе (Help) среды LabVIEW, а также в руководстве пользователя,
которое издано не только на английском, но и на русском языке.
Самый простой узнать назначение терминалов – это подвести к
ним указатель мыши и прочитать появляющуюся при этом подпись. В
структуре While Loop есть два терминала:
Loop Iteration (Повторение цикла). Имеет один контакт,
расположенный справа – выход, значение которого
соответствует количеству выполненных повторений цикла.
Синий цвет терминала и контакта показывает, что выходное
значение представлено целым числом.
а)
или
б)
Loop Condition (Условие цикла) терминал условия выхода из
цикла. Имеет один контакт слева – вход. Он может работать в
двух режимах:
а) Stop if True (остановить, если Истинный) – цикл
прерывается, если на этот терминал поступает значение
булевой переменной True (Истинный).
б) Continue if True (продолжать, если Истинный) – цикл
продолжается до тех пор, пока значение этого терминала –
True. Зеленый цвет терминала и контакта показывает, что
формат данных, передаваемых ему, булев (логический).
Булев или логический тип данных назван в честь английского
математика Джорджа Буля (George Boole 1815 - 1864)
основоположника математической логики. Переменная этого типа
представлена в памяти компьютера одним битом и может принимать
только два значения True (Истинный) и False (Ложный),
соответствующие 1 и 0.
10
Рис.1.12. Терминал кнопки Stop на блок-схеме
Исправим ошибку на блок-схеме. Для этого подключим к терминалу
условия цикла кнопку, прерывающую его выполнение.
 Наведем указатель мыши на терминал условия цикла, и, нажав
правую кнопку мыши, выберем в появившемся меню режим работы
терминала Stop if True. Убедимся, что иконка терминала приобрела
соответствующий вид.
 Наведем указатель мыши на контакт терминала, и когда курсор
превратится в катушку с проводом (Wiring tool), нажмем правую
кнопку мыши
 В появившемся меню выберем Create Control (создать элемент
управления)
 В результате на передней панели появится кнопка управления Stop,
а ее терминал на блок схеме автоматически соединится с
терминалом условия цикла (рис.1.12)
 Теперь изменим вид элементов управления на передней панели.
Поместим указатель мыши на элемент Число А и нажмем правую
кнопку мыши.
 В появившемся меню выберем Replace (заменить) 
Modern  Numeric  Knob (шарообразная ручка).
Элемент управления примет вид, показанный на
рисунке справа. Передвинем надпись Число А при
помощи мыши.
 Изменим атрибуты ручки. Нажмем правую кнопку мыши и в
выпадающем меню выберем Visible Items (Видимые объекты) 
Ramp.
 Для удобства точной установки ручки выберем в том же меню Digital
Display (цифровой дисплей)
11
Рис.1.13. Передняя панель с измененными элементами управления
 Аналогично изменим остальные элементы управления, чтобы
передняя панель выглядела так, как показано на рис. 1.13.
 Элементы управления и индикаторы можно перемещать при помощи
мыши и изменять их размеры «растягивая» их за уголки.
 После того, как редактирование завершено, необходимо сохранить
программу, используя меню File  Save, или сочетание клавиш
<Ctrl>+<s>.
 Теперь программа полностью готова, и ее можно запустить.
Для этого нажмем кнопку выполнения программы (Run)
Вращая и передвигая ручки элементов управления при помощи
мыши, убедимся в работоспособности программы.
 Чтобы изменить диапазон вводимых или выводимых значений,
достаточно поместить указатель мыши на крайнюю цифру шкалы и,
нажав левую кнопку мыши, ввести новое значение.
 Не останавливая программу, перейдем в окно блок схемы и
нажмем кнопку Highlight Execution (подсветить выполнение)
 На проводниках появятся движущиеся точки, которые
показывают, в каком порядке выполняется программа.

 ОБЯЗАТЕЛЬНО отключите режим Highlight Execution, иначе
программа будет выполняться очень медленно, так как это
демонстрационный режим, специально предназначенный для
отладки программ.
 Перейдем на переднюю панель, и остановим выполнение
программы, нажав кнопку Stop.
12
Рис.1.14. Блок-схема программы с Waveform Chart и задержкой
Теперь добавим к нашей программе графический индикатор, который
будет отображать зависимость значения суммы чисел от времени.
 Поместим на переднюю панель индикатор Modern  Graph 
Waveform Chart (cамописец, график изменения сигнала со
временем).
 На блок схеме перетащим терминал Waveform Chart в цикл While
Loop и подключим его параллельно стрелочному индикатору Сумма
 Для того, чтобы наш графический индикатор отображал значения
суммы через определенные промежутки времени, добавим в цикл на
блок-схеме операцию задержки Programming  Timing  Wait Until
Next ms Multiple (ожидать то следующего момента времени,
кратного заданному значению)
 Создадим константу, определяющую интервал выполнения этой
операции. Для этого подведем указатель мыши к входу оператора
(контакт входа расположен слева) и, нажав правую кнопку мыши,
выберем в меню Create Constant (создать константу)
 Введем в окошко константы значение 250, соответствующее
задержке при выполнении цикла в 250 мс (1/4 секунды). Теперь блоксхема выглядит, как показано на рис. 1.14.
 Перейдем на переднюю панель, и отключим автоматическое
масштабирование по оси Y. Для этого поместим указатель на
Waveform Chart, нажмем правую кнопку мыши и в меню (далее
меню, вызываемое правой кнопкой мыши, будем называть
контекстным меню) выберем Y Scale и снимем галочку
AutoScaleY (автоматическая шкала Y).
13
Рис.1.15. Редактирование линий графика
 Установим пределы шкалы Y Waveform Chart в соответствии с
минимальным и максимальным значением суммы, щелкнув по
крайним значениям шкалы, и введя новые значения.
 Сохраним программу и запустим ее.
 Щелкнем правой кнопкой мыши на маленький прямоугольник справа
вверху над панелью самописца, на котором изображен фрагмент
линии графика и, используя контекстное меню, изменим цвет, тип и
толщину линии, добавим на нее точки и т.д. (рис.1.15)
 Остановим программу
 Заменим константу, определяющую задержку, на элемент
управления. Для этого добавим на переднюю панель еще один
элемент управления Modern  Numeric  Horizontal Pointer Slide
(горизонтальный движок с указателем), и назовем его Задержка
 Вызовем контекстное меню этого элемента и выберем в нем Find
Terminal (найти терминал). При этом программа переключится в окно
блок схемы, а в нем выделится терминал элемента управления
Задержка.
 Удалим константу и вместо нее подключим
терминал Задержка. При этом около контакта
появится красная точка. Эта точка показывает,
что в данном месте происходит преобразование
типа данных.
14
Рис.1.16. Блок схема окончательного варианта программы Example01.vi
То есть тип данных с плавающей точкой с двойной точностью (DBL) не
соответствует типу данных, который используется в качестве входного
параметра данным оператором. Автоматическое преобразование
типов данных не нарушает работоспособность программы, но
иногда снижает ее быстродействие. Поэтому его желательно
избегать.
 Выберем в контекстном меню оператора задержки раздел Help. Из
открывшейся справки выясним, что его входной параметр должен
иметь тип U32 (Unsigned long integer 32-bit) – 32-разрядное целое
число без знака.
 В контекстном меню элемента управления Задержка выберем
Representation  U32. Красная точка исчезнет. Типы данных
согласованы.
 Чтобы было интереснее следить за движением графика по экрану
самописца, добавим к сумме чисел случайную помеху, создаваемую
генератором случайных чисел от 0 до 1 (Programming  Numeric 
Random Number (0-1))
 Прибавим случайное число с выхода генератора случайных чисел к
нашей сумме, и результат подключим к индикаторам Сумма и
Waveform Chart (рис.1.16)
 Перейдем на переднюю панель, и в контекстном меню элемента
управления Задержка выберем Scale  Mapping (разметка) 
Logarithmic (логарифмическая).
 Сохраним и запустим программу.
15
2. Цикл For Loop. Запись данных в файл
На первом уроке мы написали простую программу, использующую
оператор цикла While Loop. Теперь создадим еще одну программу, на
примере которой изучим другую структуру цикла – For Loop, а также
основы работы с массивами данных, процедуру сохранения данных в
файл и структуру логического ветвления Case Structure.
 Создадим новый виртуальный прибор, и сохраним его под именем
Example02.vi. Если панель блок-схемы не открылась при создании
прибора, откроем ее, нажав клавиши <Ctrl>+<E>.
 Добавим на блок схему цикл For Loop (Programming  Structures
 For Loop)
Цикл While Loop, который мы использовали в предыдущем примере,
повторяется до тех пор, пока терминал условия цикла находится в
определенном логическом состоянии – True или False. В отличие от
него, цикл For Loop всегда повторяется определенное количество раз,
заданное значением входного параметра N (Рис.2.1.)
 Подведем указатель мыши к левому контакту (к входу) терминала N
цикла For Loop и создадим константу, определяющую количество
повторений этого цикла (100 раз).
 Добавим в цикл операцию умножения случайного числа на номер
итерации этого цикла (терминал i).
 Выведем результат из цикла и подключим к графическому
индикатору Waveform Chart, помещенному на переднюю панель
(Рис.2.1.)
Рис.2.1. Блок схема программы с циклом Рис.2.2. Результат
выполнения
For Loop
программы, показанной на рис.2.1.
16
 Запустим программу. Результат ее выполнения выглядит, как
показано на рис.2.2.
Обратим внимание, что в точке пересечения проводом
границы цикла For Loop появился символ в виде
квадратных скобок, вписанных в квадрат, а толщина
проводника увеличилась. Этот квадрат называется Auto
Indexing Tunnel (туннель автоматического индексирования).
Пересечение проводником границы любой структуры в среде LabVIEW
называется туннелем (Tunnel). Автоматическое индексирование
означает, что после того, как цикл For Loop повторится заданное число
раз, на выходе из туннеля появится одномерный массив чисел,
переданных из цикла по одному на каждой его итерации. В нашем
случае (N=100) массив будет состоять из 100 элементов, имеющих
номера о 0 до 99. Проводник, по которому передается массив,
изображается более толстой или двойной линией в зависимости от
размерности массива (рис.2.3) .
Скаляр (одно число)
Одномерный массив (вектор)
Двумерный массив
Трехмерный массив
Четырехмерный массив
Рис.2.3. Обозначение проводников, передающих данные различной размерности
 Из контекстного меню проводника (вызывается правой кнопкой
мыши), передающего массив, выберем Create  Indicator
 Немного растянем при помощи мыши индикатор
Array (массив), появившийся на передней
панели, чтобы он принял вид, показанный на
рисунке справа. В ячейках отображаются
элементы
созданного
массива.
Элемент
управления, расположенный слева вверху,
задает номер элемента массива, который будет
показан в верхней ячейке индикатора.
17
Рис.2.4. Обозначение проводников, передающих данные различной размерности
Сохраним массив в файл. Наиболее простой способ сохранить данные
в файл сводится к использованию одного единственного оператора
Write to Spreadsheet File (Записать в файл крупноформатную таблицу).
 Добавим на блок-схему процедуру Write to Spreadsheet File
(Functions  Programming  File I/O  Write to Spreadsheet File);
Это сложная процедура, которая имеет множество входов для
данных и различных параметров, с которыми необходимо внимательно
ознакомиться. Для этого вызовем из контекстного меню процедуры
справку (Help). В справке содержится краткое описание процедуры,
ссылки на примеры ее использования и описание входов и выходов,
проиллюстрированное схемой (рис.2.4).
Рассмотрим некоторые особенности этой схемы.
1. Терминалы, к которым проводники подходят слева являются
входами, а терминалы, от которых проводники отходят вправо –
выходами (процедура на рис.2.4. имеет 7 входов и один выход).
2. Назначение терминалов набраны различным шрифтом:
Обычный шрифт означает, что данный терминал не обязательно
должен быть задействован.
Полужирный шрифт означает, что данный терминал должен быть
обязательно подключен, иначе среда LabVIEW выдаст сообщение об
ошибке (например, таким терминалом является терминал N в цикле For
Loop) .
Серый шрифт обозначает дополнительный параметр, который может
быть задействован по желанию пользователя.
3. В скобках () указано состояние терминала по умолчанию, то есть в
случае, когда к нему ничего не подключено.
18
Рассмотрим надписи на рис.2.4.
Входы:
1. format (%.3f) – формат (строка, определяющая форматирование
выводимых данных). Тип данных – String (строковая переменная) –
сиреневый проводник. По умолчанию принимает значение: % – ключ
строки формата, .3 – три знака после запятой, f – формат с плавающей
точкой.
2. file path (dialog if empty) – путь к файлу (если не подключен –
показывает диалоговое окно «Сохранить файл»). Тип данных – Path
(путь к файлу, ссылка) – сине-зеленый провод.
3. 1D Data – одномерные данные (одномерный массив, вектор) 1D от
английского 1 Dimension – одно измерение. Тип данных – Double –
оранжевый провод.
4. 2D Data – двумерные данные. Тип данных – Double – оранжевый
провод.
5. append to file? (new file:F) – добавить к (существующему) файлу? (по
умолчанию – создать новый файл, False). Тип данных – Boolean –
зеленый провод и знак вопроса в названии терминала.
6. transpose?(no:F) – транспонировать? (по умолчанию – нет, False).
Тип данных – Boolean – зеленый провод и знак вопроса в названии
терминала.
7. delimiter(\t) – разделитель (столбцов в таблице) (по умолчанию
символ табуляции Tab, показан в принятом в LabVIEW backslash code
(коде обратной косой черты) – \t). Тип данных – String (строковая
переменная) – сиреневый проводник.
Выход:
new file path (Not a path i…) – новый путь к файлу (принимает
значение Not a path (не путь) если сохранение файла было отменено
пользователем). Тип данных – Path (путь к файлу, ссылка) – синезеленый провод.
 Подключим контакт 1D data параллельно индикатору Waveform
Chart (рис.2.5.) и запустим программу
 В появившемся диалоговом окне выберем папку для сохранения
данных и введем имя файла с расширением, например, Data.txt
19
Рис.2.5. Запись данных в файл.
 Откроем файл в указанной нами папке. Он будет содержать строку
чисел.
 Теперь добавим на блок-схему константу типа Boolean
(Programming  Boolean  False constant) и подключим ее к
контакту Transpose? (можно также создать константу из контекстного
меню этого контакта, Create  Constant)
 Поместим указатель мыши на белое поле около константы, дважды
нажмем левую кнопку и напишем комментарий к этой константе –
«Транспонировать?» (Комментарии к блок-схемам значительно
облегчают работу с ними, ВСЕГДА комментируйте ваши
программы и как можно более подробно!)
 Нажимая левую кнопку мыши, изменим состояние константы с F
(False) на T(True).
 Запустим программу и сохраним данные в файл DataT.txt
 Откроем файл и убедимся, что в нем записан столбец чисел –
оператор записи в файл транспонировал массив – его строки стали
столбцами.
Процедура Write to Spreadsheet File позволяет быстро сохранить
интересующие нас данные в текстовый файл. При этом она
автоматически выполняет несколько последовательных операций:
1) преобразует массив чисел в строку символов (ASCII кодов символов);
2) создает файл для записи этих чисел на жестком диске компьютера;
3)
записывает
строку
символов
в
этот
файл;
4) завершает работу с диском – закрывает файл.
Если нам требуется более точно настроить процесс сохранения в файл,
мы можем выполнить эти операции по отдельности, меняя надлежащим
образом их параметры.
20
Рис.2.6. Процедура записи массива в файл (эквивалент Write to Spreadsheet file )
 Поместим на блок схему процедуру преобразования массива в
строку символов (Programming  String  Array To Spreadsheet
String (массив в строку крупноформатной таблицы)) (рис.2.6)
 Подключим массив к его контакту array. Из контекстного меню
контакта format string (строка форматирования) выберем Create 
Constant и впишем в нее, например %.3f (3 знака после запятой,
плавающая точка). Правила составления строки форматирования
можно найти в справочной системе LabVIEW.
 Добавим на блок-схему операции работы с файлами из меню
Programming  File I/O три процедуры: 1) Open/Create/Replace File;
2) Write o Text File; 3) Close file.
 Создадим константу (правой кнопкой мыши) для контакта file path
процедуры Open/Create/Replace File и введем в нее путь к файлу, в
который мы хотим сохранить данные (если эту константу не
подключать, то будет открываться диалоговое окно, такое же, как при
использовании функции Write to Spreadsheet String).
 Создадим константы для контактов operation (действие) и access
(доступ) и выберем их значения replace or create with confirmation
(заменить и или создать с подтверждением) и read/write
(чтение/запись), соответственно.
 Open/Create/Replace File открывает (создает, заменяет) файл и
передает ссылку (refnum) на него и информацию об ошибках (error)
следующим процедурам. Соединим процедуры между собой,
передавая им ссылку на файл (гладкий сине-зеленый провод), и
данные об ошибках (толстый черно-желтый провод).
 Подключим к последнему выходу информации об ошибках (error out)
процедуру Programming  Dialog & User Interface  General Error
Handler (универсальный обработчик ошибок). В случае если в одной
из процедур произойдет ошибка, например, не будет открыт файл, то
Error Handler откроет окно с сообщением об ошибке.
21
Рис.2.7. Запрос на перезапись файла. Рис.2.8. Сообщение о том, что файл не
(Путь к файлу не обязательно такой, как был переписан, так как пользователь
показано на рисунке).
отменил эту операцию
Кроме этого, последовательное соединение процедур проводником
сообщений об ошибках гарантирует, что они будут выполняться в
точности в том порядке, в котором они соединены между собой.
 Подключим выход процедуры Array To Spreadsheet String к входу
text процедуры Write to text file. Обратите внимание, что эта
процедура имеет еще один вход – Prompt (подсказка) для
переменной формата String, который мы не используем!
 Запустим программу. Она автоматически сохранит данные в файл,
путь к которому мы указали.
 При повторном запуске программа запросит разрешение переписать
этот файл в виде диалогового окна (рис.2.7). Если вы отмените
перезапись, выбрав Cancel, то сообщение об ошибке пройдет от
одного элемента к другому и затем к обработчику ошибок, который
откроет окно сообщения об ошибке (рис.2.8).
 Уменьшите количество повторений цикла For Loop до 10
раз, включите режим Highlight Execution.
 Проследите работу программы в случаях, когда вы
подтверждаете замену файла, и когда отменяете эту
операцию.
 Отключите режим Highlight Execution
Усовершенствуем нашу программу. Сделаем так, чтобы она непрерывно
вычисляла массивы случайных чисел, но сохраняла массив в файл,
если нажата кнопка Запись на передней панели. Непрерывное
выполнение программы осуществим так же, как в и предыдущем
примере – поместим все вычисления в цикл While Loop, который
прерывается при нажатии кнопки Stop. Теперь нам понадобится
структура Case Structure, которая будет проверять
22
Рис.2.9. Программа записи массива в файл c использованием Case Structure
состояние кнопки Запись и записывать массив в файл, если она нажата,
то есть, когда ее состояние – True.
 Поместим всю программу в цикл While loop и создадим кнопку Stop
для выхода из цикла.
 Поместим процедуру записи в файл внутрь структуры Сase Structure
(Programming  Structures)
 Добавим на переднюю панель кнопку Controls  Modern  Boolean
 OK button и назовем ее Запись. Также изменим надпись на
самой кнопки.
23
a)
б)
Рис.2.10. Два состояния структуры Case
 Скроем имена переменных, написанные над кнопками сняв галочку в
контекстном меню кнопки Visible Item  Label
 Подключим терминал кнопки Запись к контакту Case Selector
структуры Case Structure (рис.2.9).
Структура Case содержит два случая. Один из них соответствует
состоянию True входа Case selector (a), а другой – False (б). При
редактировании программы оба случая можно просмотреть, нажимая
левую кнопку мыши, когда указатель находится на стрелках слева и
справа от заголовка в верхней части структуры.
 Сохраним и запустим программу.
24
3. Интерфейс пользователя. Символьная строка
Взаимодействие человека и компьютера осуществляется при помощи
интерфейса пользователя (interface – от англ. граница раздела,
стык) – комплекса программных и аппаратных средств, позволяющих
человеку управлять работой компьютера и воспринимать результат его
работы.
Простейший
интерфейс
пользователя
–
кнопка.
Это
электромеханическое устройство. Когда человек нажимает на кнопку
пальцем, внутри нее замыкаются проводники. Через кнопку течет
электрический ток. Наличие или отсутствие тока через кнопку
интерпретируется компьютером как один бит информации. Нажимая
кнопку, мы изменяем по нашему желанию значение этого бита с 0 (нет
тока) на 1 (есть ток).
Аналогично мы можем проверить значение любого бита в
электрической схеме компьютера. Достаточно подключить лампу к
соответствующему проводнику. Лампа светится, когда через нее течет
ток, то есть состояние проводника 1, и не светится, когда состояние
проводника 0 (нет тока). В свою очередь, человек воспринимает свет
лампы глазами и делает вывод о состоянии данного проводника.
Разумеется, если нужно изменять или отслеживать состояние
большого количества бит (проводников), то для этого требуется
множество различных кнопок и лампочек, которые нужно разместить на
пульте управления. Кроме того, для каждой задачи, решаемой
компьютером, придется собирать специальный пульт с кнопками и
лампами соответствующими именно этой задаче.
Чтобы не конструировать громоздкие пульты, в современных
универсальных компьютерах используют другой вид интерфейса –
графический. В Windows и LabVIEW, используются только две кнопки –
это кнопки манипулятора мышь. А то, какой именно бит переключает
каждая из них, зависит от положения манипулятора на столе, вернее, от
места, в котором находится изображение специального указателя
(курсора) на экране монитора компьютера. Компьютер отслеживает
перемещения мыши по столу и перемещает изображение указателя по
экрану монитора. Если указатель находится в области, где на экране
нарисована кнопка, – то при нажатии на кнопку мыши изменяется
состояние некоторой переменной в памяти компьютера. Но если, мы,
25
перемещая мышь, отведем указатель в сторону от нарисованной
кнопки, то компьютер проигнорирует нажатие на кнопку мыши.
Когда мы помещаем указатель мыши на изображение кнопки Stop,
компьютер начинает проверять, не нажата ли левая кнопка мыши. И
если мы нажмем на кнопку, выполнение цикла прекратится. Здесь
возможно несколько вариантов. Например, выполнение программы
можно прекратить сразу же, как только мы нажмем кнопку мыши. А
можно – только после того, как мы, нажав кнопку, ее отпустим. Во
втором случае у нас будет возможность передумать – если мы навели
указатель на нарисованную кнопку, нажали на кнопку мыши, а затем
передумали останавливать программу, то можно, не отпуская кнопку
мыши, отвести указатель в сторону. И нарисованная кнопка не
сработает. Такая настройка кнопки (кстати, стандартная для
графического интерфейса в среде Windows) учитывает особенность
человеческого поведения – прежде, чем взять какой либо предмет,
человек легко прикасается к нему, и, прикоснувшись, окончательно
решает – брать или нет.
Кажущаяся простота и естественность, с которой мы
управляем современным компьютером, целиком и полностью
построена на тщательном изучении и учете множества незаметных
особенностей
человеческого
поведения
разработчиками
интерфейса пользователя.
В среде LabVIEW реакция кнопки на нажатие может быть
настроена тем или иным образом при помощи параметра Mechanical
Action (механическое действие) в контекстном меню этой кнопки.
Существует два вида отклика кнопки на нажатие:
Switch (переключатель) – при нажатии кнопка изменяет свое состояние
(переключается) и остается в нем до следующего нажатия;
Latch (защелка) – при нажатии кнопка переключается и ждет, пока
программа не проверит ее, а после первой проверки автоматически
возвращается в исходное состояние.
Всего параметр Mechanical Action имеет шесть возможных значений:
Switch When Pressed – кнопка переключается в момент нажатия на
нее;
Switch When Released – переключается в момент, когда ее отпускают;
(в этом случае есть возможность передумать – если вы, не отпуская
26
кнопку мыши, отведете указатель от кнопки, то ее состояние не
изменится).
Switch Until Released – переключается в момент
возвращается в исходное состояние когда ее отпускают;
нажатия,
и
Latch When Pressed – переключается в момент нажатия и
возвращается в исходное состояние после проверки ее состояния
программой;
Latch When Released – переключается в момент, когда ее отпускают и
возвращается в исходное состояние после проверки ее состояния
программой;
Latch Until Released
– переключается в момент нажатия и
возвращается в исходное состояние после того, как будет произведена
проверка программой ее состояния, или кнопка будет отпущена, в
зависимости от того, какое из этих событий произойдет позже другого.
Исследуем на практике особенности работы кнопок в различных
режимах. Для этого создадим программу, в которой будет шесть кнопок
и шесть индикаторов, подключенных к этим кнопкам. Пусть каждая из
кнопок будет настроена на работу в одном из перечисленных режимов.
И пусть программа опрашивает кнопки достаточно медленно, примерно
один раз в две секунды. Тогда мы сможем проследить реакцию кнопки
на нажатие и на проверку ее состояния программой.
 Создадим интерфейс виртуального прибора, показанный на рис.3.1.
и сохраним его под именем Example03.vi
 В качестве индикаторов состояния кнопок используем круглые
светодиоды Controls  Modern  Boolean  Round LED (LED – от
англ. Light Emitting Diode – светоизлучающий диод)
 В качестве индикатора чтения кнопок используем прямоугольный
светодиод, в контекстном меню которого изменим настройки цвета
светодиода: выберем красный цвет для включенного состояния, и
темно красный – для выключенного (Properties  Appearance 
Colors)
 Для украшения интерфейса используем накладные панели Controls
 Modern  Decorations  Raised Box(выпуклая прямоугольная
панель).
27
Рис.3.1. Интерфейс программы Example03
 Воспользуемся панелью инструментов для того, чтобы равномерно и
ровно расположить кнопки и индикаторы на передней панели,
изменить шрифт и переместить выпуклые панели на задний план
(Reorder(
)  Move to back)
 В контекстном меню каждой из кнопок установим значение
Mechanical Action, соответствующее надписям на панели. Кнопку
Latch When Released выделим цветом – это стандартная настройка
кнопок Windows
Наша программа должна время от времени проверять состояние
кнопок. Чтобы мы знали, когда происходит проверка, сделаем так,
чтобы в это время загорался светодиод READ (чтение). Программа
будет выполнять в цикле следующие действия: 1) включить светодиод
READ, 2) проверить состояние кнопок и включить/выключить
соответствующие светодиоды, 3) подождать некоторое время (50 мс),
чтобы мы успели заметить вспышку светодиода READ, 4) Выключить
светодиод READ, 5) подождать 2 секунды, чтобы мы успели понять, что
происходит, 6) повторить процедуру. Блок схема этой программы
показана на рис.3.2.
28
Рис.3.2. Блок схема Example01
 Так как при выполнении данной программы важна точная
последовательность действий, то воспользуемся структурой Flat
Sequence
Structure
(плоская,
развернутая
структура
последовательности) (Functions  Structures).
 Flat Sequence Structure имеет вид кинопленки, кадры которой
исполняются один за другим. Новые кадры можно добавить, выбрав
в контекстном меню структуры Add frame before или Add frame after
(добавить кадр до или после)
 Для того чтобы выключить светодиод READ в четвертом кадре мы
используем структуру Local Variable (локальная переменная)
(Functions  Structures)
 В контекстном меню Local Variable нужно выбрать Change to write и
Select Item (выбрать объект)  READ (имя светодиода)
 Запустим программу и проверим отклик кнопок на различные
воздействия, нажатие кнопки мыши, отпускание кнопки мыши, вывод
указателя с кнопки при нажатой кнопке мыши, удержание кнопки
нажатой длительное время.
29
Рис.3.3. Вариант оформления индикатора READ (светодиод на заднем плане).
 Обратите внимание, что зеленые светодиоды переключаются только
после того, как программа проверит состояние кнопки (включится
светодиод READ).
 Можно дополнительно украсить программу, если растянуть
светодиод READ, переместить его на задний план и «подложить»
под панели (рис.3.3).
Обратная задача – вывод информации на человеческом языке – также
представляет серьезную проблему при создании интерфейса
пользователя. Пусть программа считает некоторые предметы. В
результате счета в памяти компьютера получится некоторое двоичное
число. Но обычному человеку трудно воспринимать двоичные числа,
поэтому компьютер должен показать это число в более привычном виде
десятичного числа, записанного символами цифр.
Напишем программу, которая считает некоторые предметы, например,
яблоки. И выводит ответ в виде строки текста. Например: «У меня есть 5
яблок».
 Создадим новый виртуальный прибор, и сохраним его под именем
Example04.vi.
 На передней панели поместим цифровой элемент управления, при
помощи которого мы будем вводить количество «яблок». В
контекстном меню выберем тип данных – 32 разрядное целое число
без знака U32 (отрицательное число яблок не имеет смысла).
 Поместим рядом дополнительный цифровой индикатор, который
будет отображать число в двоичной форме – так, как оно
представлено в памяти компьютера назовем его Двоичное число
30
Рис.3.4. Передняя панель и блок схема программы, которая составляет строку
текста

В контекстном меню этого индикатора выберем Display Format 
Binary
 Добавим текстовый индикатор Controls  Modern  String & Path
 String Indicator, который отображает созданную программой
строку (последовательность символов).
 Используя операторы из меню Functions  Programming  String,
соберем строку «ответа» (рис.3.4) .
 В цикл While Loop ОБЯЗАТЕЛЬНО нужно добавить задержку Wait
Until Next ms Multiple (рис.3.4).
Если этого не сделать, то компьютер будет стремиться проверять
состояние элементов управления и выполнять цикл как можно быстрее,
нерационально используя свои ресурсы (даже такая простая программа
способна полностью загрузить процессор!). С другой стороны,
вполне достаточно проверять состояние элементов управления 10 раз в
секунду. Оператор не заметит этой задержки, так как время реакции
31
Рис.3.5. Усовершенствованная программа Example04.vi
человека, как правило, не меньше 0,1 с. Всегда используйте
задержку, если программа обращается к передней панели!
 Строка, получающаяся в результате выполнения этой программы, в
некоторых случаях выглядит немного странно, например, «У меня есть
2 яблок» или «0 яблок». В первом случае человек скажет «У меня есть 2
яблока», а во втором – «У меня нет яблок».
Сделаем ответ программы более похожим на человеческую речь.
Заметим, что слово яблоко согласуется с числительным. Мы говорим
одно яблоко, затем говорим два, три, четыре яблока, с пяти до
двадцати мы говорим «яблок», а затем все повторяется: 21 яблоко, 22
яблока, 25 яблок и т.д. То, какое слово следует добавить в строку,
определяется двумя младшими разрядами числа.
Выделим эти два разряда – разделим введенное число два раза
подряд на 10 и возьмем остатки от этих делений (рис.3.5) (Functions
 Programming  Quotient & Remainder (частное и остаток)).

Используя операторы сравнения из меню Functions 
Programming  Comparison, и логическую операцию AND из меню
32
Boolean организуем проверку значений этих разрядов и выбор
правильной формы слова яблоко (рис.3.5).

При проверке на 2, 3, 4 в контекстном меню оператора In range and
coerce установите Include upper limit (включить верхний предел в
интервал) и Include lower limit (включить нижний предел в
интервал).

В заключение добавим еще одну проверку, чтобы программа,
подражая человеку, выводила строку «У меня нет яблок», если
введенное число равно нулю.
Данная программа имитирует осмысленную человеческую речь для
того, чтобы пользователю было проще читать ее ответ. Иногда такого
рода имитация способна создать у пользователя иллюзию
«разумности» машины. Но, как мы убедились на данном примере,
машина просто составляет строку символов строго по заданным нами
правилам.
33
4. Массивы и работа с ними
Теперь продолжим изучение массивов в среде LabVIEW. Массив –
это набор данных одного типа. Доступ к отдельным элементам
массива осуществляется при помощи индекса. Простейший массив –
одномерный. Он состоит из последовательно нумерованных ячеек, в
каждой из которых хранится один элемент этого массива. Каждая
ячейка двумерного массива имеет два индекса. Если представить такой
массив в виде двумерной таблицы, то индексы будут соответствовать
номеру строки и столбца этой таблицы. Значения индексов начинаются
с 0. Количество измерений в массивах (количество индексов,
адресующих отдельный элемент) в принципе может быть любым, но,
как правило, оно ограничено объемом оперативной памяти компьютера.
В LabVIEW элементом массива могут быть данные любого типа. В
массивы можно также объединять элемент управления или индикатор ы
на передней панели.
 Создадим новый виртуальный прибор и сохраним его под именем
Example05.vi
 Добавим на переднюю панель элемент Array (Controls  Modern 
Array, Matrix & Cluster  Array). Этот элемент пустой внутри.
 Выберем любой элемент управления и поместим его внутрь
элемента Array. Растянем элемент управления Array.
 Чтобы добавить измерение к массиву, в контекстном меню массива
выберем Add dimension. Чтобы сбросить значения массива, в
контекстном меню выберем Data Operations  Empty Array
 На рис. 4.1. показана программа, иллюстрирующая массивы
различных типов и некоторые операции с ними. Попробуйте
самостоятельно воспроизвести ее.
 Обратите внимание, что в цикл While Loop добавлен оператор
задержки на 100 мс. Это сделано для того, чтобы не перегружать
компьютер слишком частой проверкой и перерисовыванием
большого числа элементов передней панели.
34
Рис.4.1. Программа Example04.vi
35
Второй случай структуры Case
Рис.4.2. Программа поиска элементов массива, попадающих в заданный диапазон
36
В заключение рассмотрим стандартный метод выбора элементов
массива, значения которых попадают в некоторый интервал (рис.4.2). В
качестве входных данных мы используем массив случайных чисел,
созданный в цикле For Loop. Размер массива задается оператором при
помощи элемента управления Число элементов.
Этот массив
передаются процедуре поиска элементов, значения которых находятся в
интервале, заданном оператором при помощи элементов управления
Верхняя граница интервала и Нижняя граница интервала.
В этой процедуре мы определяем полное количество элементов
входного массива при помощи оператора Array Size. Затем создаем
массив точно такого же размера, как и входной, все элементы которого
равны нулю (Initialize Array). Затем последовательно проверяем все
элементы входного массива в цикле For Loop. Для проверки
используется уже знакомый нам оператор In range and coerce.
Массив создается заранее для того, чтобы избежать изменения
размера массива в процессе выполнения цикла. Каждый раз, когда мы
добавляем к массиву новые элементы, он копируется в памяти
компьютера. При этом выполнение программы при этом замедляется, а
память компьютера переполняется копиями одного и того же массива.
Чтобы избежать этого, в данной программе мы заранее создаем
достаточно большой массив. Мы записываем нужные нам элементы в
этот массив, последовательно заменяя значения его элементов.
Одновременно программа считает количество таких замен N. После
того, как поиск завершен, мы изменяем размер выходного массива, и
оставляем в нем первые N элементов, которые содержат найденные
нами значения.
Для замены значений массива и счета количества этих замен в
программе используется уже знакомая нам структура Case Structure.
В этой программе используется туннель особого вида – так
называемый Shift register (Сдвигающий регистр). Чтобы создать его,
нужно в контекстном меню туннеля выбрать Replace with Shift Register.
В результате вместо одного туннеля появится два – один
на входе в цикл (слева), а другой – на выходе (справа).
Значение, поступившее на вход регистра, передается в цикл при его
запуске. Во время выполнения цикла значение, передаваемое на
37
Рис.4.3. Счетчик с использованием Shift Register
правый терминал сдвигающего регистра, запоминается и возвращается
обратно в цикл при его следующем повторении через левый терминал.
После остановки цикла значение сдвигающего регистра выводится на
выход справа. Например, на рис.4.3 состояние регистра увеличивается
на единицу при каждом повторении цикла и отображается индикатором
Внутри. После завершения цикла общее число повторений передается
на индикатор Снаружи.
38
Список литературы
1. Уроки по LabVIEW http://www.picad.com.ua/lesson.htm
2. LabVIEW TM Вводный курс. National instruments. 2003. 52 c.
http://russia.ni.com/datasheet ;
ftp://ftp.ni.com/pub/branches/russia/software/labview_8.5.pdf
3. LabVIEW. Руководство пользователя. National instruments. 2007.
370 c. http://russia.ni.com/datasheet ;
ftp://ftp.ni.com/pub/branches/russia/software/labview_user_manual.pdf
4. Микропроцессоры и микро-ЭВМ / Б. Соучек ; Пер. с англ. под ред.
А. И. Петренко, 517 с. ил. 22 см., М. Сов. радио 1979
39
Оглавление
Предисловие ...................................................................................................................... 2
1. Блок схема. Элементы управления и индикаторы ...................................................... 3
2. Цикл For Loop. Запись данных в файл ....................................................................... 16
3. Интерфейс пользователя. Символьная строка ......................................................... 25
4. Массивы и работа с ними ............................................................................................ 34
Список литературы .......................................................................................................... 39
Оглавление....................................................................................................................... 40
Приложение. Задания для самостоятельной работы ................................................... 41
Задание 1. Преобразование десятичного числа в двоичное........................................ 41
Задание 2. Двоичный сумматор ..................................................................................... 42
Задание 3. Гирлянда «Бегущие огни» ............................................................................ 44
Задание 4. Метод деления отрезка пополам ................................................................. 45
Задание 5. Спираль ......................................................................................................... 46
Задание 6. Измерение времени реакции человека ....................................................... 47
Задание 7. Делитель напряжения .................................................................................. 48
Задание 8. Счет числительными .................................................................................... 50
Задание 9. Фонетический анализ текста ........................................................................ 51
Задание 10. Затухающие колебания .............................................................................. 52
40
Приложение. Задания для самостоятельной работы
Задание 1. Преобразование десятичного числа в двоичное
Напишите программу, которая переводит методом деления на 2
десятичное число ((U8) – восьмиразрядное целое число без знака) в
восьмиразрядное двоичное число, представленное в виде массива
булевых переменных. Обратите внимание, что младший разряд на
индикаторе массива находится справа.
Указание: используйте цикл While Loop с задержкой в 100 мс для
проверки элементов управления и цикл For Loop
для
последовательного деления на 2 при помощи функции Quotient &
Remainder. Правильный порядок бит индикатора можно получить с
помощью функции Reverse Array.
41
Задание 2. Двоичный сумматор
Используя логические функции из меню Boolean, сконструируйте
трехразрядный двоичный сумматор, который складывает два двоичных
числа.
Указание: Сначала создайте двоичный полусумматор – программу,
которая складывает два одноразрядных двоичных числа. Полусумматор
имеет два входа: слагаемое A и слагаемое B; и два выхода: сумма S и
перенос в следующий разряд C. Из правил сложения чисел столбиком
получаем таблицу истинности для полусумматора:
Входы
Выходы
Слагаемое Слагаемое Сумма S
A
В
Перенос С
0
0
0
0
1
0
1
0
0
1
1
0
1
1
0
1
Сумма S получается при помощи логической операции Exclusive OR
(исключающее или) для входов A и B, а перенос C – при помощи
операции AND (и) для тех же входов. При сложении также необходимо
учитывать перенос из предыдущего разряда. Его добавляют к сумме при
помощи второго полусумматора. Перенос сумматора получают помощи
операции OR (или) для выходов переноса каждого из полусумматоров.
Объединяя несколько сумматоров можно получить сумматор для любого
числа двоичных разрядов.
42
Двоичный полусумматор (а); однобитный двоичный сумматор (б);
сумматор n двоичных разрядов. M – перенос в следующий разряд, m –
вход для переноса из предыдущего разряда, S – сумма, A, B –
слагаемые. Индексы – номера разрядов.
Оранжевый цвет – операция XOR (исключающее ИЛИ); желтый –
операция AND (И); зеленый – OR (ИЛИ).
43
Задание 3. Гирлянда «Бегущие огни»
Напишите программу, моделирующую работу гирлянды «Бегущие огни»
Указание: Иллюзия движения огней вдоль гирлянды создается
последовательным переключением нескольких (не менее трех) групп
светодиодов. Например, на рисунке, сначала включается первая группа
(1, 4, 7), светится в течение 100 мс, затем, она выключается, и
включается вторая группа (2, 5, 8), через 100 мс вместо этой группы
включается третья группа (3, 6, 9) и т.д.
44
Задание 4. Деление отрезка пополам
Напишите программу, которая определяет загаданное пользователем
целое число от 0 до 100 методом деления отрезка пополам.
Указание: Для поиска используйте цикл While Loop c задержкой 100 мс.
В цикле необходимо хранить и изменять в процессе поиска три числа –
начало отрезка (первоначально 0), конец отрезка (первоначально 100)
и середина отрезка (первоначально 50). Эти числа можно хранить при
помощи сдвигающего регистра Shift Register (см. урок 3).
В цикле проверяется состояние кнопок передней панели. Если кнопки не
нажаты, параметры отрезка передаются без изменений в следующую
итерацию. Нажатие кнопок Больше или Меньше отслеживается двумя
структурами Case Structure. Например, если нажата кнопка Больше, то
выполняются следующие операции: 1) середина отрезка становится
началом нового отрезка, 2) Середина нового отрезка вычисляется как
среднее арифметическое его начала и конца. Аналогичные операции
выполняются, если нажата кнопка Меньше, только середина отрезка в
этом случае становится концом нового отрезка. Условием выхода из
цикла является нажатие кнопки Равно или совпадение конца и начала
отрезка.
45
Задание 5. Спираль
Напишите программу, которая рисует плоскую спираль с заданным
числом витков.
Указание: Для отображения спирали используйте график XY Graph из
меню элементов управления. Он изображает точки, координаты которых
даются ему виде двух одномерных массивов одинаковой длины. В
одном массиве координаты X, а в другом – соответствующие им
значения Y. Массивы объединяются в кластер из двух элементов:
при помощи функции Bundle из меню Cluster, Class & Variant. Для
вычисления
тригонометрических
функций
используйте
меню
Mathematics. Координаты точек спирали вычисляйте в цикле For Loop и
собирайте массивы при помощи автоматического индексирования.
Проверку
элемента
управление
Количество
витков
можно
организовать при помощи цикла While Loop с задержкой 100 мс.
46
Задание 6. Измерение времени реакции человека
Напишите программу, которая измеряет интервал времени между
включением светодиода на передней панели и нажатием на кнопку.
Указание: Измерение времени реакции выполняется по следующему
протоколу:
1) После запуска программы проходит некоторый интервал времени
(длительность этого интервала изменяется случайным образом от 2 до 7
секунд); 3) затем включается светодиод и считывается значение
системного таймера при помощи функции Tick Count, ms; 4) сразу после
включения светодиода запускается пустой цикл While Loop, который
прерывается нажатием кнопки НАЖАТЬ; 4) После завершения цикла
считывается второе значение системного таймера (момент нажатия); 5)
время реакции оператора вычисляется как разность этих двух моментом
(в миллисекундах); 6) измерения повторяются несколько раз в цикле For
Loop (измерения отделяются друг от друга случайными интервалами
времени продолжительностью от 2 до 7 секунд); 7) результаты
измерений записываются в массив; 8) вычисляется среднее время
реакции оператора (используйте функцию Mean (среднее) из меню
Mathematics).
Прогресс выполнения теста отображается при помощи индикатора
Horizontal Progress Bar, подключенного к индексу цикла For Loop.
47
Задание 7. Делитель напряжения
Создайте виртуальный прибор, моделирующий работу делителя
напряжения, состоящего из двух резисторов R1 и R2. К выходу делителя
подключена нагрузка сопротивлением Rн. Значение сопротивлений, а
также входное напряжение делителя Uвх можно задавать при помощи
элементов управления. Индикаторы показывают входной ток делителя
Iвх, напряжение на нагрузке Uн и ток через нее Iвх. Два индикатора
показывают мощность, потребляемую делителем Pвх = UвхIвх и
мощность, передаваемую нагрузке Pн = UнIн
Указание: Для вычисления токов и напряжений используйте закон Ома
I
U
R,
(1)
где I – ток через участок электрической цепи, U – разность потенциалов
на концах этого участка, R – электрическое сопротивление этого участка
цепи.
Сопротивление двух последовательно соединенных резисторов R1 и R2
вычисляется по формуле
R  R1  R2 ,
(2)
а сопротивление двух резисторов, соединенных параллельно – по
формуле
48
R
R1 R2
R1  R2 .
(3)
Ограничьте точность отображения значений на цифровых индикаторах
четырьмя значащими цифрами (Significant digits), используя контекстное
меню Display Format…
Проверку состояния элементов управления организуйте, используя цикл
While Loop с задержкой 100 мс.
49
Задание 8. Счет числительными
Напишите программу, которая записывает введенное двухзначное число
строкой соответствующих числительных.
Указание:
обратите внимание, что числительные от 21 до 99
получаются написанием перед числительным для чисел от 1 до 9 слова,
обозначающего десятки – двадцать, тридцать, ..., девяносто.
Исключение составляет 0 и числа от 10 до 19.
Поэтому имеет смысл анализировать цифры двузначного числа по
отдельности.
Выбор числительных организуйте при помощи структуры Case Structure.
Если к терминалу условия подключить данные типа целое число, то
станет возможно создавать случаи, соответствующие различным
значениям этого числа, или даже диапазонам значений. Новые случаи
создаются из контекстного меню структуры Add Case After или Add Case
Before.
Проверку состояния элементов управления организуйте, используя цикл
While Loop с задержкой 100 мс.
50
Задание 9. Фонетический анализ текста
Напишите программу, которая подсчитывает количество гласных звуков
в заданном тексте. В русском языке имеется шесть гласных звуков,
которые обозначаются десятью гласными буквами:
Звук
[a]
Буква а, я
[o]
[э]
[и]
[ы]
[у]
о, ё
э, е
и
ы
у, ю
Программа подсчитывает количество гласных звуков в тексте,
введенном в текстовый элемент управления. Для этого она находит все
буквы, кодирующие тот или иной звук, без учета регистра (строчные и
прописные). Относительные частоты (отношение количества
определенных гласных звуков к общему количеству гласных звуков в
тексте), отображается при помощи массива индикаторов Vertical
Progress Bar.
Указание: поиск и букв в тексте можно осуществить при помощи
функции Search and Replace String из меню String. Буквы можно
заменять пустой строкой (по умолчанию для данной функции).
Количество замен будет соответствовать количеству найденных букв.
Не забудьте задать при помощи булевых констант параметры поиска –
Ignore case? (не учитывать регистр?) и Replace All? (заменить все?).
Проверку состояния элементов управления организуйте, используя цикл
While Loop с задержкой 100 мс.
51
Задание 10. Затухающие колебания
Напишите программу, которая демонстрирует экспоненциально
затухающие гармонические колебания стрелки индикатора относительно
среднего положения. Колебания начинаются после нажатия на кнопку
Пуск.
Указание: Проверку состояния элементов управления организуйте,
используя цикл While Loop с задержкой 100 мс. Расчет положения
стрелки и изменение состояния индикатора также организуйте при
помощи цикла While Loop. Этот цикл выполняется до тех пор, пока
значение амплитуды колебаний не станет меньше заданного значения,
например, 0,01.
52
Скачать