Настройка PID

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
odekolon
Мастер
Сообщения: 1105
Зарегистрирован: 05 ноя 2014, 14:53
Репутация: 360
Настоящее имя: Борис
Контактная информация:

Настройка PID

Сообщение odekolon »

Всем добрый вечер.
для будущего лазера, прикрутил голову к обычному фрезеру и настраиваю систему поддержания высоты.
структурная схема выглядит так:
PID_sheme.JPG (3850 просмотров) <a class='original' href='./download/file.php?id=178152&sid=eec669fca88c2c8ef0dd06e45a22330f&mode=view' target=_blank>Загрузить оригинал (33.79 КБ)</a>
как бы вчерне, уже работает
выглядит так:https://youtu.be/sj6lW6AMhsk
это режим наладки: хал-генератор меняет уставку, а голова отрабатывает.
импульсы - это выходной сигнал ПИД-регулятора
при большой разнице в уставках, система "идет вразнос"
явно надо чего-то ограничить.
у пид-регулятора, да и у интегратора, есть ограничители, как думаете -где лучше ограничить?
еще у пид-регулятора есть куча доп настроек. Кто-нибудь их крутил вдумчиво?
(для просмотра содержимого нажмите на ссылку)
(float) pid.<loopnum>.FF0 - Zeroth order feedforward - output proportional to command (position).

(float) pid.<loopnum>.FF1 - First order feedforward - output proportional to derivative of command (velocity).

(float) pid.<loopnum>.FF2 - Second order feedforward - output proportional to 2nd derivative of command (acceleration).

(float) pid.<loopnum>.deadband - Amount of error that will be ignored

(float) pid.<loopnum>.maxerror - Limit on error

(float) pid.<loopnum>.maxerrorI - Limit on error integrator

(float) pid.<loopnum>.maxerrorD - Limit on error derivative

(float) pid.<loopnum>.maxcmdD - Limit on command derivative

(float) pid.<loopnum>.maxcmdDD - Limit on command 2nd derivative
"Капиталистом стать можно лишь тогда, когда обогатишь свою память знанием всех тех богатств, которые выработало человечество"
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

Re: Настройка PID

Сообщение aftaev »

odekolon писал(а):выглядит так:
01.png (3847 просмотров) <a class='original' href='./download/file.php?id=178154&sid=eec669fca88c2c8ef0dd06e45a22330f&mode=view' target=_blank>Загрузить оригинал (19.76 КБ)</a>
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
odekolon
Мастер
Сообщения: 1105
Зарегистрирован: 05 ноя 2014, 14:53
Репутация: 360
Настоящее имя: Борис
Контактная информация:

Re: Настройка PID

Сообщение odekolon »

:hehehe: вроде открыл
"Капиталистом стать можно лишь тогда, когда обогатишь свою память знанием всех тех богатств, которые выработало человечество"
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Настройка PID

Сообщение Serg »

Тут ПИД регулятор используется неправильно: на входах ПИД (задание и фидбэк) должно быть то, что нужно получить, т.е. позиция. А вот на выходе будет не позиция, а воздействие на исполнительное устройство, т.е. не позиция, а скорость в данном случае. Т.е. pid.output нужно подавать на stepgen.2.velocity−cmd (и ctrl_type=v соотв.)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
odekolon
Мастер
Сообщения: 1105
Зарегистрирован: 05 ноя 2014, 14:53
Репутация: 360
Настоящее имя: Борис
Контактная информация:

Re: Настройка PID

Сообщение odekolon »

UAVpilot писал(а):ут ПИД регулятор используется неправильно: на входах ПИД (задание и фидбэк) должно быть то, что нужно получить, т.е. позиция.
ну, на самом деле, после регулятора стоит интегратор, а расстояние есть интеграл от скорости... так что схема рабочая.
это давно мной откатано на плазме, с THC по напряжению дуги. токо там, в больших скоростях особой нужды нет. Вполне хватило PD

кстати , наверное на ограничители интегратора есть смысл подать границы хода по оси (Z). тогда при "разносе" не будет о лимиты стукаться :hehehe:
UAVpilot писал(а):pid.output нужно подавать на stepgen.2.velocity−cmd (и ctrl_type=v соотв.)
а есть "живая" конфигурация с такими настройками stepgen ? (интересно, что с чем соединяется?)

