Pid_v3_const_time (Regulator proporcjonalno-całkująco-różniczkujący ze stałym cyklem pracy)
Wejście:
- In - sygnał wejściowy, zmienna sterująca,
- Set - wartość ustalona zmiennej sterującej,
- K - współczynnik wzmocnienia dla bloku proporcjonalnego regulatora PID, wewnątrz używana wartość jest podzielona przez 100,
- Ti - stała czasowa całkowania dla bloku I regulatora PID,
- Td - stała czasowa różniczkowania dla bloku D regulatora PID, wewnątrz używana wartość jest dzielona przez 100,
- LimitLo - minimalna wartość, którą może przyjąć zmienna sterowana na wyjściu regulatora PID,
- LimitHi - maksymalna wartość, którą może przyjąć zmienna sterowana na wyjściu regulatora PID, używana również w algorytmie anti-windup (patrz niżej),
- Initial – wartość regulatora PID po zresetowaniu,
- En - wejście cyfrowe, jeżeli en = 0, to regulator PID na wyjściu podaje ostatnio wyliczoną wartość, a wszelkie wewnętrzne obliczenia są wstrzymywane, jeżeli en = 1, to regulator PID działa normalnie,
- Rst - wejście cyfrowe, jeżeli Rst = 1, to cały wewnętrzny stan bloku jest inicjalizowany na i wartość Out ustawiana jest na wartość Initial, jeżeli Rst = 0 to blok działa normalnie. Jeśli wartość Initial jest mniejsza niż LimitLo , po resecie wartość wyjściowa zostanie ustawiona LimitLo. Jeśli wartość Initial jest większa od LimitHi, po resecie wartość wyjściowa zostanie ustawiona na LimitHi
- Cycle_100ms – Cykl co jaki pobierana jest wartość parametru (wartość 10 oznacza, że program pobierze wartość raz na sekundę, 3600 raz na godzinę), jeśli wartość czasu podana na wejście Cycle_100ms < Cykl wykonania programu, funkcja będzie pobierała dane co cykl programu.
Wyjście:
- Out - wartość zmiennej sterowanej wyliczona przez regulator PID
Opis funkcji:
Kiedy wejście En jest w stanie wysokim funkcja realizuje operacje regulatora proporcjonalno-całkująco-różniczkującego, dąży do takiego wysterowanie wartością wyjściową Out, aby wartość wejściowa In osiągnęła i utrzymała wartość zadaną Set.
Algorytm:
- Obliczenie błąd dla cyklu:
# n - numer cyklu
e(n) = Set - In
- Obliczenie części proporcjonalnej:
P = K / 100 * e(n)
- Obliczenie części całkującej:
I(n) = I(n - 1) + K / Ti * (e(n) + e(n - 1)) / 2 # jeżeli Ti = 0, to I(n)=0
- Obliczenie części różniczkującej:
D = (-K / 100) * (Td / 100) * (e(n-1) - e(n))
# e(n - 1) - e(n) <=> In(n) - In(n - 1), wewnętrznie blok utrzymuje wartość błędu z poprzedniego cyklu
- Obliczenie wartości zmiennej sterowanej:
Out = P + I(n) + D
- Ograniczenie wartości zmiennej sterowanej do zadanych widełek:
if Out > LimitHi then Out = LimitHi
if Out < LimitLo then Out = LimitLo
- Ograniczenie całkowania algorytmem anti-windup:
# abs - wartość bezwzględna
if abs(P + I(n)) > abs(LimitHi) then I(n) = LimitHi - P
Uwagi:
jeżeli LimitLo == 0 i LimitHi == 0 to wartości ograniczeń są ustawiane na LimitLo = -32768, LimitHi = 32767, przed przystąpieniem do obliczeń przeprowadzana jest normalizacja wartości ograniczeń, tj. jeżeli LimitLo > LimitHi, to LimitLo jest zamieniany wartością z LimitHi.
powrót