Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект з ПК.doc
Скачиваний:
14
Добавлен:
16.11.2019
Размер:
3.45 Mб
Скачать

Вступ

LabVIEW – програмування “для чайників”

У сучасному житті інженерові, та й будь-якому “технарю” в принципі, дуже важко обійтися без хоч мінімальних навичок програмування: завжди є можливість спростити собі життя,от лише треба вміти нею скористатися. Та проблема у тому, що бути фахівцем у всіх сферах нереально і спеціалістам зі, скажімо, вимірювань чи автоматизації просто не вистачає часу, аби вивчати якусь мову програмування. При виникненні потреби їм доводиться звертатися до дипломованих програмістів.

Насправді так і має бути: кожен робить свою роботу. Тільки от як пояснити “далекому” від вимірювань програмістові що саме від нього вимагається, якщо мова йде про обробку інформації з якогось об’єкту, обвішаного давачами? Скільки чекати на вирішення досить простої задачі і скільки різних папірців написати, аби отримати в допомогу того програміста? Невже не простіше якісь елементарні навички мати самому?

Компанія National Instruments, вочевидь, поділяє мою думку, бо розроблений нею комплекс LabVIEW просто ідеально підходить для тих, кому треба вирішувати прикладні задачі і не тратити час на вивчення команд та синтаксису сучасних мов програмування. Натомість текстовим операторам, у LabVIEW використовуються графічні піктограмки, що зображають відповідні функції. Суть програмування полягає у з’єднанні цих піктограм своєрідними провідниками, по яких дані “мандрують” всередині програми.

Незважаючи на свою простоту, мова програмування G, що використовується у LabVIEW, є повноцінною об’єктно-орієнтованою мовою. Розроблені програми (їх називають віртуальними приладами) можна використовувати у якості підпрограм більш глобальних проектів; також можна підключити динамічні бібліотеки (не залежно від того, яка мова використовувалася для їх розробки) сторонніх розробників, або ж писати код на С-подібній текстовій мові.

Віртуальні прилади LabVIEW вміють працювати на сервері, тож можна отримати доступ до них навіть через глобальну мережу. Також підтримується робота зі стандартними портами вводу-виводу даних, спеціальними платами розширення (їх продає як National Instruments, так і сотні сторонніх розробників), робота з реєстром ОС Windows, тощо.

Оскільки на нашій кафедрі (та й у “Нафті” загалом, наскільки я знаю) вже деякий час ведуться роботи з впровадження LabVIEW у навчальний процес та для розробки лабораторних стендів, а блог повинен приносити певну користь суспільству, то презентую нову рубрику, присвячену LabVIEW. Що конкретно тут буде поки не скажу. Найбільш імовірно, простенькі приклади для студентів-першокурсників (орієнтуватимуся на LabVIEW 7.1, хоч вона вже суттєво застаріла, та причини є і про них згодом).

1. Інтерфейс LabVIEW

У одному з попередніх дописів я вже почав тему середовища графічного програмування під назвою LabVIEW. Якщо раптом хтось зацікавився – читайте продовження циклу. Зараз я коротко розповім про головні елементи інтерфейсу. Отож, запускаємо LabVIEW (я використовую версію 7.1, хоч вона і стара, та не вимагає потужного “заліза” і проста для вивчення) і вибираємо у стартовому вікні опцію “New -> Blank VI” (для цього досить двічі натиснути клавішу “Enter”).

 

Стартове вікно LabVIEW 7.1

Далі одразу рекомендую натиснути комбінацію клавіш “Ctrl+T” – вона розмістить обидва вікна поруч (у епоху широкоформатних моніторів таке розміщення є оптимальним) і спробуємо розібратися що ми тут бачимо.

Робоча область розділена на два вікна, одне з яких сірого кольору, а інше – білого. Сіре вікно називається лицьовою панеллю віртуального приладу, тут розміщуються візуальні елементи, інтерфейс користувача. Хто має досвід програмування у інших середовищах із можливістю графічного проектування інтерфейсу (Delphi, Visual C, NetBeans), той у LabVIEW не розгубиться.

Всі візуальні компоненти поділяються на дві великі групи: регулятори (Controls) та індикатори (Indicators). Перші служать для вводу користувачем даних у програму, а другі – для виводу результатів її роботи.

Біле віконечко називається блок-діаграмою і саме тут ми проектуватимемо всю логіку роботи нашого приладу. На блок-діаграмі розміщуються невізуальні (невидимі) компоненти: функції, константи, оператори.

Робоча область LabView 7.1

Вгорі обох віконечок є меню та панель інструментів. Якщо з меню все зрозуміло, то про панель скажу кілька слів (на рисунку кнопки, про які йтиме мова, позначено цифрами).

Отож, перша кнопка дозволяє запустити програму на виконання. Друга кнопка здійснює циклічний запуск – після завершення програми вона запускається знову автоматично (з цією кнопочкою треба бути обережними). Кнопка номер 3 дозволяє перервати виконання програми, а кнопка номер 4 – призупинити його і увійти у режим відладки.

Ці кнопки дублюються і на лицьовій панелі і на блок діаграмі, та на блок діаграмі є ще одна цікава кнопочка (№6), яка має вигляд лампочки і називається “Highlight Execution” – підсвітка виконання. Якщо її натиснути, то робота програми сповільнюється, а на блок діаграмі буде видно вогники, які показують рух даних у програмі. Поки ми цього бачити не можемо, бо ще нічого не напрограмували. Пора виправляти ситуацію.

Натисніть праву клавішу миші на вільному місці лицьової панелі чи блок діаграми. Ви побачите контекстне меню, яке містить всі компоненти, які можна розмістити на відповідній частині робочої області (для лицьової панелі та блок-діаграми ці компоненти різні).

 

Регулятори та індикатори

Запам’ятати де регулятори, а де індикатори досить просто (дивіться рисунок). Більш того, регулятори та відповідні їм індикатори розташовані одні під одними: числові під числовими, лампочки під кнопочками. Окрема піктограмка служить для виклику палітри з усіма доступними компонентами, зргупованими за призначенням.

