Podstawy programowania funkcji sterowników PLC

Programy dla sterowników PLC nie zachowują się jak programy napisane przy użyciu języków skryptowych, używanych przez większość aplikacji komputerowych. Podstawowa znajomość fundamentalnych zasad organizacji aplikacji sterowania ma zasadnicze znaczenie dla projektowania skutecznego systemu wspierającego sterowanie procesów technologicznych i przemysłowych.
Przed rozpoczęciem tworzenia projektu mającego na celu wsparcie procesów, który będzie mógł skutecznie oddziaływać z innymi aplikacjami sterującymi, projektant musi najpierw zdobyć podstawową wiedzę na temat fundamentalnych zasad organizacji i funkcjonowania aplikacji sterowania.
Programistom komputerowym często znacznie łatwiej jest postrzegać programy drabinkowe (powszechnie stosowane w programowaniu funkcji sterowników PLC) jako listę tzw. równań boolowskich. Poszczególne grupy równań tworzą oddzielnie aplikacje sterowania. Sterownik urządzenia nieustannie skanuje i analizuje każde równanie, w każdej aplikacji.
Jeśli sprawdzane warunki równania są prawdziwe, zaprogramowane instrukcje wyjścia działają tak, aby włączyć lub wyłączyć sygnał wewnętrzny, sygnał wyjściowy lub zmienną danej funkcji. Każda aplikacja zajmuje ułamek każdego skanu programu. Efekt końcowy jest równoznaczny z równoległym przetwarzaniem wszystkich aplikacji przez sterownik maszyny.
Obwodem wykorzystywanym do sterowania ruchem mechanizmu lub obiektu może być układ logiczny, czyli linijka kodu programu, będąca zarazem częścią aplikacji sterowania maszyny, lub też obwód zewnętrzny ? zarówno elektryczny, pneumatyczny, światłowodowy, jak i hydrauliczny, reagujący na sygnał wyjściowy sterownika urządzenia i wykonujący operacje na obiekcie lub mechanizmie.
Obwody zewnętrzne są układami fizycznymi, natomiast obwody logiczne są zaszyte we wnętrzu sterownika maszyny. Określenie ?obwód zewnętrzny? odnosi się do rozmieszczenia urządzeń w świecie rzeczywistym, które reagują na włączony sygnał wyjściowy danego kontrolera. Zewnętrznie sygnały wyjściowe są to punkty połączeń na module wyjściowym danego sterownika. Obwody zewnętrzne wykorzystują przewody od punktów połączeniowych, aby umożliwić obsługę przekaźników, zaworów i przełączników do aktywacji obwodów hydraulicznych, pneumatycznych, optycznych i/lub elektrycznych.
Obwody logiczne są to linijki kodu, zawierające sprawdzane przez program warunki oraz zaprogramowane rezultaty. Elementami tych obwodów są sygnały dyskretne lub zmienne aplikacji.
<—newpage—>Każdy układ logiczny pozwala na uzyskanie jednego lub wielu rezultatów. Rezultatem takim jest zazwyczaj włączony lub wyłączony sygnał albo zmienna wartość przechowywana w rejestrze. Powszechne jest również stosowanie układów logicznych generujących wyniki bezwarunkowo. Wynikiem działania dla niektórych układów logicznych są sygnały wyjściowe, które po załączeniu uaktywniają obwody zewnętrzne. Projektanci często umieszczają sprawdzane warunki w obwodzie logicznym szeregowo, aby uzyskać dla nich operację AND. Zamiast nawiasów programiści używają tzw. gałęzi, z jednym lub większą liczbą elementów równoległych do uzyskania operacji OR.
Poniższe definicje opisują niektóre powszechnie używane określenia z terminologii dotyczącej programowania układów logicznych.

  • Bit: najmniejsza zmienna logiczna kontrolera maszyny, mająca tylko dwie wartości ? jeden (1) albo zero (0).
  • Słowo: multibit (16, 32, 64 itd.) rejestru sterownika maszyny użytego do zapamiętywania zawartości zmiennych w aplikacji.
  • Instrukcja: pojedyncza programowalna operacja, wykorzystywana w celu zbadania, porównania, umożliwienia wyłączania, przeniesienia, ustalenia, resetowania lub sterowania wartością logiczną albo słowem.
  • Instrukcja typu Bit: operacja służąca do sprawdzania, włączania lub wyłączania wartości logicznej.
  • Instrukcja typu Słowo: operacja używana do porównania, przepisywania, ustawiania, resetowania lub sterowania wartością słowa.
  • Instrukcja typu Plik: operacja używana do porównywania, przepisywania, ustawiania, resetowania lub sterowania tablicą danych składającą się z wielu słów.
  • Instrukcje specjalne: unikatowe programowalne operacje, stworzone do obsługi określonej funkcji aplikacji. 

