QtVCP можна використовувати для створення панелей керування, які взаємодіють з HAL.

1. Вбудовані віртуальні панелі керування

Доступно кілька вбудованих панелей HAL.

У терміналі введіть qtvcp list, щоб побачити список.

1.1. копія

Використовується для копіювання вбудованого коду екранів/панелей VCP/QtVismach QtVCP до папки, щоб його можна було налаштувати.

У термінальному запуску:

qtvcp copy
Діалогове вікно копіювання QtVCP – екран, панель або панель копіювання коду Vismach
Figure 1. Діалогове вікно копіювання QtVCP - екран, панель VCP або панель копіювання коду QtVismach

1.2. spindle_belts

Ця панель призначена для відображення додаткових даних частотного перетворювача RS485, а також для налаштування 4-шківного шпиндельного приводу з 2 ременями за допомогою серії кнопок.

Панель ременів шпинделя QtVCP - Ремені шпинделя VCP

Крім того, це також корисний шаблон для вашої власної панелі, оскільки він містить:

  • Відображення додаткових даних HAL

  • Кнопки та групи кнопок

  • Динамічні зміни стану кнопок увімкнено/вимкнено залежно від стану інших кнопок

  • Збереження даних у файлі qtdragon.prefs

  • Кнопка користувача для скидання налаштувань частотно-регульованого перетворювача (VFD)

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

1.2.1. Додаткові вимоги

  • Шпиндельний привід (наприклад VFDMOD)

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

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

  • Підключіть вхідні контакти qtdragon.belts.<назва-кода> у вашому HAL-файлі postgui.

1.2.2. Функція

Ремені розділені на дві групи кнопок: передні ремені та задні ремені. Вони пронумеровані відповідно до таблички на машині. Кнопки в групі є взаємовиключними, тобто в групі можна вибрати тільки одну.

Крім того, з таким механізмом неможливо встановити обидва ремені на одному рівні, оскільки на один шків натяжного ролика не можна встановити два ремені. Тому, якщо вибрано один ремінь, його протилежна кнопка стає неактивною. Наприклад, якщо вибрано ремінь 3, ремінь 7 стає неактивним.

1.2.3. Команди вбудовування

Додайте ці рядки до розділу [DISPLAY] у вашому INI-файлі.
Приклад tab_location стосується екрана QtDragon.

EMBED_TAB_NAME=Spindle Extras
EMBED_TAB_COMMAND=qtvcp spindle_belts
EMBED_TAB_LOCATION=tabWidget_utilities

Ось як завантажити spindle_belt зі скрипта HAL:

loadusr qtvcp spindle_belts

1.2.4. Підказки щодо налаштування

Налаштування панелі:

  • Скопіюйте файли, розташовані в /user/share/qtvcp/qtdragon/panels/belts, до: ~/linuxcnc/configs/<my_configuration_folder>/qtvcp/panels/belts (для цього можна скористатися діалоговою панеллю копіювання)

  • Редагувати belts.ui за допомогою дизайнера.

  • Редагуйте belts_handler.py за допомогою текстового редактора

  • Підключіть відповідні контакти у файлі postgui.hal

  • Переконайтеся, що ваш файл postgui завантажено вашим INI-файлом.

Щоб отримати детальнішу інформацію, зверніться до документації QtVCP та QtDragon. Файл обробника Python також надає корисний шаблон для будь-якої користувацької панелі.

1.3. test_dial

  • Ця панель має циферблат, який регулює вихідні контакти S32 та Float HAL.

  • Діапазон циферблата можна налаштувати у випадаючому меню.

  • Вивід можна масштабувати за допомогою spinbox.

  • Для автоматичного вибору та підключення до сигналу можна використовувати combobox.

loadusr qtvcp test_dial
QtVCP test_dial Панель - Тестовий циферблат VCP
Figure 2. QtVCP test_dial Панель - Тестовий циферблат VCP

1.4. test_button

  • Ця панель має кнопку, яка встановлює PIN-код HAL.

  • Кнопку можна вибрати як минуточасну або _кнопку_перемикання.

  • Буде створено HAL-пін, який відповідає стану кнопки.

  • Колір індикатора кнопки можна налаштувати у випадаючому меню.

  • Вивід або сигнал HAL можна вибрати для відстеження стану кнопки.

  • Ви можете додати більше кнопок з випадаючого меню.

  • Ви можете завантажити Halmeter з випадаючого меню.

  • Ви можете завантажити тестовий світлодіод з випадаючого меню.

  • Кнопку можна від’єднати від основних вікон.

