Во всех этих примерах предполагается, что вы начинаете с конфигурации на основе StepConf и имеете два потока base-thread и servo-thread. Мастер StepConf создаст пустые файлы custom.hal и custom_postgui.hal. Файл custom.hal будет загружен после файла конфигурации HAL, а файл custom_postgui.hal загружается после загрузки ГИП.

1. Подключение двух выходов

Чтобы соединить два выхода со входом, вы можете использовать компонент or2. or2 работает следующим образом: если какой-либо вход or2 включен, то и выход or2 включен. Если ни один из входов or2 не включен, выход or2 выключен.

Например, чтобы две кнопки PyVCP были подключены к одному светодиоду.

Файл .xml, дающий указание PyVCP подготовить графический интерфейс с двумя кнопками (с именами "button-1" и "button-2") и светодиодом (с именем "led-1").
<pyvcp>
  <button>
    <halpin>"button-1"</halpin>
    <text>"Button 1"</text>
  </button>

  <button>
    <halpin>"button-2"</halpin>
    <text>"Button 2"</text>
  </button>

  <led>
    <halpin>"led-1"</halpin>
    <size>50</size>
    <on_color>"green"</on_color>
    <off_color>"red"</off_color>
  </led>
</pyvcp>
Файл postgui.hal, считывается после настройки ГИП и готовности портов принять логику, описанную в HAL.
loadrt or2
addf or2.0 servo-thread
net button-1 or2.0.in0 <= pyvcp.button-1
net button-2 or2.0.in1 <= pyvcp.button-2
net led-1 pyvcp.led-1 <= or2.0.out

Когда вы запустите этот пример в симуляторе оси, созданном с помощью мастера StepConf, вы можете открыть терминал и просмотреть выводы, созданные с помощью loadrt or2, набрав в терминале halcmd show pin or2.

Запуск halcmd в командной строке UNIX, чтобы отобразить контакты, созданные с помощью модуля or2.
$ halcmd show pin or2
Component Pins:
Owner   Type  Dir         Value  Name
    22  bit   IN          FALSE  or2.0.in0 <== button-1
    22  bit   IN          FALSE  or2.0.in1 <== button-2
    22  bit   OUT         FALSE  or2.0.out ==> led-1

Из команды HAL show pin or2 вы можете видеть, что вывод button-1 подключен к выводу or2.0.in0. По стрелке направления вы можете видеть, что кнопка является выходом, а or2.0.in0 — входом. Выход с or2 поступает на вход светодиода.

2. Ручная смена инструмента

В этом примере предполагается, что вы развертываете свою собственную конфигурацию и хотите добавить окно ручной смены инструментов HAL. Ручная смена инструмента HAL в первую очередь полезна, если у вас есть предустановленные инструменты и вы сохраняете смещения в таблице инструментов. Если вам нужно приступить к каждой смене инструмента, лучше всего просто разделить G-код. Чтобы использовать окно HAL Manual Toolchange, вам, по сути, необходимо

  1. загрузить компонент hal_manualtoolchange,

  2. затем отправить tool change iocontrol на hal_manualtoolchange change и

  3. отправить changed hal_manualtoolchange обратно в tool changed iocontrol.

A pin is provided for an external input to indicate the tool change is complete.

Это пример ручной смены инструмента с помощью компонента HAL Manual Toolchange:

loadusr -W hal_manualtoolchange
net tool-change iocontrol.0.tool-change => hal_manualtoolchange.change
net tool-changed iocontrol.0.tool-changed <= hal_manualtoolchange.changed
net external-tool-changed hal_manualtoolchange.change_button <= parport.0.pin-12-in
net tool-number iocontrol.0.tool-prep-number => hal_manualtoolchange.number
net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared

Это пример ручной смены инструмента без компонента HAL «Manual Toolchange»:

net tool-number <= iocontrol.0.tool-prep-number
net tool-change-loopback iocontrol.0.tool-change => iocontrol.0.tool-changed
net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared

3. Вычислить скорость

В этом примере используются ddt, mult2 и abs для вычисления скорости одной оси. Дополнительную информацию о компонентах реального времени см. на страницах руководства или в списке компонентов HAL ([sec:hal-components]).

Прежде всего, проверьте свою конфигурацию, чтобы убедиться, что вы не используете готовые компоненты реального времени. Вы можете сделать это, открыв окно конфигурации HAL и найдя компоненты в разделе контактов. Если да, то найдите файл HAL, в который они загружаются, увеличьте количество и настройте экземпляр на правильное значение. Добавьте следующее в файл custom.hal.

Загрузите компоненты реального времени.

loadrt ddt count=1
loadrt mult2 count=1
loadrt abs count=1

Добавьте функции в поток, чтобы он обновлялся.

addf ddt.0 servo-thread
addf mult2.0 servo-thread
addf abs.0 servo-thread

Установите связи.

setp mult2.in1 60
net xpos-cmd ddt.0.in
net X-IPS mult2.0.in0 <= ddt.0.out
net X-ABS abs.0.in <= mult2.0.out
net X-IPM abs.0.out

