Regulator temperatury PID na sterowniku PLC to trzy elementy: pomiar (tu czujnik PT100), algorytm PID liczący moc w zakresie 0-100% i wykonawca, który tę moc podaje na grzałkę. W tym projekcie zbudowaliśmy to na Finder OPTA z runtime CODESYS: PT100 w układzie trójprzewodowym na module analogowym, blok PID z biblioteki Util i przekaźnik półprzewodnikowy SSR sterowany sygnałem PWM o okresie 5 sekund. Poniżej pokazujemy cały program krok po kroku, nastawy, które zadziałały na obiekcie z nagrzewnicą 4 kW, i wykres z testu.
Architektura układu regulacji temperatury
Układ regulacji jest klasyczną pętlą sprzężenia zwrotnego. Sterownik mierzy temperaturę, porównuje ją z wartością zadaną i na tej podstawie wylicza sygnał wyjściowy dla grzałki. W filmie z laboratorium automatyki obiekt to mała skrzynka z zamkniętą w środku nagrzewnicą o mocy 4 kW, a czujnik PT100 w głowicy siedzi na jej górnej ściance.
- Sterownik: Finder OPTA z runtime CODESYS, więc cały program piszesz w standardowym środowisku CODESYS (IEC 61131-3).
- Pomiar: czujnik PT100 podłączony trójprzewodowo do analogowego modułu rozszerzeń OPTA. Trzeci przewód kompensuje rezystancję przewodów, więc pomiar jest dokładniejszy niż w układzie dwuprzewodowym.
- Wykonawca: przekaźnik półprzewodnikowy (SSR) Finder w module rozszerzeń, załączany wyjściem tranzystorowym. SSR nie ma styków, które się zużywają, więc dobrze znosi częste przełączanie.
- Sterowanie mocą: PWM o okresie około 5 s. Przy 20% mocy SSR jest załączony przez ok. 1 s i wyłączony przez 4 s.

Taki zestaw to w praktyce przemysłowy regulator temperatury zbudowany na PLC, a nie na gotowym panelowym regulatorze z wyświetlaczem. Zaleta: pełna kontrola nad algorytmem, wizualizacją i komunikacją. Jeśli dopiero zaczynasz z tym sterownikiem, zajrzyj najpierw do wpisu Pierwsze uruchomienie i konfiguracja sterownika Finder OPTA w CODESYS oraz do poradnika jak podłączyć i skonfigurować moduły rozszerzeń dla Finder OPTA.
Krok 1: pomiar temperatury z czujnika PT100
W drzewie urządzeń CODESYS konfigurujesz kanał modułu analogowego: w naszym przypadku kanał 1, typ czujnika PT100, podłączenie trójprzewodowe. W zakładce mapowania przypisujesz zmienną, która trafi do programu. W trybie online widać od razu surową wartość z kanału - to liczba całkowita, którą trzeba przeskalować na stopnie Celsjusza. W projekcie wystarczyło dzielenie przez stały współczynnik i przypisanie wyniku do zmiennej typu REAL. Współczynnik zawsze sprawdź w podglądzie online i w dokumentacji modułu, bo zależy od konfiguracji kanału.
Po przeskalowaniu temperatura lekko oscyluje wokół jednej wartości. Te zakłócenia warto odfiltrować, zanim trafią do regulatora, bo człon różniczkujący i sam człon proporcjonalny przeniosą każdy szum na sygnał sterujący. Użyliśmy filtra dolnoprzepustowego FT_PT1 z biblioteki OSCAT BASIC, czyli członu inercyjnego pierwszego rzędu ze stałą czasową 1 s. Po filtracji odczyt ustabilizował się na 22,1-22,2°C.

