Каталог
Зателефонуйте мені
Каталог

PID-регулятор: принцип роботи, налаштування та приклад на ємності

PID-регулятор: принцип роботи, налаштування та приклад на ємності
Автор: Andriy Savechka Опубліковано: 22.01.2026 Переглядів: 2763 Коментарів: 0

ПІД-регулятор - це одна з тих речей в автоматизації, з якими рано чи пізно стикається кожен інженер. Температура, рівень, тиск, швидкість, витрата — у більшості випадків за стабільною роботою цих параметрів стоїть саме ПІД. Його можна сприймати як «чорну скриньку» з налаштуваннями, але на практиці такий підхід майже завжди закінчується довгими підборами коефіцієнтів і нестабільною роботою системи.

Насправді ПІД-регулятор набагато простіший, ніж здається на перший погляд. Якщо зрозуміти базову логіку його роботи — що таке помилка, звідки береться керуючий сигнал і як кожна складова впливає на процес — налаштування перестає бути магією і перетворюється на звичайну інженерну задачу.

У цій статті ми розберемо ПІД-регулятор «з нуля» без складної математики, на зрозумілих прикладах, а потім прив’яжемо все це до практики — керування рівнем у ємності. Подивимось, як виглядає алгоритм у коді, як він поводиться в симуляторі та як цей підхід можна без проблем перенести у реальний PLC-проєкт у TIA Portal.

Які взагалі бувають методи керування

У промисловій автоматизації керування технологічними процесами не починається одразу з ПІД-регулятора. Існують простіші методи, які в багатьох випадках цілком успішно працюють і сьогодні.

Найпростіший варіант - дискретне керування “увімкнено / вимкнено”. Наприклад, насос або нагрівач просто вмикається, коли параметр нижче уставки, і вимикається, коли її досягнуто. Такий підхід простий у реалізації, але майже завжди призводить до частих вмикань, коливань параметра та зносу обладнання.

Трохи кращий варіант - керування з гістерезисом. У цьому випадку задається діапазон, в межах якого нічого не відбувається: обладнання вмикається при нижній межі і вимикається при верхній. Це зменшує кількість перемикань і робить систему стабільнішою, але точного підтримання параметра все одно немає.

Наступний крок - керування через ШІМ або аналоговий вихід. Тут ми вже можемо не просто вмикати чи вимикати виконавчий механізм, а плавно змінювати його потужність: швидкість насоса, відкриття клапана, потужність нагрівача. Але виникає інше питання — як саме визначити, яке значення керуючого сигналу потрібно подати в конкретний момент часу?

Саме тут і з’являється ПІД-регулятор — алгоритм, який автоматично обчислює керуючий сигнал на основі різниці між завданням (SP) та зворотним зв’язком (PV), враховуючи поточну, накопичену та прогнозовану помилку.

Система керування

Перш ніж переходити безпосередньо до PID-регулятора, важливо розібратися й чітко зафіксувати кілька базових понять, з яких складається будь-яка система автоматичного керування.

Перш за все це регулятор - елемент, який «приймає рішення». У промисловій автоматизації це зазвичай програмний алгоритм, реалізований у ПЛК, контролері або частині програмного коду, що циклічно виконується процесором.

Другий ключовий елемент - об’єкт керування. Це фізичний процес або обладнання, на яке ми впливаємо. У класичних прикладах це може бути піч, електродвигун або насос. У нашому випадку об’єктом керування буде ємність з рідиною, рівень у якій необхідно підтримувати на заданому значенні.

Щоб впливати на об’єкт керування, використовується керуючий орган. Для печі це може бути регульований ТЕН, для електродвигуна - частотний перетворювач або драйвер, а в нашому прикладі - насос, швидкість обертання якого змінюється за сигналом від регулятора. Керуючий орган отримує від регулятора керуючий сигнал - конкретне числове значення. Це може бути, наприклад, відсоток ШІМ, значення аналогового виходу 0–10 В або 4–20 мА, або ж внутрішня програмна величина в діапазоні 0–100 %. Для самого регулятора не має принципового значення, чим саме він керує - для нього це просто число.

В об’єкті керування обов’язково присутній датчик, який вимірює керовану величину і передає її регулятору. Саме цей сигнал називається зворотним зв’язком. У системах регулювання температури це температура, у приводах — частота обертів, а в нашому прикладі - рівень рідини в ємності, який вимірюється датчиком рівня (LT).

Окрім зворотного зв’язку, регулятор отримує ще одну важливу величину - уставку (setpoint). Це задане значення параметра, до якого система повинна прагнути. Уставка може бути фіксованою або змінюватися оператором через HMI, потенціометр, повзунок, енкодер чи кнопки. Для регулятора це знову ж таки просто число - наприклад, бажаний рівень 60 %.

