4. Implementując w środowisku LabVIEW regulator PID posłużyliśmy się modelem PID z rzeczywistą częścią różniczkującą. Transmitancja opisująca nasz PID:
gdzie:
kr – wzmocnienie regulatora PID
Ti – stała całkowania
Td – stała różniczkowania
TD – stała czasowa inercji w członie różniczkującym
Regulator został zaimplementowany w środowisku LabVIEW za pomocą struktury formula node, w której mogliśmy zapisywać równania matematyczne podobnie jak w tekstowych językach programowania, np. C. Takie rozwiązanie było najprostszym i najskuteczniejszym podejściem do problemu implementacji regulatora PID. Równania różniczkowe regulatora są rozwiązywane za pomocą metody Eulera, wzór ogólny:
gdzie:
h – krok różniczkowania, w naszym przypadku dt, czyli okres próbkowania regulatora.
Ponadto w części różniczkującej potrzebne było różniczkowanie sygnału wejściowego, czyli uchybu, w tym celu wykorzystaliśmy definicję różniczki, czyli:
gdzie h oznacza to samo co w poprzednim wzorze.
W naszym przypadku musieliśmy trochę zmodyfikować powyższy wzór, gdyż symulator działał w czasie rzeczywistym, a do wyznaczenia pochodnej zgodnie z powyższym wzorem potrzeba próbki z przyszłości ( f(x0+h)), zamiast tego wykorzystywaliśmy poprzednią próbkę, czyli ( f(x0-h)), co przy odpowiednio małym h wpływało niezauważalnie na wynik. W celu lepszej czytelności kodu z naszego regulatora PID utworzyliśmy subVI:
Aby nie tworzyć kolejnych wyjść oraz wejść subVI w celu dostarczania do niego poprzednich wartości uchybu oraz kilku innych niezbędnych zmiennych za pomocą rejestrów przesuwnych w pętli głównej programu, zastosowaliśmy Feedback Node wewnątrz pid2.vi, który zapamiętuje wartości z poprzedniego wykonania subVI.
Poniżej znajduje się schemat blokowy regulatora PID:
5. W celu zwiększenia funkcjonalności symulatora zaimplementowaliśmy 2 dodatkowe funkcje:
a) zatrzymanie całkowania (anti-windup)
Zatrzymanie całkowanie polega na odłączeniu części całkującej regulatora PID w przypadku gdy sygnał sterujący u znajduje się na wartości granicznej lub ją przekracza, przez co programowo jest on ograniczany. W naszym przypadku dozwolone wartości u znajdują się w zakresie (0,5). Gdyby część całkująca nie była w tym przypadku odłączana, składowa całkująca cały czas by rosła, z powodu niezerowego uchybu, pomimo ograniczenia sygnału wyjściowego u. Taka sytuacja powoduje znaczne zwiększanie się błędu całkowania, szczególnie przy długim utrzymywaniu się sygnału sterującego powyżej wartości ograniczającej. Nasza implementacja anti-windup:
Fi = ((u>=5.0))?0.0:T*kp*e/Ti;
Problem zatrzymania całkowania został przez nas rozwiązany w bardzo prosty sposób, co okres całkowania sprawdzamy wartość sygnału sterującego u, gdy znajduje się ona w dopuszczalnym przedziale, wtedy obliczamy kolejną wartość składowej całkującej, natomiast gdy sygnał sterujący przekracza wartość dopuszczalną, wtedy do składowej całkującej przypisujemy wartość 0, dzięki czemu sygnał z części całkującej nie rośnie.
b) bezuderzeniowe przełączanie
bezuderzeniowe przełączanie polega na tym, aby przy zmianie trybu sterowania z ręcznego na automatyczny (PID) oraz w odwrotną stronę, wartość sterowana (w naszym przypadku p3) nie ulegała gwałtownym zmianom. Natomiast w stanie ustalonym p3 w ogóle nie powinno się zmienić przy przejściu na inny tryb sterowania. W przypadku bezuderzeniowego przełączania z trybu automatycznego na ręczny należy na bieżąco przypisywać wartości p0 (set) (wartość zadana w trybie ręcznym) wartość wyjściową regulatora PID. Natomiast w przypadku zmiany ręcznego trybu na automatyczny, potrzebnych jest kilka modyfikacji. Wejście na człon całkujący musi być odłączone od uchybu, a zamiast niego należy podłączyć wartość zadaną w trybie ręcznym pomniejszoną o sygnał z części proporcjonalnej regulatora PID, oraz dodatkowo wyzerować część różniczkującą regulatora.
Realizacja bezuderzeniowego przełączania z trybu automatycznego na ręczny:
Realizacja bezuderzeniowego przełączania z trybu ręcznego na automatyczny: