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

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

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

image

Частина LabVIEW

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

image

Тепер більш докладно.
1 — Ініціалізація джойстика. Можна знайти в Function Palette в розділі Connectivity->Input Device Control. Якщо до комп'ютера підключений один джойстик, як у моєму випадку, параметр Device Index рекомендується прирівнювати до 0.
2 — Отримання даних з пристрою введення. Дані про кнопках і напрямках осей (хрестику) зберігаються у кластерах, які з допомогою функції Unbundle потрібно розбити на елементи, щоб в подальшому їх обробляти. «Кнопковий» кластер 3 (на малюнку він вже розбитий на елементи) складається з бульових елементів; при натиснутій кнопці відповідний елемент кластера приймає значення TRUE. З «осьовим» кластером 4 справа йде трохи інакше: він складається з цілочисельних елементів, і при натиснутій клавіші ВГОРУ перший елемент кластера — X axis — приймає значення -32768, ВНИЗ клавіші відповідає значення 32767. З другим елементом кластера — Y axis — все приблизно так само: НАЗАД = -32768, ВПЕРЕД = 32767.
5 — Формування рядка. Функція Format Into String формує (або ж повертає) рядок з елементів різних типів даних. У моєму випадку це булева елементи та їх усього 8, тому на виході буде рядок з 8 символів. Тут необхідне пояснення: якщо жодна кнопка не натиснута, рядок має вигляд «00000000»; якщо ж, наприклад, натиснути кнопку 1, рядок буде такий «1000000», якщо кнопка 2, то такий «01000000» і т. д. В залежності від значення це рядки в серійний порт буде записуватися певне число, яке вже й буде обробляти ПЛК100. До речі, параметр format string» функції Format Into String задано так "%d%d%d%d%d%d%d%d", щоб перетворювати вхідні булеві FALSE і TRUE в нулі і одиниці, і в підсумку отримувати рядок виду, наприклад, «10000000», а не «TRUEFALSEFALSEFALSE...». Ось так. Можна простіше? Можна, але в інший раз.
6 — Конфігурування і відкриття серійного порту. Я залишив всі параметри за замовчуванням, додавши лише керуючий елемент для вибору номера порту. Для роботи з COM-портом повинна бути встановлена NI-VISA (тут www.ni.com/download/ni-visa-5.4.1/4626/en/).
7 — Структура Case. В залежності від значення рядка, сформованої функцією Format Into String, пише в серійний порт число (11, наприклад, відповідає кнопці 1, 12 — кнопка 2 і т. д.). Це число попередньо конвертується функцією Decimal Number To 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.

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

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.