Symulator PID

ON
OFF
Wejście
Wartość zad.:
Nastawy
P:
Ti:
Td:
Wyniki
Czas:
Sterowanie:
Wyjście:

Powyżej przedstawiam symulator obiektu dynamicznego wraz z regulacją PID. Powstał on w ramach ćwiczenia implementacji prostych algorytmów i użytkowania biblioteki jQuery do podstawowej manipulacji elementami strony. Mam nadzieję, że narzędzie się komuś przyda bo każdy automatyk chociaż raz w życiu musi własnoręcznie napisać działający regulator PID.

Oczywiście nie jest to optymalne rozwiązanie oraz sam kod nie jest zbytnio powodem do dumy. Wydajność również zdaje się tutaj nieco szwankować. Wąskim gardłem jest niestety odświeżanie wykresu. Javascript niestety tak ma ;)

Najważniejsze cechy symulatora:

  • działanie w pętli otwartej lub zamkniętej,
  • wejście/wartość zadana podawana z zadajnik lub generowana w postaci sygnału prostokątnego,
  • implementacja klasycznego, szeregowego regulatora PID (całkowanie z użyciem metody prostokątów, różniczkowania z użyciem różnic wstecznych) w postaci: $$u(i)=K_p\left(e(i)+\frac{dt}{T_i}\sum_{k=0}^{i} e(k)+T_d\frac{e(i)-e(i-1)}{dt}\right) $$ gdzie: $K_p$ - wzmocnienie, $T_i$ - stała całkowania, $T_d$ - stała różniczkowania, $e(i)$ - uchyb w chwili $i$, $u$ - wartość sterowania, $dt$ - krok czasu,
  • strojenie regulatora PID zgodnie z zależnościami: $$K_p=1.2k\frac{T}{T_0},\quad T_i=2T_0,\quad T_d=\frac{T_0}{2}$$ gdzie $T$, $T_0$ oraz $k$ to parametry inercji z opóźnieniem będącej dopasowaniem do dynamiki układu wyższego rzędu,
  • ograniczenie wartości sterowania oraz mechanizm antiwind-up (wyłączenie członu całkującego w przypadku oparcia się regulatora o ograniczenie sterowania),
  • możliwość zmiany parametrów regulatora,
  • implementacja obiektu w postaci inercji II rzędu: $$\frac{Y(s)}{U(s)}=K(s)=\frac{k}{(1+sT_1)(1+sT_2)},$$ która jest obrazem równania różniczkowego: $$\ddot{y}=-\frac{T_1+T_2}{T_1T_2}\dot{y}-\frac{1}{T_1T_2}y+\frac{k}{T_1T_2}u,$$ sprawdzonego poprzez podstawienia: $x_1=\dot{y}$, $\dot{x}_1=\ddot{y}$, $x_2=y$, $\dot{x}_2=\dot{y}=x_1$ do układu równań różniczkowych pierwszego rzędu: $$\begin{cases} \dot{x}_1=-\frac{T_1+T_2}{T_1T_2}x_1-\frac{1}{T_1T_2}x_2+\frac{k}{T_1T_2}u \\ \dot{x}_2=x_1 \end{cases}$$ do którego rozwiązania użyto metody Eulera: metoda Eulera. Parametry obiektu: $k=0.8$, $T_1=T_2=0.5$,
  • dopasowanie modelu będącego inercją I rzędu z opóźnieniem do symulowanego obiektu, którego parametry ustalono na podstawie analizy odpowiedzi skokowej obiektu: $$k=\frac{\Delta y}{\Delta u},\quad T=1.5(t_1-t_2),\quad T_0=t_1-T,$$ gdzie: $\frac{\Delta y}{\Delta u}$ - stosunek przyrostu wyjścia obiektu do przyrostu wejścia, $t_1$ - czas potrzebny na osiągnięcie 63.2% wartości stanu ustalonego, $t_2$ - czas potrzebny na osiągnięcie 28.3% stanu ustalonego. Transmitancja modelu dana jest w postaci: $$K(s)=\frac{k}{1+sT}e^{-sT_0},$$ która jest obrazem równania: $$\dot{y}(t)=-\frac{1}{T}y(t)+\frac{k}{T}u(t-T_0),$$ do którego rozwiązania użyto metodę Rungego-Kutty IV rzędu: metoda RK4. Parametry modelu: $k=0.8$, $T=0.8$, $T_0=0.3$.
  • krok symulacji ustalony na $dt=0.01s$, okres odświeżania wykresu oraz interfejsu ustalony odpowiednio na dwudziesto i dziesięciokrotność tej wielkości,
  • wykorzystanie jQuery i FlotCharts,
  • formuły matematyczne stworzono z użyciem MathJax.
Cała implementacja algorytmów i obsługi GUI znajduje się w jednym pliku: sim.js.