Компоненты hal
Компонетны 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 [функция] [поток] [индекс]
индекс может быть отрицательный - тогда отстчет будет с конца списка.