Rysunek 1 przedstawia niektóre symbole instrukcji i związane z nimi nazwy bitów, słów, plików oraz instrukcji specjalnych. Instrukcje te są kompatybilne z większością zmiennych danej aplikacji. Instrukcje bitowe reprezentują wykonywalne lub modyfikowalne dyskretne sygnały, które oznaczają stan zmiennej wewnętrznej, wyjściowej oraz wejściowej.
Sygnał wewnętrzny jest zmienną wyzwalaną przez jeden obwód logiczny, a wykonywaną przez inne obwody. Sygnał wejściowy zazwyczaj reprezentuje aktywny lub nieaktywny stan czujnika, przycisku, przełącznika lub urządzenia. Sygnał wyjściowy z reguły reprezentuje aktywowany lub dezaktywowany stan lampki sygnalizacyjnej, przekaźnika zewnętrznego lub zaworu elektromagnetycznego. Instrukcje takie jak One-shot, zegar Time-on lub zegar podtrzymywany (retentive timer) to przykłady specjalnych instrukcji programowania.
Instrukcja One-shot umożliwia programistom opracowanie układów wyzwalających. Instrukcja Time-on umożliwia aplikacjom sterującym zliczanie czasu, gdy spełnione są warunki poszczególnych linii. W przeciwieństwie do zegara typu Time-on, podtrzymywany zegar ? retentive timer ? przetrzymuje skumulowaną wartość czasu, gdy instrukcja zostaje wyłączona. Instrukcje typu Słowo są kompatybilne z instrukcjami, które porównują lub sterują instrukcjami multibitowymi.
<—newpage—>Instrukcje wykonywane na plikach umożliwiają sterowanie przyległymi grupami słów. Większość instrukcji sterowników maszyn pozwala aplikacjom na wykonywanie i sterowanie zmiennymi w postaci ośmiobitowych bajtów, czterobitowych półbajtów oraz zmiennych multibitowych. Kiedy warunek początkowy przechodzi w stan ?fałszu?, sterownik maszyny dezaktywuje sygnał przypisany do instrukcji wyjściowej.
Cewka przekaźnika oraz instrukcje zatrzaskiwania/zwalniania cewki ? jeśli są stosowane ? mogą tworzyć pięć typów układów:

  1. konfiguracyjny: obwód logiczny, który sprawdza jeden albo więcej szeregowych lub równoległych warunków, umożliwiających przypisanie do cewki sygnału dyskretnego;
  2. równoległy: układ konfiguracji, który sprawdza w danym szczeblu drabinki sygnał dyskretny przypisany do cewki przekaźnika, równolegle do jednego lub większej liczby innych warunków, zmieniających stan, gdy obwód jest włączony
  3. zatrzaskowy: obwód logiczny, który analizuje różne szeregowe i/lub równoległe warunki przed ustawieniem sygnału;
  4. zwalniający: postać układu logicznego, który analizuje różne szeregowe i/lub równoległe warunki przed kasowaniem sygnału;
  5. czasowy: obwód logiczny, który analizuje różne warunki szeregowe i/lub równoległe przed włączeniem instrukcji zegara ? timera. 

