LinuxCNC / Руководство разработчика конфигураций

Материал из Wiki CNC
Перейти к навигации Перейти к поиску

Дополнительная информация для разработчиков собственных конфигураций

Основы работы с HAL

Система LinuxCNC целиком и полностью состоит из небольших подпрограмм - компонентов. Каждый компонент имеет свое уникальное имя. У каждого компонента есть контакты входов и выходов, они называются ПИНами. У каждого компонента ПИНов может быть различное количество.

Пины делятся на пины in (в которые можно писать) и out (из которых можно читать). Также пины бывают разных типов данных:

BIT - или 1 или 0
FLOAT - число с плавующей запятой.
S32 - целое число от -2147483648 до 2147483647
U32 - положительное (беззнаковое) целое число от 0 до 4294967295

Для обращения имеется следующая запись:

 (имя компонента).(имя пина)

Например:

 motion.analog-out-00

, где motion- имя компонента, analog-out-00 - имя пина, этот пин выходной и его номер 00.


Компоненты могут иметь некоторые параметры (один или несколько), а также могут "соединяться" между собой посредством связей (сигналов), при этом каждая связь имеет свое имя.

  (команда) (имя связи) (источник "сигнала") (приёмник "сигнала")
  net vel <= motion.current-vel => stepgen.3.vel

, данная запись означает, что требуется создать (команда net) связь (vel) между пином current-vel компонента motion и пином vel компонента stepgen.3 (3 - это номер компонента с таким именем - один компонент может использоваться одновременно несколько раз, но под разными порядковыми номерами). Стрелочки <= и => писать необязательно. С ними на начальном этапе овладения системой проще - понятно ОТКУДА и куда передается "сигнал".

Возможно эту запись сделать так:

  net vel <= motion.current-vel
  net vel => stepgen.3.vel

Надо сказать, что эти строки можно писать в разных частях HAL файла.

Правила соединения пинов и сигналов hal

  • Сигнал принимает значение пина out, и передает его пинам in.

Signal.png

  • Любой пин может быть подключен только к 1 сигналу.

2signal.png

  • К одному сигналу можно подключить только один пин out (в противном случае будет не ясно из какого пина брать значение для сигнала).

2-out.png

  • К одному сигналу может быть подключено несколько пинов in.

Signal.png

  • Если требуется соединить два пина типа out - то нужно использовать дополнительные компоненты, например компонент and2.

And2.png

Основные команды HAL файла

loadrt

loadrt - загружает компонент HAL реального времени. Например,

  loadrt stepgen step_type=0,0,0,0 

, что означает: загружаем (loadrt) компонент stepgen с некоторыми установками (step_type=0,0,0,0).

addf

addf - добавляет компонент реального времени в поток и определяет место выполнения его функции: в высокоскоростном потоке (base-thread) или в низкоскоростном потоке (servo-thread).

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

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

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

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

  addf parport.0.read base-thread
  addf stepgen.make-pulses base-thread
  addf parport.0.write base-thread
  addf parport.0.reset base-thread
  
  addf stepgen.capture-position servo-thread
  addf motion-command-handler servo-thread
  addf motion-controller servo-thread

ВАЖНО! Эти команды должны быть обязательно! Именно они определяют: какими компонентами мы собираемся пользоваться и какие требования к этим компонентам мы предъявляем по скорости.

net

net - создает связь между сигналом и одним или несколькими пинами.

Например, нам нужно подать высчитанный программой сигнал Step на два контакта LPT-порта (нам требуется управлять через отдельные драйвера двумя шаговыми двигателями по координате X). Для этого мы должны написать:

  net xstep <= stepgen.0.step
  net xstep => parport.0.pin-02-out
  net xstep => parport.0.pin-03-out

или

  net xstep <= stepgen.0.step => parport.0.pin-02-out => parport.0.pin-03-out

или

  net xstep <= stepgen.0.step => parport.0.pin-02-out parport.0.pin-03-out

или

  net xstep stepgen.0.step parport.0.pin-02-out parport.0.pin-03-out

или

  net xstep parport.0.pin-02-out parport.0.pin-03-out stepgen.0.step

Т.е. главное в этой команде:

на первом месте - команда (net), затем название связи (xstep), а уже потом источник сигнала (выходной пин компонента - stepgen.0.step) и приёмник (приёмники) сигнала (входной или входные пины компонентов parport.0.pin-02-out и parport.0.pin-03-out).

setp

setp - устанавливает значение пина или параметра.

Если открыть ваш HAL-файл, то можно легко отыскать место, где прописываются параметры шаговых двигателей по координатам.

Например, по X:

  setp stepgen.0.position-scale [AXIS_0]SCALE
  setp stepgen.0.steplen 1
  setp stepgen.0.stepspace 0
  setp stepgen.0.dirhold 55000
  setp stepgen.0.dirsetup 55000
  setp stepgen.0.maxaccel [AXIS_0]STEPGEN_MAXACCEL

Как можно видеть команда setp может присваивать значения пинам и параметрам компонентов из INI-файла, таким образом связаны hal и ini файлы.

Но, иногда, можно прописать значения не из ini, а непосредственно. А выглядеть это будет, например, так:

  setp stepgen.0.position-scale 44.145839
  setp stepgen.0.steplen 1
  setp stepgen.0.stepspace 0
  setp stepgen.0.dirhold 55000
  setp stepgen.0.dirsetup 55000
  setp stepgen.0.maxaccel 150

Оба варианта работают.

Дополнительные возможности HAL

Для реализации сложных цифровых схем имеются логические компоненты. Каждый логический компонент имеет таблицу истинности входов и выходов. Для использования компонентов требуется знать что такое функции, параметры, пины и таблицы истинности.

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

Параметры позволяют задать режим работы функции или оценить ее работу.

Таблица истинности показывает зависимость состояния выходного пина от состояний входных.

and2

Этот компонент имеет 2 входных и один выходной пин.

Использование

and2 [номер функции=N] | [имена=имя1[,имя2...]]

Функции

and2.n

Пины

and2.N.in0 (bit, in)
and2.N.in1 (bit, in)
and2.N.out (bit, out)

Таблица истинности

And22.png

not

Компонент является битовым инвертором.

Использование

not [номер функции=n] | [имена=имя1[,имя2...]]

Функции

not.all
not.n

Пины

not.n.in (bit, in)
not.n.out (bit, out)

Таблица истинности

Not.png

or2

Данный компонент реализует логику ИЛИ с двумя входами.

Использование

or2[номер функции=n] | [имена=имя1[,имя2...]]

Функции

or2.n

Пины

or2.n.in0 (bit, in)
or2.n.in1 (bit, in)
or2.n.out (bit, out)

Таблица истинности

Or2.png

xor2

Компонент реализует логику ИСКЛЮЧАЮЩЕГО ИЛИ с двумя входами.

Использование

xor2[номер функции=n] | [имена=имя1[,имя2...]]

Функции

xor2.n

Пины

xor2.n.in0 (bit, in)
xor2.n.in1 (bit, in)
xor2.n.out (bit, out)

Таблица истинности

Xor2.png

Ниже приведен пример использования компонента 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