Алгоритм PID: как учитывать быстрые изменения входных значений после длительной задержки

15

Я пытаюсь реализовать базовый алгоритм PID на Arduino Leonardo для смешивания горячей и холодной водопроводной воды с использованием сервоуправляемых клапанов. Цель состоит в том, чтобы поддерживать температуру как можно ближе к заданному значению. Особенно важно предотвратить превышение заданной температуры выходной температуры, чтобы защитить пользователя от ожогов. Во-вторых, важно как можно быстрее получить температуру около заданного значения.

При небольших изменениях температуры стандартная реализация алгоритма ПИД работает нормально. Но я не знаю, как объяснить длительные задержки, которые могут возникнуть при ожидании горячей воды, чтобы достичь клапана, так как эти задержки намного больше, чем стандартные задержки после изменения положения клапана.

Очевидно, что в зависимости от длины линии горячей воды и времени, прошедшего с момента последнего использования горячей воды, может потребоваться несколько десятков секунд, чтобы горячая вода достигла клапана, поэтому в течение этого времени температура воды остается довольно постоянной при низкой температуре. и клапан горячей воды скоро открывается на 100%. Интегральный компонент начинает накапливать большое значение ошибки.

Когда горячая вода наконец достигает клапана, обнаруженная температура очень быстро повышается до максимальной температуры горячей воды. Из-за большой интегральной погрешности клапан горячей воды удерживается на уровне 100% в течение длительного времени после того, как температура превысит заданное значение, вследствие ожидания того, что интегральное значение будет снижено до нормального уровня. Таким образом, результатом является максимальная температура воды в течение нескольких (десятков) секунд.

Я не уверен, как объяснить эту возможную длительную задержку. В таком случае, было бы разумно установить верхнюю (и нижнюю) границу значения интегральной ошибки, чтобы ограничить максимальное время отклика? Похоже, что это противоречит цели интегрального компонента, а также приведет к некоторому отставанию после достижения заданного значения.

Или есть лучший способ обработать быстрые изменения ввода после большой задержки?

Спасибо за любой совет!

Райан Григгс
источник
1
На самом деле, мне интересно, нужно ли вам вообще I-действие, потому что я думаю, что изменения температуры воды относительно медленны по сравнению с срабатыванием клапана. Хуже того, вы можете получить колебательное поведение из-за чрезвычайно низкого запаса фазы, который вы, вероятно, получите (ваша система может быть стабильной в теории, но может никогда не перестать колебаться на практике, потому что I-действие добавляет задержку фазы). Кроме того, поскольку вы, возможно, будете сжигать людей, я не могу не подчеркнуть, что достаточно взглянуть на комментарии Чу и JonRB!
Sanchises

Ответы:

15

Ваша проблема называется Integral Windup , это общая проблема контроля. В нелинейной или иным образом ограниченной области контроллер не может отслеживать заданное значение, и интеграл увеличивается до большого значения. Это приводит к значительному перерегулированию при достижении заданного значения, которое является именно той проблемой, которую вы вывели.

Самое простое решение - ограничить само значение Интегратора разумным максимумом. Ограничение интегрального вклада также не сработает, потому что интегратор все равно будет увеличен до некоторой большой величины.

У Mathworks есть страница с некоторыми другими решениями для интегрального windup.

В ПИД-контроллере обычно требуется как можно меньше интегральных терминов. В стандартном механическом клапане контроля температуры используется только пропорциональный контроль, и они работают нормально. Сохраняйте интегральное слагаемое как можно меньше - пользователь не заметит небольшую ошибку в конечной температуре. Вы можете обнаружить, что вы получаете приемлемую производительность только с PD.

Поскольку это очень особый, известный случай, вы можете рассмотреть возможность использования другого режима для контроллера. Измерьте температуру горячего воздуха на входе, и пока она ниже заданного значения, просто прогрейте 100%, а холодные 20%. Когда он прогреется, переключитесь на PID с хорошими начальными условиями.

tomnexus
источник
1
Да. В идеале вы можете измерить температуру горячего входа независимо друг от друга и таким образом запретить нагнетание.
Брайан Драммонд
2
Завершение может быть проблемой, но если бы интегратор не был реализован, например, дестабилизирующий эффект задержки все равно сохранялся. Smith Predictor - хороший метод для смягчения последствий чистой задержки. Одной только адресации интегратора ничего не происходит, чтобы преодолеть внутреннюю задержку фазы, вызванную временной задержкой.
Чу
2
Точно, я не думаю, что это чисто интегратор windup, даже если это так. Это действительная проблема, которая всегда должна быть смягчена для ДАЖЕ, если обычные операции не
достигают
Вау, отличный ответ! Я размышлял в этом направлении (ограничивая максимальное значение интегратора), но не сформулировал вопрос должным образом, поэтому меня неправильно поняли. Приятно видеть, что я по крайней мере на стадионе с решением. Я думаю, что самым простым решением было бы отключить фактор «I», пока температура не достигнет контролируемого диапазона. Это позволило бы очень быстро реагировать на изменения. Затем, когда мы увидим реальное изменение температуры и приблизимся к желаемому результату, снова включите интеграл, чтобы добавить дополнительный необходимый толчок. Спасибо за подробный ответ!
Райан Григгс
Но интегральный термин не для ускорения, а для исправления систематической ошибки, особенно пропорционального коэффициента, который не совсем верен. Нет? И в этой ситуации P-коэф. не может быть идеальным все время, потому что он будет меняться в зависимости от давления воды в обеих трубах.
Роман Старков
4

