Języki programowania: norma IEC 61131-3

Norma IEC61131-3 była za oceanem przez długi czas lekceważona i traktowana jako wyłącznie europejski fenomen. Jednak od niedawna zyskuje na znaczeniu w Stanach Zjednoczonych jako standard programowania sterowników. Wielu tamtejszych automatyków zna jeden lub niektóre z definiowanych przez nią języków, lecz rzadko kiedy wszystkie. To utrudnia im właściwy dobór charakterystyki języka i sposobu programowania dla automatyzowanej aplikacji. 
Dzięki Międzynarodowej Komisji Elektrotechnicznej (ang. International Electrotechnical Commission – IEC) pojawiło się pięć standardowych języków programowania sterowników zarówno dla procesów ciągłych, jak dyskretnych:

  • język drabinkowy (ang. Ladder Diagram – LD),
  • diagram bloków funkcyjnych (ang. Function Block Diagram – FBD),
  • język sekwencji działań (ang. Sequential Function Chart – SFC),
  • lista instrukcji (ang. Instruction List – IL),
  • język tekstu strukturalnego (ang. Structured Text – ST).
    Chciałbym pokazać ich wady i zalety.

Wybór właściwego języka
Mając do dyspozycji kilka różnych języków programowania, przed wyborem konkretnego z nich należałoby odpowiedzieć sobie na kilka kluczowych pytań. Oczywiście naszą naturalną tendencją jest pozostawanie przy tym, który znamy. Jednak zawsze warto wziąć pod uwagę umieszczoną poniżej listę cech całej piątki:

  • łatwość nadzoru przez użytkownika końcowego: SFC,
  • powszechność i akceptacja języka: LD,
  • znajomość i akceptacja w Europie: IL lub ST,
  • prędkość wykonywania przez PLC: IL lub ST,
  • aplikacje wykorzystujące głównie cyfrowe We/Wy oraz prosta regulacja ciągła: LD lub FBD,
  • łatwość dokonywania zmian w kodzie: LD,
  • łatwość i umiejętność obsługi przez młodych inżynierów: ST,
  • łatwość w implementacji skomplikowanych operacji matematycznych: ST,
  • aplikacje, które cechują powtarzające się operacje lub procesy wymagające łączenia i jednoczesności operacji: SFC.

Ponieważ nie wszyscy dostawcy sterowników PLC lub PAC dostarczają programy narzędziowe w pełni zgodnez normą IEC61131-3, na wybór języka programowania może również wpłynąć wykorzystywana w projekcie platforma sprzętowa. W rzeczywistości większość pozaeuropejskich dostawców nie oferuje tej funkcjonalności lub posiada bardzo ograniczone spektrum opcji, np. oferując jedynie język drabinkowy i SFC. W przypadku małych sterowników – „mikro” PLC – kwestią kluczową z punktu widzenia różnorodności języków programowania może być również brak wystarczającej ilości pamięci oraz zbyt mała prędkość procesora.
Wielu programistów skazanych jest na pracę z konkretnym sprzętem. Jeśli jednak programista ma wpływ na wybór platformy sprzętowej, powinien dobrać najbardziej odpowiedni dla danej aplikacji język lub grupę języków.
 
Język drabinkowy
Język drabinkowy (LD lub po prostu drabinka) jest prawdopodobnie najpowszechniej stosowanym językiem programowania sterowników. Wynaleziony, aby w układach sterowania sprzętowego zastąpić łączenie przekaźników, jest obecnie wykorzystywany w prawie 95% wszystkich aplikacji przemysłowych. Drabinka jest tak powszechnie przyjętym językiem programowania, że niemal każdy programista, bez względu na kraj i gałąź przemysłu, potrafi zrozumieć i napisać w niej program. Ponieważ swoim formatem przypomina obwody elektryczne, w sytuacji wystąpienia awarii nawet osoba, która nie jest programistą, ale posiada wiedzę z podstaw elektryki, będzie potrafiła dokonać analizy programu.

