Паровый контур после сбоя давления полчаса крутился с клапаном на 100 %. Давление вернулось в норму, а клапан ещё двадцать минут не закрывался - технолог уже готов был лезть в ручной режим. На тренде: уставка 6 бар, процессная переменная 6,2, выход PID упёрся в потолок и «липнет». Интегральная составляющая за время насыщения набрала такой запас, что даже при нулевой ошибке блок продолжает держать 100 %, пока I не «выветрится» или оператор не переведёт в MAN.
Anti-windup (защита от перенапряжения интегратора) - не академическая опция, а разница между нормальным возвратом контура и ночным обходом HMI. Статья разбирает насыщение выхода, windup, back-calculation и clamping, поведение при ручном режиме и после открытия клапана. Без преобразований Laplace и без полного курса PID - только то, что настраивают на ПЛК перед пуском. Общая анатомия регулятора и фильтры - в отдельных материалах.
Когда выход PID упирается в 100 % (или 0 %), а ошибка ещё долго положительная, интеграл продолжает накапливаться «внутри» - это windup. После падения ошибки накопленный I держит выход на saturation, клапан не отпускает. Решения: ограничение интегрирования при насыщении (clamping), back-calculation (сброс I пропорционально разнице между несaturated и реальным выходом), переключение на tracking при MAN. На тренде признак windup: PV уже у SP, Out остаётся 100 % дольше времени отклика исполнительного механизма. Включите anti-windup в FB PID или добавьте внешнюю логику до пуска, не после жалоб оператора.
Ограничение выхода 0…100 % (или 4…20 мА после пересчёта) - штатное. Насос не может дать 150 %, клапан физически закрыт или открыт полностью. Пока процесс догоняет уставку, насыщение ожидаемо: большая ошибка, P и I тянут выход в потолок.
Проблема начинается, когда ошибка сменила знак или ушла в ноль, а выход остаётся у границы. Исполнительный механизм уже не нужен на 100 %, но ПЛК продолжает «думать», что надо. Перерасход пара, перелив, кавитация - в зависимости от контура.
На объекте смотрят не только Out, но и внутренние I_part, P_part, флаг Saturation. Если I_part большой положительный при Out=100 и e≈0 - классический windup.
Дискретный PID на ПЛК каждый цикл: e := SP - PV, затем I := I + Ki * e * dt. Пока SP > PV, e > 0, I растёт, даже если сумма P+I+D уже давно упёрлась в 100 и реальный клапан не открывается сильнее. Эта «лишняя» интегральная память не видна на выходе до saturation, но хранится в переменной I.
Когда PV догоняет SP, e → 0, но I остаётся огромным. Summation даёт 100 % ещё долго. Скорость «отпускания» зависит от Ki и того, появится ли отрицательная ошибка (перерегулирование) для компенсации.
Длительность насыщения на пуске котла или после аварии может быть минуты. Без anti-windup I за это время набирает запас на десятки процентов выхода.
Clamping (ограничение интегрирования): интеграл не обновляют, когда выход на границе и ошибка «толкает дальше в стену». Например, при Out=100 и e>0 - не прибавлять к I. Простая логика, работает в большинстве температурных и давленческих контуров.
Back-calculation: вычисляют «идеальный» несaturated выход, сравнивают с реальным; разница через коэффicient Kb возвращает I назад. Более плавный возврат, меньше рывка при сходе с saturation. В CODESYS стандартный FB PID и библиотечные варианты имеют параметры EnableAntiWindup, AntiWindupMode, Kb - названия зависят от версии библиотеки.
Tracking (bumpless): при MAN интеграл подстраивают под текущий ручной выход, чтобы при возврате в AUTO не было скачка. Windup в MAN часто возникает, если tracking выключен: оператор держит 40 %, I в AUTO накопил 100 %, переключение - скачок.
Перед пуском зафиксируйте в паспорте настройки: какой режим anti-windup, Kb, лимиты Out, поведение при PV Bad.
Не каждое «долго на 100 %» - windup. Заклинивший клапан, ограничение по позиционеру, насыщение по SP вторичного контура - похожие симптoms. Различие:
Смотрите тренды SP, PV, Out, позицию клапана (если есть), Mode AUTO/MAN. Запись на 30 минут вокруг инцидента убедительнее для разбора, чем скрин «сейчас».
Оператор переводит контур в MAN при аварии, держит клапан частично открытым. Если при этом интеграл в AUTO продолжает крутиться (ошибка в проекте - I не заморожен в MAN), при возврате Out прыгает. Правильно: в MAN I := f(MV_manual) через tracking или заморозка I.
После открытия клапана (разрешение по interlock, конец «минимального времени закрытия») контур часто стартует с Out=0, SP уже высокий - снова быстрый уход в 100 % и windup. Плавный ramp SP и предоткрытие клапана на минимальный ход снижают время saturation.
При каскаде (TC → FC) windup на мастере бьёт по slave: мастер долго на 100 %, slave упирается, windup копится на обоих уровнях. Настраивают anti-windup на обоих PID или ограничивают SP slave по Out slave.
На объектах с несколькими параллельными контурами (три котла, три PID) сравнивайте тренды соседних контуров при одном сценарии пуска. Windup на одном при «правильных» настройках на других - признак локальной ошибки LIMIT после PID или разного Ti, а не «особенности процесса».
Проверьте в FB:
Ошибка: anti-windup включён, но OutLimit в другом месте проекта (например, LIMIT() после PID) режет выход без обратной связи в PID - блок «не знает» о saturation, I копится.
Вторая ошибка: два последовательных PID «на всякий случай» - windup во внутреннем, внешний видит странный PV.
Третья: перевод единиц - SP в барах, PV в кПа, ошибка в 10 раз, saturation за секунды.
Связь с анатомией PID и настройкой контура с anti-windup - там базовая структура; здесь сценарий «не отпускает».
На стенде с имитацией PV (генератор шага или manual force с осторожностью) воспроизведите сценарий: SP скачком вверх, Out упирается в 100 %, затем PV догоняет SP. Запишите время от момента e≈0 до Out < 95 % без anti-windup и с включённым. Разница в 5–15 минут на медленном температурном контуре - нормальный аргумент для включения back-calculation в паспорте настройки.
Сравните два режима: только clamping I и clamping + back-calc. На некоторых библиотеках clamping даёт «ступеньку» при выходе с saturation, back-calc - плавнее, но чувствительнее к шуму PV. Подберите Kb на стенде, не на горячем паре.
Зафиксируйте в протоколе FAT: Ti, Kp, Kb, тип anti-windup, время выхода из saturation для эталонного теста. При замене FB PID на объекте повторите один эталонный тест - иначе технолог сравнивает с «как было год назад» по памяти.
Операторы часто держат контур в MAN во время мойки или ремонта арматуры. Если при MAN интеграл продолжает копиться (ошибка в логике Mode), возврат в AUTO даёт скачок Out на десятки процентов - это тоже воспринимается как «не отпускает», хотя windup накопился в MAN. Tracking должен подстраивать I под текущий MV, пока Mode = MAN.
При каскадном включении (сначала внутренний контур, потом внешний) включайте anti-windup на обоих уровнях до передачи AUTO технологу. Внешний контур может долго сидеть на 100 % SP внутреннего, пока внутренний в saturation - windup на мастере не менее опасен, чем на одиночном PID.
ПИД выдаёт 100 %, AO модуль даёт 20 мА, но клапан с deadband не двигается до 22 мА эквивалента - для PID saturation наступил раньше физики. Обратная связь по положению клапана (если есть) должна идти в PV или отдельный контур - иначе I копится на «виртуальную» ошибку.
При обрыве 4-20 мА часто Bad на входе - PID должен заморозить I и Out или уйти в safe, а не копить windup на последнем PV. См. сигнал 4-20 мА и Bad quality.
На контурах с большим Td при насыщении выхода D-составляющая может давать рывки при первом сходе с 100 %, если фильтр D настроен агрессивно. Windup касается в основном I, но оператор видит «клапан дёрнулся» и винит только интеграл. На watch смотрите все три части; иногда помогает freeze D при saturation так же, как I.
При двухскоростном PID (fine/coarse) переключение зон без сброса I переносит windup из грубой зоны в точную - отдельный сценарий для теста на стенде.
| Картина на тренде | Windup или нет | Что менять в блоке PID |
|---|---|---|
| PV≈SP, Out=100 % > 3·Tau процесса | Windup | Включить anti-windup, back-calc, проверить Kb |
| PV<<SP, Out=100 % долго</td> | Норма разгона или слабый привод | Мощность, ramp SP, не только PID |
| Out=100, I_part >> P_part | Windup | Clamping I при saturation |
| MAN→AUTO скачок Out | Нет tracking | Tracking integral к MV в MAN |
| Out скачет 100↔0, PV шумит | Скорее D или шум PV | Фильтр PV, уменьшить Kd |
| После аварии «липнет» только один контур | Windup на этом PID | Сравнить с соседним контуром, Ti, Kb |
| Out=100, позиция клапана 60 % | Не windup, рассогласование | Масштаб AO, позиционер, limit после PID |
| PV Bad, Out ушёл в 100 | Ложная ошибка | Freeze при Bad, не только anti-windup |
Anti-windup обязателен на каждом PID?
На любом контуре с интегралом и ограниченным выходом - да. Исключение - осознанный P-only.
Kb подбирают как Ki?
Обычно того же порядка, что обратная связь back-calc; начинают с 1/Ti или по рекомендации библиотеки, смотрят тренд при сходе с 100 %.
Оператор жалуется «не отпускает» - сразу менять Ti?
Сначала проверьте windup и механику. Уменьшение Ti без anti-windup ухудшает перерегулирование.
В симуляции windup не видно?
Модель без задержки и saturation моделирует идеальный клапан. Добавьте limit Out и задержку 1-го порядка в симулятор.
Два PID на один клапан - как?
Избегайте. Если каскад - anti-windup на обоих и ограничение SP внутреннего.
ПЛК СТАБУР с модулями PSV-AO и аналоговыми входами PSV-AI в CODESYS или MasterSCADA используют те же FB PID с anti-windup. На пуске имеет смысл записать эталонный тренд «разгон - выход из saturation» для основных контуров температуры и давления и положить в папку FAT - при замене блока PID сравнение с эталоном быстрее, чем спор с технологом.