Цей документ містить довідку з основ HAL.
1. Команди HAL
Більш детальну інформацію можна знайти на сторінці довідки для halcmd: виконайте команду man halcmd у вікні терміналу.
Щоб переглянути конфігурацію HAL та перевірити стан контактів і параметрів, скористайтеся вікном «HAL Configuration» (Конфігурація HAL) в меню «Machine» (Машина) в AXIS. Щоб переглянути стан контакту, відкрийте вкладку «Watch» (Перегляд) і натисніть на кожен контакт, який ви хочете переглянути, і він буде доданий до вікна перегляду.
1.1. loadrt
Команда loadrt завантажує компонент HAL реального часу. Функції компонента реального часу потрібно додати до потоку, щоб вони оновлювалися з частотою потоку. Неможливо завантажити компонент, що не працює в режимі реального часу, у простір реального часу.
loadrt <component> <options> loadrt mux4 count=1
1.2. addf
Команда addf додає функцію до потоку реального часу. Якщо для створення конфігурації використовувався майстер StepConf, було створено два потоки (``base-thread`` та ``servo-thread``).
addf додає функцію functname до потоку threadname. За замовчуванням функції додаються в тому порядку, в якому вони знаходяться у файлі. Якщо вказано position, функція додається до цього місця в потоці. Від’ємне значення position вказує на позицію відносно кінця потоку. Наприклад, «1» — початок потоку, «-1» — кінець потоку, «-3» — третє місце від кінця.
Для деяких функцій важливо завантажувати їх у певному порядку, наприклад функції читання та запису parport. Назва функції зазвичай складається з назви компонента та цифри. У наведеному нижче прикладі завантажується компонент «or2», а команда «show function» показує назву функції or2.
$ halrun
halcmd: loadrt or2
halcmd: show function
Експортовані функції:
Owner CodeAddr Arg FP Users Name
00004 f8bc5000 f8f950c8 NO 0 or2.0
Ви повинні додати функцію з компонента HAL реального часу до потоку, щоб функція оновлювалася зі швидкістю потоку. Зазвичай існує два потоки, як показано в цьому прикладі. Деякі компоненти використовують математику з плаваючою комою і повинні бути додані до потоку, який підтримує математику з плаваючою комою. FP вказує, чи підтримується математика з плаваючою комою в цьому потоці.
$ halrun
halcmd: loadrt motmod base_period_nsec=55555 servo_period_nsec=1000000 num_joints=3
halcmd: показати тему
Теми в реальному часі:
Period FP Name ( Time, Max-Time )
995976 YES servo-thread ( 0, 0 )
55332 NO base-thread ( 0, 0 )
-
базовий потік (високошвидкісний потік): цей потік обробляє елементи, що потребують швидкої реакції, такі як створення крокових імпульсів, читання та запис паралельного порту. Не підтримує математику з плаваючою комою.
-
серво-потік (потік з низькою швидкістю): цей потік обробляє елементи, які можуть терпіти повільнішу реакцію, такі як контролер руху, ClassicLadder та обробник команд руху, і підтримує обчислення з плаваючою комою.
addf <function> <thread> addf mux4.0 servo-thread
|
Note
|
Якщо компонент потребує потоку з плаваючою комою, це зазвичай повільніший сервопотік. |
1.3. loadusr
Команда loadusr завантажує компонент HAL, що не працює в режимі реального часу. Програми, що не працюють в режимі реального часу, є окремими процесами, які за бажанням можуть взаємодіяти з іншими компонентами HAL за допомогою контактів і параметрів. Ви не можете завантажувати компоненти, що працюють в режимі реального часу, в простір, що не працює в режимі реального часу.
Прапори можуть бути одним або кількома з наступних:
|
-W
|
чекати готовності компонента. Вважається, що компонент має таку ж назву, як і перший аргумент команди. |
|
-Wn <name>
|
чекати на компонент, який матиме задане <name>. Це застосовується лише якщо компонент має опцію name. |
|
-w
|
чекати на завершення програми |
|
-i
|
ігнорувати значення, що повертається програмою (з опцією -w) |
|
-n
|
назвати компонент, коли це є допустимим варіантом для цього компонента. |
loadusrloadusr <component> <options> loadusr halui loadusr -Wn spindle gs2_vfd -n spindle
Англійською це означає «loadusr чекати на назву шпинделя компонент gs2_vfd назва шпинделя».
1.4. net
Команда net створює «з’єднання» між сигналом і одним або декількома контактами. Якщо сигнал не існує, net створює новий сигнал. Це замінює необхідність використання команди newsig. Опціональні стрілки напрямку <=, => і <=> полегшують розуміння логіки при читанні командного рядка net і не використовуються командою net. Стрілки напрямку повинні бути відокремлені пробілом від імен контактів.
netnet signal-name pin-name <optional arrow> <optional second pin-name> net home-x joint.0.home-sw-in <= parport.0.pin-11-in
У наведеному вище прикладі home-x — це назва сигналу, joint.0.home-sw-in — це контакт «Direction IN», <= — це необов’язкова стрілка напрямку, а parport.0.pin-11-in — це контакт «Direction OUT». Це може здатися заплутаним, але мітки входу та виходу для контакту паралельного порту вказують на фізичний спосіб роботи контакту, а не на те, як він обробляється в HAL.
Вивід можна підключити до сигналу, якщо він підпорядковується таким правилам:
-
Вивід IN завжди можна підключити до сигналу.
-
Вивід IO можна підключити, якщо на сигналі немає виводу OUT.
-
Вивід OUT можна підключити, лише якщо на сигналі немає інших виводів OUT або IO.
Одне й те саме «ім’я сигналу» можна використовувати в кількох мережевих командах для підключення додаткових контактів, якщо дотримуватися наведених вище правил.
Цей приклад показує сигнал xStep, джерелом якого є stepgen.0.out, та два зчитувачі, parport.0.pin-02-out та parport.0.pin-08-out. В основному значення stepgen.0.out надсилається до сигналу xStep, а потім це значення надсилається до parport.0.pin-02-out та parport.0.pin-08-out.
# сигнал джерело призначення призначення net xStep stepgen.0.out => parport.0.pin-02-out parport.0.pin-08-out
Оскільки сигнал xStep містить значення stepgen.0.out (джерело), ви можете знову використовувати той самий сигнал, щоб надіслати значення іншому зчитувачу. Для цього просто використовуйте сигнал із зчитувачами на іншому рядку.
# сигнал пункт призначення2 net xStep => parport.0.pin-06-out
Значення енкодера, подібного до контакту вводу/виводу.N.index-enable, можна зчитувати або встановлювати відповідно до дозволеного компонентом параметра.
1.5. setp
Команда setp встановлює значення виводу або параметра. Дійсні значення залежатимуть від типу виводу або параметра. Якщо типи даних не збігаються, це вважається помилкою.
Деякі компоненти мають параметри, які потрібно встановити перед використанням. Параметри можна встановити перед використанням або під час роботи за потреби. Ви не можете використовувати setp на виводі, підключеному до сигналу.
setpsetp <pin/parameter-name> <value> setp parport.0.pin-08-out TRUE
1.6. sets
Команда sets встановлює значення сигналу.
множинsets <signal-name> <value> net mysignal and2.0.in0 pyvcp.my-led sets mysignal 1
Це помилка, якщо:
-
Назва сигналу не існує
-
Якщо сигнал вже має записувач
-
Якщо значення не є правильним типом для сигналу
1.7. unlinkp
Команда unlinkp від’єднує пін від підключеного сигналу. Якщо перед виконанням команди до піну не було підключено жодного сигналу, нічого не відбувається. Команда unlinkp корисна для усунення несправностей.
unlinkpunlinkp <pin-name> unlinkp parport.0.pin-02-out
1.8. Застарілі команди
Наступні команди є застарілими і можуть бути видалені з майбутніх версій. У будь-якій новій конфігурації слід використовувати команду net. Ці команди включені, щоб старі конфігурації продовжували працювати.
1.8.1. linksp (застаріло)
Команда linksp створює «з’єднання» між сигналом та одним виводом.
linksplinksp <signal-name> <pin-name> linksp X-step parport.0.pin-02-out
Команду linksp було замінено командою net.
1.8.2. посилання (застаріле)
Команда linkps створює «з’єднання» між одним виводом та одним сигналом. Це те саме, що й linksp, але аргументи протилежні.
linkpslinkps <pin-name> <signal-name> linkps parport.0.pin-02-out X-Step
Команду linkps було замінено командою net.
1.8.3. новинний знак
Команда newsig створює новий HAL-сигнал з іменем <signame> та типом даних <type>. Тип має бути bit, s32, u32, s64, u64 або float. Помилка, якщо <signame> вже існує.
newsignewsig <signame> <type> newsig Xstep bit
Більше інформації можна знайти в посібнику HAL або на сторінках довідки для halrun.
2. Дані HAL
2.1. Біт
Бітове значення є увімкненим або вимкненим.
-
значення бітів = true або 1 та false або 0 (True, TRUE, true є дійсними)
2.2. Float
«Число з плаваючою комою» — це число з плаваючою комою. Іншими словами, десяткова кома може переміщуватися за потреби.
-
значення з плаваючою комою = 64-бітове значення з плаваючою комою, з роздільною здатністю приблизно 53 біт та динамічним діапазоном понад 210 (~ 1000) біт.
Для отримання додаткової інформації про числа з плаваючою комою див.:
2.3. s32
Число s32 — це ціле число, яке може мати від’ємне або додатне значення.
-
Значення s32 = цілі числа від -2147483648 до 2147483647
2.4. u32
Число «u32» — це ціле число, яке є лише додатним.
-
значення u32 = цілі числа від 0 до 4294967295
2.5. s64
Число «s64» — це ціле число, яке може мати від’ємне або додатне значення.
-
значення s64 = цілі числа від -9,223,372,036,854,775,808 до +9,223,372,036,854,775,807
2.6. u64
Число «u64» — це ціле число, яке є лише додатним.
-
значення u64 = цілі числа від 0 до 18,446,744,073,709,551,615
3. Файли HAL
Якщо ви використовували майстер налаштування Stepper для створення конфігурації, у вашому каталозі конфігурації буде до трьох файлів HAL.
-
«my-mill.hal» (якщо ваша конфігурація має назву «my-mill»). Цей файл завантажується першим і його не слід змінювати, якщо ви використовували майстер налаштування крокового двигуна.
-
«custom.hal». Цей файл завантажується наступним і перед завантаженням графічного інтерфейсу. Тут ви розміщуєте власні команди HAL, які хочете завантажити перед завантаженням графічного інтерфейсу.
-
custom_postgui.hal Цей файл завантажується після завантаження графічного інтерфейсу користувача. Тут ви розміщуєте власні команди HAL, які потрібно завантажити після завантаження графічного інтерфейсу користувача. Усі команди HAL, які використовують віджети PyVCP, потрібно розміщувати тут.
4. Параметр HAL
До кожного компонента HAL автоматично додаються два параметри під час його створення. Ці параметри дозволяють визначити час виконання компонента.
.time
|
Час – це кількість циклів процесора, необхідних для виконання функції. |
.tmax
|
Tmax – це максимальна кількість циклів процесора, необхідних для виконання функції. |
tmax — це параметр читання/запису, тому користувач може встановити його на 0, щоб позбутися першої ініціалізації під час виконання функції.
5. Основні логічні компоненти
HAL містить кілька логічних компонентів, що працюють у режимі реального часу. Логічні компоненти працюють за «таблицею істинності», яка визначає вихідні дані для будь-яких вхідних даних. Зазвичай це бітові маніпулятори, які працюють за таблицями істинності електричних логічних вентилів.
For further components see HAL Components List or the man pages.
5.1. and2
Компонента and2 — це двовхідний елемент типу "і". Таблиця істинності нижче показує вихід на основі кожної комбінації вхідних даних.
and2 [count=N] | [names=name1[,name2...]]
and2.n
and2.N.in0 (bit, in)
and2.N.in1 (bit, in)
and2.N.out (bit, out)
| in0 | in1 | out |
|---|---|---|
False |
False |
False |
True |
False |
False |
False |
True |
False |
True |
True |
True |
5.2. не
Компонент not є бітовим інвертором.
not [count=n] | [names=name1[,name2...]]
not.all
not.n
not.n.in (bit, in)
not.n.out (bit, out)
| in | out |
|---|---|
True |
False |
False |
True |
5.3. or2
Компонент or2 — це двовхідний елемент-або.
or2[count=n] | [names=name1[,name2...]]
or2.n
or2.n.in0 (bit, in)
or2.n.in1 (bit, in)
or2.n.out (bit, out)
| in0 | in1 | out |
|---|---|---|
True |
False |
True |
True |
True |
True |
False |
True |
True |
False |
False |
False |
5.4. xor2
Компонент xor2 — це двовхідний вентиль XOR (виключне АБО).
xor2[count=n] | [names=name1[,name2...]]
xor2.n
xor2.n.in0 (bit, in)
xor2.n.in1 (bit, in)
xor2.n.out (bit, out)
| in0 | in1 | out |
|---|---|---|
True |
False |
True |
True |
True |
False |
False |
True |
True |
False |
False |
False |
6. Логічні приклади
.Приклад використання and2
loadrt and2 count=1 addf and2.0 servo-thread net my-sigin1 and2.0.in0 <= parport.0.pin-11-in net my-sigin2 and2.0.in1 <= parport.0.pin-12-in net both-on parport.0.pin-14-out <= and2.0.out
У наведеному вище прикладі одна копія and2 завантажується в простір реального часу і додається до серво-потоку. Далі pin-11 паралельного порту підключається до біту in0 логічної функції «і». Далі pin-12 підключається до біта in1 логічної функції «і». Насамкінець ми підключаємо вихідний біт and2 до паралельного порту pin-14. Отже, згідно з таблицею істинності для and2, якщо виводи 11 і 12 увімкнені, то вихідний вивід 14 буде увімкнений.
7. Компоненти конверсії
7.1. weighted_sum
Зважена сума перетворює групу бітів у ціле число. Перетворення є сумою «ваги» наявних бітів плюс будь-яке зміщення. Це схоже на «двійково-кодовану десяткову систему», але з більшою кількістю опцій. Біт «утримання» перериває обробку вхідних даних, щоб значення «суми» більше не змінювалося.
weighted_sumloadrt weighted_sum wsum_sizes=size[,size,...]
Створює групи ``weighted_sum``, кожна з яких має задану кількість вхідних бітів (розмір).
Щоб оновити weighted_sum, process_wsums має бути приєднаний до потоку.
process_wsums до потоку сервоaddf process_wsums servo-thread
Що оновлює компонент weighted_sum.
У наступному прикладі, копії вікна конфігурації AXIS HAL, біти 0 та 2 мають значення TRUE, вони не мають зміщення. Вага (weight) біта 0 дорівнює 1, біта 2 – 4, тому сума дорівнює 5.
| Власник | Тип | Ви | Значення | Ім’я |
|---|---|---|---|---|
10 |
біт |
У |
TRUE |
|
10 |
s32 |
I/O |
1 |
|
10 |
біт |
У |
FALSE |
|
10 |
s32 |
I/O |
2 |
|
10 |
біт |
У |
TRUE |
|
10 |
s32 |
I/O |
4 |
|
10 |
біт |
У |
FALSE |
|
10 |
s32 |
I/O |
8 |
|
10 |
біт |
У |
FALSE |
|
10 |
s32 |
I/O |
0 |
|
10 |
s32 |
Вихід |
5 |
|