Компоненты hal

Материал из cnc-club
Версия от 14:02, 22 июля 2015; Nick (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Компонетны hal - это отдельные модули, которые выполняют специализированную задачу. Компоненты общаются между собой по средствам пинов. Все что происходит со станком происходит из-за компонентов. Компоненты могут быть простыми, а могут быть сложными. Например, компонент and2 выполняет логическое "И", в то время как компонент motion занимается планировкой траекторий и расчетами передвижения всего станка.

У компонентов есть три основных типа элементов:

  • пины
  • параметры
  • функции

Список компонентов можно найти тут: http://linuxcnc.org/docs/html/ На базе этих комопонентов можно организовать очень сложеную и развитую логическую схему.

Пины

В основном компоненты выполняют действия над пинами. Например комопнент and2 имеет три пина in0, in1 и out. Как можно догадаться из названия, компонент смотрит на состояние пинов in0 и in1 и на выходном пине помещает результат in0 "И" in1. Пины могут быть как логические (bit), так и численные (FLOAT, S32, U32), например, пин скорости компонента stepgen. Пины компонентов можно связывать между собой командой hal net. Описание пинов компонентов можно найти в справке по этому компоненту. (на сайте linuxcnc или в консоле, например, man stepgen).

Подробнее смотри Пины и сигналы hal.

Параметры

Параметры это практически тоже самое, что и пины, но обычно параметры содержат редко изменяемые значения, например, максимальная скорость stepgen. Параметры нельзя подколючать к пинам. Подробоное описание параметров смотрите в справке к компоненту.

Функции

Функции выполняют работу компонента и меняют значения его пинов.

Комопненты real-time

Функции не работают сами, их надо вызывать. В hal есть один или несколько потоков. Обычно это:

  • servo-thread - "медленный поток" в котором происходят все расчеты. Стандартный период 1мс (частота 1кГц).
  • base-thread - "быстрый поток" в нем выполяются быстрые операции, в этом потоке нельзя использовать float. Стандартный период 15-50мкс (частота около 20кГц) в зависимости от компьютера.

Как только мы добавляем функцию в поток, она начинает вызываться раз в период потока. Например, функция компонента parport.write, которая обновляет значения порта LPT добавляется в base-thread. Эта функция вызывается с частотой base-thread (20кГц), что позволяет управлять драйвером шагового двигателя. А функция для расчета скорости, положения и обратной связи stepgen более медленная и нет большой необходимости вызывать ее часто, поэтому она работает в servo-thread (1кГц).

Итак, чтобы наш компопнет работал надо добавить его функцию или функции к потокам.

Подробоное описание функций смотрите в справке к компоненту.

Комопненты user-space

Эти комопненты работают в пользовательском пространстве и не относятся к компонентам реального времени (их выполнение не гарантируется за опрределенный промежуток времени). К таким компонентам относятся GUI и другие не критичные компоненты, которые напрямую не влияют на управление станком. Они работают как отдельные программы и сами обновляют значения пинов.

Загрузка комопнента

Загрузка компонентов происходит при помощи команды loadrt (для real-time) или loadusr (для user-space).

loadrt [компонента] [параметры] 

Пример:

loadrt trivkins
loadrt probe_parport
loadrt hostmot2
loadrt hm2_pci config=" num_encoders=2 num_pwmgens=2 num_3pwmgens=0 num_stepgens=8  " 

Параметры загрузки обычно включают в себя количество компонентов, или их имена и другие параметры.

Добавление функций

Функции выполняются в потоках в порядке их добавления. Чтобы добавить функцию к потоку используется команда:

addf [функция] [поток] 

Пример:

addf hm2_5i25.0.read servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
addf pid.s.do-pid-calcs                 servo-thread
addf hm2_5i25.0.write         servo-thread
addf hm2_5i25.0.pet_watchdog  servo-thread

Можно добавить функцию не в конец потока, а на определенное место, но это используется крайне редко:

addf [функция] [поток] [индекс]

индекс может быть отрицательный - тогда отстчет будет с конца списка.