ПЛК100 + LabVIEW + джойстик

Одного разу на моєму робочому столі опинилися usb-джойстик і ПЛК (програмований логічний контролер) фірми ОВЕН - ПЛК100, при цьому на комп'ютері було запущено середовище LabVIEW. Я подумав, що все це - хоча б забави заради - можна об'єднати, організувавши управління ПЛК (його виходами) за допомогою кнопок джойстика (пізніше я вирішив використовувати не просто кнопки, а їх комбінації - ВНИЗ, ВПЕРЕД, Y, наприклад).

Отже, як все це працює. LabVIEW обробляє натискання клавіші джойстика і передає інформацію про натиснуту клавішу в ПЛК100 (в даному випадку - через послідовний порт); ПЛК100, згідно з завантаженою в нього програмою, реагує на певні комбінації клавіш включенням/відключенням своїх виходів.

Частина LabVIEW

Програма, що обробляє натискання кнопок джойстика і передає інформацію про них в ПЛК100, в загальному вигляді виглядає так:

Тепер більш детально.

1 - Ініціалізація джойстика. Можна знайти у Function Palette в розділі Connectivity- > Input Device Control. Якщо до комп'ютера підключено один джойстик, як у моєму випадку, параметр Device Index рекомендується прирівнювати до 0.

2 - Отримання даних з пристрою вводу. Дані про кнопки та напрямки осей (хрестику) зберігаються в кластерах, які за допомогою функції Unbundle потрібно розбити на елементи, щоб в подальшому їх якось обробляти. «Кнопковий» кластер 3 (на малюнку його вже розбито на елементи) складається з бульових елементів; якщо натиснути кнопку, відповідний елемент кластера приймає значення TRUE. З «осьовим» кластером 4 справа йде трохи інакше: він складається з цілочисельних елементів, і при натиснутій клавіші ВГХ перший елемент кластера - X axis - приймає значення -32768, клавіші ВНИЗ відповідає значенню 32767. З другим елементом кластера - Y axis - все приблизно так само: НАЗАД = -32768, ВПЕРЕД = 32767.

5 - Формування рядка. Функція Oneat Into String формує (або ж повертає) рядок з елементів різних типів даних. У моєму випадку це булеві елементи і їх всього 8, тому на виході буде рядок з 8 символів. Тут потрібне пояснення: якщо жодна кнопка не натиснута, рядок має вигляд «00000000»; якщо ж, наприклад, натиснута кнопка 1, то рядок буде таким «1000000», якщо кнопка 2, то такий «01000000» тощо. Залежно від значення цього рядка у послідовний порт буде записуватися певне число, яке вже і буде обробляти ПЛК100. "% d% d% d% d% d% d% d" ", щоб перетворювати вхідні булеви FALSE і TRUE в нулі та одиниці і в результаті отримувати рядок виду, наприклад", 10000000 ", а не" TRUFALSEFALSEFALSEALSE.... " Ось так. Можна простіше? Можна, але іншим разом.

6 - Налаштування і відкриття послідовного порту. Я залишив всі параметри за замовчуванням, додавши тільки керуючий елемент для вибору номера порту. Для роботи з COM-портом повинна бути встановлена NI-VISA (тут www.ni.com/download/ni-visa-5.4.1/4626/en).

7 - Структура Case. Залежно від значення рядка, сформованого функцією Oneat Into String, пише в послідовний порт число (11, наприклад, відповідає кнопці 1, 12 - кнопці 2 тощо). Це число попередньо конвертується функцією Number To Decimal String - на малюнку цифра 8 (без цього блоку ПЛК100 з незрозумілих причин читав з порту якісь кракозябри).

Програма ПЛК

Трохи про порти ПЛК100. Цілих три роз'єми можуть працювати як COM-порт: це Debug-232 на лицьовій панелі, RS-232 і RS-485 внизу. При відкритті порту потрібно буде вказати його номер: для Debug-232 це 4, для RS-232 - 1, для RS-485 - 0. Я використовував RS-485, підключивши ПЛК до комп'ютера через дешевий китайський перехідник RS-485- > USB (на фото), відповідно, в програмі в якості номера порту коштує 0.

ПЛК100 програмується в середовищі Codesys 2.3. Крім того, знадобиться так званий таргет - щось на зразок файлу з описом конфігурації програмованого пристрою. Для ініціалізації та відкриття порту я використовував бібліотеку ComService.lib (бібліотеку і приклад до неї можна завантажити тут www.owen.ru/forum/showthread.php?t=551&page=6). Дії налаштування і відкриття порту я об'єднав в одному функціональному блоці - див. малюнок нижче.

Видно, що об'єкт'set'оголошено як COMSETTINGS. Це екземпляр структури COMSETTINGS, що містить параметри порту; вона вже оголошена в бібліотеці ComService (якщо бути точним, то в бібліотеці SysComLib, яка входить до складу ComService). Параметри досить стандартні, варто тільки звернути на set. Port = 0 - це RS-485, про який було сказано вище.

Функціональний блок COM_SERVICE має два параметри: перший - це назва структури COMSETTINGS, другий - тип операції, де 0 відповідає налаштуванню і відкриттю.

Далі за допомогою функції SysComRead, що входить до бібліотеки SysLibCom, читаємо дані з порту. Параметр dwHandle - це номер порту (RS-485 в даному випадку), dwBufferAddress - покажчик на змінну, куди будуть читатися дані, dwBytesToRead - кількість байт, що читаються (у моєму випадку це 2), dwTimeout - час у мс, після якого функція зобов'язана завершитися; якщо поставити занадто мало, то функція просто нічого не прочитає.

Далі йде конвертація рядка, ліченого з порту, в ціле число і порівняння цього числа: якщо воно, наприклад, дорівнює 10, то жодна кнопка не натиснута, якщо 11 - то натиснена X тощо.

Для обробки комбінацій клавіш я запрограмував 6 функціональних блоків - 3 для включення перших трьох релейних виходів ПЛК (думаю, трьох виходів буде для початку достатньо) і 3 для їх відключення; чотири комбінації з 3-х клавіш і дві з 4-х. Всередині ці блоки виглядають ось так:

i1, i2, i3 - це перша, друга і третя кнопки комбінації відповідно. Функціональний блок для чотирикнопкової комбінації відрізняється не сильно, і отримати його з трикнопкового це справа техніки, тому його вміст я опускаю.

Слід додати, що для кожного функціонального блоку я оголошував свої екземпляри блоків R_TRIG, TON і TOF, тому що на одну комбінацію реагували б усі три виходи. Але для блоків включення і вимикання одного і того ж виходу я залишив їх однаковими.

У підсумку програма у мене виглядала так (пропускаю місце з відкриттям порту):

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

Треба сказати, що на швидкі натискання вся ця система (кажу «система», бо не знаю, в якому саме місці був «затор») реагувала досить неохоче, якщо взагалі реагувала; неспішні натискання (як на відео) трохи покращують ситуацію, але все ж іноді реакція на них була відсутня. Але ж у ПЛК100 є ще й роз'єм Ethernet. Так що наступного разу я спробую зробити хоча б невелике поліпшення, прив'язавши ПЛК до LabVIEW через OPC-сервер по Ethernet.

Дякую за увагу.