Pull to refresh

Comments 27

Отличное легкое чтиво в воскресенье, под кофе.
О, мне как раз скоро ТАУ сдавать, спасибо.
Для сдачи не пойдёт, это именно относительно практики, а не теории.
уже исправлено, да. очепятка. my bad.
Списибо! Для наглядности немного не хватает графиков.
Графики, они нужны для настройки. Для отлова вот этих классических ошибок реализации достаточно банального наблюдения глазами за лампочкой и текущим показанием прибора. Какие там графики, вы о чем :)
Помоему, обычные графики зависимости температуры от времени нагляднее чем словесное описание поведения лампочки.
Вы читали статью? Статья совсем не ПИД регуляторе, и не о его свойствах. А о стандартных ошибках в его реализации, и способе проверки поведения регулятора «на глаз». Статья для тех, кто этот самый ПИД реализовывал, и не может понять чего он дурит.
Уже предполагается определённое понимание что это такое и как он работает.
Конечно. Как бы иначе я узнал про лампочку? :)
Я же не призываю вас описывать работу ПИД с нуля, а просто выразил своё мнение насчет нагляднсти.
Ваши ошибки из статьи были бы также прекрасно видны на графиках, как и настройки ПИДа.
>> Простоту математической записи
и вот эта формула с интегралом и производной.
Привет, Антон :)

Прикол №5, когда мы пытаемся классический хорошо допиленный ПИД-регулятор применить к ОЧЕНЬ инерционному объекту. Скажем, бочка 20 тонн с жижкой, которая экзотермична (сама себя подогревает, причём нелинейно). Для охлаждения жижку циркулируем через теплообменник с холодной водой. Датчик температуры стоит где-то в бочке. Регулируем проток жижки через теплообменник задвижкой с позиционером, циркуляционный насос фигачит прямым пуском… Время реакции системы на воздействие что-то вроде 7-10 минут.

Так вот, подобрать «отзывчивость» регулятора очень сложно. Слишком медленный регулятор очень часто не успевает за ростом температуры жижки. Вроде и задвижка уже 100%, а всё, процесс раскочегарился и сварил сам себя. Слишком быстрый регулярно переохлаждает жижку, а если нет, то колебания температуры всё равно слишком велики.

Решение — модифицировать регулятор, добавив «адаптацию», а именно — в момент прекращения роста (или падения) температуры замораживать выход регулятора, несмотря на то, что рассогласование всё ещё положительно (отрицательно). Размораживать, соответственно, при переходе через уставку (т.е. через нулевое рассогласование) или при возобновлении роста (падения). Шесть таких регуляторов реализованы на контроллере Simatic S7-300.

Результат — регулировка температуры 20 тонн жижки с точностью до 0.2 градусов. Классический ПИД при этом едва в 1.5 укладывался с регулярным подкручиваним коэффициентов.

Вывод №5 — не бояться отходить от канонов :)
Да, ПИД регулятор не является ни идеальным регулятором, ни лучшим даже в тех случаях, где его применение допустимо. У него только один плюс — простота физического смысла — есть пропорциональная составляющая, когда мы просто греем на разность температур. Это съедает основную ошибку, но не может бороться с постоянными потерями — поэтому просто пропорциональный регулятор и держит всегда чуть ниже чем задали. Для избавления от вот этого «чуть ниже» вводится интегральная составляющая — которая аккумулирует ошибку, и даёт добавку к мощности, компенсирующую утечки. Собственно, в случае линейного самоподогрева — интегральная составляющая _может_ компенсировать ошибку. Если, конечно, реализация правильная — интеграл считается знаково :) — но этот тип ошибок я оставил за скобками, и так вон какая портянка. И диф. составляющая, повышающая «отзывчивость» на изменение уставки.
Хороший регулятор должен предсказывать поведение объекта, и рассчитывать управляющее воздействие именно с учетом предсказания.
Если же объект во-1х нелинейный, во-2х известный — ни интегральная ни диффеениальная составляющие не являются оптимальными, да еще и вредны в общем-то. Поэтому добавление к регулятору дополнительной «адаптации» под объект — и есть самое правильное поведение.
Еще частая адаптация — это использование нелинейных коэффициентов ПИД регулятора: когда на разные рабочие участки свой набор коэффициентов + свой набор коэффициентов для положительного и для отрицательного случая рассогласования (нагрев и охлаждение почти всегда различаются).
А вообще, регуляторы на базе фильтра калмана, или вообще синтезированные под конкретный объект — самые оптимальные регулятры.
Вывод №5 — в сложных случаях надо, наоборот, вспоминать каноны (ТАУ) и не надеяться на ПИД-регуляторы.

Конкретно в данном случае в необычной повелении системы «виновата» не инерционность (которая, вообще-то, благо), а задержка: охлажденная жидкость из теплообменника должна успеть вернуться в бочку и перемешаться там, а пока этого не произошло, температура и не начнет уменьшаться. Иными словами, в системе имеется звено e^(-ts), такое звено дает 2-3 «лишние» степени системе.
Ну как раз каноны ТАУ в данном случае не помогут. Система слишком сложна для построения каких-то моделей и передаточных функций. Какие уж там звенья n-го порядка…