Ось як завантажити test_button зі скрипта HAL:

loadusr qtvcp test_button
loadusr qtvcp -o 4 test_button

Перемикач -o встановлює кількість кнопок, з яких починається завантаження панелі.
Якщо завантаження відбувається безпосередньо з терміналу, пропустіть loadusr.

QtVCP test_button – Тестова кнопка VCP
Figure 3. QtVCP test_button – Тестування кнопки VCP

1.5. test_led

  • Ця панель має світлодіод, який можна вибрати для відстеження виводів/сигналів бітів HAL.

  • Колір світлодіодів можна налаштувати у випадаючому меню.

  • Текстове поле та стан можна вивести як мовлення, якщо вибрано звук.

  • «Випадаючий список» можна використовувати для автоматичного вибору та підключення до виводу/сигналу.

  • Ви можете додати більше світлодіодів з випадаючого меню.

  • Світлодіод можна від’єднати від основних вікон.

Ось як завантажити test_led зі скрипта HAL:

loadusr qtvcp test_led
loadusr qtvcp -o 4 test_led

Перемикач -o встановлює кількість світлодіодів, з яких починається завантаження панелі.
Якщо завантаження відбувається безпосередньо з терміналу, пропустіть loadusr.

QtVCP test_dial Панель - Тестовий світлодіод VCP
Figure 4. QtVCP test_dial Панель - Тестовий світлодіод VCP

1.6. test_panel

Колекція корисних віджетів для тестування компонента HAL, включаючи озвучування стану світлодіода.

loadusr qtvcp test_panel
QtVCP test_panel - Панель тестування компонентів HAL
Figure 5. QtVCP test_panel - Панель тестування компонентів HAL

1.7. cam_align

Віджет відображення камери для вирівнювання повороту.

Панель cam_align QtVCP – панель вирівнювання на основі камери
Figure 6. Панель QtVCP cam_align – панель вирівнювання на основі камери
Застосування

Додайте ці рядки до INI-файлу:

[DISPLAY]
EMBED_TAB_NAME = cam_align
EMBED_TAB_COMMAND = halcmd loadusr -Wn qtvcp_embed qtvcp -d -c qtvcp_embed -x {XID} cam_align
# Наступний рядок потрібен, якщо вбудовується в GMOCCAPY
EMBED_TAB_LOCATION = ntb_preview
Note
Усі <options> мають стояти перед назвою панелі cam_align.
Параметри Qtvcp
  • -c NAME Назва компонента HAL. За замовчуванням використовується назва файлу інтерфейсу користувача.

  • -d Налагодження ввімкнено. або вилучення для відсутності мінімального виводу

  • -v Увімкнено детальне налагодження. Ви можете знайти всі доступні роздільні здатності.

  • -x {XID} використовується для вбудовування в AXIS або Gmoccapy

  • -o <опція> Параметри, що передаються до cam_align. можуть використовувати кілька записів -o

Параметри вирівнювання Cam_align

Ось доступні опції -o:

  • size=400,400 Розмір вбудованого вікна (ширина, висота)

  • imagesize=300,300 Розмір зображення у вікні (ширина, висота)

  • rotincr=5 Встановлює крок обертання перехрестя прицілу. (градуси)

  • xscale=100 Масштабує зображення по осі X. Від’ємне значення призведе до перевертання зображення по осі X (у відсотках)

  • yscale=100 Масштабує зображення по осі Y. Від’ємне значення призведе до перевертання зображення по осі Y (у відсотках)

  • camnumber=1 Встановлює, яку системну камеру використовувати

  • api=V4L2 Встановлює бібліотеку OpenCV для камери

  • res=1280,720 Встановлює запитувану роздільну здатність (ширину, висоту)

Наприклад, ви можете додати ширину та висоту вікна, крок повороту та номер камери з INI за допомогою опцій -o.

EMBED_TAB_COMMAND = halcmd loadusr -Wn qtvcp_embed qtvcp -d -c qtvcp_embed -x {XID} -o size=400,400 -o rotincr=.2 -o camnumber=0 cam_align

