|
PRAKTYCZNA REALIZACJA REGULATORA PID W STEROWNIKACH PRZEMYSŁOWYCH
dr hab. inż. Janusz Kwaśniewski, prof.
AGH
Katedra Automatyzacji Procesów
Akademia Górniczo - Hutnicza
al. Mickiewicza 30, 30 - 059 Kraków
e-mail: kwa_j@uci.agh.edu.pl
Streszczenie - Publikacja zawiera metodykę budowania programu regulatora PID w sterownikach przemysłowych (PLC). Opisano tu również programową metodę ich testowania.
SPIS TREŚCI
1. Wstęp
2. Dokładność przetwarzania a rozdzielczość
3. Problem znaku podczas operacji odejmowania
4. Mnożenie w przypadku współczynników mniejszych od jedności
5. Całkowanie
6. Różniczkowanie
7. Pełna wersja programu
8. Testowanie programu regulatora
9. Wnioski
Literatura
1. Wstęp
Regulator PID jest podstawowym elementem automatyki umożliwiającym budowanie układów regulacji. Może być on zrealizowany sprzętowo jako samodzielny moduł do sterownika. Jednak postęp w budowie programowalnych sterowników przemysłowych przejawiający się coraz mniejszymi czasami instrukcji przyczynia się do tego, że coraz częściej regulatory będą realizowane programowo. W niniejszym artykule podano podstawy do napisania programu realizującego popularny algorytm prędkościowy w regulatorze PID, szeroko omówiony w rozdziale 3
poz.[1] (pod członami równania wpisano adresy rejestrów w których znajdują się wyniki):
|

|
(1) |
Powyższe równanie jest równaniem dwóch zmiennych: wejściowej
ei oraz wyjściowej mi.
Do sterownika wchodzi jedna wielkość wejściowa ei, która jest różnicą
ei = y0 - yi pomiędzy wartością zadaną
y0 a zmienną mierzoną yi. Wartość zadana wprowadzana jest z zadajnika, którym może być potencjometr podłączony do wejścia analogowego lub wybierak motylkowy. Natomiast zmienną mierzoną jest sygnał wyjściowy z czujnika konkretnej zmiennej procesowej np. przetwornika ciśnienia, sygnał przemieszczenia kątowego z tarczy kodowej itp. Ten fragment programu realizowany jest poprzez zwykłe odejmowanie. Powstaje tu jednak problem dokładności i ujemnego wyniku odejmowania.
2. Dokładność przetwarzania a rozdzielczość
Dokładność przetwarzania uzależniona jest od tego jak dokładną chcemy mieć
regulację. Jeżeli np. zadajemy prędkość 0 10 [m/s] z zadajnika motylkowego i wybierzemy zadajnik trójsekcyjny, wtedy najmniejsza ustawialna wartość prędkości wynosi
0 1 [m/s]. Załóżmy, że chcemy aby dokładność regulacji wynosiła 1%, wtedy należy określić rozdzielczość dla 1% tej najmniejszej wartości czyli w tym przypadku będzie to 0,001[m/s]. Dzieląc prędkość maksymalną przez powyższą wartość otrzymujemy rozdzielczość
10-4. Aby uzyskać taką rozdzielczość potrzebny jest przetwornik co najmniej 14 bitowy czyli o 16384 poziomach kwantowania. Co najmniej taką rozdzielczość powinien mieć moduł przetwornika analogowego jak również czujnika mierzącego sygnał wyjściowy z obiektu. Jak łatwo zauważyć w powyższym przykładzie dla dokładności 0,1% wymagana rozdzielczość powinna wynosić
10-5 tzn. powyżej 16 bitów. Założona dokładność a stąd rozdzielczość określa również format liczb (typ instrukcji) do wykonywanych obliczeń w regulatorze.
3. Problem znaku podczas operacji odejmowania
Główne odejmowanie w regulatorze dotyczy obliczenia wartości uchybu regulacji
ei = y0 - yi. Od jego dokładności zależy w dużej mierze jakość regulacji.
Z procesem odejmowania związany jest problem występowania znaku. Prześledźmy ten problem w sterownikach firmy OMRON. Jeżeli wynik odejmowania jest ujemny to przy działaniach na liczbach w kodzie BCD po pierwszym odejmowaniu mamy wynik w postaci uzupełnienia dziesiątkowego i należy wykonać jeszcze jedno odejmowanie od zer aby otrzymać postać dziesiątkową. Oczywiście to działanie jest potrzebne tylko wtedy, gdy wynik odejmowania jest wykorzystywany przez urządzenia zewnętrzne jak nastawniki, wyświetlacze, panele operatorskie itp. Natomiast jeżeli jest wykorzystywany do dalszych obliczeń to postać uzupełnienia dziesiątkowego (jak również dwójkowego) jest wygodnym formatem do wykonywania instrukcji matematycznych. Ilustruje to przykład na rysunku 1.
Podobnie jest przy odejmowaniu liczb binarnych, które są zapisywane w postaci heksadecymalnej, wynik po pierwszym odejmowaniu jest w postaci uzupełnienia do dwóch i chcąc otrzymać postać binarną należy tu zastosować przejście z formatu uzupełnienia do dwóch przy użyciu instrukcji negacji NEG. Można również skorzystać z instrukcji COM do przekształcenia na postać uzupełnienia, ale należy pamiętać, że do wyniku trzeba dodać jeszcze 1.
|