Ключом к эффективному управлению этим процессом является осознание того, что горячие и холодные ответвления не работают симметрично, и любой оптимальный алгоритм должен учитывать это.

Когда вы некоторое время не пользуетесь горячей водой, она остывает в трубе.

Когда вы не пользуетесь холодной водой какое-то время, она остается такой же, какой была когда-либо (если только холодная вода не поступает из резервуара с холодной водой с чиллером, что было бы здорово в жаркие летние дни, но я ставки на практике довольно редки).

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

Таким образом, исходя из температуры смешанной воды, а также из знания настройки клапана и из оценки температуры холодной воды, мы можем оценить, насколько горячей является вода, поступающая в настоящее время из трубы горячей воды. Затем вы можете отрегулировать клапан, чтобы получить правильную температуру на выходе без ПИД-регулятора, основываясь только на оценке термодинамической формулы.

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

Эта схема не будет абсолютно точной, но я полагаю, что она надежно попадет в стадию без возможности резкого превышения. Затем вы запускаете PID поверх этой схемы для точной настройки результатов, но ограничиваете изменение настройки клапана, которую разрешено производить PID. И, возможно, сбросьте состояние ПИД-регулятора при значительных изменениях входной температуры горячей воды.

Любые решения возможны с несколькими датчиками температуры.

Atsby
источник
Еще один замечательный ответ - мыслить нестандартно. Я подумал только о том, чтобы протестировать температуру воды и создать некую справочную таблицу с приблизительными позициями клапанов, чтобы получить желаемую температуру на выходе. Вы правы, что холод относительно постоянен, хотя, возможно, и холоднее зимой. Водопроводные линии находятся на глубине около 24-36 дюймов, и у нас обычно бывают умеренные температуры. Затем я мог бы также учесть максимальную температуру на выходе горячей воды (около 120 F) и создать справочную таблицу, которая бы правильно позиционировала клапаны, используя ПИД для точной настройки после прогрева.
Райан Griggs
1
Вода из колодца может оставаться очень холодной даже в теплое лето в зависимости от глубины / источника. «Холодная» вода, покоящаяся в трубах дома, теплее, чем то, что будет перекачиваться снизу. Таким образом, холодная вода на самом деле становится холоднее при использовании (пока она не приблизится к температуре подземных вод). Я всегда "удивляюсь", когда я иду в "большой город", и холодная вода никогда не остывает.
rickhg12hs
2

Я просто хотел добавить одну деталь к хорошим ответам выше о том, что делают инженеры управления для встроенных возможностей запуска. Это также происходит во многих промышленных процессах, и это искусство, а не наука.

Есть типичные действия учебника против этого, не жертвуя интегральным усилением, которое могло бы действительно потребоваться для спецификации производительности.

  1. Каждый раз, когда вы пересекаете нулевой уровень ошибок, вы сбрасываете интегратор. Это делает интегратор интегратором по требованию типа нелинейного элемента вместо слепого аккумулятора.

  2. Вы в основном подключаете входной блок интегрального действия к показательному элементу в цикле. Это может быть либо выходом интегратора, чтобы судить , начал ли он сборку (что требует правильного понимания процесса). Или вы проверяете, насыщены ли ваши приводы или нет, и формируете петлю обратной связи на основе этой информации. Я просто случайно выбрал первую ссылку, которая вышла из Google, и в конце этого видео есть графическое объяснение моей последней точки. https://www.youtube.com/watch?v=H4YlL3rZaNw

percusse
источник
Хорошие моменты, спасибо за расширение идеи. Спасибо за видео, оно очень хорошо объясняет проблему.
Tomnexus
1

Иногда может быть полезно иметь несколько наборов параметров ПИД для грубых этапов диапазона работы системы, которые вы изменяете на лету, когда система переходит от одной стадии поведения к другой. Например, один набор Kp, Ki и Kd, когда вы включаете горячий кран и получаете только холодную воду; затем, как только вы начнете видеть повышение температуры, переключитесь на другой набор Kp, Ki и Kd. Затем настройте два соответственно.

Вы используете библиотеку PID на игровой площадке Arduino Бретта Борегара? Это довольно мило. И там есть «адаптивный» пример этого.