Основне завдання регулятора полягає в тому, щоб порівнювати поточне значення зворотного зв’язку із заданим значенням уставки та на основі цієї різниці формувати керуючий сигнал. Різниця між уставкою і фактичним значенням називається помилкою регулювання - саме на неї орієнтується регулятор у своїх розрахунках.

У програмному вигляді цей процес виглядає досить просто: регулятор зчитує значення з датчика рівня, обчислює різницю між фактичним рівнем і заданим, виконує математичні розрахунки та видає керуючий сигнал на насос. Якщо це аналоговий вихід — він передається на частотний перетворювач, якщо внутрішня змінна — використовується далі в логіці керування.

У дискретній (програмній) реалізації регулятор не працює безперервно, а виконує розрахунки через рівні проміжки часу. Цей інтервал називається періодом дискретизації і зазвичай позначається як dt. Фактично це час у секундах, що минув з моменту попереднього циклу розрахунку. Саме з цим параметром ми будемо мати справу далі, розглядаючи роботу PID-регулятора в нашій симуляції ємності з насосом і регулюючим краном.

З чого складається PID регулятор

PID-регулятор складається з трьох складових:

  • пропорційної P (proportional),
  • інтегрувальної I (integral),
  • диференційної D (derivative).

Вихідний сигнал регулятора формується як сума трьох компонент, кожна з яких помножена на свій коефіцієнт підсилення. Результат цих обчислень і є керуючим сигналом, який подається на керуючий орган (наприклад частотний перетворювач).

У загальному вигляді це можна записати так:

LMN = P · Kp + I · Ki + D · Kd

де Kp, Ki та Kd - коефіцієнти PID-регулятора, які необхідно налаштувати для конкретної системи керування. Значення цих коефіцієнтів можуть суттєво відрізнятися - від тисячних часток (0.001) до десятків або навіть сотень. Це напряму залежить від динаміки об’єкта керування, а також від діапазонів вхідних і вихідних сигналів.

Важливий момент: будь-який з коефіцієнтів може дорівнювати нулю. У такому разі відповідна складова регулятора повністю виключається з розрахунку. Таким чином, PID-регулятор легко перетворюється на:

  • P-регулятор,
  • PI-регулятор,
  • PD-регулятор

або будь-яку іншу комбінацію.

Різні технологічні процеси вимагають різного підходу до регулювання, і саме ця гнучкість робить PID-регулятор настільки універсальним та поширеним у промисловій автоматизації.

Надалі будемо використовувати такі позначення змінних:

  • LMN - керуючий сигнал (вихід регулятора)
  • SP (Setpoint) - завдання, задане значення параметра
  • PV (Process Value) - зворотний зв’язок, фактичне значення з датчика
  • error - помилка регулювання, різниця між SP та PV
  • dt - період дискретизації, час між послідовними циклами розрахунку регулятора

error = SP - PV

Саме з цими змінними ми далі будемо розглядати роботу PID-регулятора на прикладі регулювання рівня в ємності.

Пропорційна складова (P)

Пропорційна складова PID-регулятора визначається поточним значенням помилки регулювання:

P = error = SP − PV

Чим більша різниця між заданим значенням SP і фактичним значенням PV, тим більшим буде вихідний вплив регулятора і, відповідно, керуючий сигнал LMN. У нашому прикладі з ємністю це означає: чим нижчий фактичний рівень відносно завдання, тим швидше регулятор збільшує швидкість насоса.

Коефіцієнт Kp виконує роль підсилення помилки. Збільшуючи Kp, ми змушуємо систему реагувати швидше та агресивніше на відхилення від заданого рівня.

Водночас важливо розуміти особливість P-регулятора:
коли система досягає заданого значення, помилка стає рівною нулю, а отже пропорційна складова також дорівнює нулю. Це означає, що чисто пропорційний регулятор не здатний утримувати параметр точно на заданому рівні - у сталому режимі завжди залишається певна статична помилка.

Характерні властивості P-складової:

  • є основною складовою PID-регулятора;
  • суттєво підвищує швидкодію системи;
  • значно зменшує статичну похибку, але не усуває її повністю;
  • за надто великого значення Kp може викликати коливання або нестійкість системи;
  • реагує лише на поточну помилку, не враховуючи минулі або майбутні зміни.

P - складова виправляє помилку в поточний момет часу

I-складова (інтегральна)

