Этот документ дает основы HAL.
1. HAL Commands
Более подробную информацию можно найти на странице руководства по halcmd: запустите man halcmd в окне терминала.
Чтобы просмотреть конфигурацию HAL и проверить состояние контактов и параметров, используйте окно «Конфигурация HAL» в меню «Станок» в AXIS. Чтобы просмотреть статус контакта, откройте вкладку Watch и щелкните каждый контакт, который вы хотите просмотреть, и он будет добавлен в окно просмотра.
1.1. loadrt
Команда loadrt
загружает компонент HAL в реальном времени. Функции компонентов реального времени необходимо добавлять в поток, чтобы они обновлялись со скоростью потока. Вы не можете загрузить компонент, не работающий в реальном времени, в пространство реального времени.
loadrt <component> <options> loadrt mux4 count=1
1.2. addf
Команда addf
добавляет функцию в поток реального времени. Если для создания конфигурации использовался мастер StepConf, были созданы два потока (base-thread
и servo-thread
).
addf
добавляет функцию functname в поток threadname. По умолчанию функции добавляются в том порядке, в котором они находятся в файле. Если position указано, функция добавляется в это место в потоке. Отрицательное значение position указывает положение относительно конца потока. Например, 1 — начало потока, -1 — конец потока, -3 — третий от конца.
Для некоторых функций важно загружать их в определенном порядке, например, функции чтения и записи parport. Имя функции обычно представляет собой имя компонента плюс номер. В следующем примере загружается компонент or2, а show function
показывает имя функции or2.
$ halrun
halcmd: loadrt or2
halcmd: show function
Exported Functions:
Owner CodeAddr Arg FP Users Name
00004 f8bc5000 f8f950c8 NO 0 or2.0
Вам необходимо добавить функцию из компонента реального времени HAL в поток, чтобы функция обновлялась со скоростью потока. Обычно существует два потока, как показано в этом примере. Некоторые компоненты используют математические вычисления с плавающей запятой, и их необходимо добавлять в поток, поддерживающий математические операции с плавающей запятой. FP
указывает, поддерживается ли в этом потоке математика с плавающей запятой.
$ halrun
halcmd: loadrt motmod base_period_nsec=55555 servo_period_nsec=1000000 num_joints=3
halcmd: show thread
Realtime Threads:
Period FP Name ( Time, Max-Time )
995976 YES servo-thread ( 0, 0 )
55332 NO base-thread ( 0, 0 )
-
base-thread (высокоскоростной поток): этот поток обрабатывает элементы, требующие быстрого ответа, например создание шаговых импульсов, а также чтение и запись через параллельный порт. Не поддерживает математику с плавающей запятой.
-
servo-thread (медленный поток): этот поток обрабатывает элементы, которые могут работать с более медленным откликом, например контроллер движения, ClassicLadder и обработчик команд движения, а также поддерживает математические вычисления с плавающей запятой.
addf <function> <thread> addf mux4.0 servo-thread
Note
|
Если компоненту требуется поток с плавающей запятой, обычно это более медленный сервопоток. |
1.3. loadusr
Команда loadusr загружает компонент HAL не в реальном времени. Программы, не работающие в режиме реального времени, представляют собой отдельные процессы, которые при необходимости взаимодействуют с другими компонентами HAL через контакты и параметры. Вы не можете загружать компоненты реального времени в пространство не в реальном времени.
Флаги могут быть одним или несколькими из следующих:
-W
|
дождаться готовности компонента. Предполагается, что компонент имеет то же имя, что и первый аргумент команды. |
-Wn <name>
|
дождаться компонента, который будет иметь заданное <name>. Это применимо только в том случае, если у компонента есть опция имени. |
-w
|
дождаться выхода программы |
-i
|
игнорировать возвращаемое значение программы (с -w) |
-n
|
назвать компонент, если это допустимая опция для этого компонента. |
loadusr
loadusr <component> <options> loadusr halui loadusr -Wn spindle gs2_vfd -n spindle
По-английски это означает loadusr ждет имя шпинделя компонента gs2_vfd имя шпинделя.
1.4. net
Команда net
создает соединение
между сигналом и одним или несколькими контактами. Если сигнал не существует, net создает новый сигнал. Это заменяет необходимость использования команды newsig. Необязательные стрелки направления <=
, =>
и <=>
облегчают отслеживание логики при чтении командной строки net
и не используются командой net. Стрелки направления должны быть отделены пробелом от названий контактов.
net
net signal-name pin-name <optional arrow> <optional second pin-name> net home-x joint.0.home-sw-in <= parport.0.pin-11-in
В приведенном выше примере home-x
— это имя сигнала, joint.0.home-sw-in
— это контакт Direction IN
, <=
— необязательная стрелка направления, а parport.0.pin.-11-in
— это контакт «Direction OUT». Это может показаться запутанным, но метки входа и выхода для контакта параллельного порта указывают на физический способ работы контакта, а не на то, как он обрабатывается в HAL.
Контакт может быть подключен к сигналу, если он подчиняется следующим правилам:
-
Контакт IN всегда можно подключить к сигналу.
-
Конакт IO можно подключить, если на сигнале нет контакта OUT.
-
Контакт OUT можно подключить только в том случае, если в сигнале нет других контактов OUT или IO.
Одно и то же signal-name можно использовать в нескольких сетевых командах для подключения дополнительных контактов, если соблюдаются приведенные выше правила.
В этом примере показан сигнал xStep с источником stepgen.0.out
и двумя считывателями: parport.0.pin-02-out
и parport.0.pin-08-out
. По сути, значение stepgen.0.out
отправляется в сигнал xStep, а затем это значение отправляется в parport.0.pin-02-out
и parport.0.pin-08-out
.
# сигнал источник получатель получатель net xStep stepgen.0.out => parport.0.pin-02-out parport.0.pin-08-out
Поскольку сигнал xStep содержит значение stepgen.0.out
(источник), вы можете использовать тот же сигнал снова, чтобы отправить значение другому получателю. Для этого достаточно использовать сигнал с получателями на другой линии.
# сигнал получатель2 net xStep => parport.0.pin-06-out
Контакт ввода-вывода, такой как encoder.N.index-enable, может быть считан или установлен в соответствии с разрешением компонента.
1.5. setp
Команда setp
устанавливает значение контакта или параметра. Допустимые значения будут зависеть от типа контакта или параметра. Если типы данных не совпадают, это ошибка.
Некоторые компоненты имеют параметры, которые необходимо настроить перед использованием. При необходимости параметры можно установить перед использованием или во время работы. Вы не можете использовать setp на контакте, подключенном к сигналу.
setp
setp <pin/parameter-name> <value> setp parport.0.pin-08-out TRUE
1.6. sets
Команда sets
устанавливает значение сигнала.
sets
sets <signal-name> <value> net mysignal and2.0.in0 pyvcp.my-led sets mysignal 1
It is an error if:
-
Имя сигнала не существует
-
Если у сигнала уже есть источник
-
Если значение не является правильным типом для сигнала
1.7. unlinkp
Команда unlinkp
отключает контакт от подключенного сигнала. Если до выполнения команды к контакту не был подключен сигнал, ничего не произойдет. Команда unlinkp
полезна при устранении неполадок.
unlinkp
unlinkp <pin-name> unlinkp parport.0.pin-02-out
1.8. Устаревшие команды
Следующие команды устарели и могут быть удалены из будущих версий. Любая новая конфигурация должна использовать команду net
. Эти команды включены, поэтому старые конфигурации по-прежнему будут работать.
1.8.1. linksp (устарела)
Команда linksp
создает соединение
между сигналом и одним контактом.
linksp
linksp <signal-name> <pin-name> linksp X-step parport.0.pin-02-out
The linksp
command has been superseded by the net
command.
1.8.2. linkps (устарела)
Команда linkps создает соединение между одним контактом и одним сигналом. Это то же самое, что и linksp
, но аргументы обратные.
linkps
linkps <pin-name> <signal-name> linkps parport.0.pin-02-out X-Step
The linkps
command has been superseded by the net
command.
1.8.3. newsig
команда newsig
создает новый сигнал HAL с именем <signname> и типом данных <type>. Тип должен быть бит, s32, u32, s64, u64 или float. Ошибка, если <signame> уже существует.
newsig
newsig <signame> <type> newsig Xstep bit
Дополнительную информацию можно найти в руководстве HAL или на страницах руководства halrun
.
2. HAL Data
2.1. Bit
Значение бита ВКЛ или ВЫКЛ.
-
значение bit = true или 1 и false илиr 0 (True, TRUE, true все действительны)
2.2. Float
«Float» — это число с плавающей запятой. Другими словами, десятичная точка может перемещаться по мере необходимости.
-
Значения float = 64-битное значение с плавающей запятой, с разрешением примерно 53 бита и более 2 10 (~ 1000) бит динамического диапазона.
Дополнительную информацию о числах с плавающей запятой см.:
2.3. s32
Число «s32» — это целое число, которое может иметь отрицательное или положительное значение.
-
Значения s32 = целые числа от -2147483648 до 2147483647
2.4. u32
Число «u32» — это целое число, которое может быть только положительным.
-
Значения u32 = целые числа от 0 до 4294967295
2.5. s64
Число s64 — это целое число, которое может иметь отрицательное или положительное значение.
-
Значения s64 = целые числа от -9,223,372,036,854,775,808 до +9,223,372,036,854,775,807
2.6. u64
Число u64 — это целое число, которое может быть только положительным.
-
Значения u64 = целые числа от 0 до 18,446,744,073,709,551,615
3. HAL Files
Если вы использовали Stepper Config Wizard для создания конфигурации, в вашем каталоге конфигурации будет до трех файлов HAL.
-
«my-mill.hal» (если ваша конфигурация называется «my-mill»). Этот файл загружается первым, и его не следует изменять, если вы использовали Stepper Config Wizard.
-
custom.hal Этот файл загружается следующим, до загрузки ГИП. Здесь вы помещаете свои собственные команды HAL, которые хотите загрузить до загрузки ГИП.
-
custom_postgui.hal Этот файл загружается после загрузки ГИП. Здесь вы помещаете свои собственные команды HAL, которые хотите загрузить после загрузки ГИП. В нем необходимо разместить любые команды HAL, использующие виджеты PyVCP.
4. HAL Parameter
Два параметра автоматически добавляются к каждому компоненту HAL при его создании. Эти параметры позволяют вам ограничить время выполнения компонента.
.time
|
Время — это количество циклов ЦП, необходимое для выполнения функции. |
.tmax
|
Tmax — максимальное количество циклов ЦП, необходимое для выполнения функции. |
tmax
— это параметр чтения/записи, поэтому пользователь может установить его равным 0, чтобы избавиться от первой инициализации во время выполнения функции.
5. Basic Logic Components
HAL содержит несколько компонентов логики реального времени. Логические компоненты следуют Truth Table, в которой указывается, какой выходной сигнал соответствует любому заданному входному сигналу. Обычно это битовые манипуляторы, которые следуют таблицам истинности электрических логических элементов.
Дополнительные компоненты см. в <<sec:hal-comComponents,HAL Components List> или на страницах руководства.
5.1. and2
Компонент «and2» представляет собой логический элемент "И" с двумя входами. В приведенной ниже таблице истинности показаны выходные данные, основанные на каждой комбинации входных данных.
and2 [count=N] | [names=name1[,name2...]]
and2.n
and2.N.in0 (bit, in)
and2.N.in1 (bit, in)
and2.N.out (bit, out)
in0 | in1 | out |
---|---|---|
False |
False |
False |
True |
False |
False |
False |
True |
False |
True |
True |
True |
5.2. not
Компонент not
является битовым инвертером.
not [count=n] | [names=name1[,name2...]]
not.all
not.n
not.n.in (bit, in)
not.n.out (bit, out)
in | out |
---|---|
True |
False |
False |
True |
5.3. or2
Компонент or2
является логическим элементом "ИЛИ" с двумя входами.
or2[count=n] | [names=name1[,name2...]]
or2.n
or2.n.in0 (bit, in)
or2.n.in1 (bit, in)
or2.n.out (bit, out)
in0 | in1 | out |
---|---|---|
True |
False |
True |
True |
True |
True |
False |
True |
True |
False |
False |
False |
5.4. xor2
Компонент xor2
является логическим элементом "Исключающее ИЛИ" с двумя входами.
xor2[count=n] | [names=name1[,name2...]]
xor2.n
xor2.n.in0 (bit, in)
xor2.n.in1 (bit, in)
xor2.n.out (bit, out)
in0 | in1 | out |
---|---|---|
True |
False |
True |
True |
True |
False |
False |
True |
True |
False |
False |
False |
6. Logic Examples
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
В приведенном выше примере одна копия and2
загружается в пространство реального времени и добавляется в сервопоток. Следующий контакт pin-11
параллельного порта подключен к биту in0
вентиля"И". Следующий контакт pin-12
подключен к биту in1
вентиля "И". Наконец, мы подключаем выходной бит and2
к параллельному порту pin-14
. Итак, следуя таблице истинности для and2
, если контакт 11 и контакт 12 включены, то выходной контакт 14 будет включен.
7. Conversion Components
7.1. weighted_sum
Взвешенная сумма преобразует группу битов в целое число. Преобразование представляет собой сумму весов присутствующих битов плюс любое смещение. Это похоже на BCD, но с бОльшим количеством опций. Бит hold прерывает обработку ввода, так что значение sum больше не изменяется.
weighted_sum
loadrt weighted_sum wsum_sizes=size[,size,...]
Создает группы ``weighted_sum``, каждая с заданным количеством входных битов (размером).
Чтобы обновить weighted_sum
, process_wsums
должен быть прикреплен к потоку.
process_wsums
в поток сервоприводаaddf process_wsums servo-thread
При этом обновляется компонент weighted_sum
.
В следующем примере, копия окна конфигурации AXIS HAL, биты 0 и 2 имеют значение TRUE, они не имеют смещения. Вес (weight) бита 0 равен 1, бита 2 — 4, поэтому сумма равна 5.
Владелец | Type | Dir | Value | Имя |
---|---|---|---|---|
10 |
бит |
In |
TRUE |
|
10 |
s32 |
I/O |
1 |
|
10 |
бит |
In |
FALSE |
|
10 |
s32 |
I/O |
2 |
|
10 |
бит |
In |
TRUE |
|
10 |
s32 |
I/O |
4 |
|
10 |
бит |
In |
FALSE |
|
10 |
s32 |
I/O |
8 |
|
10 |
бит |
In |
FALSE |
|
10 |
s32 |
I/O |
0 |
|
10 |
s32 |
Out |
5 |
|