Этот документ дает основы HAL.

1. HAL Commands

Более подробную информацию можно найти на странице руководства по halcmd: запустите man halcmd в окне терминала.

Чтобы просмотреть конфигурацию HAL и проверить состояние контактов и параметров, используйте окно «Конфигурация HAL» в меню «Станок» в AXIS. Чтобы просмотреть статус контакта, откройте вкладку Watch и щелкните каждый контакт, который вы хотите просмотреть, и он будет добавлен в окно просмотра.

Окно конфигурации HAL
Figure 1. Окно конфигурации HAL

1.1. loadrt

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

loadrt Синтаксис и Пример
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 Синтаксис и Пример
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 можно использовать в нескольких сетевых командах для подключения дополнительных контактов, если соблюдаются приведенные выше правила.

Направление сигнала
Figure 2. Направление сигнала

В этом примере показан сигнал 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
I/O контакты

Контакт ввода-вывода, такой как 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

Команда linksp заменена командой net.

1.8.2. linkps (устарела)

Команда linkps создает соединение между одним контактом и одним сигналом. Это то же самое, что и linksp, но аргументы обратные.

Синтаксис и примеры linkps
linkps <pin-name> <signal-name>
linkps parport.0.pin-02-out X-Step

Команда linkps заменена командой net.

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 Файлы

Если вы использовали 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. Основные логические компоненты

HAL содержит несколько компонентов логики реального времени. Логические компоненты следуют Truth Table, в которой указывается, какой выходной сигнал соответствует любому заданному входному сигналу. Обычно это битовые манипуляторы, которые следуют таблицам истинности электрических логических элементов.

Дополнительные компоненты см. в <<sec:hal-comComponents,HAL Components List> или на страницах руководства.

5.1. and2

Компонент «and2» представляет собой логический элемент "И" с двумя входами. В приведенной ниже таблице истинности показаны выходные данные, основанные на каждой комбинации входных данных.

Syntax
and2 [count=N] | [names=name1[,name2...]]
Функции
and2.n
Контакты
and2.N.in0 (bit, in)
and2.N.in1 (bit, in)
and2.N.out (bit, out)
Table 1. Таблица истинности для and2
in0 in1 out

False

False

False

True

False

False

False

True

False

True

True

True

5.2. not

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

Syntax
not [count=n] | [names=name1[,name2...]]
Функции
not.all
not.n
Контакты
not.n.in (bit, in)
not.n.out (bit, out)
Table 2. Таблица истинности для not
in out

True

False

False

True

5.3. or2

Компонент or2 является логическим элементом "ИЛИ" с двумя входами.

Syntax
or2[count=n] | [names=name1[,name2...]]
Функции
or2.n
Контакты
or2.n.in0 (bit, in)
or2.n.in1 (bit, in)
or2.n.out (bit, out)
Table 3. or2 Таблица истинности
in0 in1 out

True

False

True

True

True

True

False

True

True

False

False

False

5.4. xor2

Компонент xor2 является логическим элементом "Исключающее ИЛИ" с двумя входами.

Syntax
xor2[count=n] | [names=name1[,name2...]]
Функции
xor2.n
Контакты
xor2.n.in0 (bit, in)
xor2.n.in1 (bit, in)
xor2.n.out (bit, out)
Table 4. xor2 Таблица истинности
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. Компоненты преобразования

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.

Table 5. Контакты компонента weighted_sum
Владелец Type Dir Value Имя

10

бит

In

TRUE

wsum.0.bit.0.in

10

s32

I/O

1

wsum.0.bit.0.weight

10

бит

In

FALSE

wsum.0.bit.1.in

10

s32

I/O

2

wsum.0.bit.1.weight

10

бит

In

TRUE

wsum.0.bit.2.in

10

s32

I/O

4

wsum.0.bit.2.weight

10

бит

In

FALSE

wsum.0.bit.3.in

10

s32

I/O

8

wsum.0.bit.3.weight

10

бит

In

FALSE

wsum.0.hold

10

s32

I/O

0

wsum.0.offset

10

s32

Out

5

wsum.0.sum