LinuxCNC / Руководство разработчика конфигураций: различия между версиями
Neller (обсуждение | вклад) (Новая страница: «=Дополнительная информация для разработчиков собственных конфигураций= ==Основы работы…») |
(нет различий)
|
Текущая версия на 11:07, 16 декабря 2019
Содержание
Дополнительная информация для разработчиков собственных конфигураций
Основы работы с 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.
- Любой пин может быть подключен только к 1 сигналу.
- К одному сигналу можно подключить только один пин out (в противном случае будет не ясно из какого пина брать значение для сигнала).
- К одному сигналу может быть подключено несколько пинов in.
- Если требуется соединить два пина типа out - то нужно использовать дополнительные компоненты, например компонент and2.
Основные команды 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)
Таблица истинности
not
Компонент является битовым инвертором.
Использование
not [номер функции=n] | [имена=имя1[,имя2...]]
Функции
not.all not.n
Пины
not.n.in (bit, in) not.n.out (bit, out)
Таблица истинности
or2
Данный компонент реализует логику ИЛИ с двумя входами.
Использование
or2[номер функции=n] | [имена=имя1[,имя2...]]
Функции
or2.n
Пины
or2.n.in0 (bit, in) or2.n.in1 (bit, in) or2.n.out (bit, out)
Таблица истинности
xor2
Компонент реализует логику ИСКЛЮЧАЮЩЕГО ИЛИ с двумя входами.
Использование
xor2[номер функции=n] | [имена=имя1[,имя2...]]
Функции
xor2.n
Пины
xor2.n.in0 (bit, in) xor2.n.in1 (bit, in) xor2.n.out (bit, out)
Таблица истинности
Ниже приведен пример использования компонента 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