Pid_v2 (Regulator proporcjonalno-całkująco-różniczkujący)
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),
- 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 nowo, jeżeli Rst = 0 to blok działa normalnie. Jeśli wartość LimitLo jest mniejsza od 0, po resecie wartość wyjściowa zostanie ustawiona na 0. Jeśli wartość LimitLo jest większa od zera, wartość wyjściowa będzie równa LimitLo.
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