Керування мишею:

  • одинарний клік лівою кнопкою миші - збільшити обертання перехрестя на один крок

  • одинарний клік правою кнопкою миші - зменшити обертання перехрестя на один крок

  • одинарне клацання середньою кнопкою миші — перемикання між кроками обертання

  • Утримуйте ліву кнопку миші та прокручуйте - прокручуйте, масштабуючи камеру

  • утримуйте праву кнопку миші та прокручуйте - кут повороту перехрестя прокручування

  • лише прокручування мишею - діаметр кола прокручування

  • подвійне клацання лівою кнопкою миші - скинути масштаб

  • подвійний клік правою кнопкою миші - скинути обертання

  • подвійне клацання середньою кнопкою миші - скинути діаметр кола

Щоб використовувати верхні кнопки, потрібно призначити команду (або підпрограму). Це може виглядати так:

[MDI_COMMAND_LIST]
MDI_COMMAND_CAM_ALIGN1=G10 L20 P1 X0 Y0,Set XY\nOrigin
MDI_COMMAND_CAM_ALIGN2=G0 X0 Y0,Go To\nOrigin

Де перша команда відноситься до кнопки «SET origin», а друга — до кнопки «GOTO Origin».
Зверніть увагу, що кома та текст після неї є необов’язковими — вони замінять текст кнопки за замовчуванням.
Ці кнопки є кнопками дій QtVCP і підпорядковуються цим правилам.

1.8. sim_panel

Невелика панель управління для імітації елементів управління бігом MPG тощо для імітованих конфігурацій.
MPG, кнопки вибору та кнопки управління експортують контакти HAL для підключення до linuxcnc.
Групи вибору та управління можна приховати, якщо вони не потрібні, за допомогою опції «-o hide=».
«groupBoxControl» та «groupBoxSelection» — це назви віджетів, які можна приховати.
Якщо ви хочете приховати обидва, використовуйте між ними кому без пробілів.
Опція «-a» зробить панель завжди активною над усіма вікнами.

loadusr qtvcp sim_panel

Тут ми завантажуємо панель без кнопок вибору MPG та з опцією «завжди зверху».

loadusr qtvcp -a -o hide=groupBoxSelection sim_panel
QtVCP sim_panel - Імітація панелі керування для тестування екрану
Figure 7. QtVCP sim_panel - Імітована панель керування для тестування екрану.

1.9. tool_dialog

Діалогове вікно ручної зміни інструменту з описом інструменту.

loadusr -Wn tool_dialog qtvcp -o speak_on -o audio_on tool_dialog

Опції:

  • -o notify_on - використовуйте діалогові вікна сповіщень на робочому столі замість власних вікон QtVCP.

  • -o audio_on - відтворювати звук під час зміни інструменту

  • -o speak_on - озвучити оголошення про зміну інструменту

QtVCP tool_dialog - Діалогове вікно ручної зміни інструменту
Figure 8. QtVCP tool_dialog - Діалогове вікно ручної зміни інструменту

2. vismach Панелі 3D-моделювання

Ці панелі є попередньо створеними симуляціями поширених типів машин.

Їх також можна вбудовувати в інші екрани, такі як AXIS або GMOCCAPY.

2.1. QtVCP vismach_mill_xyz

3D OpenGL-вигляд 3-осьового фрезерного верстата.

loadusr qtvcp vismach_mill_xyz
QtVCP vismach_mill_xyz - Панель 3D-вигляду 3-осьового фрезерного верстата
Figure 9. QtVCP vismach_mill_xyz - Панель 3D-вигляду 3-осьового фрезерного верстата

2.2. QtVCP vismach_router_atc

3D-вигляд OpenGL фрезерного верстата з 3-осьовим маршрутизатором і портальною платформою.
Ця панель показує, як визначити та підключити деталі моделі у файлі обробника, а не імпортувати готову модель із бібліотеки vismach QtVCP.

loadusr qtvcp vismach_router_atc
QtVCP vismach_router_atc - Панель 3D-вигляду 3-осьового портального фрезерного верстата
Figure 10. QtVCP vismach_router_atc - Панель 3D-вигляду 3-осьового портального фрезерного верстата

2.3. QtVCP vismach_scara

3D OpenGL-вигляд фрезерного верстата на базі SCARA.

loadusr qtvcp vismach_scara
QtVCP vismach_scara - Панель 3D-вигляду SCARA Mill
Figure 11. QtVCP vismach_scara - Панель 3D-вигляду SCARA Mill

