Wszyscy znamy cykl pracy automatyka – zaczynamy nowe zlecenie i z początku jest spokój. Dobieramy sprzęt, rysujemy schematy i programujemy, aż do momentu uruchomienia, które kończy sielankę. Drobne zamieszania administracyjne, opóźnienia dostaw, niedokończone prace mechaniczne, a na szarym końcu my z laptopem pod pachą.. Czasu zostało mniej niż mało, klient się niecierpliwi, ponieważ nowy system jest niezbędny do pracy, a my dopiero załączyliśmy zasilanie. Ale jaki to ma związek z regulatorem logiki rozmytej?
Jest już godzina popołudniowa, system ma zostać odebrany jutro, ale regulacja temperatury nie działa, a wystrojenie jednego regulatora PID wygląda na niewykonalne – należałoby zastosować dwa równolegle lub trzy kaskadowo/równolegle, co nie ułatwi obecnie trudnego strojenia. Przychodzi do głowy myśl – skoro function block jest gotowy i przetestowany na symulacji, czemu by nie spróbować? Szybka zmiana w oprogramowaniu i można przetestować czy ma to jakikolwiek sens.. eureka!
W tym artykule opiszę problem z jakim się zetknąłem i przedstawię moje rozwiązanie z regulacją rozmytą.
Opis procesu
Zadanie to regulacja temperatury w rurociągu, z wykorzystaniem dwóch zaworów regulacyjnych sterowanych analogowo (4-20 mA). Trochę jak lanie wody z kranu.
Teoria teorią, a w praktyce wychodzi jak zawsze, więc jakie problemy związane z regulacją napotkano?
- Zawory otwierają się stopniowo w czasie, około 3 sekund od 0 do 100%;
- Temperatura wody zmienia się w czasie z opóźnieniem;
- Temperatura wody spada szybciej niż rośnie (prawdopodobnie zimna woda ma wyższe ciśnienie);
- Temperatura ciepłej wody nie jest stała (centralna kotłownia i wiele odbiorów);
Nie wygląda to jak problemy, z którymi regulator PID sobie nie poradzi i jest to prawda, tyle że nie ma na to czasu, a na strojenie zmarnowano już ponad 2 godziny.
Logika rozmyta
Nie jest to wykład akademicki aby opisywać precyzyjnie wzorami jak zachodzą poszczególne procesy, wytłumaczmy sobie jak działa regulator logiki rozmytej na chłopski rozum:
- Odczytujemy dane i następuje ich rozmycie;
- Sprawdzamy do których reguł pasują rozmyte dane;
- Przeliczamy rozmyte dane reguł z użyciem wybranej funkcji (przeciwieństwo rozmycia?);
Wciąż nie brzmi to sensownie, więc przetłumaczmy co znaczą poszczególne punkty
- Logika rozmyta opiera się o założenie, że przykładowo temperatura może być gorąca i ciepła jednocześnie, stąd stwierdzenie rozmycia – ponieważ kwalifikujemy jedną wartość do dwóch zbiorów w różnym stopniu (20% jako gorąca i 80% jako ciepła) – różnica względem zwykłej logiki jest taka, że oceniamy prawdziwość stwierdzenia w procentach, zamiast oceniać jako prawda/fałsz.
- Rozmyte dane wykorzystujemy do wyliczenia siły reguł, wykorzystywanych potem do wyliczenia końcowej wartości wyjścia regulatora. Przykładową regułą jest – jeżeli temperatura jest zbyt ciepła i się nie zmienia to obniż temperaturę nieznacznie. Ważna uwaga: jednocześnie aktywowane może być wiele reguł!
- Funkcji wykorzystywanych do przeliczenia wartości z reguł jest wiele, wykorzystaną w tym przypadku jest środek ciężkości (ang. Center of Gravity).
Jak zatem rozumieć, że jedna wartość zawiera się w dwóch zbiorach w różnym stopniu? Wystarczy spojrzeć na poniższy obrazek
Widoczne na obrazku powyżej są przedstawienia reguł, gdzie:
- Control Error = błąd regulacji = wartość zadana – wartość obecna;
- Control Error delta = zmiana błędu regulacji = obecny błąd regulacji – poprzedni błąd regulacji;
- Output = wyjście regulatora (a de facto zmiana wyjścia, ponieważ jest to regulator typu PI);
- Regulator logiki rozmytej typu PD, to taki gdzie wyjście ustawiane jest bezpośrednio z obliczeń
- y(t) = FLC(u(t), delta_u(t)), gdzie u(t) oznacza błąd regulacji, delta_u(t) oznacza jego zmianę w czasie t;
- Regulator logiki rozmytej typu PI, to taki gdzie wyjście jest równe sumie poprzedniej wartości wyjścia oraz obecnie wyliczonej
- y(t) = y(t-1) + FLC(u(t), delta_u(t)), gdzie t-1 oznacza poprzednią wartość;
- Regulator logiki rozmytej typu PD, to taki gdzie wyjście ustawiane jest bezpośrednio z obliczeń
Przykład: wartość błędu regulacji równa -7.0 będzie należeć jednocześnie do reguły zbyt niskiej (NegativeBig) i do reguły poniżej zera (NegativeSmall).
Uwaga:
Wiem, że jest to powierzchowne przedstawienie, lecz nie czuję się na siłach aby uczyć innych o czymś, co sam dopiero poznaję w praktyce, mogę polecić cykl anglojęzycznych poradników z firmy MathWorks:
https://www.mathworks.com/videos/getting-started-with-fuzzy-logic-toolbox-part-1-68764.html
Proszę nie opierać się na wiedzy przedstawionej w artykule, ma on na celu zainteresowanie tematem i pokazanie, że nie jest to czarna magia i przede wszystkim działa.
PLC
Problemem, który może wstrzymywać wielu automatyków jest brak lub trudny dostęp do gotowych bloków logiki rozmytej, w przeciwieństwie do regulatora PID. Należy zatem napisać, przetestować i wdrożyć to samemu!
Dlaczego zmienna do zezwolenia pracy regulatora nazywa się „global_PIDenable”? Wcześniej wspomniano, że logika rozmyta wybrana została rzutem na taśmę, jest to po prostu pozostałość po próbie stosowania PIDa.
Tak przedstawia się function block w środowisku TIA Portal z zewnątrz, niestety nie pokażę tutaj całości, ale pokażę użyteczną część.
Uwaga:
Komentarz w linii 22 zawiera błąd, powinno być Out_delta = sum(Weight*Rule) / sum(Rule).
Co oznaczają komentarze widoczne powyżej? Dla przykładu przetłumaczymy kilka z nich
- Reguła 2:
- X=LN, Y=SN
- Control Error is LargeNegative, Control Error Delta is Small Negative;
- Błąd regulacji jest zbyt niski i zmniejsza się powoli;
- Reguła 18:
- X=SP, Y=ZZ;
- Control Error is SmallPositive, Control Error Delta is Zero;
- Błąd regulacji jest powyżej zera i się nie zmienia ;
Możemy zauważyć również, że reguły 2 i 18 posiadają opis jako LN i SP, co oznacza ich wagę:
- Reguła 2:
- LN = LargeNegative;
- Mocno obniż;
- Reguła 18:
- SP = SmallPositive;
- Lekko podnieś;
Tak właściwie do czego wykorzystywana jest waga reguły? Jest ona niezbędna do obliczenia wyjścia regulatora, ponieważ po rozmyciu danych wejściowych operujemy na wartościach od 0 do 100%, z użyciem czego uzyskujemy siły reguł, również w zakresie od 0 do 100%. Finalnie z użyciem wagi obliczamy wyjście lub jego zmianę, zgodnie ze wzorem w komentarzu (poprawka w uwadze powyżej):
- Zmiana_wyjścia = suma(Wagi_Reguł * Siły_Reguł) / suma(Siły_Reguł)
- Wagi_Reguł – wartość dla reguły, przykładowo: NB = NegativeBig = -5.0;
- Siły_Reguł – wartość od 0 do 100%;
Poniżej widoczny jest kod do obliczania zmiany wyjścia regulatora, może zastanawiać pętla IF, a jest to po prostu zabezpieczenie przed dzieleniem przez 0.
Uwaga:
Ograniczenie wyjścia funkcją LIMIT() jest podyktowane wyłącznie metodologią programowania przez autora i nie jest częścią regulatora.
- #outNominator oznacza mianownik, a więc zgodnie z w.w. wzorem = suma(Wagi_Reguł * Siły_Reguł)
- #outDenominator oznacza dzielnik, a więc zgodnie z w.w. wzorem = suma(Siły_Reguł)
- dzielnik w tym wypadku zawsze jest większy lub równy zero, ponieważ siły reguł zawierają się w zakresie od 0 do 100%
Wcześniej wspomniano, że wypadałoby mieć interfejs graficzny do strojenia zamiast ustawiać dane bezpośrednio w datablocku, poniżej widzimy dlaczego
Skoro mamy już obliczenia gotowe, to jak zamienić jedną wartość na dwie? Przecież sterujemy dwoma zaworami, a wyjście regulatora jest jedno.
Przyjęto założenie, że jeden z zaworów powinien być zawsze otwarty na 100% – jak? To przedstawia się w kodzie programu poniżej
Zatem skoro regulator posiada wyjście powyżej 0 przymykamy zawór zimnej wody, jeżeli posiada wartość poniżej 0 przymykamy zawór ciepłej wody.
Regulator w pracy
Niestety, w całym chaosie uruchomienia „na wczoraj” nie zachowało się zbyt wiele wykresów z rzeczywistej pracy regulatora, więc zaprezentuję ostatni z nich.
Opis wykresów w kolejności od góry:
- błąd regulacji,
- wyjście regulatora,
- rozkaz otwarcia zaworu ciepłej wody,
- rozkaz otwarcia zaworu zimnej wody.
Oscylacje są w czasie 0,333 min do 0,917 min są spowodowane pracą blisko górnej granicy temperatury (stąd niewielkie otwarcie zaworu zimnej wody), w okolicy czasu 1,083 min została zmieniona wartość zadana na maksymalną dostępną stąd spadek otwarcia zaworu zimnej wody do 0.
Czas regulacji jest w tym przypadku wynosi około 20 sekund, jednak nie jest to krytyczna kwestia w całym procesie, ponieważ dozowanie wody trwa o wiele, wiele dłużej więc jest to nieodczuwalne w ostatecznym rozrachunku.
Podsumowanie
Dlaczego wystrojenie regulatora logiki rozmytej zajęło mniej czasu niż regulatora PID, pomimo większej ilości zmiennych?
Parametry są bezpośrednio zrozumiałe przez człowieka, można łatwo odczytać i wyobrazić sobie, gdzie zaczyna się temperatura gorąca, a gdzie ciepła, ile oznacza obniżyć mocno, a ile lekko podnieść. Jest to niewątpliwy plus względem innych algorytmów.
Logika rozmyta posiada również swoje minusy, stanowi większe obciążenie obliczeniowe dla procesora i jest trudniejsza w przełożeniu na kod, względem chociażby regulatora PID.
Oprócz plusów opisanych wcześniej, jest jeden bardzo ważny z punktu regulacji procesu – regulator PID najlepiej pracuje od punktu X do punktu Y (przykładowo od temperatury 20 do 60 stopni), lecz gdybyśmy chcieli zmienić punkt pracy może się okazać, że nastawy są nieodpowiednie – logiki rozmyta nie dotyczy ten problem i nastawy są niezależne od punktu pracy.
Przede wszystkim!
Należy sięgać po odpowiednie narzędzie do zadania, w tym konkretnym przypadku regulator logiki rozmytej sprawdził się w sam raz, zastępując 2 godziny nieudanego strojenia regulatora PID, 30 minutami dostrajania.
PS. Na forum klubautomatyka.pl obiecałem, że napiszę artykuł o symulacji zrobotyzowanej linii transportowej i trzymam się danego słowa, ograniczał mnie ostatnio brak czasu związany chociażby z treścią powyższego artykułu.
![]() ![]() Nagrodę Voucher na szkolenie + głośnik + zestaw gadżetów dostarcza ambasador konkursu, firma EMT-Systems. |