Więcej o doborze czujników i torów pomiarowych znajdziesz w artykule Czujniki i sygnały analogowe - jakie czujniki stosować.
Krok 2: blok PID z biblioteki Util w CODESYS
Sercem programu jest blok funkcyjny PID ze standardowej biblioteki Util, dostępnej w każdej instalacji CODESYS. Zasada działania regulatora PID jest taka sama jak w podręczniku: węzeł sumacyjny liczy uchyb regulacji (wartość zadana minus wartość rzeczywista), uchyb trafia na trzy człony - proporcjonalny, całkujący i różniczkujący - a ich suma to sygnał wyjściowy Y. Według dokumentacji biblioteki Util algorytm regulacji PID liczy:
Y = KP · (e + 1/TN · ∫e dt + TV · de/dt) + Y_OFFSET
gdzie e = SET_POINT - ACTUAL. Wzmocnienie KP mnoży wszystkie trzy człony, TN to czas zdwojenia (całkowania) w sekundach, a TV to czas wyprzedzenia członu D w sekundach. Ustawienie TV = 0 zamienia regulator PID w regulator PI.
| Wejście / wyjście | Typ | Znaczenie | Nastawa w projekcie |
|---|---|---|---|
| ACTUAL | REAL | wartość rzeczywista - przefiltrowana temperatura | rTemperatureFiltered |
| SET_POINT | REAL | wartość zadana [°C] | 40 (w teście z wykresu 70) |
| KP | REAL | wzmocnienie członu proporcjonalnego, musi być różne od 0 | 0,5 |
| TN | REAL | czas zdwojenia członu całkującego [s], musi być większy od 0 | 1E+04 (10 000 s) |
| TV | REAL | czas różniczkowania [s], 0 = regulator PI | 0 |
| Y_MANUAL / MANUAL | REAL / BOOL | wartość wyjścia w trybie ręcznym | 0 / FALSE |
| Y_OFFSET | REAL | stała dodawana do wyjścia | 0 |
| Y_MIN / Y_MAX | REAL | ograniczenie sygnału wyjściowego | 0 / 100 |
| RESET | BOOL | zerowanie regulatora (także części całkującej) | negacja stanu start/stop |
| Y / LIMITS_ACTIVE / OVERFLOW | wyjścia | moc 0-100%, aktywne ograniczenie, przepełnienie całki | - |