|

Załączenie
warunku co 0,1 sek. - są to kolejne chwile czasowe i
- umożliwia wprowadzenie wartości zadanej y0
z kanału IR110 do komórki pamięci DM6.
Natomiast z kanału IR112 otrzymujemy sygnał od sprzężenia
zwrotnego yi który jest wprowadzany
do kanału DM8.
Obie wielkości przechowywane w komórkach pamięci jak
również całe późniejsze obliczenia w postaci kodu
BCD.
Wynik odejmowania y0 i yi
zostaje umieszczony w komórce pamięci DM12.
Jeżeli wynik odejmowania jest ujemny ei <
0, wtedy jest on w postaci uzupełnienia dziesiątkowego
a znacznik przeniesienia 255.04 jest ustawiany na 1 i
realizowane jest drugie odejmowanie aby przywrócić mu
postać normalną. |
|
Rys.1.
Odejmowanie liczb w kodzie BCD |
|
|
|
4. Mnożenie w przypadku współczynników mniejszych od jedności
Obliczenia w sterownikach realizowane są na liczbach całkowitych lub jeżeli wymagana jest duża dokładność i istnieją instrukcje do konwersji także na liczbach zmiennoprzecinkowych. W praktyce współczynniki przyjmują jednak wartości mniejsze od jedności i wtedy należy równanie pomnożyć obustronnie tak, aby wszystkie współczynniki były całkowite. Na końcu należy sygnał wyjściowy podzielić przez wartość liczby przez którą mnożyliśmy obustronnie.
Załóżmy, że w równaniu (1) mamy następujące wartości współczynników
a0=0.5, a1=0.01, a2=20, b1=1. Porównując wartości współczynników w powyższym równaniu określamy jaka jest ich największa dokładność. Jak widać wymagana dokładność współczynników jest tu do dwóch miejsc po przecinku, stąd też równanie należy obustronnie pomnożyć przez 100. Wtedy przyjmie ono postać:
|
100
mi = 50 ei + ei
-1 + 2000 ei -2 - 100 mi
-1
|
(2) |
Rysunek 2 ilustruje jak zrealizować mnożenie, gdy dla uproszczenia w równaniu (2) uwzględniono tylko pierwszy człon sumy.
|

|
Załączenie
warunku co 0,1 sek. - są to kolejne chwile czasowe i
- umożliwia wprowadzenie wartości z kanału IR100 do
komórki pamięci DM26.
Wprowadzenie wartości współczynnika, tutaj jest to
wartość 50; aby można było łatwo go dostrajać
wygodnie jest wykorzystać do tego celu często
stosowany wewnętrzny potencjometr, na którym ustawiamy
wartość 50.
Wynik mnożenia
a0 (DM20) i ei (DM26)
zostaje umieszczony w komórce pamięci DM12.
Wynik mnożenia w tym przykładzie jest zawyżony o 100
razy, czyli o dwa miejsca, gdyż dane w rejestrach są
zapisywane w kodzie BCD, dlatego aby uzyskać poprawny
wynik końcowy należy go dwukrotnie w rejestrze przesunąć
w prawo przy użyciu instrukcji SRD - przesuwającej o
jedno miejsce; poprawny wynik znajduje się w komórce
pamięci DM10.
|
|

|
|
|
|
5. Całkowanie
Całkowanie dyskretne, omówione tu ze względów poglądowych, polega na dodawaniu do siebie wartości zmiennej
ei w określonym przedziale czasowym, w którym mamy do czynienie z
n próbkami. Zakładając, że okres próbkowania wynosi T,
a wartość próbki ei po jej pobraniu przez ten okres się nie zmienia, wykres sygnału po dyskretyzacji przyjmuje postać prostokątów, a całkowanie przebiega wtedy zgodnie z tzw. regułą prostokątów.
Program do całkowania polega na dodawaniu kolejnych próbek w jednym sumatorze według następującego algorytmu
si = si-1 + ei . Program można wykorzystać do obliczania całkowego wskaźnika jakości, w oparciu o jego wartość można optymalizować nastawy regulatora. Dotyczy to układów, w których nie mamy do czynienia z uchybem ustalonym, gdyż wtedy wartość tej całki dąży do nieskończoności - tutaj dochodzi do przepełnienia komórki pamięci DM20 (rys.3).
|

|
Załączenie
warunku co 0,1 sek. - są to kolejne chwile czasowe i
- umożliwia wprowadzenie wartości z kanału IR100 do
komórki pamięci DM26 w czasie jednego cyklu.
DM20 = DM20 + ei (DM26)
Po przekroczeniu wartości maksymalnej rejestru tj. 9999
pokazuje się przeniesienie 255.04 (CARRY) przy stanie
0000 przez okres jednego cyklu, można je wykorzystać
do zliczenia kolejnych wartości lub wcześniej określić
granice do której jest dopuszczalne całkowanie, co
oczywiście wymaga dodatkowego oprogramowania. |
|
Rys.3. Obliczanie całki zmiennej
ei |
|
Należy tu podkreślić, że całkowanie jak również różniczkowanie zależy od okresu próbkowania, dlatego okres ten w danym układzie sterowania musi być stały. Jego stałość realizuje się przez zastosowanie jednej z metod synchronizacji czasowej, które są omówione w rozdziale 3.5 poz.
[1]. Tutaj zastosowano najprostszą metodę synchronizacji polegającą na zastosowaniu zegara wewnętrznego o okresie 0,1 sekundy; jest to po prostu okres próbkowania T. Musi tu jednak być spełniony warunek, aby ten okres był większy od maksymalnego czasu odpowiedzi sterownika.
Jeżeli nie zostałby zastosowany impuls zegarowy lub nie spełniony powyższy warunek to całkowanie zmieniałoby się wraz ze zmianami czasu cyklu sterownika. Polegałoby to na tym, że dla tej samej wartości stałej poddanej całkowaniu prosta miałaby różne nachylenia czyli stała całkowania ulegałaby zmianie.
6. Różniczkowanie
Proces różniczkowania wymaga wiedzy w sterowniku o wartości zmiennej we wcześniejszych chwilach czasowych. Jest to realizowane przez odpowiednią kolejność wpisywania zmiennej do rejestrów w programie, mianowicie wcześniejsze chwile czasowe muszą poprzedzać późniejsze. Stad też właściwy program dla algorytmu regulatora składa się z części generującej poprzednie chwile czasowe
(rys.4) oraz z części zasadniczej programu, wynikającej z algorytmu czyli rozważanego tu równania
(rys.5). Dla uproszczenia założono, że w równaniu (2) wszystkie współczynniki są równe jedności. Rozważane równanie przyjmie wtedy postać:
|

|
(3) |
|

|
Załączenie
warunku co 0,1 sek. - są to kolejne chwile czasowe i
- umożliwia wprowadzenie wartości komórki pamięci DM10, gdzie znajduje się wyliczona wartość wyjścia z
regulatora mi, do komórki pamięci DM18. Będzie to miało miejsce dopiero w drugim cyklu
sterownika.
Podobnie będzie z kolejnymi wartościami sygnału ei
, które będą wpisane najpierw do komórki pamięci DM14 w drugim cyklu, a następnie w trzecim cyklu zostaną
przeniesione do komórki pamięci DM16. W efekcie końcowym
w komórkach DM14 i DM16 będą znajdować się wartości
sygnału ei z poprzednich chwil
czasowych.
Załączenie warunku co 0,1 sek. umożliwia
wyprowadzenie wartości z kanału IR100 do komórki
pamięci DM12. |
|
Rys.4. Generacja poprzednich
chwil czasowych |
|
Należy tu podkreślić, że instrukcje dodawania i odejmowania korzystają ze znacznika przeniesienia (w dodawaniu jest to przepełnienie,
a w odejmowaniu wynik ujemny). Dlatego przed każdą z powyższych operacji należy wykasować przeniesienie instrukcją
CLC, aby po powyższych instrukcjach dodawania czy też odejmowania przeniesienie dawało poprawną informację.
7.
Pełna wersja programu
Po omówieniu istotnych elementów składowych algorytmu regulatora, poniżej zostanie omówiona pełna wersja programu wg przytoczonego na wstępie równania oraz wcześniej narzuconych adresów komórek pamięci (rejestrów). Ponadto przypomnijmy symboliczne oznaczenia stosowane w asemblerach, takie jak:
| a) |
R := X lub
X
R oznacza przesunięcie zawartości rejestru X do rejestru
R co w sterowniku np. firmy OMRON zapisujemy jako MOV X R, |
| b) |
Jeżeli
X jest argumentem bezpośrednim (stałą) to zapisujemy go z symbolem #,
np. MOV #100 R, tzn. do rejestru R przesuwana jest liczba 100 (zapis w odwrotnej kolejności nie
ma sensu !), |
| c) |
*R := X lub X
*R oznacza przesunięcie zawartości rejestru X do rejestru,
którego adres znajduje się w R, co w sterowniku zapisujemy jako MOV X *R lub MOV X [R]; jest to tzw. adresowanie pośrednie, |
| d) |
R :=
operacja (Y,X) lub operacja (Y,X)
R oznacza wybraną operację arytmetyczną lub logiczną wykonaną na rejestrach
(Y,X) np. R := Y + X co w sterowniku zapisujemy jako ADD Y X
R, często Y=R tzn. że zawartość rejestru X dodawana jest do dotychczasowej zawartości rejestru
R. |
|
|
|

|
Załączenie
warunku co 0,1 sek. - są to kolejne chwile czasowe i
- powoduje dodanie dwóch składników sumy z równania
regulatora i wpisanie wyniku do komórki pamięci DM10
czyli mi = ei + ei
-1
Następnie dodany jest trzeci składnik sumy a wynik
zostaje ponownie wpisany do komórki DM10 czyli w tym
miejscu mi = ei + ei
-1 + ei -2
Na końcu
odejmowany jest ostatni składnik sumy i wpisany do komórki
DM10 czyli
mi = ei + ei
-1 + ei -2 - mi -1
Fragment oprogramowania w sytuacji, gdy wynik
odejmowania jest
ujemny.
|
|
Rys.5. Część zasadnicza programu regulatora |
|
*) w sterownikach firmy OMRON instrukcje matematyczne oprócz dzielenia należy poprzedzić skasowaniem przeniesienia
(CLC), należy również pamiętać o fragmencie programu dla uchybu mniejszego od zera w ostatnim odejmowaniu oraz ocenić wymaganą dokładność aby ewentualnie wybrać instrukcje pracujące na podwójnym słowie lub korzystające z zapisu zmiennoprzecinkowego. |
Program powyższy nie zabezpiecza przed innymi zjawiskami, które zostały omówione w rozdziale 3
poz.[1] jak np. zjawisko wchodzenia regulatora w nasycenie itp.
|
8. Testowanie programu regulatora
Sprawdzenie napisanego programu od razu w połączeniu z obiektem, czasami jest niemożliwe a nawet niebezpieczne. Dlatego należy go wcześniej przetestować. Do tego celu można wykorzystać:
| a) |
specjalistyczne oprogramowanie nakładkowe umożliwiające symulacje np. oprogramowanie do sterowników SIMATIC S7 ma taki moduł programowy, |
| b) |
potencjometry z sygnałem cyfrowym w które wyposażone jest większość sterowników, |
| c) |
własne oprogramowanie polegające na podaniu znanego ciągu liczb i obserwacji zachowania się wyjścia. |
W celach poglądowych ponownie załóżmy, że nasze równanie ma wszystkie współczynniki równe jedności, czyli będzie miało postać:
mi = ei + ei-1 +
ei-2 - mi-1. Następnie załóżmy, że wprowadzamy następujący ciąg wartości
ei = (1, 2, 3, 2, 1, 0, 0, 0). Sporządzamy tabelę i wyliczamy wg powyższego wzoru wartości wyjścia
mi.