2.4. QtVCP vismach_millturn

3D-зображення OpenGL 3-осьового фрезерного верстата з віссю A/шпинделем.

loadusr qtvcp vismach_millturn
QtVCP vismach_millturn - Панель 3D-вигляду 4-осьового фрезерування/токарного верстата
Figure 12. QtVCP vismach_millturn - Панель 3D-вигляду 4-осьового фрезерування/токарного верстата

2.5. QtVCP vismach_mill_5axis_gantry

3D OpenGL-вигляд 5-осьового портального фрезерного верстата.

loadusr qtvcp vismach_mill_5axis_gantry
QtVCP vismach_mill_5axis_gantry - Панель 3D-вигляду 5-осьового портального фрезерного верстата
Figure 13. QtVCP vismach_mill_5axis_gantry - Панель 3D-вигляду 5-осьового портального фрезерного верстата

2.6. QtVCP vismach_fanuc_200f

3D-вигляд 6-суглобової роботизованої руки у форматі OpenGL.

loadusr qtvcp vismach_fanuc_200f
QtVCP vismach_fanuc_200f - 6-суглобова роботизована рука
Figure 14. QtVCP vismach_fanuc_200f - 6-суглобова роботизована рука

3. Користувацькі віртуальні панелі керування

Звісно, ви можете створити власну панель та завантажити її.

Якщо ви створили файл інтерфейсу користувача з назвою my_panel.ui та файл HAL з назвою my_panel.hal, ви завантажили б їх з терміналу за допомогою:

halrun -I -f my_panel.hal
Приклад HAL-файлу, що завантажує панель QtVCP
# завантаження компонентів реального часу
loadrt threads
loadrt classicladder_rt

# завантажувати програми, що не працюють у реальному часі
loadusr classicladder
loadusr -Wn my_panel qtvcp my_panel.ui  # <1>

# додати компоненти до потоку
addf classicladder.0.refresh thread1


# з'єднати контакти
net bit-input1     test_panel.checkbox_1        classicladder.0.in-00
net bit-hide       test_panel.checkbox_4        classicladder.0.hide_gui

net bit-output1    test_panel.led_1             classicladder.0.out-00

net s32-in1        test_panel.doublescale_1-s   classicladder.0.s32in-00

# почати тему
start
  1. У цьому випадку ми завантажуємо qtvcp за допомогою -Wn, що очікує завершення завантаження панелі перед продовженням виконання наступної команди HAL.
    Це робиться для того, щоб переконатися, що створені панеллю контакти HAL дійсно готові, якщо вони використовуються в решті файлу.

4. Вбудовування віртуальних панелей керування QtVCP в екрани QtVCP

Панелі QtVCP можна вбудовувати в більшість екранів QtVCP, що дозволяє уникнути таких проблем, як переміщення фокуса, що може бути проблемою при вбудовуванні в ненативні середовища.

4.1. Команди вбудовування

Типовий екран, такий як QtDragon, шукатиме команди для вбудовування панелі у файлі INI під заголовком [DISPLAY].

[DISPLAY]
EMBED_TAB_NAME=Embedding demo
EMBED_TAB_COMMAND=qtvcp simple_hal
EMBED_TAB_LOCATION=tabWidget_utilities
EMBED_TAB_NAME

зазвичай буде заголовком вкладки.

EMBED_TAB_LOCATION

буде специфічним для екрана та визначатиме tabWidget або stackedWidget для вбудовування.

EMBED_TAB_COMMAND

- це команда, яка використовується для завантаження панелі. Для вбудованих панелей першим словом завжди буде «qtvcp», а останнім - назва панелі, яку потрібно завантажити. Ви також можете передати параметри панелі за допомогою перемикачів -o в командному рядку між «qtvcp» і назвою панелі. Панель буде слідувати налаштуванням режиму налагодження головного екрану.

4.2. Розташування вбудованих панелей

Існують панелі, які входять до складу LinuxCNC. Щоб переглянути список, відкрийте термінал, введіть «qtvcp» і натисніть клавішу «Return».
Ви отримаєте довідку та список вбудованих екранів і панелей.
Виберіть будь-яке ім’я зі списку панелей і додайте його до запису COMMAND після «qtvcp».
Шлях пошуку вбудованої панелі — «share/qtvcp/panels/PANELNAME».
У версіях LinuxCNC, що запускаються на місці, та встановлених версіях вони знаходяться в різних місцях системи.

