LinuxCNC Documentation

This section explains principles behind the implementation of HAL components with the Python programming language.

1. Базовий приклад використання

Компонент, що не працює в режимі реального часу, спочатку створює свої контакти та параметри, а потім входить у цикл, який періодично передає всі вихідні дані з вхідних. Наступний компонент копіює значення, яке бачить на своєму вхідному контакті («passthrough.in»), на свій вихідний контакт («passthrough.out») приблизно раз на секунду.

#!/usr/bin/env python3
import hal
import time
h = hal.component("passthrough")
h.newpin("in", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("out", hal.HAL_FLOAT, hal.HAL_OUT)
h.ready()
try:
    while True:
        h['out'] = h['in']
        time.sleep(1)
except KeyboardInterrupt:
    raise SystemExit

Copy the above listing into a file named "passthrough", make it executable (chmod +x). Then try it out (assuming the cpmponent "passthrough" is located in the current directory):

Копія екрана з детальною інформацією про виконання щойно створеного модуля HAL для передачі даних.
$ halrun

halcmd: loadusr ./passthrough

halcmd: show pin

Component Pins:
Owner   Type  Dir     Value  Name
     4  float IN          0  passthrough.in
     4  float OUT         0  passthrough.out

halcmd: setp passthrough.in 3.14

halcmd: show pin

Component Pins:
Owner   Type  Dir     Value  Name
     4  float IN       3.14  passthrough.in
     4  float OUT      3.14  passthrough.out

2. Компоненти та затримки, що не працюють у реальному часі

Якщо ви швидко набрали «show pin», ви можете побачити, що «passthrough.out» все ще має старе значення 0. Це відбувається через виклик «time.sleep(1)», який змушує присвоювання виходу відбуватися не частіше ніж раз на секунду. Оскільки це компонент, що не працює в режимі реального часу, фактична затримка між присвоєннями може бути набагато довшою, якщо пам’ять, яка використовується компонентом passthrough, переноситься на диск, оскільки присвоєння може бути відкладено до тих пір, поки ця пам’ять не буде перенесена назад.

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

3. Створення контактів та параметрів

Create a HAL component
mycomp = hal.component("passthrough")

Сам компонент створюється за допомогою виклику конструктора «hal.component». Аргументами є ім’я компонента HAL і (опціонально) префікс, що використовується для імен виводів і параметрів. Якщо префікс не вказано, використовується ім’я компонента.

Create a HAL pin or parameter
mycomp.newpin("in", hal.HAL_FLOAT, hal.HAL_IN)
mycomp.newparam("has-feature-rotate", hal.HAL_BIT, hal.HAL_RO)

Потім штифти створюються за допомогою викликів методів об’єкта компонента. Аргументами є: суфікс імені штифта, тип штифта та напрямок штифта. Для параметрів аргументами є: суфікс імені параметра, тип параметра та напрямок параметра.

Table 1. Назви опцій HAL

Типи контактів та параметрів:

HAL_BIT

HAL_FLOAT

HAL_S32

HAL_U32

HAL_S64

HAL_U64

HAL_PORT

Вказівки щодо встановлення шпильок:

HAL_IN

HAL_OUT

HAL_IO

Вказівки щодо параметрів:

HAL_RO

HAL_RW

Note

Only pins and signals can use the HAL_PORT type.

Повна назва виводу або параметра утворюється шляхом об’єднання префікса та суфікса за допомогою символу ".", тому в наведеному прикладі створений вивод називається «passthrough.in».

mycomp.ready()

Після створення всіх виводів та параметрів викличте метод .ready().

3.1. Зміна префікса

Префікс можна змінити, викликавши метод .setprefix(). Поточний префікс можна отримати, викликавши метод .getprefix().

4. Читання та запис виводів і параметрів

Для виводів та параметрів, які також є власними ідентифікаторами Python, значення можна отримати або встановити за допомогою синтаксису атрибута:

mycomp.out = mycomp.in

Для всіх пінів, незалежно від того, чи є вони також належними ідентифікаторами Python, значення можна отримати або встановити за допомогою синтаксису нижнього індексу:

mycomp['out'] = mycomp['in']

Щоб побачити всі піни з їхніми значеннями, getpins повертає всі значення зі словника цього компонента.

mycomp.getpins()
>>>{'in': 0.0, 'out': 0.0}

4.1. Виводи керування виходом (HAL_OUT)

Periodically, usually in response to a timer, all HAL_OUT pins should be "driven" by assigning them a new value. This should be done whether or not the value is different than the last one assigned. When a pin is connected to a signal, its old output value is not copied into the signal. The proper value will only appear on the signal once the component assigns a new value.

4.2. Керування двонаправленими (HAL_IO) контактами

The above rule does not apply to bidirectional pins. Instead, a bidirectional pin should only be driven by the component when the component wishes to change the value. For instance, in the canonical encoder interface, the encoder component only sets the index-enable pin to False (when an index pulse is seen and the old value is True), but never sets it to True. Repeatedly driving the pin False might cause the other connected component to act as though another index pulse had been seen.

5. Виходимо

A halcmd unload request for the component is delivered as a KeyboardInterrupt exception. When an unload request arrives, the process should either exit in a short time, or call the .exit() method on the component if substantial work (such as reading or writing files) must be done to complete the shutdown process.

6. HAL Python module reference

See Python HAL Interface for an overview and description of available classes and methods.

7. Константи

Використовуйте їх для уточнення деталей, а не значення, яке вони містять.

  • Pin, parameter and signal types:

    • HAL_BIT

    • HAL_FLOAT

    • HAL_S32

    • HAL_U32

    • HAL_S64

    • HAL_U64

  • Pin direction:

    • HAL_IN

    • HAL_OUT

  • Parameter access:

    • HAL_RO

    • HAL_RW

  • Message severity:

    • MSG_NONE

    • MSG_ALL

    • MSG_DBG

    • MSG_ERR

    • MSG_INFO

    • MSG_WARN

8. Інформація про систему

Прочитайте їх, щоб отримати інформацію про систему реального часу.