Скрипт 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].

Макет Халшоу
Figure 1. Макет Халшоу

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

2. Площа дерева HAL

2.1. Дерево фільтрів

За замовчуванням цей запис фільтрує дерево за назвами контактів або вузлами дерева за допомогою регулярного виразу. Наприклад, введення "lim-sw" відфільтрує дерево за таким параметром:

Дерево фільтрації для імен пінів з підрядком "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

Halshow: Показати вкладку
Figure 2. Halshow: Показати вкладку

Натиснувши на ім’я вузла, наприклад «Компоненти» в дереві, ви побачите (на вкладці «Показати») всю інформацію, яку 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

Назва другого піна містить повну назву першого.

Нове у версії 2.9

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

4. Область вкладок годинника

При натисканні на вкладку «Спостереження» з’являється порожнє полотно. Ви можете додавати сигнали та контакти на це полотно і спостерігати за їхніми значеннями. Ви можете додавати сигнали або контакти, коли вкладка «Спостереження» відображається, натиснувши на її назву в дереві.

Нове у версії 2.9

Ви також можете додати всі піделементи цього вузла, вибравши їх у контекстному меню (див. малюнок Halshow Watch Tab).

На наступному малюнку показано це полотно з кількома шпильками.

Вкладка: годинника Halshow

Вкладка годинника Halshow

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

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

Нове у версії 2.9

Контакти та сигнали, які можна записувати, мають кнопки для маніпулювання з правого боку. Контакти, які пов’язані з сигналом, мають вимкнені кнопки. Щоб встановити ці значення, відповідний контакт потрібно від’єднати від сигналу. Це можна зробити, клацнувши правою кнопкою миші на назві сигналу та вибравши «Від’єднати контакт», див. Контекстне меню Watch Tach.

Список спостереження буде збережено автоматично після виходу. Якщо ви не хочете, щоб Halshow зберігав ваш список спостереження, цю функцію можна вимкнути в Налаштування.

Контекстне меню

Нове у версії 2.9

Контекстне меню дозволяє додатково:

  • Скопіюйте назву PIN-коду в буфер обміну

  • Встановити значення

  • Від’єднати пін (якщо він пов’язаний із сигналом)

  • Показувати шпильку в дереві (підсвічує шпильку, не прокручує до потрібної позиції)

  • Вилучити позначку зі списку

Halshow: Контекстне меню вкладки «Перегляд»
Figure 3. Halshow: Контекстне меню вкладки «Перегляд»

5. Введення команди

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

Нове у версії 2.9

Запис команди має історію, подібну до історії BASH (протягом сеансу), тому ви можете відновити вставлені команди за допомогою клавіші зі стрілкою вгору.

Поле введення з назвою «Команда HAL:» прийматиме будь-які команди, перелічені для halcmd. До них належать:

  • loadrt, unloadrt (завантаження/вивантаження модуля реального часу)

  • loadusr, unloadusr (завантаження/вивантаження компонента, що не працює в реальному часі)

  • addf, delf (додавання/видалення функції до/з потоку реального часу)

  • net (створити зв’язок між двома або більше елементами)

  • setp (встановити параметр (або pin) у значення)

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

6. Налаштування

Нове у версії 2.9

Геометрія вікна та налаштування зберігаються у файлі в каталозі конфігурації при виході. Якщо цей шлях не може бути визначений, вони зберігаються в домашньому каталозі. Шлях буде відображатися на сторінці налаштувань. Ви можете пропустити використання файлу налаштувань, викликавши halshow з аргументом командного рядка --no-prefs.
Подальші налаштування повинні бути зрозумілими без додаткових пояснень.

Налаштування Галшоу
Figure 4. Налаштування Галшоу

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 після виконання цієї команди.

Команда Addf
Figure 5. Команда Addf

Далі нам потрібно підключити 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.