Інтегральна складова накопичує помилку керування з часом. Фактично вона інтегрує різницю між Завданням (SP) та Зворотним зв’язком (PV), помножену на період дискретизації системи (час, що минув з попереднього циклу обчислення):

I = I + error * dt

Тут I - це інтегральна сума накопичених помилок, яку необхідно зберігати між циклами розрахунку регулятора (наприклад, між циклами ПЛК).

У самому регуляторі ця складова додатково множиться на коефіцієнт Ki, яким і налаштовується внесок інтегральної дії у формування Керуючого сигналу (LMN).

За рахунок накопичення помилки інтегральна складова дозволяє з часом повністю її усунути - тобто точно вивести процес на SP, навіть якщо пропорційна складова сама по собі цього зробити не може.

Основні властивості I-складової:

  • повністю усуває статичну помилку;
  • при занадто великому значенні Ki може викликати коливання, перерегулювання та повільний вихід із режиму насичення (integral windup);
  • особливо важлива для технологічних процесів із постійними збуреннями (тиск, рівень, температура).

I-складова компенсує минулі, накопичені помилки керування

D-складова (диференційна)

Диференційна складова PID-регулятора базується на швидкості зміни помилки регулювання. Вона обчислюється як різниця між поточною та попередньою помилкою, поділена на період дискретизації dt, тобто фактично є похідною помилки за часом:

D = (error − prevError) / dt;
prevError = error;

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

По суті, D-складова реагує не на саму величину помилки, а на швидкість її зміни. Чим швидше змінюється сигнал з датчика (тобто PV), тим більший внесок диференційна складова робить у формування керуючого сигналу LMN. У нашому прикладі з ємністю це дозволяє «пригальмувати» насос у момент, коли рівень починає швидко наближатися до заданого значення.

Таким чином, D-складова компенсує різкі зміни в системі і за правильної настройки допомагає:

  • запобігти сильному перерегулюванню;
  • зменшити коливання рівня;
  • підвищити загальну стійкість контуру регулювання.

Коефіцієнт Kd визначає вагу цієї компенсації та підбирається залежно від динаміки об’єкта керування.

Водночас слід враховувати важливу особливість: диференційна складова дуже чутлива до шуму вимірювань. Оскільки вона підсилює швидкі зміни сигналу, на зашумленому сигналі з датчика рівня це може призводити до нестабільної роботи регулятора. Тому в промислових системах:

  • або застосовують фільтрацію сигналу PV перед PID-регулятором;
  • або взагалі відмовляються від D-складової.

На практиці багато технологічних процесів чудово працюють на PI-регуляторі, який значно менш чутливий до шумів і простіший у налаштуванні.

Характерні властивості D-складової:

  • додає елемент передбачення, реагуючи на швидкість зміни помилки;
  • зменшує коливання та перерегулювання, підвищує стійкість системи;
  • чутлива до шумів і може підсилювати перешкоди в сигналі вимірювання;
  • найменш ефективна для зашумлених або повільних процесів.

D-складова намагається скоригувати можливі майбутні помилки, аналізуючи швидкість зміни PV відносно SP

Все разом

Об’єднаємо все сказане у вигляді коду. Як бачите, не все так складно, як могло здаватися на перший погляд - уся логіка ПІД-регулятора зводиться до кількох простих обчислень, які виконуються при кожному циклі керування:

error := SP - PV;
I := I + error * dt;
D := (error - prevError) / dt;
prevError := error;
LMN := error * Kp + I * Ki + D * Kd;

Це і є класичний дискретний ПІД-регулятор.

Які ПІД-регулятори використовуються в реальному житті

На практиці ПІД-регулятор не завжди реалізується у вигляді коду в PLC. Залежно від задачі, бюджету та архітектури системи автоматизації, регулятор може бути окремим пристроєм або частиною іншого обладнання.

Окремостоячі щитові ПІД-регулятори

Найкласичніший варіант - окремий ПІД-регулятор у щитовому виконанні. Такі пристрої часто використовуються для регулювання температури, тиску або рівня в локальних системах.

Зазвичай вони:

  • мають вхід від датчика (4–20 мА, 0–10 В, RTD, термопара);
  • формують керуючий сигнал у вигляді аналогового виходу або ШІМ;
  • дозволяють налаштовувати P, I, D параметри прямо з передньої панелі;
  • підтримують Modbus RTU / TCP для підключення до PLC або SCADA.

У таких системах PLC часто виконує роль вищого рівня керування: передає уставку (SP), читає зворотний зв’язок (PV) і керуючий сигнал (LMN), а сам ПІД-регулятор працює автономно.

ПІД-регулятори, вбудовані у перетворювачі частоти (ПЧ)