Układy konfiguracyjne i równoległe różnią się w dwóch istotnych kwestiach. W przeciwieństwie do układu równoległego, układ konfiguracyjny nigdy nie zawiera cewki jako pierwszego w linii wykonywanego warunku. Układ równoległy zawsze obejmuje co najmniej jeden z warunków potrzebnych do obejścia warunku z poprzedzającej linijki kodu równolegle. Projektanci aplikacji często odnoszą się do układu konfiguracyjnego jako do obwodu sumowania, ponieważ streszcza on w sobie wszystkie szeregowe i równoległe warunki, niezbędne do umożliwienia przypisania cewce danego sygnału. Projektanci używają układu konfiguracyjnego, kiedy przypuszczają, że jeden z warunków zmieni swój stan i chcą utrzymać sygnał wyjściowy włączony, dopóki któryś z nich jest aktywny.
Dla układów równoległych projektanci po prostu umieszczają w postaci równoległej OR warunki, które mogą zmienić stan, ze stykiem normalnie otwartym, załączanym sygnałem przypisanym do cewki. Programiści również dodają co najmniej jeden inny warunek szeregowy AND, który musi zmienić swój stan sygnału lub wartość zmiennej, podczas gdy sygnał równoległy zostaje dezaktywowany.
Różnorodne układy czasowe potrafią niekiedy zdezorientować programistów. Układy, w których użyte są instrukcje czasowe Time-on, zliczają czas, który upłynął od chwili, gdy wszystkie warunki w danej linijce mają postać prawdziwą (true). Kiedy układ przejdzie w stan fałszywy (false), zliczona wartość czasu automatycznie się resetuje. Niektórzy programiści używają operacji dodawania lub timerów z podtrzymaniem, aby zachować informację o zliczonej ilości czasu. Tego rodzaju układy potrzebują specjalnych instrukcji na słowach, aby zresetować zgromadzoną wartość czasu.
<—newpage—>Projektanci zwykle stosują układy czasowe, by zbudować jeden z dwóch poniższych układów warunkowych:

  1. układ z przetrzymaniem ? układ czasowy, który odlicza czas od osiągnięcia pewnego stanu ustalonego sygnału poprzedzającego, pozwalając kolejnemu układowi na załączenie sygnału;
  2. układ z wyprzedzeniem ? układ czasowy, który odlicza czas od osiągnięcia pewnego stanu ustalonego sygnału, zanim pozwoli on kolejnemu układowi zareagować na nowy stan sygnału.

W programach PLC często stosuje się układy z przetrzymaniem oraz układy wyprzedzające, do zliczania czasu sygnału z danego czujnika na wejściu. Różnicą pomiędzy tymi dwoma układami jest tak naprawdę to, co dzieje się w momencie, gdy odliczony czas przekroczy czas zadany. Układ z przetrzymaniem określa czas, po którym sygnał z czujnika można uznać jako ustabilizowany i gotowy do użycia w dalszych operacjach. Natomiast układ z wyprzedzeniem określa czas, kiedy sygnał z czujnika może być już użyty do zmiany stanu następnego wykrywanego obiektu lub mechanizmu.
Każdy z producentów sterowników maszyn zazwyczaj udostępnia środowisko programistyczne, zawierające różny zestaw instrukcji. Jednakże większość z tych środowisk używa instrukcji bitowych. Niektóre z nich zmuszają też programistów do utworzenia specjalnych instrukcji dodatkowych (AOI), by przeprowadzać operacje na danych lub tworzyć bardziej skomplikowane i zaawansowane algorytmy.
Większość z producentów sterowników dostarcza środowisko programistyczne ze standardowym zbiorem instrukcji, które pozwalają programistom na zwiększenie możliwości prostych zastosowań przekaźnikowych. Programiści używają zazwyczaj instrukcji przekaźnikowych do sterowania ruchami obiektów i mechanizmów.
W programach PLC stosuje się instrukcje bitowe, aby włączyć inne procesy wewnętrzne i zewnętrzne. W przeważającej części używa się również instrukcji na słowach i plikach, do tworzenia aplikacji pomocniczych, które wykonują operacje na danych. Rejestr przesuwny, aplikacje czytników, instrukcje get-next i sterowniki komunikacyjne są przykładami aplikacji pomocniczych.
Chociaż niezawodne zatrzaskowe układy wyzwalania przerzutnika sprawdzają się w większości programów, wciąż może dojść do ponownego załączenia wyzwalacza dla tego samego elementu. Zdarza się tak, gdy ktoś celowo wprawi mechanizm w ruch, by usunąć zatrzask sygnału. W zależności od konkretnego zastosowania ponowne włączenie wyzwalacza może nie być pożądane. Jeśli ponowne załączenie nie powoduje żadnych niepożądanych skutków, obwody te nie wywołają żadnych anomalii w danej aplikacji. Jeśli powtórzenie wyzwalania sygnału może przysporzyć problemów, projektanci często pozostawiają w aplikacji możliwość ręcznego sterowania mechanizmu.<—newpage—>