|

|
Po przyciśnięciu
przycisku START rozpoczyna się wczytywanie i
wyprowadzanie danych, aż do czasu osiągnięcia
ostatniej wartości określanej przy użyciu znacznika
225.06 za instrukcją porównania CMP.
W sterownikach firmy OMRON można zastosować również
jedną instrukcję KEEP(11) zamiast dwóch SET i RSET.
Następnie
zgodnie z narzuconym czasem próbkowania (tu co 0,1
sek.) do słowa pamięci DM101 wpisywany jest adres komórki
do której wcześniej wpisaliśmy pierwszą wartość
wejściową a do słowa pamięci DM102 adres komórki do
której będzie wpisany wynik przeliczeń z regulatora.
W kolejnych
cyklach wpisane są na wejście regulatora DM12 wartości
z komórek pamięci od DM30 do DM39.
Tu dochodzi do wywołania całego podprogramu regulatora
lub można go tu wpisać bezpośrednio.
W kolejnych cyklach wyliczane są kolejne wartości wyjścia
regulatora DM14 i wpisywane do komórek pamięci od DM40
do DM49.
Zwiększanie
zawartości DM101 i DM102 w każdym kolejnym cyklu o
jeden.
Np. stany DM101:
0030
w 1 cyklu
0031
w 2 cyklu
.
. .
0039
w cyklu 10
0030
w cyklu 11
W 11 cyklu instrukcja CMP załączy warunek zrównania
się z wartością zadaną #39 i dojdzie do ponownego
wpisania do DM101 wartości #30.
|
|
Rys.6. Algorytm umożliwiający wprowadzanie i wyprowadzanie danych |
|
Ustawiając czas próbkowania na 1 sekundę (aby można zauważyć wartości stanów wyjścia), sprawdzamy czy taki sam ciąg wartości wyjścia otrzymujemy po przeliczeniach zrealizowanych przez napisany przez nas program.
Można to również zrealizować pisząc odpowiedni program w sterowniku. Załóżmy, że dane wejściowe
ei w zachowanej kolejności wpiszemy z konsoli lub z komputera do komórek pamięci DM30
DM39,
a dane wyjściowe mi chcemy obserwować w komórkach DM40
DM49. Program do wprowadzania i wyprowadzania danych przedstawiono na rysunku
6.
Testowanie regulatora w stanach dynamicznych należy przeprowadzić w połączeniu z obiektem co sprowadza się do doboru nastaw (współczynników) w powyższym algorytmie.
9. Wnioski
Przedstawiona tu metoda projektowania regulatora jest jedną z możliwych i często uzależniona jest ona od instrukcji, które są stosowane w danym sterowniku. W skrajnym przypadku są to gotowe instrukcje regulatora PID i wtedy całe programowanie sprowadza się do napisania instrukcji i jej dosyć rozbudowanej parametryzacji. Jednak przedstawiona tu metoda przydatna jest do zapisywania w sterowniku dyskretnych modeli obiektu sterowania.
Przytoczony tu materiał jest fragmentem książki napisanej przez autora niniejszego artykułu
[1]. Przeznaczona jest ona dla szerokiego kręgu odbiorców, począwszy od techników, studentów wydziałów nie informatycznych, a skończywszy na inżynierach automatykach. Ciekawszymi zagadnieniami omawianymi w książce są: optymalizacja oprogramowania w sterownikach, bezpośrednie łączenie sterowników oraz w sieci, instalacja oraz liczne przykłady oprogramowania.
Literatura
| [1] |
Janusz Kwaśniewski.: Programowalne sterowniki przemysłowe w systemach sterowania Wyd. włas. Kraków 1999. |
| [2] |
Janusz Kwaśniewski.:
Programmable Logic Controllers Wyd. AGH Kraków 2002
|
|