Techydude
источник
Спасибо за предложения. Не используя библиотеку pid, я написал ее сам, чтобы узнать больше о том, как она работает.
Райан Григгс
Рассматривали ли вы подачу вперед? Это похоже на быстрые изменения, влияющие на вывод через разомкнутый контур, поэтому вы не ждете, пока замкнутый контур отреагирует.
Грегори Корнблюм
Я пытаюсь обернуть свой мозг вокруг того, как в этом случае будет работать «продвижение вперед». Будет ли входной сигнал желаемой температурой, а выходной будет устанавливать клапаны в заранее определенное положение (как обсуждалось в моем другом комментарии выше), используя таблицу поиска или простое уравнение?
Райан Григгс
Вы можете использовать обратную связь в дополнение к вашей обратной связи (PID с обратной связью). Вы просто добавляете действие контроллера обратной связи к действию контроллера обратной связи. В идеале контроллером прямой связи должна быть обратная модель клапана. По сути, прямая связь дает вам мгновенное действие при изменении уставки. Даже с обратной связью с обратной связью по-прежнему необходимо учитывать выигрыш в компенсаторе управления с обратной связью. Компонент обратной связи должен быть
учтен
1

Вы смоделировали систему?

Есть ли у вас какие-то временные данные, показывающие перерегулирование - особенно частоту

Это два вопроса, которые следует задавать с помощью любого контрольного запроса.

Из того, что вы описали, ваш интегральный выигрыш слишком высок, вплоть до высокого. Это может быть связано с windup интегратором: у показанного кода есть некоторые реальные практические проблемы, одна из которых - это не самый большой из дискретных интеграторов

  • Очень плохая топология дискретного интегратора
  • Никаких ограничений / ограничений на выходе I, не говоря уже о выходе P + I

Это в равной степени может быть потому, что оно очень высокое и требуется время, чтобы уменьшить его.

Так что да, значение, хранящееся в регистре I, могло бы сказать ... 1000C, потому что P + I не был настроен на отклик системы, а затем он должен был свернуться.

Первое, что я хотел бы сделать, это захватить данные в реальном времени для последующей обработки. Далее я бы запустил P-only и обеспечил, чтобы пропорциональный коэффициент усиления ПОЛУЧИЛ желаемую температуру (теория управления утверждает, что это не так). В зависимости от того,

  1. Анализ существующих данных захвата, облегчающих определение подходящего усиления
  2. Модель завода получена, чтобы создать подходящие выгоды

Я бы начал с изменения кода PID для лучшей реализации, а затем добавил бы немного I, чтобы доказать свою точку зрения.

Вы действительно должны определить, против чего эти выгоды предназначены. Вход - это температура, выход - поток? поэтому должна быть передача Flow / C и функция Flow / Cs.

JonRB
источник
Хороший ответ также, спасибо. Я не смоделировал систему, поскольку я еще не знаю, как это сделать, - я только начал мокнуть в этом исследовании. Вы правы, что значение I увеличивается за разумные пределы. Можете ли вы направить меня к лучшему алгоритму реализации для интегратора? Лучше всего использовать псевдокод, поскольку он позволяет мне изучать код и вставлять его в мои слова, а не копировать / вставлять. Кроме того, вы можете направить меня к любым введениям в моделирование простых систем, подобных этой? Вы правы, что уровни потока (горячая и холодная смесь) являются выходами этой системы. В настоящее время это просто обратно пропорциональный H / C.
Райан Григгс
1
Я добавлю
твик в
1

Один из способов, который мне нравится решать Integral Windup - это перестать накапливать ошибку, когда ваш управляющий выход имеет максимальное отклонение . Или масштабируйте его, насколько это далеко от максимального отклонения. Поэтому, когда ваш контроллер выдает «горячая вода 100%, холодная вода 0%», просто не накапливайте ошибку, но и не сбрасывайте ее до нуля.

Мне не нравится ограничивать интеграл максимумом, потому что есть предел тому, какую систематическую ошибку может компенсировать ваш PID.

Я бы также предположил, что вместо создания «тупого» ПИД-регулятора, который имеет только один параметр, который он пытается контролировать без знания базовой системы, вы устанавливаете два дополнительных температурных датчика, как на горячий, так и на холодный вход. Затем вы пытаетесь найти функцию, которая приближает желаемое положение на основе входных температур, и вы используете только ПИД-регулятор, чтобы скорректировать погрешность на выходе этой функции.

Ошибка будет существенной, потому что вы не измеряете расход (ну, конечно, если вы этого не делаете), который зависит не только от положения клапана (известно), но и от давления воды (неизвестно).

Тем не менее, это должно очень помочь с проблемой того, что горячая вода в конце концов достигнет крана, потому что в хорошо затухающем контуре ПИД-регулятора необходимо полагаться на то, что элемент D хорошо откалиброван для быстрого уменьшения потока горячей воды. В моем опыте получить правильный производный коэффициент обычно труднее всего. Но если бы у вас было два дополнительных датчика, основной выход изменился бы точно так же быстро, как и температура воды на входе, поэтому в основном мгновенный, без какой-либо необходимости в производном элементе.

Роман Старков
источник