4.3. Розташування користувацьких панелей

Також можна вбудовувати власні панелі — модифіковані вбудовані панелі або нові панелі, створені користувачем.
Під час завантаження панелей QtVCP шукає в папках конфігурації шлях до «qtvcp/panels/PANELNAME/PANELNAME.ui».
«PANNELNAME» — це будь-який дійсний рядок без пробілів. Якщо шлях не знайдено, то шукається вбудований шлях до файлу.
QtVCP виконає той самий процес для опціонального файлу обробника: «qtvcp/panels/PANELNAME/PANELNAME_handler.py»

4.4. Поради щодо програмування обробників

У файлі обробника екрану посилання, яке використовується для вікна, є «self.w».
У панелях QtVCP це посилання буде посилатися на вікно панелі.
Щоб посилатися на головне вікно, використовуйте «self.w.MAIN». Якщо ваша панель має працювати незалежно та бути вбудованою, ви повинні перехоплювати помилки від посилань на об’єкти, які недоступні. (Зверніть увагу, що об’єкти головного екрану недоступні в незалежній панелі.)

Наприклад, це використовуватиме файл налаштувань панелі, якщо такий є.

try:
    belt_en = self.w.PREFS_.getpref('Front_Belt_enabled', 1, int, 'SPINDLE_EXTRAS')
except:
    belt_en = 1

Це використовуватиме файл налаштувань головного екрана, якщо такий є.

try:
    belt_en = self.w.MAIN.PREFS_.getpref('Front_Belt_enabled', 1, int, 'SPINDLE_EXTRAS')
except:
    belt_en = 1

4.5. Поради щодо дизайнерських віджетів

Під час використання параметра команди Python у віджетах кнопок дій вбудованої панелі:

ПРИМЕР

стосується вікна панелі. Наприклад, INSTANCE.my_panel_handler_function_call(True)

MAIN_INSTANCE

посилається на головне вікно екрана. Наприклад, MAIN_INSTANCE.my_main_screen_handler_function_call(True)

Якщо панель не вбудована, обидва посилаються на вікно панелі.

4.6. Патчування обробників - створення підкласів вбудованих панелей

Ми можемо змусити QtVCP завантажити підкласову версію стандартного файлу обробника. У цьому файлі ми можемо маніпулювати оригінальними функціями або додавати нові.
Підкласування означає, що наш файл обробника спочатку завантажує оригінальний файл обробника і додає до нього наш новий код - фактично патч змін.
Це корисно для зміни/додавання поведінки, зберігаючи при цьому стандартні оновлення обробника з репозиторіїв LinuxCNC.

Можливо, вам все одно доведеться скористатися діалоговим вікном копіювання обробника, щоб скопіювати оригінальний файл обробника та вирішити, як його виправити.

У папці config повинна бути папка для панелі з назвою «<CONFIG FOLDER>/qtvcp/panels/<PANEL NAME>/».
Додайте туди файл патча з назвою <ORIGINAL PANEL NAME>_handler.py,
тобто для cam_align файл буде називатися «cam_align_handler.py».

Ось приклад зміни кольору кола в cam_align:

import sys
import os
import importlib
from PyQt5.QtCore import Qt
from qtvcp.core import Path

PATH = Path()

# отримати посилання на оригінальний файл обробника, щоб ми могли зробити його підкласом
sys.path.insert(0, PATH.PANELDIR)
panel = os.path.splitext(os.path.basename(os.path.basename(__file__)))[0]
base = panel.replace('_handler','')
module = "{}.{}".format(base,panel)
mod = importlib.import_module(module, PATH.PANELDIR)
sys.path.remove(PATH.PANELDIR)
HandlerClass = mod.HandlerClass

# повернути наш об'єкт-обробник підкласу до Qtvcp
def get_handlers(halcomp, widgets, paths):
    return [UserHandlerClass(halcomp, widgets, paths)]

# підклас HandlerClass, імпортований вище
class UserHandlerClass(HandlerClass):
    print('Custom subclassed panel handler loaded\n')

    def initialized__(self):
        # call original handler initialized function
        super().initialized__()

        # додати нашу налаштування
        self.w.camview.circle_color = Qt.green