Виберіть будь-який регулятор і розмістіть його десь на лицьовій панелі. Потім розмістіть також і відповідний йому регулятор. За допомогою миші можна переміщувати його, змінювати розміри, переіменовувати (раджу відразу ж давати осмислені імена.

 

Регулятор (вгорі) та індикатор

Коли ми розміщуємо на лицьовій панелі якийсь компонент, то на блок-діаграмі відразу ж з’являється відповідний йому термінал – маленька піктограмка зі схематичним зображенням цього елемента. Піктограми регуляторів та індикаторів відрізняються маленьким білим трикутником, який показує напрям руху даних. У регулятора трикутник розташовано справа (він показує напрям назовні), у індикатора – зліва (трикутник направлено всередину піктограми).

Тому раджу намагатися розміщувати компоненти саме так: піктограми регуляторів зліва, індикаторів – справа. До речі, візуальні компоненти та відповідні їм термінали можна переміщувати незалежно один від одного, а от імена у них спільні. Скористайтеся цим для побудови зрозумілої програми.

2. Програми з галуженням у LabVIEW

Навіть програміст-початківець чудово розуміє наскільки вузька сфера застосування у лінійних програм. Скажемо відверто: без галуження та умовних переходів у програмуванні нікуди. У LabVIEW існує декілька інструментів для організації перевірки певної умови та реакції на неї. Найбільш простим із них є використання операторів порівняння, які повертають значенні “Істина” (True) у разі виконання певної умови. Розміщені ці оператори у вкладці “Comparison”, яка, в свою чергу, знаходиться у палітрі “Arith/Compare”.

 

Оператори для порівняння у LabVIEW

У цій же вкладці знаходиться також інструмент “Select”, який повертає на виході одну із двох вхідних величин у залежності від того, яка логічна величина подається на керуючий вхід. Якщо на вході значення “Істина”, то на вихід потрапляє величина із верхнього терміналу, інакше – із нижнього.Тут же знаходиться і експрес-інструмент “Comparison” (із жовтими кубиками на піктограмі). Експрес-інструмент це така функція, поведінку якої можна налаштувати відповідно до вимог. В даному випадку можна самому задати яку функцію порівняння виконуватиме інструмент (порівняння двох чисел, порівняння числа з константою, тощо).

Та можливостей операторів порівняння для написання складних програм, вочевидь, не достатньо. Тут на допомогу нам прийде “Case Strucrure”, розміщена в палітрі “Exec Ctrl”, яка дозволяє виконувати цілі частини програми в залежності від певної умови.

Оператор галуження "Case" у LabVIEW

Оператор “Case” є структурою, тобто всередині нього можна розміщувати інші оператори. На рисунку видно, що за замовчуванням пропонуються два можливих стани структури, причому в певний момент часу виконується тільки один із них. Який саме? Це залежить від значення на керуючому терміналі (його позначено знаком запитання).

У випадку, якщо двох станів недостатньо, можна додати ще декілька. Для цього натисніть праву клавішу миші на назві стану (віконечко вгорі) і виберіть відповідний пункт у контекстному меню. В принципі, для тих, хто трохи володіє англійською, назви пунктів меню говорять самі за себе.

 

Налаштування структури "Case"

Add Case Before – додає стан після поточного.

Add Case After – додає стан перед поточним.

Duplicate Case – дублює поточний стан (і весь його вміст).

Delete This Case  – видаляє поточний стан.

Remove Empty Cases – видаляє пусті (невикористані) стани.

Особливої уваги заслуговує лише опція “Make This The Default Case” – зробити цей стан станом за замовчуванням. Вона потрібна для того, щоб повідомити LabVIEW як діяти в тому випадку, коли на керуючий термінал надійде значення, не передбачене структурою “Case” (варто зауважити, що в даному випадку назва стану і є тим самим значенням, тобто для виконання додавання програмою на рисунку вище у полі “Дія” користувач повинен набрати слово “Додавання”). Якщо Ви додаєте чи видаляєте стани, то переконайтеся, що зробили один із них станом за замовчуванням, інакше програма не працюватиме (досить поширена помилка серед студентів).

Ну і нарешті зверніть увагу ще на таку штуку: при перетинання провідниками з даними границі структури “Case” у місці перетину утворюється “тунель” – такий кольоровий квадратик. Колір квадратика залежить від типу даних (синій для цілих чисел, оранжевий – для дійсних, рожевий – для тексту та зелений для логічних величин), а от якщо у якомусь із станів структури немає під’єднання до вихідного тунелю, то такий тунель буде з білим “отвором” всередині (як на рисунку нижній тунель). У цьому випадку програма теж не працюватиме, тож переконайтеся, що вихід підключено у всіх станах. Входів це правило не стосується, у випадку відсутності потреби в них цілком можна зробити отак:

Результат завжди рівний нулю

От наче і все про програми з галуженням у LabVIEW. Тим, кого зацікавила тема (а ще моїм студентам) рекомендую підписатися на новини за допомогою мереж “вКонтакті” або “ФейсБук” (відповідні віджети у сайдбарі). Ну і не забувайте, що у нас є ще й RSS.

3. Робота з текстом у LabVIEW

Робота з текстом у LabVIEW

Продовжую серію уроків з LabVIEW і цього разу ми спробуємо погратися із текстовими величинами (або ж рядками, Strings). Для цього у LabVIEW передбачено відповідні регулятори та індикатори (вони знаходяться відповідно у палітрах “Text Ctrls” та “Text Inds”), а також цілий набір функцій, які можна знайти у палітрі All Functions -> “String”.

Якщо з візуальними компонентами все просто, то на функціях варто зупинитися детальніше. Відповідне віконечко зображено на рисунку і на ньому ми бачимо наступне: в самому низу знаходиться експрес-інструмент “Build Text” – він може сформувати текстовий рядок згідно Ваших вимог, причому можна на вхід подавати як текст, так і числові величини.

Налаштування інструмента Build Text

Трохи вище знаходиться підбірка констант (рожеві піктограми). Тут можна обрати як гоові варіанти (пропуск, новий рядок, табулятор), так і ввести будь-який текст.

Наступний рядочок вгору – функції для форматування та розпізнавання рядків, а також взаємного перетворення масивів у таблиці і навпаки. Далі йдуть три оператори для пошуку і заміни підрядків у рядку, а також самотня функція для форматування дати/часу. Щоб усім цим користуватися, доведеться трохи почитати документацію, бо в хелпі детально розказано про те, як саме сформатувати текст потрібним способом. Або ж чекайте наступної публікації 

А от у першому рядочку розташовуються прості функції, такі як (зліва направо): дізнатися довжину рядка, склеїти рядки, виділити частину рядка, змінити регістр (великі букви у малі та навпаки). Піктограми справа – підпалітри, що містять інструменти для перетворення чисел у текст  і навпаки (причому підтримуються як десяткові, так і двійкові та шістнадцяткові числа), роботи з рядками, що містять шлях до файлів, та ще деякі рідковживані, але корисні, функції (скажімо видалити пробіли з початку та в кінці тексту, інвертувати рядок, або циклічно зсунути його.

Якщо не хочете пропустити наступний урок – підпишіться на новини нашої сторінки вКонтакті, або ж через віджети у правій боковій колонці.

4. Робота з рядками у LabVIEW: практика

Щось я багато пишу про теорію програмування у LabVIEW, але не наводжу конкретних прикладів. Цього разу буде інакше і ми побачимо як можна здійснювати операції з текстом у LabVIEW на прикладі невеличкої лабораторної, яку я даю моїм студентам на початку курсу. Отож завдання: користувач у три відповідних поля вводить своє ім’я, прізвище та по-батькові, а на виході отримує в одному полі повністю всі три слова, причому незалежно від того, як введено текст, починаються слова з великої літери, а всі інші будуть малими. Та ще й у випадку якщо результуючий рядок довший за певне значення, то він перетвориться у прізвище та ініціали.

При виконанні завдання користуватимемося концепцією модульного програмування: складнішу задачу розбиваємо на більш прості підзадачі, кожну з яких реалізуємо окремо. Отож, для початку займемося приведенням введеного користувачем слова до “нормального” вигляду – велика літера спочатку, а потім всі малі. Блок-діаграму розробленої підпрограми і її передню панель я зобразив на наступному рисунку.

 

Приводимо текст до "культурного вигляду"

Трохи пояснення. Отож, цифрами 1 та 7 позначено відповідно вхідну та вихідну величину (назви терміналів “tExT” та “Text” пояснюють суть операції). Позиція номер два – це константа,яка подається на відповідні входи вузла “String Subset” (позиція 3). Тут треба зауважити, що для перетворення тексту до “нормального” вигляду ми розділяємо його на дві частини: перша літера (яку далі обробляємо функцією перетворення у верхній регістр “To Upper Case” – позиція 5) та решта тексту (з якою працює функція приведення до нижнього регістру “To Lower Case” – позиція 4).

Саме тому у першому випадку ми подаємо константу “1″ на вхід “length” (довжина підрядка) і залишаємо непід’єднаним вхід “offset” (зміщення) – за замовчуванням його значення рівне нулю. Тобто задаємо копіювання одного першого (без зміщення від початку) символу. В другому випадку ми робимо якраз навпаки і встановлюємо зміщення рівним одиниці, чим пропускаємо перший символ, а довжину не під’єднуємо і для неї береться значення за замовчуванням (“rest”, або решта тексту).

Результат операції – два текстових рядки, перший з яких містить першу літеру введеного слова, переведену у верхній регістр, а другий – решту слова у нижньому регістрі. Ці два рядки ми об’єднуємо у один функцією “Concatenate Strings” (позиція 6).

Розроблений інструмент доцільно зберегти у вигляді підпрограми, для чого виділяємо всю блок-діаграму за винятком вхідного і вихідного терміналів і вибираємо в меню “Edit” опцію “Create SubVI”. В результаті отримаємо щось отаке:

 

Підпрограма у вигляді іконки

Далі зберігаємо наш файл (тут треба уважно читати повідомлення у діалогових вікнах): LabVIEW спочатку повідомить, що у нашій програмі є незбережені підпрограми і запропонує зберегти їх, погоджуємося і обираємо гарне ім’я для нашого “нормалізатора тексту”. Згодом він нам ще знадобиться.

Продовження уроку читайте далі.

У попередньому дописі ми створили інструмент, для перетворення тексту, введеного літерами у хаотичній суміші регістрів до нормального вигляду. Зараз же поговоримо про решту задачі. Нагадую, треба виводити повністю ім’я, прізвище та по-батькові у один рядок, якщо їх сумарна довжина менша якогось значення, а у протилежному випадку виводити лише прізвище та ініціали.

Реалізувати таку програму можна кількома способами, я виберу один з них, а над іншими, більш раціональними, нехай кожен попрацює сам. Отож ми використовуватимемо вузол “Select” для вибору одного з двох варіантів представлення імені та по-батькові, але генеруватимемо їх обидва. У нашій роботі знадобиться спроекований та збережений раніше у вигляді підпрограми інструмент.Для початку реалізуємо визначення сумарної довжини результуючого рядка, для чого тричі використаємо вузол “String Length” щоб дізнатися довжини всіх складових. Сумарну довжину отримаємо додавши всі три величини (для цього я використовую вузол “Compound Arithmetic” – він дозволяє вибрати яку дію виконувати над вхідними величинами і задати їх кількість, просто розтягнувши піктограму вузла по вертикалі. Додатково до сумарної довжини додаємо ще константу “2″ – це кількість пробілів-розділювачів: між ім’ям та прізвищем і прізвищем та по-батькові.

У нашій заготовці, представленій на наступному рисунку поки просто загориться зелений індикатор, якщо сумарна довжина перевищуватиме введене у відповідному віконечку число.

Контроль довжини тексту

Тепер зробимо так, щоб перемикач “Контролювати довжину” вмикав і вимикав відповідну функцію. Для цього досить скористатися логічним “І-НЕ” (“Not And”), відповідний вузол можна знайти у палітрі “All Functions” -> “Boolean”, тому окремої ілюстрації не робитимемо.

Переходимо до реалізації основної задачі. Для цього нам слід спочатку всі три введені слова опрацювати розробленим у попередньому дописі інструментом. Просто знаходите файл, у якому зберегли його, в улюбленому файловому менеджері і перетягуєте у вікно блок діаграми. Нам потрібно три екземпляри інструмента, тому скопіюйте його і вставте ще двічі.

Оскільки у будь-якому випадку прізвище змінюватися не буде, то його поки не чіпаємо, а от у імені та по-батькові виділимо перші букви за допомогою уже відомого нам вузла “String Subset” і склеїмо їх у один рядок, наступним чином: “пробіл”+”перша буква імені”+”крапка”+”перша буква по-батькові”+”крапка”. Паралельно в інший рядок склеїмо ім’я та по-батькові повністю, також розмістивши перед кожним із слів пробіл. Як це зробити ми вже знаємо (зверніть увагу, що “відрізати” перші букви треба вже після того, як слова буде приведено до “нормального” вигляду).

Ім'я та ініціали

Ну і нарешті підключаємо наш “Select”, який вибиратиме із двох варіантів, та склеюємо прізвище з результатом його роботи.

Готова програма

Програма готова. Але увага, в процесі роботи у мене виник невеличкий проїзд (хто уважний, знайде різницю на останній та передостанній ілюстраціях). У тексті послідовність виконання роботи описана правильно, а от один з малюнків трішечки невірний. Спробуйте знайти помилку самостійно 

5. Звіти у LabVIEW: швидко і зручно

При виконанні лабораторних робіт студенти часто стикаються із тим, що їм доводиться оформлювати відповідні звіти. Якщо це лабораторні роботи з програмування, то у такі звіти включають лістинги програм, а у випадку з програмуванням на LabVIEW – зображення лицьової панелі розробленого приладу та його блок-діаграми.

В принципі, зробити такі зображення можна за допомогою клавіші PrintScreen на програми mspaint, але середовище LabVIEW пропонує для цього скористатися більш потужним інструментом: функціями для генерування звітів. Фактично, можна створити підпрограму, яка автоматично виконуватиме всі необхідні дії і формуватиме готову html-сторінку (у нових версіях LabVIEW навіть документ MS Office), яку залишиться просто вивести на друк.Знаходяться всі потрібні інструменти у палітрі “All Functions” -> “Report Generation” і умовно можуть бути розділені на 4 категорії: загальні, для роботи із документацією та складовими програми, для роботи з html, та для керування виглядом звіту.

Генерація звітів у LabVIEW

Загалом, усе просто: спочатку створюємо звіт за допомогою інструменту “New Report”, далі виконуємо всі необхідні дії, зберігаємо звіт, або відкриваємо його у вікні веб-переглядача, закриваємо звіт інструментом “Dispose Report”, щоб вивільнити ресурси, які він займав.

Всі інструменти для генерування звітів слід сполучити між собою у такий-собі ланцюжок, для чого послідовно з’єднуємо вихід “report out” кожного попереднього інструмента із входом “report in” кожного наступного.

А для формування звіту нам знадобиться базове знання html-розмітки (хоча фактично можна використовувати той самий MS Word, або якийсь і з WYSIWYG-редакторів). При генеруванні звіту в першу чергу його треба створити (про це я вже згадав вище) – тож використовуємо піктограму “New Report”, але відразу ж варто створити константу і під’єднати її до входу “report type”. Для HTML-звіту ця константа повинна бути рівною “1″. Далі я радив би створити титулку звіту, для цього у підпалітрі “HTML” шукаємо інструмент “Append User Formatted HTML to Report” і до його вхідного терміналу “HTML Text” під’єднуємо текстову константу, всередині якої описуємо нашу титулку із html-тегами. Додатково можна дозволити користувачу ввести тему, мету, номер роботи у окремі константи, текстові поля на лицьовій панелі, або за допомогою діалогових вікон. Про діалогові вікна якось пізніше, а працювати з текстовими величинами ми вже вміємо.

Для того, аби побачити, що в нас вийшло, скористаємося інструментом “Open HTML Report in Browser” – він запустить програму, встановлену на комп’ютері у якості  веб-переглядача за замовчуванням і відкриє у ній наш звіт. І, насамкінець, використаємо “Dispose Report”.

Простенький HTML-звіт у LabVIEW

Наступна сторінка звіту буде містити зображення блок-діаграми та лицьової панелі нашої програми, тож заглянемо у підпалітру “VI Documentation” і занйдемо там інструменти “Append Front Panel Image to Report” та “Append VI Block Diagram to Report” – для чого вони застосовуються зрозуміло з назви. А для того, аби при друці зображення виводилися таки на окремій від титулки сторінці, використаємо інструмент “New Report Page” з палітри “Report Layout”. На картинці я ці інструменти розмістив дещо нижче.

 

Додаємо зображення до звіту

Для найкращого результату можна додати підписи до зображень (це робиться за допомогою того ж “Append User Formatted HTML to Report”), а також інформацію про розроблений прилад, яка береться із поля “VI Desription” (натискаємо Ctrl+I і у вікні, що з’явиться, переходимо до розділу “Documentation”.

Зрештою, в результаті можна створити окрему підпрограму і отримати зручний інструмент для створення звітів та документації до будь-якої зі своїх програм на LabVIEW…

6. Масиви у LabVIEW

Масиви – дуже корисна штука для роботи з даними, а у LabVIEW масиви реалізовано взагалі дуже гарно. Почнемо з того, що таке масив. Масивом називається структура, що об’єднує в собі багато даних одного типу, тобто може бути масив чисел, масив букв, наприклад. У LabVIEW можуть бути також масиви візуальних компонентів: кнопок, індикаторів, тощо.

Функції (вузли) для роботи з масивами знаходяться у палітрі “All Functions” -> “Array”, а єдиний візуальний компонент – масив-константа заховався у палітрі “All Controls”->”Array & Cluster”. У LabVIEW масиви представлено у вигляді такої-собі рамки, всередину якої можна помістити якусь величину. Початково масив не має типу, це просто контейнер. Певного типу даних масив набуває тоді, коли в нього розміщують об’єкт цього типу.

 

Масиви в LabVIEW

Отож зліва вгорі: порожній контейнер-масив, внизу – цей же контейнер, коли в нього помістили візуальний компонент – масив індикаторів. Справа вгорі піктограма пустого масиву-контейнера (візуальний лівіше, невізуальний – правіше), внизу – піктограма масиву індикаторів (зліва) та масиву чисел (справа).

Для роботи з масивами у LabVIEW призначено цілий ряд функцій, про які розкажу трохи детальніше.

 

Функції LabVIEW для роботи з масивами

Отож, зліва направо і згори донизу.

Перша функція Array Size – повертає кількість елементів у масиві. Якщо масив одновимірний, то результат буде числом, якщо розмірність масиву більша, то результатом буде масив, що містить кількість елементів по кожній розмірності. Може трохи заплутано, але логічно.

Наступна функція Index Array – повертає елемент масиву за його номером. На вхід подаємо відповідно масив і потрібний індекс, а на виході отримуємо елемент із цим індексом. Не забуваємо, що нумерація елементів масиву починається з нуля.

Йдемо далі. Функція Replace Array Subset дозволяє замінити частину масиву іншими даними. На вхід подаємо початковий масив, індекс елементу, з якого слід проводити заміну, та масив (або одне значення), які слід вставити до початкового масиву. На виході отримуємо змінений масив.

Щось схоже роблять дві наступні функції, які я опишу разом: Insert Into Arrayта Delete From Array – вони дозволяють вставити дані у масив з потрібної позиції, та видалити частину даних із масиву. В другому випадку отримуємо і відредагований масив і видалену порцію у окремому масиві.

Функція Initialize Array, як на мене, досить непотрібна – вона дозволяє створити масив, уже заповнений однаковими даними, функція Build Arrayоб’єднує декілька окремих елементів у масив, а Array Subset навпаки виокремлює частину даних із масиву, (різниця від Delete From Array у тому, що з початкового масиву дані не зникають).

Наступні функції потрібні виключно при роботі з одновимірними масивами (що видно з їх назв). Rotate 1D Array дозволяє здійснити циклічний зсув елементів масиву (задаємо кількість елементів, які з кінця масиву перекочують на його початок, посунувши всі інші ближче до кінця), а Reverse 1D Array просто “віддзеркалює” масив.

Search 1D Array дозволяє визначити, чи зустрічається у масиві певний підмасив (входження підмасиву). Можна задати початковий індекс для пошуку, пропустивши частину даних. А отримуємо порядковий номер (індекс) елемента, з якого починається входження. Split 1D Array розділяє масив на два з потрібної позиції, а Sort 1D Array сортує масив у порядку зростання.

Корисною є також функція Array Max & Min – вона повертає найбільший та найменший елементи масиву, причому як саме значення, так і порядковий номер.

Функція Transpose 2D Array служить для транспонування двовимірного масиву (простіше кажучи, просто повертає його на 90 градусів, міняючи відповідні індекси місцями, таким чином масив А[i,j] стає масивом A’[j,i]). Іноді буває корисною.

Функція Interpolate 1D Array дозволяє знайти деяку величину на основі лінійної інтерполяції елементів масиву, а що робить Transpose 1D Array я, чесно кажучи, пояснити не можу. Не користувався жодного разу   Як, між іншим, функціями Interleave 1D Array та Decimate 1D Array, які служать для утворення одного масиву з кількох, та розкладання масиву на кілька. Причому це робиться десь наступним чином: скажімо, ми розбиваємо масив на 5 частин. Тоді першим елементом першого масиву буде перший елемент початкового, першим елементом другого масиву – другий елемент початкового і т.д. Другим елементом першого масиву буде шостий елемент і так далі. Аналогічно і зі склеюванням підмасивів докупи.

Ну і, нарешті, останній рядочок (тут взагалі все просто). Першою йде масив-константа (та сама “рамочка”), далі дві функції для взаємного перетворення масивів у кластери і навпаки (про кластери розповім пізніше). І останньою стоїть функція Reshape Array, яка дозволяє “змінити форму”, тобто розмірність, масиву. Так можна із одновимірного масиву зробити двовимірний.

Поки все. Далі я розповім про те, як працювати з масивами, тому раджу підписатися на RSS або новини у соціальних мережах.

7. Масиви і цикли у LabVIEW

Продовжую розповідь про використання масивів у LabVIEW і цього разу зачепимо таку цікаву штуку як застосування циклів. Хто вчився програмувати бодай на паскалі чи бейсику, той в курсі, що працювати з масивами найкраще якраз використовуючи цикли. LabVIEW у цьому плані взагалі класна штука.

От наприклад, спробуємо зробити невеличку програму, яка виводитиме в масив числа від 0 до 9. Для цього організовуємо цикл While, термінал Loop Iteration порівнюємо з константою (т. як лічильник ітерацій починає свою роботу з 0, то константу беремо рівною 9) і зупиняємо цикл, якщо рівність справджується. Результат виводимо на числовий індикатор.

Приклад циклу While Loop

Ой… Як бачите, програма видала не всі числа, а тільки останнє з них (та й індикатор ніяк не схожий на масив). Це тому, що для циклів типу While Loop за замовчуванням вимкнено автостворення масивів (Indexing). Спробуємо це виправити. Натискаємо праву кнопку миші на тунель (синій квадратик на межі циклу) і в контекстному меню обираємо “Enable Indexing”.

Вмикаємо автостворення масивів

Насправді, як тільки ми увімкнемо автостворення масивів, програма відразу “зламається”, бо числовий індикатор не підходить у даному випадку. Тому видаляємо індикатор і створюємо його заново (в контекстному меню тунеля вибираємо Create->Indicator). Зверніть увагу на те, що сам тунель зараз має дещо інший вигляд: це вже не синій квадратик, а квадратик із квадратними дужками [], які, власне, і вказують на те, що результатом операції буде масив.

На лицьовій панелі з’явився індикатор-масив, його треба ще розтягнути, аби було видно всі десять елементів масиву.

Приклад циклу While Loop з автостворенням масиву

Загалом все добре і така програма навіть працюватиме. Та насправді для роботи із масивами більше підходить цикл з параметром, в якому кількість ітерацій задана наперед (цикл “For”). У LabVIEW такий цикл є і знаходиться він у палітрі All Functions -> Structures -> For Loop.

Приклад циклу з параметром (For Loop)

Термінал “Параметр” (позначено буквою N) служить для задання і відображення загальної кількості ітерацій, а термінал “Лічильник ітерацій” показує номер поточної. Тут можна трохи заплутатися, але загалом все зрозуміло. Важливо те, що для таких циклів автостворення масивів увімкнено за замовчуванням, тому отака програма працюватиме аналогічно попередній, тільки без зайвих маніпуляцій.

Приклад створення масиву у циклі For Loop

Зверніть увагу також на той факт, що в даному випадку ми вказуємо кількість ітерацій, а не номер останньої. Тобто якщо у першому випадку писали цифру 9, бо нумерація ітерацій починається з 0 і десята має номер 9, то тут треба вказувати 10.

Так само легко можна створити і двовимірний масив (таблицю) за допомогою двох вкладених циклів:

Створення двовимірного масиву (таблиці)

Внутрішній цикл задає кількість рядків, а зовнішній – кількість стовбців. Якщо на вхід циклу подати масив, то кількість ітерацій N можна не задавати – вона вибереться автоматично відповідно до кількості даних у масиві. Це називається автоіндексацією.

Автоматичне визначення кількості ітерацій циклу

Тобто отака програма працюватиме без підключення терміналу N, хоча завжди можна вказати і кількість ітерацій, відмінну від кількості елементів у масиві.

Зауважу ще, що для циклу з параметром теж можна вимкнути автостворення масивів (вимкнеться тоді і автоіндексація), це робиться у контекстному меню тунеля (опція Disable Indexing).

8. Регістри зсуву: доступ до даних попередньої ітерації циклу

При програмуванні деяких задач виникає потреба у доступі до результатів виконання попередньої ітерації (слово “рекурсія” знайоме, думаю, всім). В LabVIEW цю проблему вирішено досить цікаво і різнопланово.

Найбільш простим способом отримати інформацію про виконання попередньої ітерації (або кількох ітерацій) циклу є використання зсувних регістрів (Shift Registers). Для прикладу розглянемо програмку, яка виводить номер ітерації циклу While Loop:

Цикл While Loop

Як ми знаємо, за замовчуванням для циклу While Loop вимкнено автостворення та автоіндексацію масивів, тому індикатор відображатиме лише номер останньої ітерації (останнє значення лічильника) – число 9.

Нехай нам потрібно отримати попереднє значення цього лічильника, тобто результат попередньої ітерації циклу, скориставшись для цього зсувними регістрами. Для початку треба активувати регістри для циклу (як це зробити демонструє наступний рисунок).

 

Створення зсувного регістру (Shift Register)

Через термінал ліворуч можна здійснити ініціалізацію регістру, під’єднавши до нього, наприклад, певну константу, а також отримати результат попередньої ітерації. Як використовується ініціалізація демонструє наступний рисунок.

Ініціалізація зсувного регістра

Окрім інформації про передостанню ітерацію можна отримати значення на задану кількість кроків у глибину циклу. Для цього просто треба додати ще кілька “комірок” до регістра, використовуючи контекстне меню.

Доступ до кількох попередніх ітерацій

Таким чином можна отримувати інформацію практично про кожен крок виконання циклу окремо, наприклад отак:

Приклад використання Shift Register для доступу до кількох попередніх ітерацій

9. Вузли зворотнього зв’язку: доступ до даних попередньої ітерації циклу

Окрім зсувних регістрів у LabVIEW є ще один механізм доступу до результатів виконання попередньої ітерації циклу – вузли зворотнього зв’язку (Feedback Node). Отримати такий вузол можна дуже просто – достатньо з’єднати вихід якої-небудь функції з її ж входом.

Інший варіант – знайти відповідну піктограму у палітрі “Всі Функції”: All Functions -> Structures -> Feedback Node і розмістити її на блок-діаграмі. Очевидно, що розмітити вузол зворотнього зв’язку можна лише всередині циклу, при цьому на лівій межі циклу з’явиться відповідний термінал у вигляді невеличкого ромбика – він служить для ініціалізації вузла (що таке ініціалізація і для чого вона потрібна написано у попередньому пості).Термінал для ініціалізації (Initializer Terminal) можна вимкнути із контекстного меню вузла. На наступному рисунку наведено приклади Feedback Node у різних циклах.

Загальний вигляд вузла Feedback Node

Очевидно,що в такому виконанні програма не працюватиме, оскільки вузол не під’єднано до жодної функції. Про це свідчить колір піктограми. Спробуємо створити просту програму, яка розраховуватиме суму всіх чисел від 0 до якогось наперед заданого числа.

 

Приклад використання Feedback Node

Кілька слів для пояснення роботи даної програми. Регулятором N задається кількість ітерацій (оскільки перша ітерація має порядковий номер рівний нулю, то в результаті виходить сума чисел від 0 до N-1), далі вузол сумування бере значення терміналу Loop Iteration (i) і сумує його із результатом попередньої ітерації, який зберігається у Feedback Node. Для першої ітерації вузол Feedback Node не містить ніяких даних, тож потрібно його ініціалізувати (для цього подається початкове значення на відповідний термінал, у нашому випадку це константа “0″).

Ініціалізація потрібна також для того, щоб при повторному запуску програми вміст вузла Feedback Node не зберігався з попереднього запуску – це може викликати появу дуже непередбачуваних помилок, які важко відстежити.

Приклад такого явища ілюструють два наступних рисунки. На першому вузол Feedback Node використовується спільно з функцією Build Array для того, щоб створити масив, елементами якого є ті самі проміжні значення вузла зворотнього зв’язку:

Створення масиву із використанням Feedback Node

Як видно з рисунка, результат в обох випадках ідентичний. А тепер видалимо ініціалізацію масиву і подивимося що зміниться.

Чому треба ініціалізувати Feedback Node

Перші елементи масиву ідентичні, та після другого запуску програми дані просто дописуються в кінець масиву. Знову і знову… Якщо потім десь використовуватиметься, скажімо, функція Array Size, то ми отримаємо не те, на що розраховували. Особливо якщо взяти до уваги той факт, що на передній панелі може відображатися не весь масив.

10. Кластери у LabVIEW

У дописі про масиви у LabVIEW не було згадано про ще один специфічний складний тип даних, а саме про кластери. Якщо масив може містити дані лише одного типу, то, на відміну від нього, кластер – конструкція, яка вміщує різні дані і служить насамперед для зручності. Наприклад якщо потрібно передати дані з десятку полів вводу до десятку індикаторів через усю блок-діаграму, то використання кластерів може суттєво спростити розуміння програми за рахунок “розвантаження” блок-діаграми від провідників.

Групування провідників у кластер

Як видно з рисунку у випадку без кластера (б) через всю блок-діаграму проходить 5 провідників, що навіть при відсутності на їх шляху інших вузлів виглядає не надто зрозуміло. Якщо ж згрупувати провідники у кластер (а), то отримаємо своєрідний “джгут”, всередині якого помістилися всі провідники.

Аналогічно можна згрупувати у кластер і візуальні компоненти, що ще більше спростить блок-діаграму (порівняйте наступний рисунок з попередніми).

 

Приклад використання кластерів

На передній панелі віртуального приладу кластер зображується у вигляді рамочки, всередину якої потрібно помістити візуальні компоненти або їх масиви. При цьому слід пам’ятати, що порядок, у якому ви перетягуєте компоненти всередину кластера визначають порядок їх всередині, а кластери з однаковим вмістом але різним порядком елементів вважаються різними і не можуть бути сполучені між собою.

В палітрі візуальних компонентів LabVIEW масиви і кластери поєднано в одну підпалітру (фактично там нас цікавить тільки структура “Cluster”, яка і створює порожній кластер-заготовку), а у палітрі функцій вузли для роботи з кластерами знаходяться окремо (All Functions -> Cluster).

Палітри компонентів для роботи з кластерами

Список функцій для роботи з кластерами досить скромний і включає у себе функції Bundle, Unbundle, Bundle by Name, Unbundle by Name, що служать відповідно для створення кластера з окремих провідників, розбивання кластера на окремі провідники, створення кластера з провідників, орієнтуючись на імена відповідних змінних, та розбирання кластера на складові за їх іменами (корисно коли треба виділити з кластера окремий провідник).

Для роботи з масивами кластерів служать функції Build Cluster Array таIndex & Bundle Cluster Array, а вузли Cluster to Array і Array to Clusterдозволяють здійснювати перетворення кластерів, що містять дані одного типу, у масиви і навпаки. При цьому слід мати на увазі, що нумерація елементів масиву починається з нуля, а кластера – з одиниці.

11. LabVIEW: діалог з користувачем

У будь-якій програмі іноді виникає потреба відобразити певну інформацію не просто десь, а у віконечку, яке приверне увагу користувача і заблокує роботу з програмою доти, поки він не натисне відповідну кнопку у вікні (хоча більшість ці повідомлення навіть не читає, і просто тисне “ОК”). Також часто потрібно щоб користувач ввів якісь дані у відповідний момент роботи програми. Для цього у LabVIEW використовуються вузли, які реалізують діалогові вікна.

Загалом такі вузли знаходяться у палітрі All Functions -> Time & Dialog, у якій, судячи з назви, розміщено також компоненти, що дозволяють реалізувати відлік часу, а також вузли для обробки помилок виконання програми (роботу цих вузлів буде розглянуто згодом).

Вузли для створення діалогових вікон у LabVIEW

Серед функцій, що дозволяють виводити на екран діалогові вікна, розрізняють три функції низького рівня: One Button Dialog, Two Button Dialog та Three Button Dialog – їх призначення зрозуміло з назви, а приклад використання зображено на наступному рисунку.

Діалогові функції низького рівня у LabVIEW

Вузли One та Two Button Dialog у якості аргументів приймають лише текстові величини: повідомлення та назви відповідних кнопок. Для вузла Three Button Dialog можна задати також і заголовок вікна, можливість натискати кнопку за допомогою гарячих клавіш на клавіатурі, та можливість закрити діалогове вікно кнопкою з хрестиком.

Більш простими у використанні та налаштуванні є експрес інструменти (Express VI), представлені зокрема вузлом Display Message to User, який можна сконфігурувати відразу після розміщення на блок-діаграмі.

 

Налаштування та використання Express VI Display Mesage to User

Цей експрес інструмент служить для виводу вікна з повідомленням. Саме повідомлення можна ввести при налаштуванні інструменту, або ж подавати на його вхід “Message” у процесі виконання програми. Також при налаштуванні можна вибрати кількість кнопок у вікні (одна або дві), та ввести назви цих кнопок. На рисунку вгорі зображено приклад діалогового вікна, що генерується цим інструментом, зображення вузла Display Mesage to User на блок-діаграмі та вигляд вікна конфігурації інструменту.

Окремої уваги заслуговує використання діалогових вікон для вводу інформації користувачем. Для цього в LabVIEW використовується експрес інструментPrompt User for Input. На наступному рисунку зображено зовнішній вигляд вікна, яке генерується цим інструментом (а), піктограму, яка позначає відповідний Express VI на блок-діаграмі (б) та вікно конфігурації (в).

Налаштування та використання функції Prompt User for Input

12. Метод золотого перерізу у LabVIEW

Наші студенти вивчають багато різних речей, які навряд чи знадобляться їм у майбутньому, та загальне уявлення про які треба все ж мати. Однією з таких речей є пошук максимуму чи мінімуму функції методами золотого перерізу та дихотомії.

Оскільки умовою отримання заліку є також написання програми, що реалізує метод золотого перерізу \ дихотомії, досить актуальним питанням є розробка такої програми в середовищі LabVIEW. Не буду вдаватися в деталі алгоритму (їх можна запросто знайти в пошуковиках чи методичках), просто далі приклад програми, яка знаходить максимум функції методом золотого перетину.

Метод золотого перерізу у LabVIEW

Особливо ледачі можуть завантажити готову програму отут: Golden

13. (Додаток) Що можна написати на LabVIEW?

Публікації про середовище розробки під назвою LabVIEW не викликали ажіотажу – це й зрозуміло, насправді сфера застосування LabVIEW досить вузька і специфічна. Проте цього разу замість чергового нудного уроку я покажу приклад програми, створеної саме у LabVIEW, причому не надто вузькоспеціалізованої, та корисної, насамперед для багатьох студентів. Дивимося скрін:

 

Перетворення з десяткової у двійкову систему числення

На рисунку зображено програму, яка перетворює числа із десяткової системи числення у двійкову, а також перетворює з десяткової системи числення у шістнадцяткову.

Здавалось би, яка користь від такої програми, адже є звичайний собі калькулятор (навіть той, що йде у комплекті з ОС Windows) – натиснув дві клавіші і маєш результат.

Певною мірою це так. Але плюс даної софтини у тому, що вона не просто перетворює числа, а ще й показує як це треба робити. Тобто орієнтована програма не стільки на результат, як на розуміння шляху його досягнення. У вікні програми ми бачимо яким саме чином здійснюється перетворення, а саме це і треба студентам технічних вузів, особливо тим, що згодом матимуть справу з цифровою технікою, програмуванням, тощо.

Сама програмка вкладається у сотню кілобайт (скачати можна тут), але для роботи потребує встановленого пакету LabVIEW 7 Runtime Engine, розміром понад 30 мегабайт (зараз така тенденція нікого не дивує, правда). Скачати саму LabVIEW 7 RTE можна за наступним посиланням. Ніякого піратства, воно безкоштовне, на відміну від самого LabVIEW (але й тут є тріал на 30 днів).

14. Коротко про Formula Node у LabView

Про використання формул у LabVIEW я вже писав, та то було про експрес-інструмент, а цього разу поговоримо про значно більш функціональну річ: структуру Formula Node, яка дозволяє не просто задавати формули довільної складності, але фактично є нескладною вбудованою мовою програмування традиційного текстового типу.

Знайти відповідну структуру можна у палітрі “All Functions -> Strucrures -> Formula Node”; іконка її має вигляд рамочки з формулою y=f(x) і її легко запам’ятати.

Де знаходиться вузол Formula Node

Сама структура на блок-діаграмі являє собою рамку сірого кольору, всередині якої знаходиться текстовий курсор. У цій рамці можна вводити оператори, та спочатку необхідно забезпечити передачу даних від регуляторів програми всередину структури. Це робиться командою “Add Input” з її контекстного меню.

 

Додаємо входи до Formula Node

Після додавання входів їм слід дати імена (тобто ввести імена відповідних змінних, що використовуваимуться у текстовій частині програми). У нашому випадку імена змінних співпадають з назвами відповідних полів вводу: А,В,С.

Під’єднуємо регулятори до новостворених терміналів і аналогічну операцію проводимо з вихідною величиною (створюємо термінал, зв’язаний зі змінною Result, і підключаємо його до індикатора на блок-діаграмі), використовуючи пункт “Add Output” контекстного меню структури.

 

Додаємо вихід до Formula Node

Для простоти розуміння програми термінали-входи краще розміщувати в лівій частині структури, а термінали з результатами – у правій. В нашому випадку результат вього один, хоча загалом структура Formula Node дозволяє створювати досить складні програми всередині інструментів LabVIEW. Для прикладу нижче подано ілюстрацію програми із використанням оператора “If”/

 

Реалізація оператора вибору у Formula Node

У даній програмі результат буде рівний значенню змінної С якщо значення змінних А та В рівні, або сумі А+В, якщо це не так. Як видно з ілюстрації, у Formula Node використовується синтаксис, близький до мови програмування С (Сі), тому особливих проблем виникнути не повинно. Опис синтаксису можна знайти і в довідці самого LabVIEW.

Для тих, кому функціоналу Formula Node не вистачає, у новіших версіях LabVIEW передбачено зокрема і вузол MathScript Node, що дозволяє використовувати відповідні скрипти.

Приклад MathScript Node

Принципи роботи з MathScript Node ідентичні до таких при використанні Formula Node.

15. Формули у LabView

Вузлів, що знаходяться у палітрі “All Functions” -> “Numeric” достатньо для розробки невеликих програм, проте при необхідності розраховувати певні значення за складною формулою блок-діаграма часто стає занадто захаращеною, особливо у тому випадку, коли для отримання результату потрібно обробити значення кількох параметрів.

Типовий приклад: пошук коренів рівняння через дискримінант. Так для квадратного рівняння виду Y=ax^2+bx+c

дискримінант, як відомо, можна знайти з виразу:

D=b^2-4ac, а корені такого рівняння визначаються як (-b±sqrt(D))/2a, тобто загальна формула для коренів вже буде досить складною для розуміння (див. рисунок 1)

Розв'язування квадратного рівняння через дискримінант

Формула коренів кубічного рівняння є ще більш складною і реалізація її таким чином буде занадто громіздкою.

У подібних ситуаціях значно зручніше використовувати експрес-інструмент Formula, розташований також у палітрі “All Functions” -> “Numeric”. При розміщенні даного вузла на блок-діаграмі з’являється вікно для налаштування, у якому можна ввести потрібну формулу:

 

Використання експрес-інструменту Formula

Таким чином програма пошуку коренів квадратного рівняння буде мати наступний вигляд:

 

Розв'язування квадратного рівняння через дискримінант з використанням Express VI "Formula"

Звичайно, не настільки наглядно, як у першому випадку, зате дозволяє уникнути плутанини.

Іншим варіантом є використання вузла “Formula Node”, який дозволяє не просто розраховувати значення величини за математичною формулою, але й підтримує галуження, цикли, масиви і т.п. Тобто фактично є простою текстовою мовою програмування всередині LabVIEW.

Про цей вузол поговоримо трохи згодом.