У більшості сучасних перетворювачів частоти ПІД-регулятор вже вбудований “з коробки”. Це дуже зручне рішення для задач регулювання:

  • тиску,
  • витрати,
  • рівня,
  • швидкості потоку.

У такій схемі:

датчик напряму підключається до аналогового входу ПЧ;

  • ПІД-регулятор формує частоту або момент двигуна;
  • PLC, якщо він є, задає SP та зчитує параметри по польовій шині.
  • Це дозволяє будувати компактні та надійні системи без додаткового коду в PLC, що особливо популярно в насосних станціях, вентиляції та HVAC.

ПІД-регулятор у PLC (програмна реалізація)

Найгнучкіший варіант - реалізація ПІД-регулятора безпосередньо в PLC. Це може бути як власний код, так і готові функціональні блоки виробника (наприклад, PID_Compact у TIA Portal).

Такий підхід дозволяє:

  • повністю контролювати алгоритм;
  • реалізовувати складні логіки та взаємодію між контурами;
  • легко інтегрувати регулятор у SCADA та HMI;
  • використовувати симуляцію ще до запуску реального обладнання.

Саме такий варіант найчастіше застосовується в складних промислових системах і добре підходить для навчання та експериментів, як у нашому прикладі з ємністю.

Реалізація PID регулятора на ПЛК SIMATIC S7-1200/1500

SCL код нижче реалізує класичний PID-регулятор (ПІД) для контролерів Siemens (TIA Portal).

Основні функції, реалізовані в коді:

  1. Інверсія логіки: Можливість роботи як на нагрів, так і на охолодження.
  2. Зона нечутливості (Deadband): Ігнорування малих коливань помилки для стабільності.
  3. Безударний перехід (Bumpless Transfer): Плавне перемикання між ручним та автоматичним режимами (синхронізація SP та Integrator).
  4. Anti-Windup: Захист від насичення інтегральної складової (зупинка інтегрування при досягненні лімітів).
  5. ШІМ (PWM) генератор: Вбудований перетворювач аналогового виходу в дискретні імпульси (для керування твердотільними реле або клапанами).

FUNCTION_BLOCK "CONT_C"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      COM_RST : Bool;   // Повний перезапуск (ініціалізація)
      INVERT_LOGIC : Bool;   // Інверсія логіки (FALSE=Нагрів, TRUE=Охолодження)
   END_VAR

   VAR_INPUT RETAIN
      MAN_ON : Bool := TRUE;   // Ручний режим увімк.
      P_SEL : Bool := TRUE;   // П-складова увімк.
      I_SEL : Bool := TRUE;   // І-складова увімк.
      D_SEL : Bool;   // Д-складова увімк.
      CYCLE : Real := 1.0;   // Час циклу в секундах
      PV_IN : Real;   // Вхідна величина (Process Value)
      P : Real := 2.0;   // Пропорційний коефіцієнт
      I : Real := 20.0;   // Час інтегрування (Ti)
      D : Real := 20.0;   // Час диференціювання (Td)
      TM_LAG : Time := T#2S;   // Час затримки D-складової (Lag)
      DEADB_W : Real;   // Ширина зони нечутливості
      LMN_HLM : Real := 100.0;   // Верхній ліміт виходу
      LMN_LLM : Real;   // Нижній ліміт виходу
      I_ITLVAL : Real;   // Початкове значення інтегратора при скиданні
      PulsePause : Real := 1.0;   // Період ШІМ (секунди)
   END_VAR

   VAR_OUTPUT 
      PWM : Bool;   // ШІМ вихід
      LMN : Real;   // Керуючий вихід (Manipulated Variable)
   END_VAR

   VAR_IN_OUT RETAIN
      SP : Real;   // Завдання (SetPoint)
      MAN : Real;   // Ручне значення виходу
   END_VAR

   VAR 
      LMN_P : Real;   // Поточне значення P
      LMN_I : Real;   // Поточне значення I
      LMN_D : Real;   // Поточне значення D
      PV : Real;   // Робоча змінна PV
      ER : Real;   // Помилка (Error)
      sInvAlt : Real;   // Попереднє значення помилки (для I)
      sIanteilAlt : Real;   // Попереднє значення інтегратора
      sRestInt : Real;   // Залишок інтегрування (для точності)
      sRestDif : Real;   // Залишок диференціювання
      sRueck : Real;   // Змінна зворотного зв'язку D-частини
      sLmn : Real;   // Робоча змінна виходу
      sbArwHLmOn : Bool;   // Прапор: досягнуто верхній ліміт
      sbArwLLmOn : Bool;   // Прапор: досягнуто нижній ліміт
      sbILimOn : Bool;   
      tmpSP_INT : Real;   // Внутрішнє завдання
      tmpPV_IN : Real;   // Внутрішнє PV
      statTimePulse : Time;   
      tmrPulse {InstructionName := 'TOF_TIME'; LibVersion := '1.0'; S7_SetPoint := 'False'} : TOF_TIME;   
      tmrPause {InstructionName := 'TOF_TIME'; LibVersion := '1.0'; S7_SetPoint := 'False'} : TOF_TIME;   
      statTimePause : Time;   
   END_VAR

   VAR_TEMP 
      rCycle : Real; 
      Diff : Real;   
      ErKp : Real;   
      rTi : Real;   
      rTd : Real;   
      rTmLag : Real;  
      Panteil : Real; 
      Ianteil : Real; 
      Danteil : Real; 
      Verstaerk : Real;
      RueckDiff : Real;
      RueckAlt : Real; 
      dLmn : Real;   
      gf : Real;   
      rVal : Real; 
      tempPulseRate : Real;
   END_VAR

