Цей документ містить довідку з основ HAL.

1. Команди HAL

Більш детальну інформацію можна знайти на сторінці довідки для halcmd: виконайте команду man halcmd у вікні терміналу.

Щоб переглянути конфігурацію HAL та перевірити стан контактів і параметрів, скористайтеся вікном «HAL Configuration» (Конфігурація HAL) в меню «Machine» (Машина) в AXIS. Щоб переглянути стан контакту, відкрийте вкладку «Watch» (Перегляд) і натисніть на кожен контакт, який ви хочете переглянути, і він буде доданий до вікна перегляду.

Вікно конфігурації HAL
Figure 1. Вікно конфігурації HAL

1.1. loadrt

Команда loadrt завантажує компонент HAL реального часу. Функції компонента реального часу потрібно додати до потоку, щоб вони оновлювалися з частотою потоку. Неможливо завантажити компонент, що не працює в режимі реального часу, у простір реального часу.

Синтаксис та приклад loadrt
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
addf <function> <thread>
addf mux4.0 servo-thread
Note
Якщо компонент потребує потоку з плаваючою комою, це зазвичай повільніший сервопотік.

1.3. loadusr

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

Прапори можуть бути одним або кількома з наступних:

-W

чекати готовності компонента. Вважається, що компонент має таку ж назву, як і перший аргумент команди.

-Wn <name>

чекати на компонент, який матиме задане <name>. Це застосовується лише якщо компонент має опцію name.

-w

чекати на завершення програми

-i

ігнорувати значення, що повертається програмою (з опцією -w)

-n

назвати компонент, коли це є допустимим варіантом для цього компонента.

Синтаксис та приклади loadusr
loadusr <component> <options>
loadusr halui
loadusr -Wn spindle gs2_vfd -n spindle

Англійською це означає «loadusr чекати на назву шпинделя компонент gs2_vfd назва шпинделя».

1.4. net

Команда net створює «з’єднання» між сигналом і одним або декількома контактами. Якщо сигнал не існує, net створює новий сигнал. Це замінює необхідність використання команди newsig. Опціональні стрілки напрямку <=, => і <=> полегшують розуміння логіки при читанні командного рядка net і не використовуються командою net. Стрілки напрямку повинні бути відокремлені пробілом від імен контактів.

Синтаксис та приклади слова net
net 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.

Одне й те саме «ім’я сигналу» можна використовувати в кількох мережевих командах для підключення додаткових контактів, якщо дотримуватися наведених вище правил.

Напрямок сигналу
Figure 2. Напрямок сигналу

Цей приклад показує сигнал 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 на виводі, підключеному до сигналу.

Синтаксис та приклади setp
setp <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 корисна для усунення несправностей.

Синтаксис та приклади unlinkp
unlinkp <pin-name>
unlinkp parport.0.pin-02-out

1.8. Застарілі команди

Наступні команди є застарілими і можуть бути видалені з майбутніх версій. У будь-якій новій конфігурації слід використовувати команду net. Ці команди включені, щоб старі конфігурації продовжували працювати.

1.8.1. linksp (застаріло)

Команда linksp створює «з’єднання» між сигналом та одним виводом.

Синтаксис та приклади linksp
linksp <signal-name> <pin-name>
linksp X-step parport.0.pin-02-out

Команду linksp було замінено командою net.

1.8.2. посилання (застаріле)

Команда linkps створює «з’єднання» між одним виводом та одним сигналом. Це те саме, що й linksp, але аргументи протилежні.

Синтаксис та приклади linkps
linkps <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> вже існує.

Синтаксис та приклади newsig
newsig <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)
Table 1. Таблиця істинності і2
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)
Table 2. Таблиця істинності слова «не»
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)
Table 3. Таблиця істинності or2
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)
Table 4. Таблиця істинності xor2
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_sum
loadrt 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.

Table 5. Компонентні контакти weighted_sum
Власник Тип Ви Значення Ім’я

10

біт

У

TRUE

wsum.0.bit.0.in

10

s32

I/O

1

wsum.0.bit.0.weight

10

біт

У

FALSE

wsum.0.bit.1.in

10

s32

I/O

2

wsum.0.bit.1.weight

10

біт

У

TRUE

wsum.0.bit.2.in

10

s32

I/O

4

wsum.0.bit.2.weight

10

біт

У

FALSE

wsum.0.bit.3.in

10

s32

I/O

8

wsum.0.bit.3.weight

10

біт

У

FALSE

wsum.0.hold

10

s32

I/O

0

wsum.0.offset

10

s32

Вихід

5

wsum.0.sum