Во всех этих примерах предполагается, что вы начинаете с конфигурации на основе 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 были подключены к одному светодиоду.
<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>
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, вам, по сути, необходимо
-
загрузить компонент hal_manualtoolchange,
-
затем отправить tool change iocontrol на hal_manualtoolchange change и
-
отправить 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
.
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