4-я ось - позиция/скорость

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
zilk
Опытный
Сообщения: 139
Зарегистрирован: 07 янв 2012, 19:05
Репутация: 1
Откуда: Украина, Харьков
Контактная информация:

4-я ось - позиция/скорость

Сообщение zilk »

Здравствуйте люди!
Хочу поднять здесь вопрос, который уже подымался на чипмэйкере, но вразумительного ответа, кроме туманных намеков, я так и не увидел.
Вопрос начался с видео:https://www.youtube.com/watch?v=b2-Kdud7eiA
и закончился ссылкой на вялое обсуждение этой темы: http://www.mail-archive.com/emc-develop ... 03729.html
Для меня, как начинающего ЧПУ-строителя, эта тема показалась такой интересной, что уже просто кушать не могу. Хотя все внутренности моего ЧПУ пока еще лежат на полу в виде кучи проводов, моторов, компов и пр. а само железо стоит разобранным в мастерской, очень бы хотелось уже сейчас придать будущему станку дополнительные интересные возможности.
Поэтому и появился конкретный вопрос - каким образом в ходе выполнения программы в ЕМС можно переключать режим работы четвертой оси А из velocity mode в index mode и обратно без остановки программы и загрузки другой конфигурации? На видео, я так понимаю, ЧПУ работает под мачем через скрипт, возможно ли как-то исхитриться в ЕМС, чтобы получить аналогичный результат?
Спасибо!
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение Nick »

Все зависит от того, как реализована ось.
Хотя вообще, сделать это можно таким образом:
Фактически у нас появляется два шпинделя, предположим, что один это фрезерный шпиндель spindle, а второй это твоя ось A.

Нужно просто команду скорости шпинделя перекидывать с motion.spindle-speed-out на контроллер оси. Если ось на серве, то можно кидать на pid.A.command, если на шаговике и он обычно работает в режиме положения, тоже не проблема. Делаем еще один компонент stepgen, причем в режиме управления скоростью, на него подаем motion.spindle-speed-out. И его вывод подаем на пины вывода на контроллер.

Все эти подмены реализуются при помощи компонента mux2. Будет что-то вроде

net select-lathe stepgen.4.enable # это мы делаем включение stepgen для шпинделя А
net spindle-speed-cmd => stepgen.4.velocity-cmd # это мы делаем, чтобы stepgen крутился как шпиндель
# следующие 4 строчки перебрасывают пин шага
net step-a stepgen.3.step mux2.0.in0
net step-a-spin stepgen.4.step mux2.0.in1
net select-lathe mux2.0.sel
net step-a-out mux2.0.out parport.0.pin-10.out

# следующие 4 строчки перебрасывают пин направления
net dir-a stepgen.3.dir mux2.1.in0
net dir-a-spin stepgen.4.dir mux2.1.in1
net select-lathe mux2.1.sel
net step-a-out mux2.1.out parport.0.pin-11.out
zilk
Опытный
Сообщения: 139
Зарегистрирован: 07 янв 2012, 19:05
Репутация: 1
Откуда: Украина, Харьков
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение zilk »

Nick, спасибо за ответ, буду разбираться! Для меня все эти hal-ы - пока темный лес.. :monkey:
Все оси на сервах, управление 7i43-4.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение Nick »

Ну тогда еще проще. Лучше всего сделай сначала конфиг для фрезера, потом скинешь мне hal файл, и я тебе расскажу что, куда написать.

HAL проще всего себе представить отдельными устройствами с пинами - выходами и входами, а команда net, это соединить два пина вместе.
Примерно как ты провода от мотора подключаешь к пинам серво драйвера.
zilk
Опытный
Сообщения: 139
Зарегистрирован: 07 янв 2012, 19:05
Репутация: 1
Откуда: Украина, Харьков
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение zilk »

Frezer.zip
(3.63 КБ) 615 скачиваний
Да, я потихоньку проникаюсь этими сущностями и намерен их победить...
Хотел сразу задать и еще один глобальный для меня вопрос, который собираюсь когда-нибудь воплотить в железо.
Допустим, на 4-осевом фрезере имеется шпиндель на мощной серве, которая управляется +/-10В, под которую уже имеется 7i33.
Каким образом сконфигурировать все это так, чтобы заставить вращаться шпиндель и 4-ю ось А синхронно, с неким коэффициентом деления, напр. 10, 11, 12, 13 и т.д. до 200, т.е. получить некое подобие зубофрезерного станка? Для этого шпиндель надо конфигурировать как 5-ю ось, или все это делается просто соответствующим написанием циклов G-кода, или как-то еще?
Спасибо!