Bardzo łatwe jest również używanie drabinki do pisania programów. Choćby podstawowa wiedza o sygnałach wejściowych i wyjściowych pozwala na „masową” produkcję kodu. Większość pozostałych języków normy IEC wymaga już staranniejszego przygotowania, które uwzględnia m.in. umiejętność przygotowania diagramów opisujących wszystkie możliwe przepływy w procesie. Większość implementacji drabinki pozwala na podział i umieszczenie kodu programu w różnych katalogach i podprogramach.
Język drabinkowy idealnie nadaje się do obsługi prostych procesów transportu i przeładunku materiałów. Na przykład tam, gdzie jeden z sensorów wykrywa obecność paczki, zaś inny wykrywa potencjalne przeszkody. Na tej podstawie wyjście uaktywnia urządzenie wykonawcze, które spycha paczkę na odpowiedni taśmociąg. Cyfrowe wejścia odwzorowują stan układu, którego analiza w programie decyduje o odpowiednim wysterowaniu wyjść. Pisany w drabince program zazwyczaj zawiera zegary, liczniki, bloki porównań czy podstawowych operacji matematycznych, ale nie implementuje się w nim żadnych bardziej skomplikowanych funkcji.
Stopień skomplikowania dostępnych w sterownikach PLC funkcji ciągle rośnie. Dlatego przed drabinką stoją wyzwania: z jednej strony potrzeba większego zaawansowania wykorzystywanych funkcji, z drugiej zapewnienia prostoty wizualizacji, przejrzystości i zrozumienia kodu. Funkcje, takie jak: regulatory PID, funkcje trygonometryczne czy obróbki danych, które są wymagane w wielu układach sterowania, mogą być trudne w implementacji.

Kolejny problem związany jest z analizą kodu. Wraz z rozbudową programu śledzenie kodu staje się bardzo utrudnione. Wymaga bardzo dobrej i obszernej dokumentacji. I w końcu, implementacja całości programu dużego procesu z użyciem drabinki może być zwyczajnie zniechęcająca. Wystarczy wyobrazić sobie szczebelek drabinki z wyjściem wykorzystywanym w różnych fazach procesu, którego stan zależy od bardzo wielu wejść.

Diagram bloków funkcyjnych 
Choć język drabinkowy jest najpowszechniej stosowanym językiem programowania sterowników, z przeprowadzonych przez Control Engineering kilka miesięcy temu badań wynika, że rośnie użycie pozostałych języków, w tym np. diagramu bloków funkcyjnych. I choć przyrost użytkowników tego języka uległ ostatnio zmniejszeniu w porównaniu do pozostałych języków (na przykład ST), to FBD jest prawdopodobnie drugim najczęściej używanym językiem programowania sterowników PLC.
Pod wieloma względami ten graficzny język programowania przypomina schemat instalacji elektrycznej nawet bardziej niż drabinka. W FBD bloki są łączone „przewodami”, co tworzy łatwy w śledzeniu układ. Język ten dostarcza tych samych co drabinka instrukcji. Jednak wizualnie jest dużo bardziej czytelny dla użytkownika nieobeznanego z logiką przekaźnikową. Główną zaletą programów napisanych w FBD jest łatwość ich analizy – wystarczy podążać wzdłuż ścieżki połączeń.
FBD jest idealny dla prostych programów zawierających dyskretne wejścia, jak np. czujniki fotoelektryczne i wyjścia, jak chociażby zawory rozdzielające. Może również z powodzeniem zastąpić każdy program napisany w drabince. Jednakże FBD nie jest idealny dla dużych programów, które wykorzystują specjalne We/Wy i funkcje. Duża ilość miejsca zajmowanego na ekranie komputera może sprawić, że gdy program osiągnie znaczne rozmiary, jego analiza może stać się nieporęczna i niewygodna. Program pisany w FBD wymaga wcześniejszego przygotowania jego całościowej konstrukcji, ponieważ późniejsze wprowadzanie poprawek może być znacznie utrudnione. 