Dwie rzeczy z dokumentacji Util warto znać przed uruchomieniem. Po pierwsze, gdy KP = 0 albo TN ≤ 0, blok w ogóle nie liczy wyjścia. Po drugie, przy złych nastawach całka może urosnąć tak bardzo, że wyjście OVERFLOW przejdzie w TRUE i regulator się zatrzyma - wtedy trzeba go zresetować. Pełny opis i przykład regulacji temperatury znajdziesz w dokumentacji bloku PID w bibliotece Util.
Krok 3: od wyjścia PID do sygnału PWM dla SSR
Regulator zwraca Y w zakresie 0-100, co odpowiada mocy grzałki 0-100%. Ten sygnał dzielimy przez 100, bo blok PWM_DC z biblioteki OSCAT BASIC oczekuje wypełnienia DC w zakresie 0-1. Wartości poniżej 0,01 zerujemy, żeby przekaźnik nie mrugał na pojedyncze milisekundy. Częstotliwość F = 0,2 Hz daje okres 5 s. Wyjście Q bloku PWM, połączone szeregowo ze stanem start/stop, steruje wyjściem tranzystorowym, a ono przekaźnikiem SSR.
| Wypełnienie DC | Czas załączenia SSR | Czas wyłączenia | Co widać na stanowisku |
|---|---|---|---|
| 0,1 | 0,5 s | 4,5 s | krótkie mignięcie diody SSR co 5 s |
| 0,2 | 1 s | 4 s | ok. 20% mocy grzałki |
| 0,5 | 2,5 s | 2,5 s | połowa mocy |
| 0,9 | 4,5 s | 0,5 s | SSR załączony prawie bez przerwy |
Dlaczego tak wolny PWM? Obiekt grzewczy ma bardzo dużą bezwładność, więc grzałka "uśrednia" impulsy, a długi okres ogranicza liczbę przełączeń. Test w filmie wykonaliśmy najpierw z odłączonym obwodem mocy: przy wypełnieniu 0,5 dioda na module SSR świeciła 2,5 s co każde 5 s. Ten sam pomysł, tylko z wyjściem analogowym zamiast PWM, opisaliśmy w artykule Wejścia i wyjścia analogowe w sterowniku Finder OPTA - sterowanie prędkością silnika.
Cały program w języku ST
W filmie program jest napisany w LAD, ale to samo w Structured Text wygląda tak. Nazwy bloków i wejść są takie jak w projekcie: RS ze standardu, PID z biblioteki Util, FT_PT1 i PWM_DC z OSCAT BASIC (obie biblioteki trzeba dodać w Library Managerze). Zmienne wejść i wyjść zmapuj w zakładkach I/O modułów rozszerzeń.
PROGRAM PLC_PRG
VAR
iTempRaw : INT; (* surowa wartość kanału PT100 z modułu analogowego *)
xStart : BOOL; (* np. przycisk na Finder OPTA *)
xStop : BOOL;
xHeaterOn : BOOL; (* wyjście tranzystorowe sterujące SSR *)
StateStart : RS;
Filter_0 : oscat_basic.FT_PT1;
PID_0 : Util.PID;
PWM_0 : oscat_basic.PWM_DC;
rTemperatureScaled : REAL;
rTemperatureFiltered : REAL;
rSetPoint : REAL := 40.0; (* temperatura zadana [°C] *)
rKp : REAL := 0.5;
rTn : REAL := 10000.0; (* czas zdwojenia [s] *)
rY_scaled : REAL;
END_VAR
(* start / stop regulatora *)
StateStart(SET := xStart, RESET1 := xStop);
(* skalowanie i filtr dolnoprzepustowy PT1 *)
rTemperatureScaled := INT_TO_REAL(iTempRaw) / 100.0; (* współczynnik zależy od konfiguracji kanału *)
Filter_0(in := rTemperatureScaled, T := T#1S, K := 1.0);
rTemperatureFiltered := Filter_0.out;
(* regulator PI: TV = 0 *)
PID_0(ACTUAL := rTemperatureFiltered,
SET_POINT := rSetPoint,
KP := rKp,
TN := rTn,
TV := 0.0,
Y_MANUAL := 0.0,
Y_OFFSET := 0.0,
Y_MIN := 0.0,
Y_MAX := 100.0,
MANUAL := FALSE,
RESET := NOT StateStart.Q1);
(* 0-100 % -> wypełnienie 0-1, martwa strefa poniżej 1 % *)
rY_scaled := PID_0.Y / 100.0;
IF rY_scaled < 0.01 THEN
rY_scaled := 0.0;
END_IF
(* PWM 0,2 Hz = okres 5 s *)
PWM_0(F := 0.2, DC := rY_scaled);
xHeaterOn := PWM_0.Q AND StateStart.Q1;
W projekcie z filmu ostatni network przelicza jeszcze zmienne na liczby całkowite (temperatura × 10) i wymienia je po Modbus z wizualizacją w Grafanie. Z poziomu wykresu można też zmieniać temperaturę zadaną.
Nastawy regulatora: dlaczego PI, a nie pełny PID
Nastawy dobraliśmy wstępnie, ręcznie: KP = 0,5, duży czas zdwojenia TN i TV = 0, więc pracuje regulator PI. Obiekt ma niską dynamikę i nagrzewa się kilka-kilkanaście minut, więc człon D niewiele by tu wniósł, a wzmacniałby szum pomiaru. Człon całkujący ma tylko delikatnie "dociągnąć" temperaturę do wartości zadanej. Zbyt krótki TN przy tak wolnym obiekcie łatwo wprowadza układ w oscylacje i przeregulowania.
Łatwo sprawdzić, co liczy człon P. Przy wartości zadanej 40°C i rzeczywistej 22,2°C uchyb wynosi 17,8°C. Pomnożony przez KP = 0,5 daje ok. 8,9% - dokładnie tyle pokazało wyjście Y zaraz po starcie. Część całkująca rośnie dopiero z czasem, bo całkuje wartość uchybu.
Praktyczna kolejność strojenia nastaw regulatora dla obiektu grzewczego:
- zacznij od samego członu P z małym KP i zobacz, ile zostaje uchybu ustalonego,
- dodaj człon całkujący z długim TN i skracaj go stopniowo, aż uchyb znika bez oscylacji,
- człon D (TV) włączaj dopiero, gdy pomiar jest dobrze przefiltrowany, a obiekt szybszy niż typowy piec,
- każdą zmianę oceniaj na wykresie, nie na pojedynczym odczycie.
Wykres: jak pracuje regulator temperatury PID w praktyce
Po zamknięciu skrzynki i włączeniu regulatora przyciskiem na Finder OPTA wykres w Grafanie pokazuje trzy przebiegi: moc grzałki (zielony), temperaturę rzeczywistą (żółty) i zadaną (niebieski).

- Na starcie regulator podaje ok. 22-23% mocy, czyli dokładnie KP razy uchyb.
- Temperatura rośnie płynnie, jak w typowym obiekcie inercyjnym: od ok. 24°C do 70°C w niespełna kwadrans.
- Moc maleje razem z uchybem, a w stanie ustalonym wystarcza kilka procent, żeby utrzymać temperaturę.
- Wokół wartości zadanej widać delikatne oscylacje rzędu 1-3°C, bez dużego przeregulowania.
- Gdy temperatura spadła o ok. 10°C pod wpływem zakłócenia, regulator podniósł moc i wrócił do nastawy.
To jest główna przewaga nad termostatem i regulacją dwustawną z histerezą: zamiast przełączać pełną moc 0 albo 100%, regulator PID dozuje ją płynnie, więc regulacja temperatury jest precyzyjna, a grzałka i SSR pracują łagodniej.
Gdzie zastosować taki regulator temperatury
Ten sam schemat - PT100, blok PID, PWM i SSR - przeniesiesz 1:1 do maszyn i instalacji grzewczych: pieców hartowniczych, pieców do wyżarzania, suszarni, stref grzania wtryskarek czy wanien w liniach do galwanizacji. Zmieniają się tylko nastawy i liczba stref. Przy kilku strefach wystarczy kilka instancji bloków PID i PWM_DC w jednym programie. Więcej o samym sterowniku znajdziesz na stronie Finder OPTA.
Regulator temperatury PID - najczęściej zadawane pytania
Jaki jest wzór regulatora PID w CODESYS?
W bloku PID z biblioteki Util: Y = KP · (e + 1/TN · ∫e dt + TV · de/dt) + Y_OFFSET, gdzie e to wartość zadana minus wartość rzeczywista. TN i TV podajesz w sekundach, a TV = 0 daje regulator PI.
Jak ustawić regulator temperatury PID?
Zacznij od małego KP i długiego TN, z TV = 0. Obserwuj wykres: jeśli zostaje uchyb, skracaj TN, a jeśli pojawiają się oscylacje i przeregulowanie, zmniejsz KP lub wydłuż TN. Wolne obiekty grzewcze zwykle dobrze pracują jako regulator PI.
Czym różni się regulator PID od termostatu z histerezą?
Termostat (regulacja dwustawna) załącza pełną moc poniżej progu i wyłącza ją powyżej, więc temperatura stale się waha. Regulator PID liczy moc wyjściową 0-100% na podstawie uchybu i jego historii, dzięki czemu utrzymuje temperaturę dokładniej i bez dużych wahań.
Dlaczego grzałką steruje się przez SSR i PWM, a nie stycznikiem?
Przy PWM z okresem 5 s przekaźnik przełącza się kilkanaście razy na minutę, czyli tysiące razy w ciągu jednej zmiany. Przekaźnik półprzewodnikowy nie ma styków mechanicznych, więc się nie zużywa, a stycznik szybko by się wytarł.
Podsumowanie
Regulator temperatury PID na Finder OPTA w CODESYS to kilka networków: skalowanie i filtr PT1 dla czujnika PT100, blok PID z biblioteki Util, przeliczenie wyjścia na wypełnienie i PWM_DC sterujący przekaźnikiem SSR. Na obiekcie z nagrzewnicą 4 kW regulator PI z KP = 0,5 doprowadził temperaturę do nastawy bez dużego przeregulowania. Jeśli chcesz pisać takie programy samodzielnie, od typów danych po bloki funkcyjne i biblioteki, sprawdź nasz kurs programowania sterowników PLC w środowisku CODESYS w języku ST.