PS. Добавил архив с файлами конфигурации
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение Nick »

Есть режим (gкод для перемещения) с заданным перемещением на оборот. Только не уверен, что он будет работать с четвертой осью...
Вот ссылка: G33 Перемещение синхронизированное со шпинделем
zilk
Опытный
Сообщения: 139
Зарегистрирован: 07 янв 2012, 19:05
Репутация: 1
Откуда: Украина, Харьков
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение zilk »

Да, я это все прочитал, и тоже не уверен. Хотя-бы понять, в какую сторону копать...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение Nick »

Хотя.... может здесь сработает G96 Constant surface speed mode (foot/minute or meter/minute) with top speed.... надо подумать...

Можно конечно пины управления скоростью завязать, но не уверен, что хватит их быстродействия...
zilk
Опытный
Сообщения: 139
Зарегистрирован: 07 янв 2012, 19:05
Репутация: 1
Откуда: Украина, Харьков
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение zilk »

Nick, не могу разобраться с примером, который ты привел по моему первому вопросу, ход мысли непонятен. Если есть возможность, приведи пожалуйста более полную структуру этого кусочка hal-а, чтобы и неграмотный понял...
Слепил из того что нашел свой вариант переключения двух stepgen-ов на одну ось, если тупо следовать логике, то может и сработает..

Код: Выделить всё

loadrt and2 count=4
loadrt or2 count=2
loadrt not count=1

addf and2.0 servo-thread
addf and2.1 servo-thread
addf and2.2 servo-thread
addf and2.3 servo-thread
addf or2.0 servo-thread
addf or2.1 servo-thread
addf not.0 servo-thread

net mode motion.digital-out-00 => not.0.in and2.0.in1 and2.2.in1
net inv not.0.out => and2.1.in1 and2.3.in1
net p-step stepgen.3.step => and2.0.in0
net v-step stepgen.4.step => and2.1.in0
net p-dir stepgen.3.dir => and2.2.in0
net v-dir stepgen.4.dir => and2.3.in0
net pstep-sw and2.0.out => or2.0.in0
net vstep-sw and2.1.out => or2.0.in1
net pdir-sw and2.2.out => or2.1.in0
net vdir-sw and2.3.out => or2.1.in1

net sel-step or2.0.out => parport.0.pin-NN-out
net sel-dir or2.1.out => parport.0.pin-NN-out
Переключение в режим скорости по команде M64 P0, обратно в режим позиции - M65 P0.

Если такой вариант прокатит, то осталось 2 вопроса, пока непонятных для меня - как все это выразить для случая использования серв (непойму как задается направление dir в hal) и как это применить для случая месы 7i43? как там прописываются выводы?
Спасибо!
zilk
Опытный
Сообщения: 139
Зарегистрирован: 07 янв 2012, 19:05
Репутация: 1
Откуда: Украина, Харьков
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение zilk »

Изучал тут на досуге всякие умные доки, слепил еще один вариант переключения для случая месы 7i43.
Наверное это все бред, но может кто скажет - туда хоть копаю или нет? :monkey:
Спасибо Nick-у за подсказку..

Код: Выделить всё

# сначала создается один лишний pwmgen.04; pwmgen.03 крутит 4-ю ось; pwmgen.05 крутит шпиндель
loadrt mux2 count=3        # загружается 3 мультиплексора
addf mux2.0 servo-thread
addf mux2.1 servo-thread
addf mux2.2 servo-thread

net select motion.digital-out-00 => mux2.0.sel mux2.1.sel # переключение режима M64 P0 <=> M65 P0

net a-pwm    hm2_7i43.0.pwmgen.03.pwm => mux2.0.in0
net a1-pwm   hm2_7i43.0.pwmgen.04.pwm => mux2.0.in1
net out-pwm  mux2.0.out => hm_7i43.0.gpio.XXX.out          # вывод pwm на контакт XXX месы

net a-dir    hm2_7i43.0.pwmgen.03.dir => mux2.1.in0
net a1-dir   hm2_7i43.0.pwmgen.04.dir => mux2.1.in1
net out-dir  mux2.0.out => hm_7i43.0.gpio.YYY.out          # вывод dir на контакт YYY месы

net a-enable   hm2_7i43.0.pwmgen.03.enable => mux2.2.in0
net a1-enable  hm2_7i43.0.pwmgen.04.enable => mux2.2.in1
net out-enable mux2.3.out => hm_7i43.0.gpio.ZZZ.out        # вывод enable на контакт ZZZ месы

