Лишняя сущность.
Поскольку к станку прилажен внешний агрегатЪ висящий на проводке (под общим названием ШТУРВАЛ) с запасными кнопками по бортам, то, решено было использовать его ещё и в качестве регулятора скорости подач (для режима ручного управления). Это когда нужно «пропылить» плоскость и т.п.
Маленькая ремарка.
Свой фрезерный станок я доработал из 67К25ПФ20. С условием соблюсти варианты работы в ручном, автоматическом (ЧПУ) и полуавтоматическом (работа с предустановленными скоростями подач «по прямой». Для таких действий используются обычные «джойстики». Т.е., по сути, выключатели, с фиксацией положения. Как на классических станках: включил – поехали с заданной ранее скоростью.
Перед этим я успел наиграться возможностями ЕМС2. Только вот мышка постоянно соскальзывает…
Т.е., регулировать скорость подачи мышкой - неудобно. Опять же отрывать руку от энкодера, дергать мышку с нажатой кнопкой обратно к энкодеру – жуть и мрак…
Итак.
При нажатии одной (выбираем сами) из боковых кнопок на корпусе «штурвала» происходит блокировка всех ранее назначенных этому узлу действий и (удерживая кнопу) осуществляется регулирование скорости подачи.
В результате трёх неспешных весенних вечеров родилось-таки.
Код: Выделить всё
#Входы "ручного джойстика"
net go_x_plus halui.jog.0.plus <= parport.2.pin-03-in-not
net go_x_minus halui.jog.0.minus <= parport.2.pin-02-in-not
net go_y_plus halui.jog.1.plus <= parport.2.pin-04-in-not
net go_y_minus halui.jog.1.minus <= parport.2.pin-05-in-not
net go_z_plus halui.jog.2.plus <= parport.2.pin-06-in-not
net go_z_minus halui.jog.2.minus <= parport.2.pin-07-in-not
#Логика, необходимая для управления с энкодера
loadrt and2 count=3
addf and2.0 servo-thread
addf and2.1 servo-thread
addf and2.2 servo-thread
loadrt sample_hold count=1
addf sample-hold.0 servo-thread
loadrt sum2 count=2
addf sum2.0 servo-thread
addf sum2.1 servo-thread
loadrt limit1 count=1
addf limit1.0 servo-thread
loadrt not count=1
addf not.0 servo-thread
loadrt tristate_float count=2
addf tristate-float.0 servo-thread
addf tristate-float.1 servo-thread
loadrt conv_s32_float count=3
loadrt conv_float_s32 count=1
loadrt mult2 count=1
addf conv-s32-float.0 servo-thread
addf conv-s32-float.1 servo-thread
addf conv-s32-float.2 servo-thread
addf conv-float-s32.0 servo-thread
addf mult2.0 servo-thread
#Штурвал
loadrt mux4 count=1
addf mux4.0 servo-thread
#Тип энкодера 1-квадратурный, 0-импульсный
setp encoder.3.x4-mode 1
#Vel. mode - 1, pos. mode - 0
setp axis.0.jog-vel-mode 0
setp axis.1.jog-vel-mode 0
setp axis.2.jog-vel-mode 0
#Селектор шага энкодера (множитель) мм.
setp mux4.0.in0 0.00125
setp mux4.0.in1 0.0025
setp mux4.0.in2 0.025
#Пины селектора шага
net scale1 mux4.0.sel0 <= parport.2.pin-10-in-not
net scale2 mux4.0.sel1 <= parport.2.pin-11-in-not
#Передача из mux4 к оси
net mpg-scale <= mux4.0.out
net mpg-scale => axis.0.jog-scale
net mpg-scale => axis.1.jog-scale
net mpg-scale => axis.2.jog-scale
#Пины входа энкодера
net mpg-a encoder.3.phase-A <= parport.2.pin-08-in
net mpg-b encoder.3.phase-B <= parport.2.pin-09-in
#Кнопка режима работы штурвала - когда нажата оси блокируются и вращение штурвала регулирует скорость
net sw-mode parport.1.pin-08-in => and2.0.in0 and2.1.in0 and2.2.in0 not.0.in tristate-float.1.enable
#Инвертированный сигнал кнопки - на устройство выборки и хранения и tristate-float.0
net NOT2 not.0.out => sample-hold.0.hold tristate-float.0.enable
#Блокировка осей
net AND1 and2.0.in1 <= parport.2.pin-12-in-not
net mpg-x axis.0.jog-enable <= and2.0.out
net AND2 and2.1.in1 <= parport.2.pin-13-in-not
net mpg-y axis.1.jog-enable <= and2.1.out
net AND3 and2.2.in1 <= parport.2.pin-15-in-not
net mpg-z axis.2.jog-enable <= and2.2.out
#Выход 4 энкодера (штурвал) направляется на входы jog-counts осей, устройство выборки и хранения и на сумматор. У оси Z попутно корректируется направление - см. далее
net ENC_OUT encoder.3.counts => conv-s32-float.0.in axis.0.jog-counts axis.1.jog-counts sample-hold.0.in conv-s32-float.2.in
#Кожффициенты и смещения сумматоров. Нулевой вычитает из счетчика энкодера значение, сохраненное при нажатии кнопки. Первый - складывает с предыдущей
#выставленной скоростью, запомненной опять же в момент нажатия кнопки. Также выполняются промежуточные преобразования s32-float
setp sum2.0.gain0 -1.0
setp sum2.0.gain1 1.0
setp sum2.0.offset 0.0
setp sum2.1.gain0 1.0
setp sum2.1.gain1 1.0
setp sum2.1.offset 0.0
net SUM1 conv-s32-float.1.in <= sample-hold.0.out
net SUM2 sum2.0.in0 <= conv-s32-float.1.out
net SUM3 sum2.0.in1 <= conv-s32-float.2.out
net SUM30 sum2.1.in0 <= sum2.0.out
net SUM31 sum2.1.in1 <= tristate-float.1.out
#Ограничитель скорости
setp limit1.0.min 0
setp limit1.0.max 1800
#
net SUM4 tristate-float.0.in <= sum2.1.out
net SUM5 limit1.0.in <= tristate-float.0.out
#Выход ограничителя направляется в halui и устройство tristate-float.1. Кроме этого сигнал encoder-jog может быть выведен в pyvcp панель или другой GUI
net encoder-jog limit1.0.out => tristate-float.1.in halui.jog-speed