PLC CODESYS

Regulator temperatury PID w CODESYS na Finder OPTA z czujnikiem PT100

Szymon Adamek 11 min czytania

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.
Finder OPTA z modułem analogowym i modułem SSR obok zamkniętej skrzynki z nagrzewnicą i czujnikiem PT100
Obiekt regulacji: zamknięta skrzynka z nagrzewnicą 4 kW, PT100 w głowicy na górze, obok Finder OPTA i przekaźnik SSR

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.

Filtr dolnoprzepustowy FT_PT1 z biblioteki OSCAT BASIC dla pomiaru temperatury PT100 w CODESYS
Filtr PT1 (OSCAT BASIC FT_PT1, T = 1 s) wygładza pomiar z czujnika PT100

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ścieTypZnaczenieNastawa w projekcie
ACTUALREALwartość rzeczywista - przefiltrowana temperaturarTemperatureFiltered
SET_POINTREALwartość zadana [°C]40 (w teście z wykresu 70)
KPREALwzmocnienie członu proporcjonalnego, musi być różne od 00,5
TNREALczas zdwojenia członu całkującego [s], musi być większy od 01E+04 (10 000 s)
TVREALczas różniczkowania [s], 0 = regulator PI0
Y_MANUAL / MANUALREAL / BOOLwartość wyjścia w trybie ręcznym0 / FALSE
Y_OFFSETREALstała dodawana do wyjścia0
Y_MIN / Y_MAXREALograniczenie sygnału wyjściowego0 / 100
RESETBOOLzerowanie regulatora (także części całkującej)negacja stanu start/stop
Y / LIMITS_ACTIVE / OVERFLOWwyjściamoc 0-100%, aktywne ograniczenie, przepełnienie całki-
Blok PID z biblioteki Util w CODESYS z nastawami KP 0,5 i TV 0 oraz blok PWM_DC sterujący przekaźnikiem SSR
Blok PID z biblioteki Util (KP = 0,5, TV = 0), przeliczenie wyjścia na wypełnienie i PWM_DC z okresem 5 s

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 DCCzas załączenia SSRCzas wyłączeniaCo widać na stanowisku
0,10,5 s4,5 skrótkie mignięcie diody SSR co 5 s
0,21 s4 sok. 20% mocy grzałki
0,52,5 s2,5 społowa mocy
0,94,5 s0,5 sSSR 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).

Wykres regulacji temperatury PID w Grafanie: moc grzałki, temperatura rzeczywista i zadana 70 stopni
Test regulatora: nagrzewanie do 70°C, moc grzałki maleje wraz z uchybem, małe oscylacje wokół wartości zadanej
  • 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.

Autor Szymon Adamek

Dyrektor w ControlByte, automatyk. Autor kursu Predykcyjne utrzymanie ruchu i analiza danych w Pythonie. Prowadzi projekty szkoleniowe dla firm i szkół.

Kursy online

Chcesz programować PLC w praktyce?

Kursy Siemens, CODESYS, komunikacji i safety z certyfikatem i wsparciem instruktora. Zacznij od bezpłatnego minikursu.

Zobacz kursy