все-таки ключевой вопрос был
odekolon писал(а):еще у пид-регулятора есть куча доп настроек. Кто-нибудь их крутил вдумчиво?
"Капиталистом стать можно лишь тогда, когда обогатишь свою память знанием всех тех богатств, которые выработало человечество"
Аватара пользователя
odekolon
Мастер
Сообщения: 1105
Зарегистрирован: 05 ноя 2014, 14:53
Репутация: 360
Настоящее имя: Борис
Контактная информация:

Re: Настройка PID

Сообщение odekolon »

ну что-ж !
первая же подкрученная доп. настройка привела к желаемому результату
это настройка pid.n.maxoutput - это ограничитель максимального выходного сигнала ПИД. При этом, ушли все проявления "разноса" .
теперь на голова пикирует на установленную высоту максимально быстро и без "разноса"
на приведенном видео, генерятся переходы с 4мм на 0.5 мм
осциллограмма - выходной сигнал ПИД (скорость)
плоская вершина - ограничение
ступеньки на спаде - похоже на период получения инфы по ком-порту от датчика
https://youtu.be/_Zrh2gxeFeo
"Капиталистом стать можно лишь тогда, когда обогатишь свою память знанием всех тех богатств, которые выработало человечество"
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

Re: Настройка PID

Сообщение aftaev »

Почему нет вида целиком станка? Жаждим видать весь станок :)
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
solo
Мастер
Сообщения: 1374
Зарегистрирован: 20 окт 2011, 18:39
Репутация: 272
Настоящее имя: Юрий Соловьев
Откуда: Украина Харьков
Контактная информация:

Re: Настройка PID

Сообщение solo »

odekolon писал(а):а есть "живая" конфигурация с такими настройками stepgen
вот с моего станка
Вложения
676mm.hal
(7.26 КБ) 397 скачиваний
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Настройка PID

Сообщение Serg »

odekolon писал(а):ну, на самом деле, после регулятора стоит интегратор, а расстояние есть интеграл от скорости... так что схема рабочая.
И интегратор вносит в сигнал лишнюю задержку минимум в один сервоцикл, а это только мешает PID'у правильно воспринимать "реальность бытия"...
odekolon писал(а):а есть "живая" конфигурация с такими настройками stepgen ? (интересно, что с чем соединяется?)
Сейчас stepconf по дефолту создаёт такую конфигурацию для осей.
odekolon писал(а):это настройка pid.n.maxoutput - это ограничитель максимального выходного сигнала ПИД. При этом, ушли все проявления "разноса" .
Можно было просто уменьшить макс. скорость у stepgen.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
odekolon
Мастер
Сообщения: 1105
Зарегистрирован: 05 ноя 2014, 14:53
Репутация: 360
Настоящее имя: Борис
Контактная информация:

Re: Настройка PID

Сообщение odekolon »

aftaev писал(а):Почему нет вида целиком станка? Жаждим видать весь станок
да хрен-ли на него смотреть - обычный китайский говнофрезер :hehehe:
чисто для отладки конфигурации.
solo писал(а):вот с моего станка
ага, спасибо, будем посмотреть
UAVpilot писал(а):И интегратор вносит в сигнал лишнюю задержку минимум в один сервоцикл, а это только мешает PID'у правильно воспринимать "реальность бытия"...
Спасибо, это важное дополнение, учту на будущее.
но пока, основной элемент задержки - период поступления информации от датчика (ну вы, в курсе :D )

кстати, я в свое время для себя принял, что множество хал-функций могут пропустить через себя сигналы даже за один цикл,
если их addf - строки находятся в "нужной" последовательности. Это так?

я не имею ввиду сложные функции типа интегратора, а всякие мультиплексоры/умножители/ограничители и др
UAVpilot писал(а):Можно было просто уменьшить макс. скорость у stepgen.
но в этом случае, падает максимальная скорость у станка - а это не есть гуд - или я не прав?
"Капиталистом стать можно лишь тогда, когда обогатишь свою память знанием всех тех богатств, которые выработало человечество"
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Настройка PID

Сообщение Serg »

odekolon писал(а):но в этом случае, падает максимальная скорость у станка - а это не есть гуд - или я не прав?
Прав. Но и pid.n.maxoutput делает ровно тоже самое. :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
odekolon
Мастер
Сообщения: 1105
Зарегистрирован: 05 ноя 2014, 14:53
Репутация: 360
Настоящее имя: Борис
Контактная информация:

Re: Настройка PID

Сообщение odekolon »

UAVpilot писал(а):
odekolon писал(а):но в этом случае, падает максимальная скорость у станка - а это не есть гуд - или я не прав?
Прав. Но и pid.n.maxoutput делает ровно тоже самое. :)
но в моем случае, pid.n.maxoutput режет "виртуальную" скорость, которая физически не существует.
то есть быстрые перемещения станка (включая перемещения при стабилизации высоты), у меня идут с максимально возможной скоростью.
интегратор-то работает, и быстро-быстро двигает точку назначения, а ось едет к точке с максимальной скоростью

На глаз, оценка конечно еще та, но "на глаз" опускание с высоты 100 до высоты 0.5 идет со скоростью, близкой к максимальной скорости оси Z
и конечно перемещения по команде G0 будут идти с максимальной скоростью ( а не ограниченной "разносом" в ПИД )
"Капиталистом стать можно лишь тогда, когда обогатишь свою память знанием всех тех богатств, которые выработало человечество"
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Настройка PID

Сообщение Serg »

odekolon писал(а):но в моем случае, pid.n.maxoutput режет "виртуальную" скорость, которая физически не существует.
stepgen просто будет генерить шаги с частотой не выше, чем задано в stepgen.N.maxvel, какое-бы задание ему не дали.
pid просто не выдаст задание более, чем указано в pid.N.maxoutput, как бы ему этого не хотелось.
pid.N.maxoutput и stepgen.N.maxvel в данном варианте - это как два последовательных краника на одной трубе. :)
odekolon писал(а):и конечно перемещения по команде G0 будут идти с максимальной скоростью ( а не ограниченной "разносом" в ПИД )
Разве что на 25%, если в .ini вот такое не менял:

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

MAX_VELOCITY = 100.0
MAX_ACCELERATION = 100.0
# The values below should be 25% larger than MAX_VELOCITY and MAX_ACCELERATION
# If using BACKLASH compensation STEPGEN_MAXACCEL should be 100% larger.
STEPGEN_MAXVEL = 125.00
STEPGEN_MAXACCEL = 125.00
:)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
odekolon
Мастер
Сообщения: 1105
Зарегистрирован: 05 ноя 2014, 14:53
Репутация: 360
Настоящее имя: Борис
Контактная информация:

Re: Настройка PID

Сообщение odekolon »

UAVpilot писал(а):tepgen просто будет генерить шаги с частотой не выше, чем задано в stepgen.N.maxvel, какое-бы задание ему не дали.
pid просто не выдаст задание более, чем указано в pid.N.maxoutput, как бы ему этого не хотелось.
pid.N.maxoutput и stepgen.N.maxvel в данном варианте - это как два последовательных краника на одной трубе.
мне кажется, в данном случае, вы не правы

рассмотрим схему еще раз
PID_sheme.JPG (3713 просмотров) <a class='original' href='./download/file.php?id=178222&sid=eec669fca88c2c8ef0dd06e45a22330f&mode=view' target=_blank>Загрузить оригинал (75.36 КБ)</a>
во первых, я забыл нарисовать мультиплексор который подключает пид только при включенном лазере :D (поскольку для поднятой темы, это было не важно)
так что любые перемещения при выключенной LHC, идут мимо ПИД и соответственно могут идти на максимальной скорости.
Во вторых представим ситуацию, что PID ограничен, а фидбэк "залип" интегратор быстренько передвинет точку назначения, и голова поедет на полной скорости степгена, пока не упрется в ограничитель
В-третьих, для интегратора, в общем-то все равно, будет ли импульс на его входе, высоким, но коротким или пониже, но чуть пошире.
тем паче, что степген, сразу разогнаться не может, высокий импульс на выходе незажатого ПИД, остается на пике, пока степген не разгонится, соответсвенно точка назначения окажется дальше, чем нужно и должна будет корректироваться уже "в процессе движения" , что явно не добавляет стабильности.
Ограничитель в ПИД, при котором я получил стабильную работу ПИД, как мне кажется, как раз компенсирует время на разгон степгена от покоя до макимума.