BEGIN
    REGION Data Preparation & Logic Inversion
        // Визначення напрямку регулювання (прямий або зворотний)
        // Якщо INVERT_LOGIC = FALSE -> Нагрів (SP - PV)
        // Якщо INVERT_LOGIC = TRUE  -> Охолодження (PV - SP)
        IF NOT #INVERT_LOGIC THEN
            #tmpSP_INT := #SP;
            #tmpPV_IN  := #PV_IN;
        ELSE
            #tmpSP_INT := #PV_IN;
            #tmpPV_IN  := #SP;
        END_IF;
    END_REGION

    REGION Main Control Logic
        // Перевірка команди повного скидання (ініціалізації)
        IF #COM_RST THEN
            // --- Скидання всіх внутрішніх змінних та виходів ---
            #sIanteilAlt := #I_ITLVAL; // Початкове значення інтегратора
            #LMN         := 0.0;
            #LMN_P       := 0.0;
            #LMN_I       := 0.0;
            #LMN_D       := 0.0;
            #PV          := 0.0;
            #ER          := 0.0;
            #sInvAlt     := 0.0;
            #sRestInt    := 0.0;
            #sRestDif    := 0.0;
            #sRueck      := 0.0;
            #sLmn        := 0.0;
            #sbArwHLmOn  := FALSE; // Прапор верхнього ліміту
            #sbArwLLmOn  := FALSE; // Прапор нижнього ліміту
            
        ELSE
            // --- Робота регулятора в циклі ---
            #rCycle := #CYCLE; // Час циклу виконання
            #PV     := #tmpPV_IN;
            
            // 1. Розрахунок помилки регулювання (Error)
            #ErKp := #tmpSP_INT - #PV;
            
            // 2. Обробка зони нечутливості (Deadband)
            // Якщо помилка в межах зони нечутливості, вихід помилки = 0
            IF #ErKp < (-#DEADB_W) THEN
                #ER := #ErKp + #DEADB_W;
            ELSIF #ErKp > #DEADB_W THEN
                #ER := #ErKp - #DEADB_W;
            ELSE
                #ER := 0.0;
            END_IF;
            
            // Попередній розрахунок пропорційного коефіцієнта
            #ErKp := #ER * #P;
            
            // 3. Зчитування та перевірка часових параметрів
            #rTi    := #I; // Час інтегрування (сек)
            #rTd    := #D; // Час диференціювання (сек)
            // Конвертація часу затримки D-складової в секунди
            #rTmLag := DINT_TO_REAL(TIME_TO_DINT(#TM_LAG)) / 1000.0; 
            
            // Захист від некоректних налаштувань часу (щоб уникнути ділення на нуль)
            REGION Safety Checks for Time Settings
                IF #rTi < (#rCycle * 0.5) THEN
                    #rTi := #rCycle * 0.5;
                END_IF;
                IF #rTd < #rCycle THEN
                    #rTd := #rCycle;
                END_IF;
                IF #rTmLag < (#rCycle * 0.5) THEN
                    #rTmLag := #rCycle * 0.5;
                END_IF;
            END_REGION
            
            // 4. Розрахунок Пропорційної складової (P-term)
            REGION P-Action
                IF #P_SEL THEN
                    #Panteil := #ErKp;
                ELSE
                    #Panteil := 0.0;
                END_IF;
            END_REGION
            
            // 5. Розрахунок Інтегральної складової (I-term)
            REGION I-Action
                IF #I_SEL THEN
                    IF #MAN_ON THEN
                        // Ручний режим: підготовка до безударного переходу в Авто
                        // I-складова підлаштовується так, щоб вихід не стрибнув при перемиканні
                        #Ianteil   := #sLmn - #Panteil;
                        #sRestInt  := 0.0;
                        // В ручному режимі SP слідує за PV для плавного переходу
                        #SP        := #tmpPV_IN; 
                    ELSE
                        // Автоматичний режим: формула інтегрування
                        #Diff := #rCycle / #rTi * (#ErKp + #sInvAlt) * 0.5 + #sRestInt;
                        
                        // Anti-Windup: Заморожування інтегратора при досягненні лімітів виходу
                        // Якщо вихід насичений і помилка намагається штовхати далі -> ігноруємо приріст
                        IF ((#Diff > 0.0) AND #sbArwHLmOn) OR ((#Diff < 0.0) AND #sbArwLLmOn) THEN
                            #Diff := 0.0;
                        END_IF;
                        
                        // Накопичення інтегральної суми
                        #Ianteil   := #sIanteilAlt + #Diff;
                        #sRestInt  := #sIanteilAlt - #Ianteil + #Diff; // Збереження залишку точності
                        
                        // Синхронізація ручного завдання з актуальним виходом
                        #MAN := #LMN; 
                    END_IF;
                ELSE
                    // Якщо I-складова вимкнена
                    #Ianteil   := 0.0;
                    #sRestInt  := 0.0;
                END_IF;
            END_REGION
            
            // 6. Розрахунок Диференціальної складової (D-term)
            REGION D-Action
                #Diff := #ErKp;
                IF (NOT #MAN_ON) AND #D_SEL THEN
                    // Розрахунок коефіцієнта підсилення з урахуванням Lag-фільтру
                    #Verstaerk := #rTd / (#rCycle * 0.5 + #rTmLag);
                    #Danteil   := (#Diff - #sRueck) * #Verstaerk;
                    
                    // Збереження попередніх значень
                    #RueckAlt  := #sRueck;
                    #RueckDiff := #rCycle / #rTd * #Danteil + #sRestDif;
                    #sRueck    := #RueckDiff + #RueckAlt;
                    #sRestDif  := #RueckAlt - #sRueck + #RueckDiff;
                ELSE
                    #Danteil   := 0.0;
                    #sRestDif  := 0.0;
                    #sRueck    := #Diff;
                END_IF;
            END_REGION
            
            // 7. Формування вихідного сигналу та обмеження
            REGION Output Calculation & Limiting
                // Сума всіх складових PID
                #dLmn := #Panteil + #Ianteil + #Danteil;
                
                // Вибір джерела сигналу: Ручний або Автоматичний
                IF #MAN_ON THEN
                    #dLmn := #MAN;
                ELSE
                    // Динамічне обмеження інтегральної складової (запобігання перерегулюванню)
                    IF #I_SEL THEN
                        // Перевірка на верхній ліміт
                        IF (#Ianteil > #LMN_HLM) AND (#dLmn > #LMN_HLM) AND ((#dLmn - #LMN_D) > #LMN_HLM) THEN
                            #rVal    := #LMN_HLM;
                            #gf      := #dLmn - #LMN_HLM;
                            #rVal    := #Ianteil - #rVal;
                            IF #rVal > #gf THEN #rVal := #gf; END_IF;
                            #Ianteil := #Ianteil - #rVal;
                        // Перевірка на нижній ліміт
                        ELSIF (#Ianteil < #LMN_LLM) AND (#dLmn < #LMN_LLM) AND ((#dLmn - #LMN_D) < #LMN_LLM) THEN
                            #rVal    := #LMN_LLM;
                            #gf      := #dLmn - #LMN_LLM;
                            #rVal    := #Ianteil - #rVal;
                            IF #rVal < #gf THEN #rVal := #gf; END_IF;
                            #Ianteil := #Ianteil - #rVal;
                        END_IF;
                    END_IF;
                END_IF;
                
                // Запис значень для діагностики
                #LMN_P       := #Panteil;
                #LMN_I       := #Ianteil;
                #LMN_D       := #Danteil;
                #sInvAlt     := #ErKp;
                #sIanteilAlt := #Ianteil;
                
                // Скидання прапорів обмеження
                #sbArwHLmOn := FALSE;
                #sbArwLLmOn := FALSE;
                
                // Жорстке обмеження виходу (Hard Limiting)
                IF #dLmn >= #LMN_HLM THEN
                    #dLmn       := #LMN_HLM;
                    #sbArwHLmOn := TRUE; // Активація прапора Max
                ELSIF #dLmn <= #LMN_LLM THEN
                    #dLmn       := #LMN_LLM;
                    #sbArwLLmOn := TRUE; // Активація прапора Min
                END_IF;
                
                #sLmn := #dLmn;
                #LMN  := #dLmn; // Фінальний вихід (в одиницях, наприклад 0.0 - 100.0%)
            END_REGION
        END_IF;
    END_REGION

    REGION PWM Generation
        // Генерація широтно-імпульсної модуляції (ШІМ)
        // Перетворює вихід (#LMN) у часові інтервали
        
        #tempPulseRate := #LMN / #LMN_HLM; // Коефіцієнт заповнення
        
        // Розрахунок часу ввімкнення та паузи
        #statTimePulse := UDINT_TO_TIME(REAL_TO_UDINT(1000.0 * #PulsePause * #tempPulseRate));
        #statTimePause := UDINT_TO_TIME(REAL_TO_UDINT(1000.0 * #PulsePause * (1.0 - #tempPulseRate)));
        
        // Логіка таймерів (асинхронний генератор)
        #tmrPulse(IN := NOT #tmrPause.Q, PT := #statTimePulse);
        #tmrPause(IN := #tmrPulse.Q,     PT := #statTimePause);
        
        // Формування дискретного виходу
        IF NOT #COM_RST THEN
            #PWM := #tmrPulse.Q;
        ELSE
            #PWM := FALSE;
        END_IF;
    END_REGION

END_FUNCTION_BLOCK

Можете просто скопіювати цей код у текстовий файл з розширенням .scl, після чого імпортувати його в проєкт TIA Portal та на його основі згенерувати власний Function Block (FB) для подальшого використання в програмі керування.

Симулятор ПІД-регулятора: дивимось, як він працює на практиці

Теорія - це добре, але справжнє розуміння ПІД-регулятора приходить тоді, коли бачиш його в роботі. Саме тому далі розглянемо симулятор ПІД-регулятора, який дозволяє наочно подивитись, як змінюється керуючий сигнал (LMN), зворотний зв’язок (PV) та поведінка системи при різних значеннях коефіцієнтів Kp, Ki та Kd.

У симуляторі можна без ризику для реального обладнання поекспериментувати з налаштуваннями, побачити перерегулювання, коливання, час виходу на завдання (SP) і зрозуміти, як кожна складова ПІД-регулятора впливає на динаміку процесу.

PID Регулятор: Ємність

 
50.0%
Рівень

Система

PID Параметри

Потужність насоса: 0.0 %

Цей симулятор є класичною моделлю системи автоматичного керування зі зворотним зв'язком. Основна логіка базується на безперервному розрахунку «помилки» - різниці між заданим рівнем (Setpoint) та поточним рівнем води (Process Variable). Насос намагається компенсувати цю помилку, закачуючи воду, в той час, як «кран» (Outflow) створює постійний витік, що виступає в ролі зовнішнього збурення. 

Регулятор обчислює потужність насоса через три компоненти: P (пропорційна) реагує на поточну помилку, I (інтегральна) накопичує помилку минулого, щоб повністю усунути статичну похибку, а D (диференціальна) прогнозує майбутні зміни, гасячи занадто різкі коливання. На графіку в реальному часі ви бачите «боротьбу» регулятора за стабільність: червона лінія завдання - це те, чого ми хочемо, а синя лінія рівня - те, що ми отримуємо в результаті роботи насоса.

Які режими та сценарії можна спробувати:

  • Перехідна характеристика (Step Response): Встановіть систему у стабільний стан (наприклад, 40%), а потім різко пересуньте повзунок завдання на 80%. Ви побачите, як система «наздоганяє» нове значення. Тут можна побачити перерегулювання (коли рівень підстрибує вище 80%) та час заспокоєння.
  • Робота зі збуренням (Disturbance Rejection): Коли рівень стабільний, різко змініть параметр «Кран (Outflow)». Це імітує прорив труби або зміну навантаження. Хороший PID-регулятор повинен швидко повернути рівень до заданого значення, майже не змінивши його надовго.
  • Пошук критичного посилення (Tuning): Спробуйте обнулити параметри I та D, а параметр P поступово збільшувати. Ви помітите, що при високих значеннях P система почне входити в режим автоколивань (рівень буде постійно стрибати вгору-вниз). Це чудовий спосіб зрозуміти межі стійкості вашої системи.
  • Усунення статичної помилки: Спробуйте залишити тільки P=1.0 (інші 0). Ви побачите, що рівень ніколи не досягне завдання (наприклад, зупиниться на 55% при заданих 60%). Потім додайте трохи I (наприклад, 0.05), і ви побачите, як рівень повільно, але впевнено доповзе до ідеальних 60%.

Практичні поради з налаштування ПІД-регулятора

Універсальних значень коефіцієнтів P, I та D не існує — усе залежить від конкретного процесу, його інерційності та вимог до точності. Проте є кілька загальних правил, які значно спрощують налагодження.

Для повільних та інерційних процесів (рівень у ємності, температура, тиск у великих об’ємах) зазвичай достатньо ПІ або навіть П-регулятора. Починати варто з малого значення Kp, поступово збільшуючи його до появи коливань, а потім трохи зменшити. Після цього додається інтегральна складова Ki для усунення статичної помилки. Диференціальну складову в таких процесах часто не використовують взагалі — вона мало що дає і може погіршити стабільність.

Для швидких процесів (швидкість обертання двигуна, позиціювання, серво-приводи) потрібна більш агресивна реакція регулятора. Тут важливу роль відіграє P-складова, а D-складова допомагає пригасити різкі зміни та перерегулювання. Інтегральну частину слід налаштовувати обережно, щоб уникнути «розгону» регулятора та затяжного виходу з насичення.

Якщо сигнал з датчика шумний, варто або фільтрувати його перед регулятором, або зменшувати вплив D-складової, а в багатьох випадках — повністю від неї відмовитись. На практиці велика кількість промислових задач чудово працює саме на ПІ-регуляторі.

Окрему увагу слід приділяти обмеженням керуючого сигналу (LMN) та захисту від накопичення інтегральної складової при насиченні (anti-windup). Без цього навіть правильно підібрані коефіцієнти можуть призводити до нестабільної поведінки системи при пусках або різких змінах навантаження.

Короткі чек-листи налаштування

Рівень, температура, тиск (повільні та інерційні процеси)

  • Починати з П-регулятора (Ki = 0, Kd = 0)
  • Плавно збільшувати Kp до появи легких коливань
  • Зменшити Kp на 10–30% від критичного значення
  • Додати Ki для усунення статичної помилки
  • D-складову зазвичай не використовувати
  • Обов’язково задати обмеження LMN (0–100%)
  • Перевірити поведінку при пуску та зміні навантаження

Швидкість двигуна, позиціювання, серво-системи

  • Почати з малого Kp, поступово збільшуючи
  • Додати Kd для гасіння перерегулювання
  • Інтегральну складову Ki вводити дуже обережно
  • Слідкувати за часом реакції та перерегулюванням
  • Перевірити роботу на різких змінах завдання (SP)
  • За можливості фільтрувати сигнал зворотного зв’язку (PV)

Шумні або нестабільні сигнали

  • Увімкнути фільтр вимірювання PV
  • Зменшити або вимкнути D-складову
  • Збільшити період дискретизації dt (в межах розумного)
  • Віддати перевагу ПІ-регулятору
  • Перевірити фізичне підключення та заземлення датчиків

Типові помилки при налаштуванні ПІД

Занадто великий Kp
Призводить до коливань, нестабільності та “розгойдування” процесу

Надмірний Ki
Викликає перерегулювання, повільний вихід на режим і ефект “накручування” інтегратора

Використання D без потреби
Часто тільки підсилює шум і робить систему менш стабільною

Відсутність anti-windup
Інтегратор накопичує помилку при насиченні LMN, що ламає пуски та переходи

Занадто малий або великий dt
Малий dt → шум і нестабільність
Великий dt → повільна та “гальмівна” система

Налаштування “на око” без тестів
Без перевірки пуску, зупинки та зміни навантаження регулятор майже гарантовано буде працювати некоректно

Підсумок

ПІД-регулятор - це простий за своєю логікою, але надзвичайно потужний інструмент керування. Незважаючи на «страшну» назву та формули, на практиці він зводиться до кількох зрозумілих операцій і легко реалізується навіть у вигляді кількох рядків коду. Як ви могли побачити, нічого магічного тут немає — усе ґрунтується на роботі з помилкою, її накопиченням та швидкістю зміни.

Сподіваюсь, ця стаття допомогла вам розкласти ПІД-регулятор «по поличках» і зробила його менш загадковим. Якщо розумієш, як він працює - налаштовувати його стає значно простіше.

Коментарі

Додайте коментар...

Ім'я
E-mail (Не буде опублікований)
Ваш коментар
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Схожі статті

Авторизація
Немаєте акаунта? Реєстрація
Забыли пароль?
E-mail
Введите e-mail Вашей учетной записи, чтобы получить пароль.
Введите корректно e-mail!
viber-chatЧат «А2М» в Viber telegram-chatЧат «А2М» в Telegram
Telegram QR
💬 Актуальні ціни
завжди під рукою