wstecz | dalej  

 Archiwum Process Control Club 2002, poz.18  
 


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ść wynika z zastosowanego modułu analogowego służącego do mierzenia zmiennej procesowej. Większość sterowników ma moduły analogowe o rozdzielczości 1215 bitów oraz bit znaku. Sygnał wyjściowy może być reprezentowany w postaci binarnej (heksadecymalnej) lub w postaci kodu BCD. Przy wyborze należy również zwrócić uwagę na to, czy wejścia do modułu są izolowane. Moduły z nie izolowanymi wejściami możemy stosować tylko w systemach, gdzie występuje wspólny potencjał dla wszystkich kanałów pomiarowych. Moduły analogowe są:

  

  uniwersalne z możliwością podłączenia czujników o sygnale prądowym 020 mA lub 420 mA, napięciowym ±10 V, 010 V lub 15 V i czasami rezystancyjne do podłączenia termorezystorów typu PT 100 (Siemens),

    specjalizowane np. regulator PID, regulatory temperatury.

    Dokładność przetwarzania uzależniona jest od tego jak dokładną chcemy mieć regulację. Jeżeli np. zadajemy prędkość 010 [m/s] z zadajnika motylkowego i wybierzemy zadajnik trójsekcyjny, wtedy najmniejsza ustawialna wartość prędkości wynosi 01 [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


Zgodnie z wyżej podanym zapisem, program regulatora ma następującą postać:
 

DM6 DM26 :=

Wyzerowanie rejestrów, istotne w przypadku nagłego wyłączenia napięcia zasilającego (zastosowanie programu z adresowaniem pośrednim)

DM18 := DM10

Instrukcja generowania mi -1 (MOV)
DM16 := DM14 Instrukcja generowania ei -2 (MOV)
DM14 := DM12 Instrukcja generowania ei -1 (MOV)
Powyższe trzy instrukcje muszą poprzedzać właściwą instrukcję gdzie powstaje uchyb regulacji ei i sygnał wyjściowy mi
 DM6 := IR110 Wprowadzenie wartości zadanej y0 (instrukcja MOV, IN)
 DM8 := IR112 Wprowadzenie wartości z wyjścia obiektu yi, sygnał sprzężenia zwrotnego (instrukcja MOV, IN)
DM12 := DM6 - DM8 Obliczenie wartości uchybu regulacji ei = y0 - yi (SUB) *)
DM12 := DM22DM12 a0 ei tutaj 50ei (MUL) *)
DM14 := DM24DM14 a1 ei-1 tutaj 1ei-1 (MUL) *)
DM10 := DM12 + DM14 mi = a0 ei + a1 ei-1 tutaj 100mi = 50ei + ei-1 (ADD) *)
DM16 := DM26DM16 a2 ei-2 tutaj 2000ei-2 (MUL) *)
DM10 := DM10 + DM16 mi = a0 ei + a1 ei-1 + a2 ei-2
tutaj 100mi = 50ei + ei-1 + 2000ei-2 (ADD) *)
DM18 := DM28DM18 b1 mi-1 tutaj 100mi-1 (MUL) *)
DM10 := DM10 - DM18 mi = a0ei  + a1 ei-1 + a2 ei-2 - b1 mi-1
tutaj 100mi = 50ei + ei-1 + 2000ei-2 - 100mi-1 (SUB)*)
DM10 := DM10 : #100 Podzielenie przez 100, czyli przesunięcie zawartości komórki DM10 w prawo o dwie cyfry (2xSRD)

*) 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