Język sekwencji działań (SFC) 
Język sekwencji działań (SFC) przypomina schematy algorytmów programów, które wielu inżynierów pamięta z czasów studiów. Po kroku początkowym (punkcie startowym algorytmu programu) następują serie tranzycji i dodatkowych kroków. Koncepcja języka SFC jest prosta: krok z kodem napisanym w dowolnym języku jest aktywny tak długo, dopóki warunek logiczny tranzycji do kroku następnego nie będzie prawdziwy. Wówczas aktualny krok jest dezaktywowany, a program wykonuje operacje kroku następnego w kolejności. Tranzycje, opisujące warunki przejścia pomiędzy danymi krokami, podobnie jak kod poszczególnych stanów, mogą zostać zaimplementowane w dowolnym języku programowania. SFC jest językiem bardzo przyjaznym dla technologów oraz inżynierów utrzymania ruchu, ponieważ jego wygląd i naturalny sposób zapisu czyni go prostym w rozwiązywaniu problemów.
Minusem tego sposobu programowania jest narzucanie – czasami niepotrzebnie skomplikowanej – struktury programu. Wymaga również gruntownego przemyślenia i przygotowania algorytmu przed przystąpieniem do implementacji. W przeciwnym razie schemat programu może stać się zagmatwany i nieczytelny, a przez to trudny do analizy. Konstrukcja programu SFC powoduje również, że jest wykonywany wolniej, niż programy pisane w innych językach.
Ostatnią krytyczną cechą SFC jest jego nieprzetłumaczalność na inne języki programowania. Programy napisane w IL, FBD, ST czy drabince mogą być w prosty sposób między sobą tłumaczone, pozwalając na wyświetlanie programiście kawałków kodu w sposób przez niego preferowany. W przypadku SFC jest to niemożliwe.

Lista instrukcji
Program napisany w liście instrukcji (IL) składa się z wielu linii kodu, z których każda reprezentuje dokładnie jedną operację. Taki format kodu powoduje, że wprowadzanie szeregu prostych funkcji matematycznych jest bardzo łatwe.
IL jest językiem niskiego poziomu i jako taki jest wykonywany znacznie szybciej niż języki graficzne, takie jak drabinka. Program wykonywalny IL jest również bardziej kompaktowy, zajmuje mniej miejsca w pamięci sterownika PLC. Uproszczone metody wprowadzania tekstu – możliwe przy programowaniu w tym języku – pozwalają na bardzo szybkie wprowadzanie kodu (żadnych kliknięć myszką i tabulatorów). W systemach monitorowania przebiegu programy napisane w IL są łatwiejsze do wyświetlenia i edycji na ekranach podręcznych jednostek programujących. Bez konieczności użycia dodatkowego oprogramowania czy laptopów.
Pomimo wielu zalet tego języka wydaje się, że inżynierowie utrzymania ruchu i serwisanci wolą inne metody programowania. Może to być spowodowane faktem, że IL jest mniej graficzny, niż np. drabinka. Co za tym idzie, trudniejszy w bieżącej analizie działania i diagnozowania błędów.
IL może uczynić implementowanie skomplikowanych funkcji, takich jak regulatorów PID czy skomplikowanych operacji matematycznych, drogą przez mękę. IL nie najlepiej nadaje się do form programowania strukturalnego, co ogranicza jego przydatność w implementacji dużych programów. Dyskusyjną jest również zaleta prędkości wykonywania i kompaktowości skompilowanego kodu programu. Mają one mniejsze znaczenie w sytuacji stałego wzrostu prędkości procesorów w nowoczesnych jednostkach centralnych sterowników PLC oraz wzrostu dostępnej w nich ilości pamięci.