Rysunek 3 przedstawia niezawodną alternatywę dla układu wyzwalania przerzutnika poprzez zatrzask. Bez opcjonalnej równoległej gałęzi obwód bazowy nie pozwoli na ponowne załączenie wyzwalacza. Warunki wstępne tego obwodu wymuszają, by projekt bazował na sygnale wyzwalacza wykrywania ruchu, aby ponownie włączyć sygnał ruchu ramienia.
Jeśli wskazane jest powtórzenie aktywacji wyzwalacza, programiści zazwyczaj dodają linijkę z warunkiem OR, aby ponownie uzbroić wyzwalacz w alternatywny sposób. Konstrukcja obwodu podstawowego zapewnia warunek, aby wyzwalacz pomocniczy zadziałał tylko raz dla każdej wykrytej części.
Zalety techniczne stosowania układów bazujących na instrukcjach zamiast na bitach i cewkach nie mają nic wspólnego ze zmniejszeniem chaotycznej natury aplikacji sterujących. Niezawodny układ z zatrzaskiem zapewnia pewną dodatkową ochronę przed fałszywym wyzwalaniem, bez korzystania z instrukcji One-shot. Układ logiczny z dodatkowym uzbrojeniem wykonywanego ruchu obiektu gwarantuje najwyższy stopień niezawodności.
Metoda programowania oparta na blokach funkcyjnych dostarcza programistom alternatywnego sposobu zaprogramowania wyzwalacza z zatrzaskiwaniem. Łatwo można stwierdzić, że dodanie przez producentów sterowników maszyn instrukcji One-shot do zestawu instrukcji bitowych sprawi, że programiści będą mieli okazję wykorzystywać je dowolnie do projektowania również mniej niezawodnych układów z wyzwalaczem. Stosowanie ich w aplikacjach sterujących zwiększa tylko chaotyczną naturę tych aplikacji.
Bezsygnałowe układy z instrukcjami One-shot nie wytwarzają sygnałów wyzwalających, które są sprawdzane przez inne obwody. Układy te zazwyczaj służą do zablokowania lub odblokowania dyskretnego sygnału. Niektóre obwody mają za zadanie tylko zmienić lub przenieść dane, gdy warunki bazowe są poprawne.
Brak sprawdzanego sygnału początkowego utrudnia projektantom, służbom technicznym lub integratorom układów automatyki odnalezienie właściwych warunków progowych dla wyzwalania sygnałów lub określonych funkcji.
W większości przypadków układy bezsygnałowe z instrukcjami One-shot zwiększają prawdopodobieństwo, że ktoś w przyszłości stworzy dodatkowe układy wyzwalania, aby obsłużyć swoją własną, kolejną aplikację. Zaniechanie tych warunków i powielanie tego samego schematu działania gwarantuje coraz większy chaos w działaniu danej aplikacji.
Daniel B. Cardinal jest inżynierem systemowym w firmie InSyte Inc.
Tekst pochodzi z nr 3/2016 magazynu "Control Engineering". Jeśli Cię zainteresował, ZAREJESTRUJ SIĘ w naszym serwisie, a uzyskasz dostęp do darmowej prenumeraty w formie drukowanej i/lub elektronicznej.