Я так думаю...
"Капиталистом стать можно лишь тогда, когда обогатишь свою память знанием всех тех богатств, которые выработало человечество"
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Настройка PID

Сообщение Serg »

odekolon писал(а):во первых, я забыл нарисовать мультиплексор который подключает пид только при включенном лазере :D (поскольку для поднятой темы, это было не важно)
так что любые перемещения при выключенной LHC, идут мимо ПИД и соответственно могут идти на максимальной скорости.
Так просто не будет нормально работать. А вот с stepgen.n.velocity−cmd хотя-бы пыталось работать. :)
Увы причина в непонимании работы stepgen в этом режиме: на входе stepgen.n.position−cmd всегда "абсолютная позиция". Допустим по G0 ты передвинул Z в позицию -100, далее ты активируешь "ВКЛ LHC" и от интегратора на stepgen.n.position приходит новое значение позиции, скажем +20, догадываешься что произойдёт?..
Нужно не mux2 использовать, а thc, или в крайнем случае 2хsum2.
odekolon писал(а):Во вторых
odekolon писал(а):В-третьих
Ничего этого не случится - "following error" вырубит ЧПУ гораздо раньше... :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
odekolon
Мастер
Сообщения: 1105
Зарегистрирован: 05 ноя 2014, 14:53
Репутация: 360
Настоящее имя: Борис
Контактная информация:

Re: Настройка PID

Сообщение odekolon »

UAVpilot писал(а):Ничего этого не случится - "following error" вырубит ЧПУ гораздо раньше...
following error на "чистом степдире", величина бессмысленная, поэтому он отключен нахрен. :hehehe:
У меня три плазмы, по этой схеме, уже несколько лет работают ;)

в общем-то я размышлял когда-то "не сделать ли корректной работу петли положения Z", но пришел к выводу, что абсолютно ни к чему.

В принципе, можно рассматривать станок, как двухкоординатный, с внешним блоком управления высотой.
"Капиталистом стать можно лишь тогда, когда обогатишь свою память знанием всех тех богатств, которые выработало человечество"
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Настройка PID

Сообщение Serg »

odekolon писал(а):following error на "чистом степдире", величина бессмысленная, поэтому он отключен нахрен. :hehehe:
Зато спасает от потери шагов из-за того, что реальный (мгновенный) джиттер - величина непостоянная и у stepgen есть собственные ограничители.
проверяется элементарно:

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

$ cat tst.hal 
loadrt trivkins
loadrt motmod servo_period_nsec=1000000 num_joints=3
addf motion-command-handler servo-thread
addf motion-controller servo-thread
start

$ halrun -I tst.hal 
Note: Using POSIX realtime
halcmd: loadrt stepgen step_type=0
halcmd: addf stepgen.capture-position servo-thread
halcmd: addf stepgen.update-freq servo-thread
halcmd: addf stepgen.make-pulses servo-thread
halcmd: show pin stepgen
Component Pins:
Owner   Type  Dir         Value  Name
    15  s32   OUT             0  stepgen.0.counts
    15  bit   OUT         FALSE  stepgen.0.dir
    15  bit   IN          FALSE  stepgen.0.enable
    15  float IN              0  stepgen.0.position-cmd
    15  float OUT             0  stepgen.0.position-fb
    15  bit   OUT         FALSE  stepgen.0.step
    15  s32   OUT           418  stepgen.capture-position.time
    15  s32   OUT           506  stepgen.make-pulses.time
    15  s32   OUT           550  stepgen.update-freq.time

halcmd: setp stepgen.0.enable 1
halcmd: setp stepgen.0.position-cmd 1000
halcmd: show pin stepgen
Component Pins:
Owner   Type  Dir         Value  Name
    15  s32   OUT          1000  stepgen.0.counts
    15  bit   OUT         FALSE  stepgen.0.dir
    15  bit   IN           TRUE  stepgen.0.enable
    15  float IN           1000  stepgen.0.position-cmd
    15  float OUT      999.9999  stepgen.0.position-fb
    15  bit   OUT         FALSE  stepgen.0.step
    15  s32   OUT           297  stepgen.capture-position.time
    15  s32   OUT           341  stepgen.make-pulses.time
    15  s32   OUT           539  stepgen.update-freq.time

