Próbuję zaimplementować podstawowy algorytm PID w Arduino Leonardo do mieszania ciepłej i zimnej wody z kranu za pomocą serwozaworów. Celem jest utrzymanie temperatury możliwie najbliżej wartości zadanej. Szczególnie ważne jest, aby temperatura wyjściowa nie przekroczyła wartości zadanej, aby chronić użytkownika przed poparzeniem. Po drugie ważne jest jak najszybsze zbliżenie temperatury do wartości zadanej.
W przypadku niewielkich zmian temperatury standardowa implementacja algorytmu PID wydaje się działać poprawnie. Ale nie wiem, jak uwzględnić długie opóźnienia, które mogą wystąpić podczas oczekiwania na dotarcie ciepłej wody do zaworu, ponieważ opóźnienia te są znacznie dłuższe niż standardowe opóźnienia po zmianie pozycji zaworu.
Oczywiście w zależności od długości linii ciepłej wody i czasu od ostatniego użycia gorącej wody, dotarcie gorącej wody do zaworu może zająć kilkadziesiąt sekund, więc w tym czasie temperatura wody pozostaje dość stała w niskiej temperaturze a zawór ciepłej wody wkrótce otwiera się w 100%. Zintegrowany element zaczyna gromadzić dużą wartość błędu.
Gdy gorąca woda w końcu dotrze do zaworu, wykryta temperatura bardzo szybko wzrasta do maksymalnej temperatury ciepłej wody. Ze względu na duży błąd całkowania zawór ciepłej wody jest utrzymywany na poziomie 100% przez długi czas po przekroczeniu temperatury zadanej, ponieważ oczekiwanie na wartość całki zostanie zredukowane do normalnego poziomu. Tak więc wynikiem jest woda o maksymalnej temperaturze przez kilka (kilkadziesiąt) sekund.
Nie jestem pewien, jak uwzględnić to możliwe duże opóźnienie. Czy w takim przypadku rozsądnie byłoby ustawić górną (i dolną) granicę wartości błędu integralnego, aby ograniczyć maksymalny czas odpowiedzi? Wydaje się, że pokonuje to cel integralnego komponentu i nadal narzuca pewne opóźnienie po osiągnięciu wartości zadanej.
Czy jest lepszy sposób na radzenie sobie z szybkimi zmianami danych wejściowych po długim opóźnieniu?
Dziękuję za wszelkie porady!
źródło
Odpowiedzi:
Twój problem nazywa się Integral Windup , jest częstym problemem kontrolnym. W obszarze nieliniowym lub w inny sposób ograniczony regulator nie może śledzić wartości zadanej, a całka wzrasta do dużej wartości. Powoduje to duże przekroczenie po osiągnięciu wartości zadanej, i właśnie to, jak się domyśliłeś, jest problemem.
Najprostszym rozwiązaniem jest ograniczenie samej wartości Integratora do rozsądnego maksimum. Ograniczenie integralnego wkładu również nie zadziała, ponieważ integrator będzie nadal zwijany do pewnej dużej wartości.
Mathworks ma stronę z kilkoma innymi rozwiązaniami integralnej likwidacji.
W regulatorze PID zazwyczaj chcesz mieć jak najmniej integralnego terminu. W standardowym mechanicznym zaworze regulacji temperatury stosowana jest tylko regulacja proporcjonalna i działają one prawidłowo. Zachowaj jak najkrótszy termin całkowania - użytkownik nie zauważy niewielkiego błędu w końcowej temperaturze. Może się okazać, że osiągasz akceptowalną wydajność tylko z PD.
Ponieważ jest to bardzo szczególny, znany przypadek, możesz rozważyć zastosowanie innego trybu dla kontrolera. Zmierz temperaturę na wlocie gorącego, a gdy jest ona poniżej wartości zadanej, po prostu uruchom gorącą 100%, zimną 20%. Po rozgrzaniu przełącz się na PID, przy dobrych warunkach początkowych.
źródło
Kluczem do skutecznego sterowania tym procesem jest uświadomienie sobie, że krany na gorąco i na zimno nie działają symetrycznie, a każdy optymalny algorytm musi to uwzględnić.
Kiedy gorąca woda nie jest używana przez pewien czas, ochładza się w rurze.
Kiedy nie używasz zimnej wody przez jakiś czas, pozostaje taka sama jak zawsze (chyba że zimna woda pochodzi ze zbiornika zimnej wody z agregatem chłodniczym, co byłoby wspaniale mieć w gorące letnie dni, ale ja obstawianie jest w praktyce dość rzadkie).
Zakładamy więc, że nie wiemy, co otrzymujemy z rury ciepłej wody, ale możemy polegać na tym, że rura zimnej wody jest prawie stała podczas całego cyklu.
Zatem na podstawie temperatury zmieszanej wody i znajomości ustawienia zaworu oraz na podstawie oszacowania temperatury zimnej wody możemy oszacować, jak gorąca jest woda aktualnie pobierana z rury ciepłej wody. Następnie można wyregulować zawór, aby uzyskać prawidłową temperaturę wyjściową bez PID, po prostu na podstawie oceny wzoru termodynamicznego.
Aby uzyskać „szacunkową temperaturę zimnej wody”, można uruchomić zimną wodę przez krótki czas (może kilka sekund) na początku cyklu i odczytać temperaturę. Następnie załóż, że nie zmieni się on później, ponieważ nie masz wystarczających danych do rozwiązania dla obu temperatur.
Ten schemat nie będzie idealnie dokładny, ale szacuję, że niezawodnie dostanie się na boisko, bez możliwości drastycznego przekroczenia. Następnie uruchom PID na górze tego schematu, aby dostroić wyniki, ale ogranicz zmianę do ustawienia zaworu, które może wytwarzać PID. I ewentualnie zresetuj stan PID, gdy wystąpią znaczące zmiany temperatury wejściowej ciepłej wody.
Bardziej zaawansowane rozwiązania są możliwe dzięki wielu czujnikom temperatury.
źródło
Chciałem tylko dodać jeden szczegół do powyższych ładnych odpowiedzi na temat tego, co robią inżynierowie sterowania dla zintegrowanych możliwości zwijania. Dzieje się tak również w wielu procesach przemysłowych i jest to raczej sztuka niż nauka.
Istnieją typowe działania podręcznikowe przeciwko temu bez utraty integralnego wzmocnienia, które może być naprawdę wymagane w specyfikacji wydajności.
Za każdym razem, gdy przekroczysz zerowy poziom błędu, resetujesz integrator. To sprawia, że integrator jest integralnym elementem nieliniowym na żądanie zamiast ślepego akumulatora.
Zasadniczo łączysz blok wejściowy akcji integralnej z elementem wskaźnikowym w pętli. Może to być dane wyjściowe integratora do oceny, czy rozpoczął on gromadzenie danych (co wymaga zrozumienia procesu, aby osąd był właściwy). Lub sprawdzasz, czy siłowniki są nasycone, czy też nie i na podstawie tych informacji tworzą pętlę sprzężenia zwrotnego. Właśnie losowo wybrałem pierwszy link, który wyszedł z Google'a, a na końcu tego filmu znajduje się graficzne wyjaśnienie mojej ostatniej kwestii. https://www.youtube.com/watch?v=H4YlL3rZaNw
źródło
Czasami pomocne może być posiadanie wielu zestawów parametrów PID, dla gruboziarnistych etapów zakresu działania systemu, które zmieniasz w locie, gdy system przechodzi z jednego etapu zachowania do drugiego. Na przykład jeden zestaw Kp, Ki i Kd, gdy włączasz gorący kran i dostajesz tylko zimną wodę; potem, gdy zaczniesz widzieć wzrost temperatury, przełącz na inny zestaw Kp, Ki i Kd. Następnie dostrój je odpowiednio.
Czy korzystasz z biblioteki PID na placu zabaw Arduino autorstwa Bretta Beauregarda? Ten jest całkiem niezły. Jest tam również „adaptacyjny” przykład tego.
źródło
Czy wymodelowałeś system?
Czy masz jakieś dane czasowe pokazujące przekroczenie - szczególnie częstotliwość
Są to dwa pytania, które należy zadać w przypadku dowolnego zapytania sterującego.
Z tego, co opisałeś, twoje całkowite wzmocnienie jest zbyt wysokie, droga do wysokiego. Może to wynikać z likwidacji integratora: pokazany kod ma pewne praktyczne problemy, z których jedna nie jest największą z integratorów dyskretnych
Może być tak samo, ponieważ jest bardzo wysoki i wymaga czasu, aby go zmniejszyć.
Więc tak, wartość przechowywana w rejestrze I mogła zostać zwijana, by powiedzieć ... 1000C, ponieważ P + I nie były ustawione na odpowiedź systemu, a następnie musiałby się rozładować.
Pierwszą rzeczą, którą bym zrobił, to przechwycenie danych w czasie rzeczywistym do przetwarzania końcowego. Następnie uruchomiłbym tylko P i upewniłem się, że proporcjonalne wzmocnienie osiągnie PRAWIE pożądaną temperaturę (zgodnie z teorią sterowania). W zależności od tego, czy
Zacznę od zmiany kodu PID, aby był lepszą implementacją, a następnie dodam trochę I, tylko po to, aby udowodnić swoją rację.
Naprawdę musisz ustalić, przeciwko czemu te zyski są przeznaczone. Wejście to temperatura, wyjście to ... przepływ? dlatego powinien istnieć transfer Flow / C i funkcja Flow / Cs.
źródło
Jednym ze sposobów, które lubię rozwiązać Integral Windup, jest zatrzymanie gromadzenia błędu, ilekroć wyjście sterujące osiąga maksymalne odchylenie . Lub przeskaluj go według odległości od maksymalnego ugięcia. Tak więc za każdym razem, gdy sterownik wysyła komunikat „ciepła woda 100%, zimna woda 0%”, po prostu nie kumuluj błędu, ale nie resetuj go również do zera.
Nie lubię ograniczać całki do maksimum, ponieważ wtedy istnieje limit tego, jaki błąd systematyczny może kompensować Twój PID.
Sugerowałbym również, że zamiast tworzyć „głupi” PID, który ma tylko jeden parametr, który próbuje kontrolować bez wiedzy o podstawowym systemie, instalujesz dwa dodatkowe czujniki temperatury, zarówno na wejściu ciepłym, jak i zimnym. Następnie próbujesz znaleźć funkcję, która aproksymuje pożądaną pozycję na podstawie temperatur wejściowych, i używasz pętli PID tylko w celu skorygowania błędu na wyjściu tej funkcji.
Błąd będzie znaczący, ponieważ nie mierzysz przepływu (no chyba, że robisz to oczywiście), co zależy nie tylko od pozycji zaworów (znane), ale także od ciśnienia wody (nieznane).
Mimo to powinno to bardzo pomóc w problemie, że gorąca woda w końcu dotrze do kranu, ponieważ w dobrze tłumionej pętli PID trzeba polegać na dobrze skalibrowanym elemencie D, aby szybko zmniejszyć przepływ gorącej wody. Z mojego doświadczenia wynika, że poprawienie współczynnika pochodnego jest zwykle najtrudniejsze. Ale gdybyś miał dwa dodatkowe czujniki, główna moc wyjściowa zmieniałaby się dokładnie tak szybko, jak temperatura wody na wejściu, czyli w zasadzie natychmiastowa, bez potrzeby stosowania elementu pochodnego.
źródło