Скрипт halshow може допомогти вам зорієнтуватися в запущеному HAL. Він відображає вибрані значення HAL та постійно їх оновлює.
Це дуже спеціалізована система, яка повинна підключатися до працюючого HAL. Вона не може працювати автономно, оскільки покладається на здатність HAL «інтроспектувати» і повідомляти про себе через бібліотеку інтерфейсу halcmd. Коли конфігурація LinuxCNC змінюється, вивід halshow також буде іншим.
Як ми скоро побачимо, ця здатність HAL до самодокументування є одним із ключових моментів у створенні ефективної системи CNC.
1. Початок гри в Халшоу
Халшоу доступний
-
у меню AXIS у розділі Machine/Show HAL Configuration,
-
у меню TkLinuxCNC у розділі Скрипти/Показати HAL,
-
у GMOCCAPY на сторінці налаштувань.
halshow також можна запустити з командного рядка терміналу та вказати формати для цілочисельних та чисельних елементів з плаваючою комою (виводи або сигнали) та визначити збережений файл списку спостереження для використання:
$ halshow --help
Використання:
halshow [Options] [watchfile]
Опції:
--help (this help)
--fformat format_string_for_float
--iformat format_string_for_int
--noprefs don't use preference file to save settings
Нотатки:
Створіть файл спостереження в halshow за допомогою: «Файл/Зберегти список спостереження».
Для автономного використання LinuxCNC має бути запущений.
Приклад обмеження кількості десяткових ком для чисел з плаваючою комою та використання файлу з назвою my.halshow у поточному каталозі:
$ halshow --fformat "%.5f" ./my.halshow
Для отримання додаткової інформації щодо формату, будь ласка, зверніться до https://www.tcl.tk/man/tcl/TclCmd/format.html [сторінка довідки щодо формату Tcl].
Ліворуч від його дисплея, як показано на рисунку вище, розташоване деревоподібне подання, що нагадує те, що ви могли бачити у файлових браузерах. Праворуч знаходиться блокнот із вкладками для показу, перегляду та налаштувань.
2. Площа дерева HAL
2.1. Дерево фільтрів
За замовчуванням цей запис фільтрує дерево за назвами контактів або вузлами дерева за допомогою регулярного виразу. Наприклад, введення "lim-sw" відфільтрує дерево за таким параметром:
joint.0.neg-lim-sw-in
joint.0.pos-lim-sw-in
joint.1.neg-lim-sw-in
joint.1.pos-lim-sw-in
joint.2.neg-lim-sw-in
joint.3.pos-lim-sw-in
Якщо ви хочете відобразити всі елементи, пов’язані з joint.0, вам потрібно натиснути на піктограму налаштувань і вибрати «Повний шлях». Зверніть увагу на те, щоб уникнути спеціальних символів регулярного виразу, тому вам потрібно ввести «joint\.1\.», щоб явно вказати крапку і не знайти також joint 10.
2.2. Дерево
Дерево показує всі основні частини HAL. Перед кожною з них розташований невеликий знак плюс (+) або мінус (-) у прямокутнику, щоб розгорнути або згорнути відповідну частину дерева.
Ви також можете розгорнути або згорнути деревоподібне відображення за допомогою меню «Вигляд дерева» у верхньому лівому краю екрана.
У розділі «Дерево перегляду» ви знайдете: «Розгорнути все», «Згорнути все»; «Розгорнути шпильки», «Розгорнути параметри», «Розгорнути сигнали»; та «Перезавантажити дерево перегляду». «Перезавантажити дерево перегляду» корисно, коли під час виконання завантажуються нові компоненти, які потрібно відобразити.
3. Виставкова зона HAL
Натиснувши на ім’я вузла, наприклад «Компоненти» в дереві, ви побачите (на вкладці «Показати») всю інформацію, яку HAL має про вміст цього вузла. На малюнку Halshow Show Tab показано список, який ви побачите, натиснувши на ім’я «Компоненти». Інформація відображається точно так само, як у традиційних текстових інструментах аналізу HAL. Перевага тут полягає в тому, що ми маємо доступ за допомогою клацання мишею, який може бути настільки широким або вузьким, наскільки вам потрібно.
Якщо ми уважніше придивимося до дерева, то побачимо, що шість основних частин HAL можна розгорнути щонайменше на один рівень. У міру розгортання цих рівнів ви можете отримати більш конкретну відповідь, якщо клацнути на крайньому правому вузлі дерева. Ви побачите, що деякі контакти та параметри HAL показують більше ніж одну відповідь. Це пов’язано з особливостями пошукових процедур у самій програмі halcmd. Якщо ви шукаєте один контакт, ви можете отримати два, як показано нижче:
Виводи компонентів:
Owner Type Dir Value Name
06 bit -W TRUE parport.0.pin-10-in
06 bit -W FALSE parport.0.pin-10-in-not
Назва другого піна містить повну назву першого.
4. Область вкладок годинника
При натисканні на вкладку «Спостереження» з’являється порожнє полотно. Ви можете додавати сигнали та контакти на це полотно і спостерігати за їхніми значеннями. Ви можете додавати сигнали або контакти, коли вкладка «Спостереження» відображається, натиснувши на її назву в дереві.
На наступному малюнку показано це полотно з кількома шпильками.
Watch відображає значення бітового типу (бінарні) за допомогою кольорових кіл, що представляють світлодіоди. Вони відображаються темно-червоним кольором, коли бітовий сигнал або контакт є хибним, і світло-жовтим кольором, коли цей сигнал є істинним. Якщо ви виберете контакт або сигнал, який не є сигналом бітового типу (бінарним), watch відобразить його як числове значення. Контакти відображаються чорним кольором, сигнали — синім, а параметри — коричневим.
Watch дозволить вам швидко протестувати перемикачі або побачити ефект змін, які ви вносите в LinuxCNC під час використання графічного інтерфейсу. Частота оновлення Watch є дещо повільною для перегляду імпульсів крокового двигуна, але ви можете використовувати її для цього, якщо рухаєте вісь дуже повільно або з дуже невеликими кроками відстані.
Контекстне меню
5. Введення команди
У нижній частині знаходиться поле введення для тестування команд HAL. Команди, які ви вводите тут, та їхній вплив на працюючий HAL не зберігаються. Вони залишатимуться активними, доки працює LinuxCNC, але зникнуть, щойно LinuxCNC буде вимкнено.
Поле введення з назвою «Команда HAL:» прийматиме будь-які команди, перелічені для halcmd. До них належать:
-
loadrt,unloadrt(завантаження/вивантаження модуля реального часу) -
loadusr,unloadusr(завантаження/вивантаження компонента, що не працює в реальному часі) -
addf,delf(додавання/видалення функції до/з потоку реального часу) -
net(створити зв’язок між двома або більше елементами) -
setp(встановити параметр (або pin) у значення)
Цей невеликий редактор вводитиме команду щоразу, коли ви натискатимете клавішу enter або кнопку виконання. Якщо ці команди сформовані неправильно, halcmd відображатиме повідомлення про помилку. Якщо ви не впевнені, як правильно налаштувати команду, вам потрібно буде ще раз прочитати документацію про halcmd та конкретні модулі, з якими ви працюєте.
6. Налаштування
7. Приклад/Посібник
Давайте використаємо цей редактор, щоб додати диференційний модуль до HAL і підключити його до положення осі, щоб ми могли бачити швидкість зміни положення, тобто прискорення. Спочатку нам потрібно завантажити компонент HAL під назвою ddt, додати його до серво-потоку, а потім підключити до контакту положення шарніра. Після цього ми зможемо знайти вихід диференціатора в halscope. Тож давайте почнемо.
loadrt ddt
Тепер подивіться на вузол components, і ви десь там маєте побачити ddt.
Завантажені компоненти HAL: ID Type Name 10 User halcmd29800 09 User halcmd29374 08 RT ddt 06 RT hal_parport 05 RT scope_rt 04 RT stepgen 03 RT motmod 02 User iocontrol
Звісно ж, ось він. Зверніть увагу, що його ідентифікатор — 08. Далі нам потрібно з’ясувати, які функції він пропонує, тому ми розглянемо функції:
Експортовані функції:
Owner CodeAddr Arg FP Users Name
08 E0B97630 E0DC7674 YES 0 ddt.0
03 E0DEF83C 00000000 YES 1 motion-command-handler
03 E0DF0BF3 00000000 YES 1 motion-controller
06 E0B541FE E0DC75B8 NO 1 parport.0.read
06 E0B54270 E0DC75B8 NO 1 parport.0.write
06 E0B54309 E0DC75B8 NO 0 parport.read-all
06 E0B5433A E0DC75B8 NO 0 parport.write-all
05 E0AD712D 00000000 NO 0 scope.sample
04 E0B618C1 E0DC7448 YES 1 stepgen.capture-position
04 E0B612F5 E0DC7448 NO 1 stepgen.make-pulses
04 E0B614AD E0DC7448 YES 1 stepgen.update-freq
Тут ми шукаємо власника № 08 і бачимо функцію з назвою ddt.0. Ми повинні мати можливість додати ddt.0 до серво-потоку, і вона буде виконувати свої обчислення кожного разу, коли серво-потік оновлюється. Ще раз переглядаємо команду addf і бачимо, що вона використовує три аргументи, як показано нижче:
addf <functname> <threadname> [<position>]
Ми вже знаємо functname=ddt.0, тому давайте визначимо ім’я потоку, розгорнувши вузол потоку в дереві. Тут ми бачимо два потоки: servo-thread і base-thread. Позиція ddt.0 у потоці не є критичною. Тому ми додаємо функцію ddt.0 до servo-thread:
addf ddt.0 servo-thread
Це лише для перегляду, тому ми залишаємо позицію порожньою та отримуємо останню позицію в потоці. На наступному рисунку показано стан halshow після виконання цієї команди.
Далі нам потрібно підключити ddt до чогось. Але як нам дізнатися, які піни доступні? Відповідь полягає в тому, щоб подивитися в розділі «піни». Там ми знаходимо ddt і бачимо це:
Виводи компонентів:
Owner Type Dir Value Name
08 float R- 0.00000e+00 ddt.0.in
08 float -W 0.00000e+00 ddt.0.out
Це виглядає досить легко зрозуміти, але який сигнал або контакт ми хочемо до нього підключити? Це може бути контакт осі, контакт ступінчастого генератора або сигнал. Ми бачимо це, коли дивимося на joint.0:
Виводи компонентів:
Owner Type Dir Value Name
03 float -W 0.00000e+00 joint.0.motor-pos-cmd ==> Xpos-cmd
Отже, схоже, що Xpos-cmd має бути гарним сигналом для використання. Повертаємося до редактора, де вводимо таку команду:
linksp Xpos-cmd ddt.0.in
Тепер, якщо ми подивимося на сигнал Xpos-cmd, використовуючи вузол дерева, ми побачимо, що ми зробили:
Сигнали:
Тип Значення Назва
float 0.00000e+00 Xpos-cmd
<== joint.0.motor-pos-cmd
==> ddt.0.in
==> stepgen.0.position-cmd
Ми бачимо, що цей сигнал надходить від joint.o.motor-pos-cmd і надходить як до ddt.0.in, так і до stepgen.0.position-cmd. Підключивши наш блок до сигналу, ми уникнули будь-яких ускладнень із нормальним потоком цієї команди руху.
Область HAL Show Area використовує halcmd для виявлення того, що відбувається в працюючому HAL. Вона надає повну інформацію про те, що було виявлено. Вона також оновлюється, коли ви видаєте команди з невеликої панелі редактора для модифікації цього HAL. Іноді вам може знадобитися відображення іншого набору елементів без усієї інформації, доступної в цій області. Саме в цьому випадку корисною є область HAL Watch Area.