В этом последнем разделе мы устанавливаем для параметра mult2.0.in1 значение 60, чтобы преобразовать дюймы в секунду в дюймы в минуту (IPM), которые мы получаем из ddt.0.out.

xpos-cmd отправляет заданную позицию в ddt.0.in. ddt вычисляет производную изменения входных данных.

ddt2.0.out умножается на 60, чтобы получить IPM.

mult2.0.out отправляется в abs для получения абсолютного значения.

На следующем рисунке показан результат, когда ось X перемещается со скоростью 15 дюймов в минуту в отрицательном направлении. Обратите внимание, что мы можем получить абсолютное значение либо от контакта abs.0.out, либо от сигнала X-IPM.

HAL: пример скорости
Figure 1. HAL: пример скорости

4. Подробности плавного запуска

В этом примере показано, как компоненты HAL lowpass, limit2 или limit3 могут использоваться для ограничения скорости изменения сигнала.

В этом примере у нас есть серводвигатель, приводящий в движение шпиндель токарного станка. Если мы просто использовали заданные скорости шпинделя сервопривода, он попытается перейти от текущей скорости к заданной скорости как можно быстрее. Это может вызвать проблемы или повредить привод. Чтобы замедлить скорость изменения, мы можем отправить spindle.N.speed-out через ограничитель перед PID, чтобы значение команды PID изменялось на новые настройки медленнее.

Три встроенных компонента, ограничивающих сигнал:

  • limit2 ограничивает диапазон и первую производную сигнала.

  • limit3 ограничивает диапазон, первую и вторую производные сигнала.

  • moving average to track an input signal.

Чтобы найти дополнительную информацию об этих компонентах HAL, обратитесь к справочным страницам.

Поместите следующее в текстовый файл с именем softstart.hal. Если вы не знакомы с Linux, поместите файл в свой домашний каталог.

loadrt threads period1=1000000 name1=thread
loadrt siggen
loadrt lowpass
loadrt limit2
loadrt limit3
net square siggen.0.square => lowpass.0.in limit2.0.in limit3.0.in
net lowpass <= lowpass.0.out
net limit2 <= limit2.0.out
net limit3 <= limit3.0.out
setp siggen.0.frequency .1
setp lowpass.0.gain .01
setp limit2.0.maxv 2
setp limit3.0.maxv 2
setp limit3.0.maxa 10
addf siggen.0.update thread
addf lowpass.0 thread
addf limit2.0 thread
addf limit3.0 thread
start
loadusr halscope

Откройте окно терминала и запустите файл с помощью следующей команды.

halrun -I softstart.hal

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

Далее вам нужно добавить сигналы в каналы. Нажмите на channel 1, затем выберите square на вкладке Signals. Повторите то же самое для channels 2–4 и добавьте lowpass, limit2 и limit3.

Далее, чтобы настроить триггерный сигнал, нажмите кнопку Source None и выберите square. Кнопка изменится на Source Chan 1.

Затем нажмите Single в поле переключателей Run Mode. Это запустит прогон, и когда он закончится, вы увидите свои сигналы.

Чтобы разделить сигналы и лучше их видеть, щелкните канал, а затем используйте ползунок Pos в поле Vertical, чтобы установить позиции.

Снимок экрана плавного запуска

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

setp lowpass.0.gain *.01

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

Когда вы закончите, введите exit в окне терминала, чтобы завершить работу halrun и закрыть halscope. Не закрывайте окно терминала при работающем halrun, так как в памяти могут остаться некоторые вещи, которые могут помешать загрузке LinuxCNC.

Для получения дополнительной информации о Halscope см. руководство HAL и учебное пособие.

5. Автономный HAL

В некоторых случаях вам может потребоваться запустить экран GladeVCP только с HAL. Например, предположим, что у вас есть устройство с шаговым приводом, и все, что вам нужно, это запустить шаговый двигатель. Простой интерфейс Пуск/Стоп — это все, что вам нужно для вашего приложения, поэтому нет необходимости загружать и настраивать полнофункциональное приложение ЧПУ.

В следующем примере мы создадим простую панель GladeVCP с одним шаговым приводом.

Основной синтаксис
# load the winder.glade GUI and name it winder
loadusr -Wn winder gladevcp -c winder -u handler.py winder.glade

# load realtime components
loadrt threads name1=fast period1=50000 fp1=0 name2=slow period2=1000000
loadrt stepgen step_type=0 ctrl_type=v
loadrt hal_parport cfg="0x378 out"

# add functions to threads
addf stepgen.make-pulses fast
addf stepgen.update-freq slow
addf stepgen.capture-position slow
addf parport.0.read fast
addf parport.0.write fast

# make HAL connections
net winder-step parport.0.pin-02-out <= stepgen.0.step
net winder-dir parport.0.pin-03-out <= stepgen.0.dir
net run-stepgen stepgen.0.enable <= winder.start_button

# запуск потоков
start

# закомментируйте следующие строки во время тестирования и используйте интерактивную
# опцию halrun -I -f start.hal, чтобы иметь возможность отображать контакты и т. д..

# дождитесь завершения работы ГИП GladeVCP с именем winder
waitusr winder

# остановить потоки HAL
stop

# выгрузить все компоненты HAL перед выходом
unloadrt all