*****
Zdaniem zwolennika SFC
Dla Control Engineering Polska mówi Bogdan Broel-Plater z Instytutu Automatyki Przemysłowej
Zachodniopomorskiego Instytutu Technologicznego.
Sterownik programowalny oraz języki jego programowania są dla automatyka jedynie środkiem do realizacji pewnego celu, jakim jest zaprojektowanie, uruchomienie i prawidłowa eksploatacja układu sterowania pewnym procesem technologicznym. Układ taki musi być bezpieczny i skuteczny. Byłoby przy tym dobrze, aby był „przyjazny” dla personelu obsługującego sterowany proces. Musimy pamiętać także, że jeśli układ sterowania będzie eksploatowany dostatecznie długo, to konieczne będzie dokonanie w nim zmian (czasami tylko w algorytmie sterowania). Jest wysoce prawdopodobne, że nie będzie tego robiła ta sama osoba, która projektowała układ. Dlatego też ważne jest, aby algorytm sterowania wykorzystywany przez układ sterowania był czytelny i łatwo modyfikowalny. Spójrzmy zatem na języki programowania sterowników PLC z punktu widzenia ich przydatności do realizacji celu prac automatyka… 
Język schematu drabinkowego (LD) jest rzeczywiście prosty i czytelny, zwłaszcza dla elektryków, a przy tym stosunkowo łatwo „rysuje” się w nim program aplikacji. Program ten jest jednak tylko realizacją algorytmu sterowania. Czytelność i łatwość modyfikacji takiego algorytmu, w przypadku programu liczącego kilkaset lub nawet tylko kilkadziesiąt linii („szczebli”, segmentów), może być jednak niezbyt wielka, jeśli osoba projektująca algorytm robiła to w sposób niesystematyczny, czyli na tzw. „wyczucie”. Będzie tak nawet wówczas, gdy podczas tworzenia algorytmu zastosowano tzw. adresację symboliczną zmiennych. Jeśli zaś – co jest dość częste – program w języku LD trzeba będzie modyfikować po uprzednim odczytaniu go z pamięci sterownika, może okazać się, że wszystkie zmienne dostępne są wyłącznie poprzez swoje adresy fizyczne. Wówczas zadanie będzie jeszcze trudniejsze. A co wtedy, gdy program liczyć będzie kilka tysięcy linii?
Powyższe uwagi odnoszą się także do drugiego języka tzw. poziomu podstawowego, czyli języka listy instrukcji (IL). Język tekstu strukturalnego (ST) – jak również Pascal czy też C – jest bardzo chętnie stosowany przez studentów (i młodych inżynierów). Pozwala im bowiem wykorzystać wiedzę z informatyki. Program aplikacji pisze się w języku ST bardzo łatwo. Jednak słowo „pisze” trzeba w tym wypadku traktować dosłownie. Projektowanie złożonego algorytmu sterowania zapisanego w całości za pomocą języka ST jest bowiem moi zdaniem trudne, a jego czytelność niewielka. Język ten jest jednak doskonały do zapisywania tych fragmentów algorytmu sterowania, w których trzeba wykonać obliczenia matematyczne. 
Myślę, że czytelnik tych słów zorientował się już, że jestem gorącym zwolennikiem języka sekwencji działań (SFC). Uważam bowiem, że najważniejszą i prawdziwie twórczą częścią pracy automatyka jest projektowanie układu sterowania. Zwłaszcza wykorzystywanego w nim algorytmu sterowania. Algorytmu, który można nazwać dobrym, gdy dzięki niemu powstanie układ sterowania spełniający wszystkie – wymienione na wstępie tych uwag – warunki. Moim zaś zdaniem, język SFC jest najlepszy do projektowania dobrego algorytmu sterowania. Zapisując taki algorytm w postaci wielu grafów skoordynowanych ze sobą poprzez kroki oraz wykorzystując tzw. zagnieżdżania zapisane w języku ST, łatwo jest tworzyć nawet bardzo złożone algorytmy sterowania wykorzystujące obliczenia numeryczne.
Innym problemem, o znacznie jednak mniejszym znaczeniu, jest wybór języka przy pomocy którego algorytm zapisany w języku SFC zostanie przekształcony w program aplikacji implementowany w pamięci sterownika PLC. Dobrze, jeśli sterownik, który wykorzystamy w projektowanym układzie sterowania, można programować w języku SFC. W przeciwnym wypadku algorytm zapisany w języku SFC bardzo łatwo przekształcić w program zapisany w innym języku, który jest dostępny w tym sterowniku. Jeśli zaś zrobimy to w odpowiedni sposób, to powstanie program aplikacji zachowujący wszystkie warunki dobrego algorytmu. W tym także czytelność i łatwość modyfikacji. Do głenszych studiów tematu polecam między innymi moją książkę pod tytułem: „Układy wykorzystujące sterowniki PLC. Projektowanie algorytmów sterowania” (PWN, 2008).
*****