net spindle-vel-cmd     => hm2_7i43.0.pwmgen.04.value hm2_7i43.0.pwmgen.05.value
net spindle-enable      => hm2_7i43.0.pwmgen.04.enable hm2_7i43.0.pwmgen.05.enable
Спасибо!
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение Nick »

1-й вариант слишком сложен, вместо and, not и or проще использовать компонент mux2 - выбирает один из вводов в зависимости от сигнала sel.

2-й вариант выглядит более менее правильным :)! Какими контактами у тебя серва управляется, ШИМ на скорость + пин направления?
Да, в случае с А-шпинделем на вывод направления наверное нужно подать motion.spindle-reverse. А в случае А-четвертой оси все это дело надо будет прогнать через ПИД.
zilk
Опытный
Сообщения: 139
Зарегистрирован: 07 янв 2012, 19:05
Репутация: 1
Откуда: Украина, Харьков
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение zilk »

Да, сервы у меня управляются pwm-dir.
Пока не понял, как нужно изменить hal, чтобы задействовать motion.spindle-reverse, а просто тупо подать вывод pwmgen шпинделя на ось А - это не правильно?
Подтолкни еще немного в нужном направлении... :monkey:
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение Nick »

Правильно, но тебе нужно еще и направление, а это motion.spindle-reverse. Вроде так.
Да еще нужно будет отключить энкодер оси А, иначе при переходе на шпиндель будет вылетать Ferror. И наверное надо будет после обратного перехода заново хоумить ось... Хотя... можно энкодер не отключать совсем, а просто отключить его от axis.N.motor-pos-fb
zilk
Опытный
Сообщения: 139
Зарегистрирован: 07 янв 2012, 19:05
Репутация: 1
Откуда: Украина, Харьков
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение zilk »

[b]Nick[/b] писал(а):просто отключить его от axis.N.motor-pos-fb
Если сделать линк axis.N.motor-pos-cmd => axis.N.motor-pos-fb, то ferror перестает вылетать навсегда.. :hehehe:
Nick, можно глупый вопрос - если создавать конфиг в pncconf, то каждый созданный pwm или encoder изначально привязан к своим выводам месы; можно ли их как-то отвязать от конкретных выводов и задать свои? как изменить их раскладку или она жестко определяется в прошивке?
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение Nick »

Скорее всего все определяется прошивкой. А зачем тебе это надо?
zilk писал(а):Если сделать линк axis.N.motor-pos-cmd => axis.N.motor-pos-fb, то ferror перестает вылетать навсегда.. :hehehe:
А еще говорит ничего в HAL не понимает :).
zilk
Опытный
Сообщения: 139
Зарегистрирован: 07 янв 2012, 19:05
Репутация: 1
Откуда: Украина, Харьков
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение zilk »

Здравствуйте все!
Продолжаем разбираться. Nick, что ты скажешь о таком варианте, когда смена режима оси происходит путем переключения компонентов оси А или шпинделя прямо на вход PID-регулятора А? При этом сохраняется и кольцо обратной связи через энкодер, и PID вроде как остается.. Какие могут быть подводные камни?

Код: Выделить всё

net select motion.digital-out-00 => mux2.0.sel mux2.1.sel

net a-pos-cmd              axis.3.motor-pos-cmd => mux2.0.in0
net spindle-vel-cmd      motion.spindle-speed-out => mux2.0.in1
net a-out-cmd              mux2.out => pid.a.command
net a-output                 pid.a.output => hm2_7i43.0.stepgen.03.velocity-cmd

net a-enable-cmd         axis.3.amp-enable-out  => mux2.1.in0
net spindle-enable        motion.spindle-on => mux2.1.in1
net a-enable                 mux2.1.out => hm2_7i43.0.stepgen.03.enable


И еще сопутствующий вопрос - можно ли подключить к 7i43 еще один (5-й) энкодер для шпинделя к незадействованым gpio? что-то типа такого?

Код: Выделить всё

loadrt encoder num_chan=1
addf encoder.update-counters base-thread
addf encoder.capture-position servo-thread
setp encoder.0.position-scale 100

net spindle-position     encoder.0.position => motion.spindle-revs
net spindle-velocity     encoder.0.velocity => motion.spindle-speed-in
net spindle-index-enable encoder.0.index-enable <=> motion.spindle-index-enable

net spindle-phase-a      encoder.0.phase-A <= hm_7i43.0.gpio.XXX.in
net spindle-phase-b      encoder.0.phase-B <= hm_7i43.0.gpio.YYY.in
net spindle-index        encoder.0.phase-Z <= hm_7i43.0.gpio.ZZZ.in
Спасибо!
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение Nick »

zilk писал(а):net a-pos-cmd              axis.3.motor-pos-cmd => mux2.0.in0
net spindle-vel-cmd      motion.spindle-speed-out => mux2.0.in1
Ничего, только тогда на pid нужно подавать не положение оси A, а ее скорость. Для этого можно воспользоваться компонентом ddt (производная по времени (производная по времени от положения = скорость)).
Т.е.
loadrt ddt
addf ddt.0 base-thread
net a-pos-cmd axis.3.motor-pos-cmd => ddt.0.in
net a-vel-cmd ddt.0.out => mux2.0.in0
zilk писал(а):И еще сопутствующий вопрос - можно ли подключить к 7i43 еще один (5-й) энкодер для шпинделя к незадействованым gpio? что-то типа такого?
Можно, но не очень хорошо - так все энкодеры обрабатываются на месе с охрененной частотой, а так их придется загонять в emc2. И кстати в каком потоке вводы с mesa читаются?
zilk
Опытный
Сообщения: 139
Зарегистрирован: 07 янв 2012, 19:05
Репутация: 1
Откуда: Украина, Харьков
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение zilk »

Nick писал(а): И кстати в каком потоке вводы с mesa читаются?
Наверное таки в servo-thread: addf hm2_7i43.0.read servo-thread, т.е. обработать еще один энкодер не получится?
А можно ли хотя-бы индексный сигнал шпинделя как-то задействовать? Пока не могу найти примеров, как это написать в хал...
Nick писал(а):Ничего, только тогда на pid нужно подавать не положение оси A, а ее скорость
Так в hal, сгенерированном, pncconf прямо записано: axis.3.motor-pos-cmd => pid.a.command, т.е. вроде как положение и подается на ПИД.. :?
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение Nick »

zilk писал(а):Наверное таки в servo-thread: addf hm2_7i43.0.read servo-thread, т.е. обработать еще один энкодер не получится? А можно ли хотя-бы индексный сигнал шпинделя как-то задействовать? Пока не могу найти примеров, как это написать в хал...
если servo-thread, то через месу энкодер точно не прокинуть. У него чатостота обновления будет 1кГц, а это вообще ниочем, но можно сделать через LPT :).
Тупо берем стандартное описание энкодера и пихаем его пины в пины LPT.
Если надо, могу примерчик скинуть.
zilk писал(а):Так в hal, сгенерированном, pncconf прямо записано: axis.3.motor-pos-cmd => pid.a.command, т.е. вроде как положение и подается на ПИД..
Там-то да, но потом ты пихаешь в него же скорость шпинделя. Поэтому надо либо скорость привести к положению, либо положение к скорости ;).

Но, я тут подумал, идея не очень хорошая через 1 пид все делать, в разных режимах пид должен работать по-разному, а он этого не сможет, т.к. параметры у него зафиксированы. Лучше все таки два ПИД под это дело сделать. (или 1, т.к. под шпиндель ПИД не так уж и нужен.)
zilk
Опытный
Сообщения: 139
Зарегистрирован: 07 янв 2012, 19:05
Репутация: 1
Откуда: Украина, Харьков
Контактная информация:

Re: 4-я ось - позиция/скорость

Сообщение zilk »

Здравствуйте !
В процессе разбирательства с написанием хала по моей теме, я зашел в легкий тупик, а именно: есть 2 stepgen, которые управляют 4 осью и шпинделем. Настройки у них совершенно одинаковые что касается типа управления - на обеих стоит .control-type 1, т.е. управление скоростью. Но, подавая на них поочередно один и тот же сигнал, получаю совершенно разный результат - тот, который управляет осью А, отрабатывает положение, тот который шпинделем - отрабатывает скорость. Т.е. подавая например на них значение 100, один отрабатывает поворот 100 градусов, а другой отрабатывает скорость 6000 об/мин. :?
Nick, подскажи, где здесь может быть засада в виде каких нибудь скрытых обратных связей или еще чего? И чем отличаются 2 stepgena сконфигурированных в pncconf под ось и под шпиндель соответственно? Я перекопал все настройки, параметры, связи, но ничего не нашел... Шо делать?? :monkey:

Спасибо!
Ответить

Вернуться в «LinuxCNC»