Тут вплоть до того, что между выходом регулятора и позиционером небольшая функция написана, пытающаяся переменной длины импульсами «вверх» и «вниз» подогнать положение задвижки под выход регулятора на основе показаний не особо точного датчика положения этой самой задвижки. Помимо этого, функция ещё и реализована с учётом сохранения механического ресурса позиционера (минимизация движений).

Я уж молчу про то, что в бочку постоянно поступает, так сказать, исходное сырьё неизвестной температуры и консистенции :)
> Ну как раз каноны ТАУ в данном случае не помогут.
Ну как раз каноны НЕЛИНЕЙНОЙ ТАУ здесь как нельзя кстати. Существуют отлаженные методы построения передаточной функции обратной связи с целью получения "Желаемой АЧХ". Все упирается в идентификацию объекта (в построение его АЧХ или передаточной функции). Если есть возможность экспериментально снять переходный процесс для импульсного или ступенчатого воздействия, то это уже позволит построить хоть какую-то приближенную модель. Дальше — дело техники.
В том-то и дело, что, во-первых, реакция на «единичное воздействие» у системы всегда разная и зависит от доброго десятка непредсказуемых и неизмеряемых факторов. Во-вторых, никто не разрешит выдавать на этот объект всякие там воздействия. Стоимость жижки в бочке эдак примерно под 100К евро :)

Поэтому в данном случае — только адаптивный регулятор, реализованный на основе существующего в библиотеке функций симатика ПИД-регулятора с минимальными изменениями (дабы не заниматься потом тестированием с ночёвкой на объекте :).

Да и вообще, к ожидаемому недовольству апологетов классической ТАУ, могу сказать, что при всём моём немаленьком опыте автоматизации разнообразных производств, мне ни разу не приходилось видеть, чтобы регулятор считали по всем правилам, с вычислением передаточных функций, с единичными ступенчатыми воздействиями и прочими изучаемыми в универе штуками. Всё строго на глаз, с потолка, научным тыком. И главное — работает :)
Один раз я только слышал о расчёте регулятора для какой-то сложной и быстрой колонны синтеза, где подбирать коэффициенты никак бы не получилось, система очень быстро уходила вразнос. Правда, расчётный регулятор в результате заработал едва ли не хуже настроенного по интуиции. Как решили проблему — не знаю. Скорее всего подобрали таки подходящий режим, утилизировав сотню-другую тонн исходного сырья :)
> реакция на «единичное воздействие» у системы всегда разная… никто не разрешит выдавать на этот объект всякие там воздействия.
Тогда понятно.
А четкое следование пособиям ТАУ и не требуется. Достаточно синтезировать в общем виде передаточную функцию (это достаточно просто), а потом подвинчивать коэффициенты.

Я вот тоже как-то ПИД настраивал с нуля в мелком автомате по нанесению покрытия (никелевого или еще какого-то — не помню). Так у меня очень много времени ушло на «метод тыка». Поэтому, кажется, нужен компромисс. А синтезировать регулятор в виде модели пространства состояний для меня проще и понятнее, а следовательно результативнее и предсказуемее.
Полезная статья, спасибо.
Интересно было бы узнать, насколько реализации, предлагаемые в DSP-библиотеках (от тех же ST Microelectronics для своих STM32Fxx) избавлены от указанных ошибок. Хочется верить что полностью — все же библиотека эта в своем роде стандарт, притом оптимизирована, и предпочтительнее использовать ее, нежели писать свой велосипед…
подозреваю, что хорошие DSP используют всё-таки прямую схему, а не разностную.
uint16_t DoFullPID(uint16_t In, uint16_t Ref, uint16_t *Coeff)
{
  uint16_t Kp, Ki, Kd, Output, Error;

  Error = Ref - In;
  Kp = Coeff[0];
  Ki = Coeff[1];
  Kd = Coeff[2];

  IntTerm_C += Ki*Error;
  Output = Kp * Error;
  Output += IntTerm_C;
  Output += Kd * (Error - PrevError_C);

  PrevError_C = Error;

  return (Output);
}


Совсем в лоб.
Оххохо… Можно влететь в шар с волосами из-за округлений при рассчетах. Я во второй статье описываю приколюхи реализации прямой схемы.
Спасибо, весьма интересно; сейчас как раз разбираюсь с PID управлением. Правда, мне по-прежнему не ясна базовая вещь: выходи PID — это абсолютное значение (тока через нагреватель, например) или же его изменение?

Отвлечёмся от ограничений, переполнения и прочих тонкостей, а также оставим для начала только пропорциональную составляющую. Пусть на выходе абсолютное значение. Итак, насколько я понимаю, в результате отклонение измеряемого параметра (например, температуры) должно пребывать вблизи нуля. Но тогда и ток будет вблизи нуля, а должен быть вблизи некоторого постоянного значения! В чём подвох?
ПИД в первом приближении (благодаря пропорциональной части) — это усилитель ошибки. Когда ошибка 0, на выходе ПИД тоже 0.
Sign up to leave a comment.

Articles

Change theme settings