Język tekstu strukturalnego
Z jego instrukcjami – IF…THEN, CASE – oraz liniami kodu, kończącymi się średnikami, język tekstu strukturalnego (ST) bardzo przypomina języki wysokiego poziomu, takie jak Pascal czy C. Wspomniane już wyżej badania przeprowadzone przez Control Engineering wskazują, że spośród wszystkich zdefiniowanych w normie IEC61131 języków programowania ST zanotował największy przyrost implementacji.
Pośród języków normy IEC, ST prawdopodobnie najlepiej spełnia wymagania pojawiające się wraz ze wzrostem skomplikowania aplikacji PLC. Na przykład przy regulacji ciągłej w przemyśle tworzyw sztucznych czy chemicznym. Trygonometria, skomplikowane obliczenia matematyczne i obróbka danych mogą zostać zaimplementowane o wiele łatwiej niż w drabince czy liście instrukcji. Pętle decyzyjne i wskaźniki (zmienne używane do adresowania pośredniego) pozwalają na bardzo kompaktowe implementacje. Dużo bardziej niż ma to miejsce w przypadku drabinki. Bardzo elastyczny i wygodny edytor programu ST, wspólny dla większości pakietów oprogramowania, pozwala na wygodne komentowanie kodu programu, wprowadzanie wcięć i odstępów między liniami. To z kolei pozwala na wyróżnianie powiązanych ze sobą fragmentów programu. Wszystko to ułatwia implementację skomplikowanych programów.
Tekstowy język ST nie ma natury graficznej, co czyni go podobnym do listy instrukcji. Podobnie jak IL wykonywany jest dużo szybciej niż kod drabinki. Dodatkową zaletą ST jest również fakt, że w większym stopniu niż inne języki normy IEC61131 spełnia warunki związane z przenoszeniem kodu, co uniezależnia programistę od platformy sprzętowej. 

Ostatnią z zalet języka ST jest przystosowanie do współczesnej wiedzy studentów. Wielu z tych, którzy kończą studia techniczne, posiada lepszą znajomość programowania komputerów niż podstaw z zakresu elektryczności. Z kolei wadą tego języka programowania jest jego nieznajomość wśród wielu doświadczonych programistów PLC, inżynierów utrzymania ruchu i serwisantów. Należy również zwrócić uwagę na fakt, że przejrzysta forma pisania kodu programu ST odbywa się przeważnie kosztem kompaktowości kodu.
W rezultacie programiści zazwyczaj wykorzystują ST w „tle” programu. Dla przykładu, IEC 61131 pozwala programiście na zdefiniowanie – w dowolnym języku programowania – swojej własnej funkcji i wielokrotnego jej wykorzystania jako podprogram programu napisanego w innym języku. Mając takie możliwości, programiści często hermetyzują kod ST w instrukcji, która jest następnie wywoływana w programie napisanym w LD.
Ted Thayer
Artykuł pod redakcją Pawła Dworaka, adiunkta w Zakładzie Automatyki Instytutu Automatyki Przemysłowej Zachodniopomorskiego Uniwersytetu Technologicznego