Algorytm PID: jak uwzględnić szybkie zmiany wartości wejściowej po długim opóźnieniu


15

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!


1
W rzeczywistości zastanawiam się, czy w ogóle potrzebujesz działania typu I, ponieważ uważam, że zmiany temperatury wody są stosunkowo powolne w porównaniu z uruchamianiem zaworu. Co gorsza, możesz uzyskać zachowanie oscylacyjne z powodu wyjątkowo słabego marginesu fazowego, który prawdopodobnie uzyskasz (twój system może być stabilny teoretycznie, ale może nigdy nie przestać oscylować w praktyce, ponieważ działanie I dodaje opóźnienie fazowe). Ponadto, ponieważ prawdopodobnie spalisz ludzi, nie mogę się stresować, aby spojrzeć na komentarze Chu i JonRB!
Sanchises

Odpowiedzi:


15

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.


1
Tak. Idealnie możesz niezależnie mierzyć temperaturę na wlocie gorącego i w ten sposób hamować zwijanie.
Brian Drummond

2
Kończenie może stanowić problem, ale gdyby integrator nie został zaimplementowany, np. Destabilizujący efekt opóźnienia pozostałby. Smith Predictor to dobra metoda łagodzenia skutków czystego opóźnienia czasowego. Samo rozwiązanie problemu z zamknięciem integratora nie pomaga przezwyciężyć nieodłącznego opóźnienia fazy wprowadzonego przez opóźnienie czasowe.
Chu

2
dokładnie nie sądzę, że jest to wyłącznie integracja z integratorem, nawet jeśli tak jest. jest to ważna obawa, która zawsze powinna być złagodzona NAWET, jeśli normalne operacje nie
spełnią

Wow, świetna odpowiedź! Myślałem w tym kierunku (ograniczając maksymalną wartość integratora), ale nie sformułowałem poprawnie pytania, więc zostałem źle zrozumiany. Dobrze jest zobaczyć, że jestem przynajmniej na boisku z rozwiązaniem. Myślę, że najprostszym rozwiązaniem byłoby wyłączenie współczynnika „I”, dopóki temperatura nie osiągnie kontrolowanego zakresu. Umożliwiłoby to bardzo szybką reakcję na zmiany. Następnie, gdy widzimy rzeczywistą zmianę temperatury i zbliżamy się do pożądanego wyniku, włącz ponownie całkę, aby dodać potrzebne dodatkowe naciśnięcie. Dziękuję za szczegółową odpowiedź!
Ryan Griggs

Ale integralny termin nie ma go przyspieszyć, służy do skorygowania błędu systematycznego, zwłaszcza proporcjonalnego współczynnika, który nie jest całkiem właściwy. Nie? I w tej sytuacji C Pef. nie może być cały czas idealny, ponieważ będzie się różnić w zależności od ciśnienia wody w obu rurach.
Roman Starkov

4

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.


Kolejna świetna odpowiedź - myślenie poza polem PID. Rozważałem właśnie przetestowanie temperatur wody i stworzenie pewnego rodzaju tabeli przeglądowej z przybliżonymi położeniami zaworów, aby uzyskać pożądaną temperaturę wyjściową. Masz rację, że zimno jest względnie stałe, aczkolwiek być może zimniejsze zimą. Linie wodne są pochowane na wysokości około 24-36 cali i zwykle mamy tutaj łagodne temperatury. Następnie mógłbym również uwzględnić maksymalną temperaturę wyjściową ciepłej wody (około 120 F) i stworzyć tabelę przeglądową, która odpowiednio ustawia zawory, używając PID do dokładnego dostrojenia po rozgrzaniu.
Ryan Griggs

1
Woda w studni może być bardzo chłodna nawet w ciepłe lata, w zależności od głębokości / źródła. „Zimna” woda spoczywająca w rurach domowych jest cieplejsza niż woda pompowana od dołu. Tak więc zimna woda faktycznie staje się zimniejsza podczas użytkowania (dopóki nie zbliży się do temperatury wody podziemnej). Zawsze jestem „zaskoczony”, kiedy idę do „dużego miasta”, a zimna woda nigdy nie jest zimna.
rickhg12hs

2

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.

  1. 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.

  2. 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


Dobre punkty, dziękuję za rozwinięcie pomysłu. Dzięki za film, bardzo dobrze wyjaśnia problem.
tomnexus

1

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.


Dziękuję za sugestie. Nie korzystając z biblioteki pid, napisałem ją sam, aby dowiedzieć się więcej o tym, jak to działa.
Ryan Griggs

Czy rozważałeś przekazanie dalej? To tak, jakby szybkie zmiany wpływały na wyjście przez otwartą pętlę, więc nie musisz czekać na zamkniętą pętlę, aby zareagować.
Gregory Kornblum

Staram się owijać mózg wokół tego, jak działałoby „feed forward” w tym przypadku. Czy wejściem byłaby pożądana temperatura, a wyjście ustawiłoby zawory we wcześniej ustalonej pozycji (jak omówiono w moim innym komentarzu powyżej) za pomocą tabeli przeglądowej lub prostego równania?
Ryan Griggs

Oprócz sprzężenia zwrotnego można użyć sprzężenia zwrotnego (PID w zamkniętej pętli). Po prostu dodajesz akcję kontrolera sprzężenia do akcji kontrolera przekazywania. Najlepiej byłoby, gdyby sterownik sprzężenia zwrotnego był odwrotnym modelem zaworu. Feedforward zasadniczo zapewnia natychmiastowe działanie po zmianie wartości zadanej. Nawet przy sprzężeniu zwrotnym i sprzężeniu zwrotnym nadal musisz uwzględnić likwidację w kompensatorze kontroli sprzężenia zwrotnego. Należy uwzględnić element informacji zwrotnej.
docscience

1

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

  • Bardzo słaba topologia integratora dyskretnego
  • Brak zacisków / limitów na wyjściu I, a co dopiero na wyjściu P + I.

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

  1. Analiza obecnych danych przechwytywania ułatwiająca określenie odpowiedniego wzmocnienia
  2. Model rośliny jest uzyskiwany w celu uzyskania odpowiednich korzyści

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.


Dobra odpowiedź również, dzięki. Nie modelowałem systemu, ponieważ nie wiem jeszcze, jak to zrobić - po prostu zaczynam moczyć stopy w tym badaniu. Masz rację, że wartość I wzrasta poza rozsądne granice. Czy możesz skierować mnie do lepszego algorytmu implementacji dla integratora? Pseudokod jest najlepszy, ponieważ pozwala mi się uczyć i wstawiać kod do moich własnych słów, zamiast kopiować / wklejać. Czy możesz też skierować mnie do jakichkolwiek wprowadzeń do modelowania takich prostych systemów? Masz rację, że poziomy przepływu (mieszanie na gorąco i na zimno) są wyjściami tego systemu. Obecnie jest to po prostu odwrotnie proporcjonalny H / C.
Ryan Griggs

1
Niedługo
dodam poprawkę

1

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.