LabVIEW
Руководство пользователя
Техническая поддержка и информация о продукции ni.com
Головной офис корпорации National Instruments
11500 North Mopac Expressway Austin, Texas 78759-3504 USA Tel: 512 683 0100
Региональные офисы
Australia 61 2 9672 8846, Austria 43 0 662 45 79 90 0, Belgium 32 0 2 757 00 20, Brazil 55 11 3262 3599,
Canada (Calgary) 403 274 9391, Canada (Montreal) 514 288 5722, Canada (Ottawa) 613 233 5949,
Canada (Québec) 514 694 8521, Canada (Toronto) 905 785 0085, Canada (Vancouver) 514 685 7530,
China 86 21 6555 7838, Czech Republic 420 2 2423 5774, Denmark 45 45 76 26 00,
Finland 385 0 9 725 725 11, France 33 0 1 48 14 24 24, Germany 49 0 89 741 31 30, Greece 30 2 10 42 96 427,
Hong Kong 2645 3186, India 91 80 51190000, Israel 972 0 3 6393737, Italy 39 02 413091, Japan 81 3 5472 2970, Korea 82 02 3451 3400, Malaysia 603 9059 6711, Mexico 001 800 010 0793,
Netherlands 31 0 348 433 466, New Zealand 64 09 914 0488, Norway 47 0 32 27 73 00,
Poland 48 0 22 3390 150, Portugal 351 210 311 210, Russia 7 495 238 7139, Singapore 65 6 226 5886,
Slovenia 386 3 425 4200, South Africa 27 0 11 805 8197, Spain 34 91 640 0085, Sweden 46 0 8 587 895 00,
Switzerland 41 56 200 51 51, Taiwan 886 2 2528 7227, United Kingdom 44 0 1635 523545
Более подробно о поддержке см. в приложении Техническая поддержка и профессиональные услуги. Замечания на документацию направляйте по E-mail на info.russia@ni.com
©1992–2007 National Instruments Corporation. All rights reserved.
©2007 Перевод на русский язык: Николаев С.В.
2
Important Information
Warranty
The media on which you receive National Instruments software are warranted not to fail to execute programming instructions, due to defects in materials and workmanship, for a period of 90 days from date of shipment, as evidenced by receipts or other documentation. National Instruments will, at its option, repair or replace software media that do not execute programming instructions if National Instruments receives notice of such defects during the warranty period. National Instruments does not warrant that the operation of the software shall be uninterrupted or error free.
A Return Material Authorization (RMA) number must be obtained from the factory and clearly marked on the outside of the package before any equipment will be accepted for warranty work. National Instruments will pay the shipping costs of returning to the owner parts which are covered by warranty.
National Instruments believes that the information in this document is accurate. The document has been carefully reviewed for technical accuracy. In the event that technical or typographical errors exist, National Instruments reserves the right to make changes to subsequent editions of this document without prior notice to holders of this edition. The reader should consult National Instruments if errors are suspected. In no event shall National Instruments be liable for any damages arising out of or related to this document or the information contained in it.
EXCEPT AS SPECIFIED HEREIN, NATIONAL INSTRUMENTS MAKES NO WARRANTIES, EXPRESS OR IMPLIED, AND SPECIFICALLY DISCLAIMS ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. CUSTOMER’S RIGHT TO RECOVER DAMAGES CAUSED BY FAULT OR NEGLIGENCE ON THE PART OF NATIONAL INSTRUMENTS SHALL BE LIMITED TO THE AMOUNT THERETOFORE PAID BY THE CUSTOMER. NA-
TIONAL INSTRUMENTS WILL NOT BE LIABLE FOR DAMAGES RESULTING FROM LOSS OF DATA, PROFITS, USE OF PRODUCTS, OR INCIDENTAL OR CONSEQUENTIAL DAMAGES, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. This limitation of the liability of National Instruments
will apply regardless of the form of action, whether in contract or tort, including negligence. Any action against National Instruments must be brought within one year after the cause of action accrues. National Instruments shall not be liable for any delay in performance due to causes beyond its reasonable control. The warranty provided herein does not cover damages, defects, malfunctions, or service failures caused by owner’s failure to follow the National Instruments installation, operation, or maintenance instructions; owner’s modification of the product; owner’s abuse, misuse, or negligent acts; and power failure or surges, fire, flood, accident, actions of third parties, or other events outside reasonable control.
Copyright
Under the copyright laws, this publication may not be reproduced or transmitted in any form, electronic or mechanical, including photocopying, recording, storing in an information retrieval system, or translating, in whole or in part, without the prior written consent of National Instruments Corporation.
Trademarks
CVI™, DAQPad™, DataSocket™, DIAdem™, IMAQ™, IVI™, LabVIEW™, Measurement Studio™, National Instruments™, NI™, ni.com™, NI-DAQ™, NI Developer Zone™, NI-IMAQ™, NI-VISA™, NI-VXI™, and SCXI™ are trademarks of National Instruments Corporation. Product and company names mentioned herein are trademarks or trade names of their respective companies.
Patents
For patents covering National Instruments products, refer to the appropriate location: Help»Patents in your software, the
patents.txt file on your CD, or ni.com/patents.
WARNING REGARDING USE OF NATIONAL INSTRUMENTS PRODUCTS
(1)NATIONAL INSTRUMENTS PRODUCTS ARE NOT DESIGNED WITH COMPONENTS AND TESTING FOR A LEVEL OF RELIABILITY SUITABLE FOR USE IN OR IN CONNECTION WITH SURGICAL IMPLANTS OR AS CRITICAL COMPONENTS IN ANY LIFE SUPPORT SYSTEMS WHOSE FAILURE TO PERFORM CAN REASONABLY BE EXPECTED TO CAUSE SIGNIFICANT INJURY TO A HUMAN.
(2)IN ANY APPLICATION, INCLUDING THE ABOVE, RELIABILITY OF OPERATION OF THE SOFTWARE PRODUCTS CAN BE IMPAIRED BY ADVERSE FACTORS, INCLUDING BUT NOT LIMITED TO FLUCTUATIONS IN ELECTRICAL POWER SUPPLY, COMPUTER HARDWARE MALFUNCTIONS, COMPUTER OPERATING SYSTEM SOFTWARE FITNESS, FITNESS OF COMPILERS AND DEVELOPMENT SOFTWARE USED TO DEVELOP AN APPLICATION, INSTALLATION ERRORS, SOFTWARE AND HARDWARE COMPATIBILITY PROBLEMS, MALFUNCTIONS OR FAILURES OF ELECTRONIC MONITORING OR CONTROL DEVICES, TRANSIENT FAILURES OF ELECTRONIC SYSTEMS (HARDWARE AND/OR SOFTWARE), UNANTICIPATED USES OR MISUSES, OR ERRORS ON THE PART OF THE USER OR APPLICATIONS DESIGNER (ADVERSE FACTORS SUCH AS THESE ARE HEREAFTER COLLECTIVELY TERMED “SYSTEM FAILURES”). ANY APPLICATION WHERE A SYSTEM FAILURE WOULD CREATE A RISK OF HARM TO PROPERTY OR PERSONS (INCLUDING THE RISK OF BODILY INJURY AND DEATH) SHOULD NOT BE RELIANT SOLELY UPON ONE FORM OF ELECTRONIC SYSTEM DUE TO THE RISK OF SYSTEM FAILURE. TO AVOID DAMAGE, INJURY, OR DEATH, THE USER OR APPLICATION DESIGNER MUST TAKE REASONABLY PRUDENT STEPS TO PROTECT AGAINST SYSTEM
3
FAILURES, INCLUDING BUT NOT LIMITED TO BACK-UP OR SHUT DOWN MECHANISMS. BECAUSE EACH END-USER SYSTEM IS CUSTOMIZED AND DIFFERS FROM NATIONAL INSTRUMENTS’ TESTING PLATFORMS AND BECAUSE A USER OR APPLICATION DESIGNER MAY USE NATIONAL INSTRUMENTS PRODUCTS IN COMBINATION WITH OTHER PRODUCTS IN A MANNER NOT EVALUATED OR CONTEMPLATED BY NATIONAL INSTRUMENTS, THE USER OR APPLICATION DESIGNER IS ULTIMATELY RESPONSIBLE FOR VERIFYING AND VALIDATING THE SUITABILITY OF NATIONAL INSTRUMENTS PRODUCTS WHENEVER NATIONAL INSTRUMENTS PRODUCTS ARE INCORPORATED IN A SYSTEM OR APPLICATION, INCLUDING, WITHOUT LIMITATION, THE APPROPRIATE DESIGN, PROCESS AND SAFETY LEVEL OF SUCH SYSTEM OR APPLICATION.
4
Содержание
Об этом руководстве…………………………………………………………………………………….. |
15 |
Организация этого руководства…………………………………………………………………. |
16 |
Соглашения………………………………………………………………………………………………. |
16 |
Часть I………………………………………………………………………………………………………….. |
18 |
Основы LabVIEW…………………………………………………………………………………………. |
18 |
1. Введение в LabVIEW ………………………………………………………………………………… |
19 |
Источники документации LabVIEW ………………………………………………………….. |
19 |
ВП-шаблоны, ВП-примеры и инструменты в LabVIEW ……………………………… |
22 |
ВП-шаблоны в LabVIEW ………………………………………………………………………… |
22 |
ВП-примеры в LabVIEW…………………………………………………………………………. |
23 |
Инструменты LabVIEW………………………………………………………………………… |
23 |
2. Введение в виртуальные приборы……………………………………………………………… |
25 |
Лицевая панель…………………………………………………………………………………………. |
25 |
Блок-диаграмма………………………………………………………………………………………… |
26 |
Терминалы…………………………………………………………………………………………….. |
27 |
Узлы……………………………………………………………………………………………………… |
28 |
Проводники…………………………………………………………………………………………… |
28 |
Структуры…………………………………………………………………………………………… |
28 |
Иконка и соединительная панель……………………………………………………………….. |
29 |
Использование и настройка ВП и ВПП………………………………………………………. |
30 |
3. Среда LabVIEW………………………………………………………………………………………… |
31 |
Палитра Controls (Элементы управления)…………………………………………………… |
31 |
Палитра Functions (Функции)…………………………………………………………………….. |
32 |
Навигация по палитрам Controls и Functions ………………………………………………. |
32 |
Палитра инструментов………………………………………………………………………………. |
33 |
Меню и панель инструментов……………………………………………………………………. |
34 |
Меню…………………………………………………………………………………………………….. |
34 |
Панель инструментов (Toolbar)…………………………………………………………….. |
35 |
Окно контекстной помощи (Context Help Window) …………………………………….. |
35 |
Настройка Вашего рабочего окружения …………………………………………………….. |
36 |
Настройка палитр Controls и Functions …………………………………………………. |
36 |
Установка опций рабочей среды……………………………………………………………. |
39 |
4. Построение лицевой панели………………………………………………………………………. |
43 |
Конфигурирование объектов лицевой панели…………………………………………….. |
43 |
Включение и выключение видимости необязательных элементов……………. |
44 |
Преобразование элементов управления в индикаторы и наоборот………….. |
44 |
5 |
Замена объектов лицевой панели…………………………………………………………… |
45 |
Конфигурирование лицевой панели…………………………………………………………… |
46 |
Установка комбинаций клавиш для элементов управления……………………… |
46 |
Раскрашивание объектов………………………………………………………………………. |
48 |
Использование импортированной графики…………………………………………….. |
48 |
Выравнивание и распределение объектов ………………………………………………. |
49 |
Группировка и фиксация объектов………………………………………………………… |
50 |
Изменение размеров объектов………………………………………………………………. |
50 |
Масштабирование объектов лицевой панели…………………………………………. |
51 |
Добавление свободного пространства на лицевой панели без изменения |
|
размеров окна……………………………………………………………………………………….. |
53 |
Элементы управления и индикаторы лицевой панели………………………………… |
53 |
Трехмерные (3D) и классические элементы управления и индикаторы……. |
53 |
Движки, кнопки, переключатели, цифровые переключатели и временные |
|
метки…………………………………………………………………………………………………… |
54 |
Графики и диаграммы (Graphs and Charts)…………………………………………….. |
57 |
Клавиши, переключатели и лампочки (Buttons, Switches, and Lights)………… |
57 |
Окна текстового ввода (Text Entry Boxes), метки (Labels) и дисплеи путей |
|
(Path Displays) ………………………………………………………………………………………. |
58 |
Элементы управления и индикаторы для массивов и кластеров……………… |
60 |
Списки, деревья и таблицы……………………………………………………………………. |
61 |
Кольцевые и перечислительные элементы управления и индикаторы……… |
63 |
Контейнерные элементы управления (Container Controls)………………………. |
65 |
Элементы управления и индикаторы имен ввода/вывода (I/O Name) ………. |
68 |
Ссылки на объекты или приложения……………………………………………………… |
74 |
Диалоговые элементы управления и индикаторы…………………………………… |
74 |
Использование текстовых меток……………………………………………………………….. |
75 |
Заголовки (Captions)………………………………………………………………………………. |
76 |
Текстовые характеристики………………………………………………………………………… |
77 |
Конструирование пользовательского интерфейса………………………………………. |
78 |
Использование элементов управления и индикаторов лицевой панели……… |
79 |
Конструирование диалоговых окон………………………………………………………… |
80 |
Выбор размера экрана…………………………………………………………………………… |
80 |
5. Построение блок-диаграммы…………………………………………………………………….. |
81 |
Соответствие между объектами лицевой панели и терминалами блок-
диаграммы……………………………………………………………………………………………….. |
81 |
Объекты блок-диаграммы…………………………………………………………………………. |
81 |
Терминалы блок-диаграммы………………………………………………………………….. |
81 |
Узлы блок-диаграммы …………………………………………………………………………… |
87 |
Обзор функций…………………………………………………………………………………………. |
88 |
Числовые функции…………………………………………………………………………………. |
89 |
Логические функции………………………………………………………………………………. |
89 |
6 |
Строковые функции………………………………………………………………………………. |
89 |
Функции над массивами…………………………………………………………………………. |
90 |
Кластерные функции…………………………………………………………………………….. |
90 |
Функции сравнения………………………………………………………………………………… |
90 |
Временные и диалоговые функции………………………………………………………….. |
90 |
Функции файлового ввода/вывода…………………………………………………………… |
91 |
Функции работы с осциллограммами …………………………………………………….. |
91 |
Функции управления приложениями……………………………………………………….. |
92 |
Дополнительные функции………………………………………………………………………. |
92 |
Добавление терминалов у функций…………………………………………………………. |
92 |
Использование проводников для связи объектов блок-диаграммы………………. |
93 |
Автоматическое соединение объектов………………………………………………….. |
95 |
Соединение объектов вручную……………………………………………………………….. |
95 |
Прокладка проводников…………………………………………………………………………. |
96 |
Селектирование проводников ………………………………………………………………… |
97 |
Исправление поврежденных проводников……………………………………………….. |
97 |
Точки принудительного преобразования…………………………………………………. |
98 |
Полиморфные ВП и функции…………………………………………………………………….. |
99 |
Полиморфные ВП………………………………………………………………………………….. |
99 |
Полиморфные функции………………………………………………………………………… |
103 |
Экспресс ВП …………………………………………………………………………………………… |
103 |
Создание ВПП из экспресс ВП……………………………………………………………… |
103 |
Динамический тип данных…………………………………………………………………… |
104 |
Обработка вариантных данных………………………………………………………………… |
107 |
Числовые единицы и строгая проверка типов…………………………………………… |
108 |
Единицы и строгая проверка типов……………………………………………………… |
109 |
Поток данных на блок-диаграмме ……………………………………………………………. |
111 |
Зависимость по данным и искусственная зависимость по данным……….. |
112 |
Поток данных и управление памятью………………………………………………….. |
113 |
Конструирование блок-диаграммы…………………………………………………………… |
114 |
6. Запуск и отладка виртуальных приборов………………………………………………….. |
116 |
Запуск ВП……………………………………………………………………………………………….. |
116 |
Настройка способа запуска ВП……………………………………………………………. |
117 |
Исправление поврежденных виртуальных приборов………………………………… |
117 |
Поиск причин повреждения ВП ……………………………………………………………. |
117 |
Типичные причины повреждения ВП…………………………………………………….. |
118 |
Технология отладки ………………………………………………………………………………… |
119 |
Подсвечивание выполнения…………………………………………………………………… |
121 |
Пошаговое выполнение………………………………………………………………………… |
121 |
Инструмент Probe (пробник) ………………………………………………………………. |
122 |
Точки прерывания………………………………………………………………………………… |
125 |
Приостановка исполнения……………………………………………………………………. |
126 |
7 |
Комментирование сегментов блок-диаграммы…………………………………….. |
127 |
Отключение инструментов отладки…………………………………………………………. |
127 |
Неопределенные или неожиданные данные……………………………………………… |
127 |
Данные по умолчанию в циклах…………………………………………………………….. |
128 |
Значения по умолчанию в массивах………………………………………………………. |
129 |
Предотвращение неопределенных данных……………………………………………. |
129 |
Проверка и обработка ошибок…………………………………………………………………. |
129 |
Проверка на ошибки ……………………………………………………………………………. |
130 |
Обработка ошибок……………………………………………………………………………… |
131 |
7. Создание ВП и ВПП……………………………………………………………………………….. |
134 |
Планирование и построение вашего проекта……………………………………………. |
134 |
Разработка проектов несколькими разработчиками……………………………. |
135 |
Шаблоны ВП………………………………………………………………………………………….. |
136 |
Создание шаблонов ВП………………………………………………………………………… |
136 |
Другие типы документов…………………………………………………………………….. |
136 |
Использование встроенных ВП и функций………………………………………………. |
136 |
Построение ВП и функций для управления приборами и ввода/вывода |
|
данных………………………………………………………………………………………………… |
137 |
Построение ВП, которые имеют доступ к другим ВП…………………………. |
137 |
Построение ВП, которые общаются с другими приложениями……………. |
138 |
Виртуальные подприборы (ВПП)…………………………………………………………….. |
138 |
Выявление однотипных операций…………………………………………………………. |
139 |
Конфигурирование соединительной панели………………………………………….. |
140 |
Создание иконки………………………………………………………………………………….. |
143 |
Отображение ВПП и экспресс ВП в виде иконок либо в виде расширяемых |
|
узлов……………………………………………………………………………………………………. |
144 |
Создание ВПП из фрагмента ВП…………………………………………………………. |
145 |
Конструирование ВПП………………………………………………………………………… |
146 |
Просмотр иерархии ВП……………………………………………………………………….. |
146 |
Сохранение ВП……………………………………………………………………………………….. |
147 |
Преимущества сохранения каждого ВП в отдельном файле………………… |
147 |
Преимущества сохранения нескольких ВП в библиотеках…………………….. |
148 |
Управление виртуальными приборами в библиотеках…………………………… |
149 |
Имена ВП……………………………………………………………………………………………. |
149 |
Сохранение в формате предыдущей версии LabVIEW …………………………… |
150 |
Распространение виртуальных приборов…………………………………………………. |
150 |
Построение стандартных приложений и библиотек совместного доступа…. |
151 |
Часть II………………………………………………………………………………………………………. |
153 |
Построение и редактирование виртуальных приборов…………………………………. |
153 |
8. Циклы и структуры…………………………………………………………………………………. |
155 |
Структуры For Loop и While Loop……………………………………………………………. |
156 |
Структура For Loop …………………………………………………………………………… |
156 |
8 |
Структура While Loop…………………………………………………………………………. |
157 |
Автоиндексация циклов……………………………………………………………………….. |
159 |
Использование циклов для построения массивов…………………………………… |
161 |
Сдвигающие регистры и узел обратной связи в циклах…………………………. |
161 |
Узел обратной связи……………………………………………………………………………. |
165 |
Управление синхронизацией …………………………………………………………………. |
167 |
Структуры выбора и последовательности ………………………………………………… |
167 |
Структура Case………………………………………………………………………………….. |
168 |
Структуры последовательности…………………………………………………………. |
170 |
9. Событийно управляемое программирование ……………………………………………. |
176 |
Что такое события? …………………………………………………………………………………. |
176 |
Зачем использовать события? …………………………………………………………….. |
177 |
Компоненты структуры Event…………………………………………………………….. |
178 |
Использование событий в LabVIEW……………………………………………………… |
181 |
Пользовательские события…………………………………………………………………. |
191 |
10. Группировка данных с использованием строк, массивов и кластеров………. |
195 |
Строки……………………………………………………………………………………………………. |
195 |
Строки на лицевой панели……………………………………………………………………. |
196 |
Таблицы………………………………………………………………………………………………. |
197 |
Программное редактирование строк………………………………………………….. |
197 |
Форматирование строк………………………………………………………………………. |
198 |
Числа и строки……………………………………………………………………………………. |
199 |
Конвертирование данных в XML и обратно………………………………………….. |
200 |
Группировка данных в массивы и кластеры……………………………………………… |
203 |
Массивы ……………………………………………………………………………………………… |
203 |
Кластеры……………………………………………………………………………………………. |
210 |
11. Локальные и глобальные переменные ……………………………………………………. |
213 |
Локальные переменные …………………………………………………………………………… |
213 |
Создание локальных переменных………………………………………………………….. |
214 |
Глобальные переменные………………………………………………………………………….. |
214 |
Создание глобальных переменных ………………………………………………………… |
215 |
Чтение и запись значений переменных…………………………………………………….. |
216 |
Предосторожности при использовании локальных и глобальных переменных
……………………………………………………………………………………………………………….. |
217 |
Инициализация локальных и глобальных переменных…………………………….. |
217 |
Эффект гонок……………………………………………………………………………………… |
217 |
Соображения о памяти при использовании локальных переменных……….. |
218 |
Соображения о памяти при использовании глобальных переменных……… |
218 |
12. Графики и диаграммы……………………………………………………………………………. |
220 |
Типы графиков и диаграмм……………………………………………………………………… |
220 |
Опции индикаторов Graph и Chart……………………………………………………………. |
221 |
Несколько шкал X и Y в индикаторах Graph и Chart ……………………………… |
221 |
9 |
Сглаживание линий графиков на индикаторах Graph и Chart……………….. |
221 |
Настройка внешнего вида индикаторов Graph и Chart…………………………. |
222 |
Настройка индикаторов Graph …………………………………………………………… |
223 |
Настройка индикаторов Chart ……………………………………………………………. |
226 |
Индикаторы Waveform Graph и XY Graph………………………………………………… |
228 |
Типы данных для построения одной кривой на индикаторе Waveform Graph |
|
…………………………………………………………………………………………………………… |
229 |
Построение нескольких кривых на индикаторе Waveform Graph…………… |
230 |
Типы данных для построения одной кривой на индикаторе XY Graph……. |
232 |
Типы данных для построения нескольких кривых на индикаторе XY Graph |
|
…………………………………………………………………………………………………………… |
232 |
Индикаторы Waveform Chart …………………………………………………………………… |
232 |
Индикаторы Intensity Graph и Intensity Chart…………………………………………….. |
233 |
Схема отображения цветов ……………………………………………………………….. |
235 |
Необязательные компоненты индикатора Intensity Chart…………………….. |
236 |
Необязательные компоненты индикатора Intensity Graph …………………… |
236 |
Индикаторы Digital Waveform Graph ……………………………………………………….. |
237 |
Маскирование данных………………………………………………………………………….. |
239 |
Трехмерные графики………………………………………………………………………………. |
240 |
Тип данных waveform (осциллограмма) …………………………………………………… |
241 |
Тип данных digital waveform (цифровая осциллограмма)………………………….. |
242 |
13. Графика и звук……………………………………………………………………………………… |
243 |
Использование индикатора Picture (изображение) ……………………………………. |
243 |
ВП с палитры Picture Plots (изображение кривых) ……………………………………. |
244 |
Использование ВП Polar Plot в качестве ВПП………………………………………. |
245 |
Использование ВП Plot Waveform и Plot XY в качестве ВПП…………………. |
245 |
Использование ВП Smith Plot в качестве ВПП………………………………………. |
246 |
ВП с палитры Picture Functions………………………………………………………………… |
247 |
Задание и модификация цветов с помощью ВП с палитры Picture Functions |
|
…………………………………………………………………………………………………………… |
249 |
ВП с палитры Graphics Formats ……………………………………………………………….. |
249 |
ВП с палитры Sound………………………………………………………………………………… |
250 |
14. Файловый ввод/вывод…………………………………………………………………………… |
252 |
Основы файлового ввода/вывода …………………………………………………………….. |
252 |
Выбор формата файлового ввода/вывода…………………………………………………. |
253 |
Когда использовать текстовые файлы ……………………………………………….. |
253 |
Когда использовать двоичные файлы…………………………………………………… |
255 |
Когда использовать файлы протоколов данных…………………………………… |
256 |
Использование ВП высокоуровневого файлового ввода/вывода……………….. |
257 |
Использование ВП и функций низкого уровня и с подпалитры Advanced File
I/O ………………………………………………………………………………………………………….. |
258 |
Дисковый поток………………………………………………………………………………….. |
260 |
10 |
Соседние файлы в папке LabView — учеб. пособия
- #
- #
- #
- #
Время на прочтение
13 мин
Количество просмотров 8.3K
Это первая статья из небольшого цикла о графическом языке программирования G, который используется в LabVIEW. Язык этот пока не очень популярен — по индексу TIOBE на май 2020 года LabVIEW находится на сороковом месте аккурат между Julia и Haskell. Выпуск LabVIEW Community Edition даёт возможность значительно расширить аудиторию пользователей (раньше можно было пользоваться только триальной версией, а по истечении 45-и дней учиться «вприглядку»).
Что ж, как говорили великие Керниган и Ритчи — «единственный способ научиться новому языку программирования — это начать на нём программировать». Этим и займёмся.
В первой части мы разберём основные элементы среды разработки, и нарисуем на блок-диаграмме наш первый «Hello, World!»
Статья-туториал рассчитана на тех, кто видит LabVIEW впервые. Под катом полсотни картинок примерно на семь мегабайт.
Введение
Предполагается, что вы уже справились с установкой и активацией LabVIEW NXG.
Основное отличие от имеющихся учебных материалов будет заключаться в том, что мы будем изучать этот язык с точки зрения средства разработки «общего назначения». В процессе изложения я буду пытаться также проводить параллели с текстовыми языками чтобы показать некоторые отличия от «традиционных» средств разработки. Для иллюстрации я буду использовать C# (в минимальном варианте, доступном и тем, кто понимает базовый синтаксис языка С). Изложение будет настолько подробным, насколько возможно, по мере углубления в дебри LabVIEW степень «подробности» основ будет уменьшаться. Также потребуется минимальное знание английского — русской локализации LabVIEW пока нет.
Итак, LabVIEW программа собирается из отдельных «кирпичиков», которые называются «Виртуальные Инструменты» («Virtual Instruments») или коротко VI. Первые версии LabVIEW предназначались для превращения ПК в измерительный прибор-инструмент, так что исторически за ними и закрепилось такое вот название. Также как С# программа собирается из отдельных *.cs файлов, также и LabVIEW программа собирается из VI файлов (в классической LabVIEW 2020 у них расширение *.vi, а в NXG — *.gvi). Множественные файлы объединяются в проекты. Единственное отличие — представьте себе, что вы организуете проект таким образом, что в каждом файле лежит только одна функция (ну или метод класса, если будет угодно). В небольшом проекте счёт отдельных виртуальных инструментов может идти на десятки, в проектах средних размеров — на сотни, а в больших проектах — тысячи их (предполагается, что размер кода в каждом отдельном инструменте находится в пределах разумного). Вот сейчас я работаю над проектом, в котором семь с лишним тысяч VI и это довольно большой проект.
При первом запуске LabVIEW NXG покажет нам вот такое окно:
Здесь перечислены шесть основных направлений, в которых применяется LabVIEW. В принципе без разницы, что вы здесь выберете, просто для некоторых направлений разработки или обучения нам рекомендуется «классическая» LabVIEW, а для некоторых — NXG, поскольку функциональность NXG пока проигрывает классической LabVIEW, но команда NI работает в этом направлении, а нам для изучения и NXG хватит с лихвой.
На этот вопрос нужно ответить всего один раз, после этого NXG будет запускаться вот так:
Виртуальный инструмент
Создадим наш первый инструмент, выбрав в меню File->New VI…:
После этого откроется основное окно — это наше рабочее пространство. При первом запуске нам покажут подсказки (если вы их закроете, то для того, чтобы их вызвать снова, надо нажать вопросик в правом верхнем углу).
Элементы рабочего пространства:
В левой части находится дерево для навигации по файлам проекта (Navigation Pane), в середине — основное пространство для программирования (VI), там же слева палитра инструментов (Palette), а справа — свойства для конфигурирования, вид которых меняется в зависимости от выбранных элементов (Configuration Pane), а снизу будет панель ошибок и предупреждений.
Нас в данный момент интересует средняя панель (VI). Вообще Виртуальный Инструмент VI обычно состоит из двух основных частей — Блок-Диаграммы (Block Diagram) и Передней Панели (Front Panel). Переключатель расположен в верхней части — Panel и Diagram (Icon — это иконка инструмента, мы её разберём попозже).
Блок-Диаграмма
Отложим пока что переднюю панель в сторону и займёмся блок-диаграммой. Очень часто программистам LabVIEW задают вопрос — ну картинки картинками, а код-то где? Вот собственно блок-диаграмма и есть ваш код. Щелкните по вкладке Diagram в верней части. Вот наше рабочее пространство:
Обычно изучение нового языка начинается с «Привет, мир!»-подобной программы, выводящей что-то в консоль, ну как-то вот так:
Console.WriteLine("Hello World!");
Где тут консоль? — этот вопрос возникает у многих программистов, ранее работавших с текстовыми языками. Консоли здесь как таковой нет, так что ниже мы будем выводить модальное диалоговое окошко. Если проводить аналогию с текстовыми языками, то, пожалуй самым ближайшим аналогом будет С# с WPF. Аналогом блок диаграммы у нас является *.cs файл исходного кода, а аналогом передней панели — соответствующий *.xaml файл с разметкой с той разницей, что в LabVIEW обе части находятся в одном *.gvi файле.
Кстати, если вы решили основательно заняться NXG, то есть ещё одна причина для того, чтобы изучить C#/WPF — вы сможете делать сборки, расширяющие интерфейс пользователя и логику (да, свои сборки .net можно подключать к графическому языку, в том числе включающие WPF контролы можно вкорячить в переднюю панель — для этого есть API).
Соответственно вывод диалогового окошка самым простым способом в C# реализуется как-то так:
const string message = "Hello, Habr!";
MessageBox.Show(message);
В принципе даже если вы не знаете C#, тут всё достаточно просто — объявляется строковая константа и выводится диалог. Если уж быть совсем дотошным, то MessageBox — это класс, из которого мы вызываем метод Show (документация для любопытных).
Вот давайте сделаем примерно тоже самое в LabVIEW. Нам понадобится строковая константа и собственно диалог.
Функции работы со строками находятся в палитре DataTypes вот здесь:
А собственно строковая константа находится вот здесь:
Поначалу обилие иконок может смущать, но к ним довольно быстро привыкаешь (кроме того есть и другие способы доступа к функциям, о которых я расскажу ниже).
Перетащим строковую константу мышкой на блок-диаграмму:
Теперь нам ещё диалог потребуется, он находится вот здесь в палитре «User Interface»:
Перетащим и его на блок-диаграмму:
Обратите внимание, что при наведении мышки слева у диалога мы видим две малиновые (или пурпурные, в общем цвета «magenta») точки слева и зелёную справа — они называются терминалами. Слева терминалы входные, а справа — выходной. Восклицательный знак у верхнего терминала означает, что этот терминал (message) обязательно должен быть куда-то подключён, а вот второй терминал — не обязательный, и по умолчанию его значение «OK». Разный цвет терминалов связан с типами данных — для строк они малиновые, для чисел — синие для целых или оранжевые для плавающей точки и так далее. Зелёный означает что выход представляет собой логический (булевый) тип данных (в случае однокнопочного диалога возвращаемое значение будет всегда true).
Вот теперь разместим эти два элемента рядышком, наведём мышку на выходной терминал строковой константы — курсор превратится в катушку, щёлкнем по малиновой точке и соединим выход константы со входом диалога (держать постоянно зажатой кнопку можно, но не нужно), завершив создание проводника щелчком по входному терминалу диалога (либо отпустив кнопку мыши, если вы держали её нажатой):
Ну а в самой константе наберём какой-либо текст (указатель мыши «умный», он меняется в зависимости от контекста использования):
(если у вас возникли сложности — промотайте статью чуть ниже — там есть анимированный gif)
Этот код — суть квинтэссенция графического программирования, основанного на потоках данных (Data Flow).
Константа является источником данных. Диалог является приёмником данных. Соединяющий проводник («Wire») переносит данные от источника к приёмнику.
Общепринято направление потока данных «слева направо». То есть источники надо располагать левее, а приёмники — правее, так, чтобы поток данных шёл слева направо.
Один источник может быть подключён к нескольким приёмникам, но не наоборот.
Почему нельзя — объясняется в окне предупреждений и ошибок в нижней части экрана. Когда ошибок много — двойной щелчок подсветит место ошибки.
И вот так делать не стоит (хотя код этот вполне работоспособен, так как простое перемещение элементов на диаграмме суть косметическое изменение, не влияющее на логику потоков данных):
Как это запустить? Очень просто — надо нажать зелёную стрелочку вот здесь — Run Execute this code:
Результатом будет диалог:
Обратите внимание на сочетание клавиш «Ctrl+R» для запуска VI. Запомните его, оно будет использоваться очень часто.
Также обратите внимание, что нам не пришлось компилировать программу, мы просто запустили её. Идеология LabVIEW заключается в том, что программа всегда находится в памяти в уже скомпилированном виде. В сложных случаях, при первом запуске инструмента с большим количеством кода, когда компиляция будет занимать ощутимое время, вам будет показано окошко, примерно вот такое:
«Принудительная перекомпиляция» возможна, для этого надо щёлкнуть по кнопке Run, удерживая нажатой клавишу «Контрол».
Вы можете визуализировать потоки данных, передающихся по проводникам, включив режим подсветки выполнения, это делается вот здесь:
Вот как это выглядит всё вместе:
Теперь мне хотелось бы подчеркнуть очень важный для понимания идеологии потоков данных момент.
Давайте сделаем пару копий нашего кода.
Лайфхак: копипастить код в LabVIEW можно традиционным способом, нажимая клавиши Ctrl+C/Ctrl+V (нужно выделить код, нажать Ctrl+C, затем щёлкнуть мышкой там, где хотим вставить и нажать Ctrl+V), но есть способ чуть проще — нужно выделить код, затем просто нажать клавишу Ctrl и удерживая её (возле курсора появится плюсик), перетащить копию на новое место. При этом если ещё и клавишу Shift зажать, то перемещение будет происходить строго по вертикали или горизонтали — так вы будете копипастить аккуратнее. Вот так (первую копию я сделал традиционным способом, а вторую — удерживая клавишу Ctrl):
Получилось вот что:
И вот дело в том, что глядя на этот код вы не можете утверждать в каком порядке появятся эти три диалога. В этом смысле мы имеем неопределённое поведение. В этом заключается кардинальное отличие графического программирования от текстового, в котором операторы выполняются последовательно и у вас не возникает сомнений в каком порядке будут выведены три диалоговых окна:
MessageBox.Show("Проверка");
MessageBox.Show("Test");
MessageBox.Show("Prüfung");
вот смотрите, кто бы сомневался (совместно с кириллическими символами я использую немецкое слово с умляутом, чтобы уж заодно проверить код на «юникодность»):
Ну а в LabVIEW вот так:
Для упрощения можно считать, что несвязанный потоками данных код просто выполняется параллельно (хотя это строго говоря и не совсем так), факт в том, что порядок выполнения не определён.
Можно ли явно задать порядок выполнения кода? Да, можно, для этого существует управляющая структура.
Однако избыточное использование этой структуры считается «плохим тоном» (я на данном этапе даже не буду показывать где она находится). В некоторых случаях её применение оправдано, но каждый раз, когда вы будете использовать эту структуру, есть повод спросить себя «а не стоит ли сделать рефакторинг кода и избавиться от структуры последовательности?»
Аксиома: От любой структуры последовательности всегда можно избавиться. Любой код, содержащий эту структуру, можно изменить таким образом, что порядок выполнения будет задан потоками данных и никак иначе.
На этом можно было бы и остановиться для начала, но давайте рассмотрим среду разработки чуть повнимательнее.
Эффективная работа в LabVIEW
Перетаскивание примитивов из палитр на диаграмму и панель не является самым эффективным способом. Палитры нужны в том числе для того, чтобы понять какие функции есть в нашем распоряжении, но если вы точно знаете, какой элемент вам нужен, то его название можно начать вводить в строке поиска, вот здесь:
Если вы внимательно посмотрите на это окно, то увидите справа сочетания 1dg, 2dg и так далее. Это — короткие сочетания, то есть вместо «One Button Dialog» или «Dialog» можно сразу написать «1dg» и нажать клавишу «Ввод». Если в списке присутствует несколько элементов, то между ними можно перемещаться стрелочками, и выбрав нужный, нажать Enter.
Окно поиска также не требует клика мышкой — для этого есть сочетание клавиш Ctrl+Space (удерживая контрол надо нажать пробел). Это сочетание называется «Quick Drop» и этот метод реально ускоряет работу. Конечно, вы не выучите сразу все сочетания-шорткаты, это придёт постепенно, но этим надо пользоваться.
В том случае если вы забыли и хотите посмотреть, в какой палитре находится тот или иной элемент, надо просто навести указатель мыши на правую часть окошка — появится кнопка «Show in Palette»
При щелчке по этой кнопке откроется соответствующая палитра, где элемент будет подсвечен.
Вам также не всегда нужно открывать основную палитру — щелчок правой кнопкой мышки в свободной области диаграммы откроет компактное окно, в котором прямо под курсором мыши будет доступ ко всем палитрам. Наиболее часто используемые элементы можно добавить в фавориты, также тут есть доступ к ещё неразмещённым «Unplaced» элементам (об этом в следующей части). В целом это даже удобнее чем в «классической» LabVIEW (хотя Quick Drop есть и там).
Теперь по поводу констант. Их тоже можно «доставать» из быстрого доступа (попробуйте нажать клавиши Ctrl+Space, затем sc — это строковая константа):
Но если константа, скажем, нужна для подключения к терминалу диалога, то значение можно ввести в свойствах вот здесь:
Соответственно один из самых быстрых способов «наброса» кода на диаграмму выглядит примерно вот так:
Здесь я нажал последовательно: <Ctrl+пробел>, затем набрал «1dg», затем <Ввод>, щелкнул на диалоге, ввёл «Hello, Habr» и нажал <Ctrl+R>.
Если вам нужно добавить собственные заметки на диаграмму, то достаточно дважды щёлкнуть в свободном месте и начать вводить текст:
Если полёт вашей мысли заполнил весь экран и вам нужно больше свободного места, то его легко добавить, нажав на клавиатуре клавишу Контрол и очертив область для расширения, вот так:
Как видите, это работает «в обе стороны» — можно не только добавлять свободное пространство но и «убирать» его, делая диаграмму более компактной.
Да, кстати, хорошим тоном считается не превышать размер экрана, чтобы при просмотре диаграммы вообще не пользоваться скроллингом. Это не всегда будет получаться на первых порах, но если размер диаграммы растёт, то лучше делать это только в одном направлении — вертикальном или горизонтальном.
Последнее, о чём хотелось бы рассказать сегодня — контекстные меню и свойства. В LabVIEW довольно много функций доступно через контекстные меню, вызываемые правой кнопкой мыши.
У нас три элемента всего — константа, соединительный проводник и диалог, посмотрите на их контекстные меню:
Некоторый пункты требуют более глубоких знаний (всему своё время), но часть из них уже можно прокомментировать:
Константа:
Dock to node — «прилепит» константу к терминалу, что даст боле компактное представление на диаграмме. Ровно тоже самое произойдёт, если в контекстном меню диалога выбрать Terminals->Dock constants, с тем лишь исключением, что это будет относиться к нескольким константам подключённым к диалогу, если таковые имеются:
Обратите внимание на маленькие приятные детали — если значение константы совпадает со значением терминала по умолчанию (в нашем случае «ОК» — это текст, который будет на кнопке), то терминал будет не закрашен. А вот если я изменю значение по умолчанию, то он будет залит (сравните вид второго и третьего диалогов).
Show in Palette в меню константы и диалога откроет соответствующую палитру и покажет вам, откуда был взят элемент.
Clean up wire в меню проводника «почистит» проводник если вы сделали «спагетти»:
Create branch — создаст новую ветку для проводника. Допустим вам одну константу надо в двух диалогах использовать:
Delete Branch — пояснений не требует. Удалять проводники можно и наживая клавишу «Del», при этом обратите внимание как происходит выделение:
При первом щелчке по вертикальному сегменту выделится только один сегмент, при втором щелчке — дополнительно горизонтальный, а при третьем — весь проводник, включая все ответвления. Так что для эффективной работы надо овладеть искусством тройного щелчка. Собственно во многих текстовых редакторах это работает похожим образом — при щелчке ставится курсор, двойной щелчок выделяет слово, тройной — строку ну и так далее.
Create wire comment позволяет добавить комментарий проводнику — это удобно в случае длинных проводников:
В верхней части контекстных меню находятся кнопки Insert или Replace. Это позволяет заменять элементы, либо вставлять какую-либо функцию прямо в проводник, не требуя возни с удалением проводника и последующим пересоединением. Вот как это работает — я заменю диалог на двухкнопочный и вставлю функцию конвертации строки в верхний регистр:
Properties — откроет панель свойств в правой части. Вот как она выглядит для всех трёх элементов (слева направо — строковая константа, проводник и диалог соответственно):
Для строки:
Constant configuration используется если вам нужна определённая константа, типа табуляции или пробела — для них есть наглядное визуальное представление, кроме того это защитит вас от случайного изменения такой константы.
Display Format -> Show escape sequences позволяет вам переключиться на вот такое представление:
Используется если вам надо чётко видеть все символы в строке.
Visual style -> Show Label позволяет включить подписи:
У константы подпись можно изменить, равно как и размещение слева/внизу/вверху, у диалога — нельзя. Кстати, подпись у константы — это всего лишь метка для вашего удобства, а не её имя. Ну то есть вы можете иметь две константы с одинаковой подписью, и это — две разные константы:
Если вам нужно использовать одну константу в нескольких местах, то единственно правильный способ вот такой:
Layout -> Size to content можно отключить, если вам нужно ввести много текста:
У проводника в окне свойств вы видите тип и можете изменить комментарий, если надо.
Что касается окна свойств диалога, то тут вы можете «прилепить» константы к диалогу как это было показано выше, а также изменить визуальное представление:
Иконка более компактна, зато список позволяет видеть все терминалы, обязательные к подключению отображаются при этом жирным шрифтом, кроме того порядок их можно поменять, если нужно (это не меняет функциональность, лишь позволяет лучше разместить проводники, чтобы избежать пересечений:
Если вы выделяете несколько однотипных элементов (это делается удерживая клавишу Shift), то общие для всех свойства также отображаются (ну то есть можно включить отображение меток сразу для всех выделенных элементов).
В нашем случае окошки свойств были очень простые, но в зависимости от сложности используемых элементов их вид будет меняться и может быть гораздо сложнее.
Ну и напоследок по окошкам свойств — здесь можно включить контекстную помощь:
Окошко это всегда можно вызвать нажав Ctrl+H. Вид его меняется в зависимости от выделенного элемента и это удобно (также используется, чтобы посмотреть документацию к библиотекам, тип данных на проводниках и так далее).
В конце настало время сохранить наш «Hello, Habr!». Тут всё просто:
Для нас был создан проект, по умолчанию всё сохраняется в «Мои документы» — там будет создана папка «LabVIEW Projects».
Любопытные могут заглянуть внутрь файла — там обычный XML, в котором можно разглядеть нашу диаграмму.
Кусочек XML с диаграммой
<BlockDiagram Id="a44ad16c1aa64eb9940a6db1357f6f34">
<OneButtonDialog Bounds="230 236 40 40" Id="abd1e9094fb74fe3ae59249f61acaa0b" />
<Literal Bounds="100 236 100 15" DataType="String" Id="99b8849aac10420386a3c64b659755e8"
Label="e03893aa5f6948b4b8f028ffff4aaa45" xmlns="http://www.ni.com/MocCommon">
<p.Data>Привет, Хабр!</p.Data>
<StringBehavior TextDisplayMode="Default" />
</Literal>
<NodeLabel AttachedTo="99b8849aac10420386a3c64b659755e8" Bounds="100 234 30 15"
Id="e03893aa5f6948b4b8f028ffff4aaa45" Visible="False"
xmlns="http://www.ni.com/PlatformFramework">
<p.Text>message</p.Text>
</NodeLabel>
<Wire Id="4e45a6a724704c38b808a29f3417ce9b"
Joints="N(99b8849aac10420386a3c64b659755e8:Out)|(200,237)
N(abd1e9094fb74fe3ae59249f61acaa0b:message)|(230,237)"
xmlns="http://www.ni.com/PlatformFramework" />
</BlockDiagram>
В «классической» LabVIEW эти файлы были двоичные, что сводило с ума системы контроля версий, теперь стало чуть лучше. Можно увидеть наш диалог, константу, и проводник, их соединяющий, причём все атрибуты и координаты хранятся тут же.
Вот, собственно и всё на сегодня. Мы рассмотрели блок-диаграмму, сделали простую программку, разучили сочетания клавиш Ctrl+R, Ctrl+H, Ctrl+Пробел и освоились в среде разработки.
На следующем занятии мы потрогаем переднюю панель и сделаем что-нибудь чуть более полезное — Основы работы с Передней Панелью — Контролы и Индикаторы
Предложите, как улучшить StudyLib
(Для жалоб на нарушения авторских прав, используйте
другую форму
)
Ваш е-мэйл
Заполните, если хотите получить ответ
Оцените наш проект
1
2
3
4
5