halcmd: setp stepgen.0.position-cmd -1000
halcmd: show pin stepgen
Component Pins:
Owner   Type  Dir         Value  Name
    15  s32   OUT            12  stepgen.0.counts
    15  bit   OUT          TRUE  stepgen.0.dir
    15  bit   IN           TRUE  stepgen.0.enable
    15  float IN          -1000  stepgen.0.position-cmd
    15  float OUT      12.49991  stepgen.0.position-fb
    15  bit   OUT         FALSE  stepgen.0.step
    15  s32   OUT           286  stepgen.capture-position.time
    15  s32   OUT           319  stepgen.make-pulses.time
    15  s32   OUT           583  stepgen.update-freq.time

halcmd: setp stepgen.0.position-cmd -1000
halcmd: show pin stepgen
Component Pins:
Owner   Type  Dir         Value  Name
    15  s32   OUT         -1000  stepgen.0.counts
    15  bit   OUT          TRUE  stepgen.0.dir
    15  bit   IN           TRUE  stepgen.0.enable
    15  float IN          -1000  stepgen.0.position-cmd
    15  float OUT     -999.9999  stepgen.0.position-fb
    15  bit   OUT         FALSE  stepgen.0.step
    15  s32   OUT           297  stepgen.capture-position.time
    15  s32   OUT           330  stepgen.make-pulses.time
    15  s32   OUT           583  stepgen.update-freq.time

halcmd: 
В общем дело хозяйское... :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
odekolon
Мастер
Сообщения: 1105
Зарегистрирован: 05 ноя 2014, 14:53
Репутация: 360
Настоящее имя: Борис
Контактная информация:

Re: Настройка PID

Сообщение odekolon »

UAVpilot писал(а):ато спасает от потери шагов из-за того, что реальный (мгновенный) джиттер - величина непостоянная и у stepgen есть собственные ограничители.
проверяется элементарно:
проверил. Есть такое дело.
поразмыслил :thinking:
тут такая фигня...
"following error" у меня блочится установкой
MIN_FERROR = 300
то есть, я не рву связь полностью, просто запрещаю системе генерить ошибку в пределах хода оси Z,
так что связь stepgen.2.position-fb => axis.2.motor-pos-fb не рвется никогда
а после прекращения работы системы контроля высоты,
воосстанавливается связь axis.2.motor-pos-cmd => stepgen.2.position-cmd
в этот момент, ось z возвращается в исходную точку

мне кажется, при этом, потери шагов происходить не должно.
Во всяком случае, я этого не замечал, но хотелось бы проверить...
"Капиталистом стать можно лишь тогда, когда обогатишь свою память знанием всех тех богатств, которые выработало человечество"
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Настройка PID

Сообщение Serg »

odekolon писал(а):"following error" у меня блочится установкой
MIN_FERROR = 300
Т.е. по сути ты разрешаешь оси ошибаться в позиционировании на 300мм...
odekolon писал(а):то есть, я не рву связь полностью, просто запрещаю системе генерить ошибку в пределах хода оси Z,
так что связь stepgen.2.position-fb => axis.2.motor-pos-fb не рвется никогда
а после прекращения работы системы контроля высоты,
воосстанавливается связь axis.2.motor-pos-cmd => stepgen.2.position-cmd
в этот момент, ось z возвращается в исходную точку
А зачем все эти "ухищрения", если уже давно существует компонент thc, созданный именно для подобных задач?.. Или сделать по старинке на двух sum2 - один добавляет поправку от THC в задание, а другой вычитает её из фидбэка.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
calabr
Мастер
Сообщения: 937
Зарегистрирован: 04 янв 2019, 15:19
Репутация: 146
Настоящее имя: Calabr
Откуда: Киев
Контактная информация:

Re: Настройка PID

Сообщение calabr »

odekolon писал(а):Ограничитель в ПИД, при котором я получил стабильную работу ПИД, как мне кажется, как раз компенсирует время на разгон степгена от покоя до макимума.
Обычно ограничивают интегральную компоненту, а не все вместе, чтоб накопленная ошибка не мешала воспринимать реальность, и реакция на импульс оставалась быстрой, а выход должен быть нормирован в пределах рабочего диапазона привода.
Если выход меньше - потеря скорости, если больше, то интегратор на выходе нажрется лишним и при остановке будет перелет и колебания чтоб его компенсировать.
Ответить

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