Dawniej, aby zaprogramować sterownik, korzystając z oprogramowania dostarczanego zwykle przez producenta tego urządzenia, należało najpierw dobrze poznać parametry techniczne i specyfikę zarówno PLC, jak i samego programu. Między aplikacjami od różnych dostawców często wstępowały bowiem różnice w zakresie przykładowo składni języków programowania.
Ponadto zazwyczaj algorytm sterowania można było zapisać tylko w jednym języku. Z tych powodów za każdym razem, gdy instalowano sterowniki nowego typu lub od innego producenta, ich programowania uczono się od podstaw.
Utrudnione było również tworzenie przenośnego kodu, nawet w przypadku sterowników od jednego dostawcy. Wszystko to negatywnie wpływało na komfort oraz efektywność pracy programistów PLC. Powodowało to też stratę czasu oraz zwiększało koszty projektowania oraz rozwoju systemów sterowania i automatyki. Czasem z tego powodu całkiem rezygnowano z planów zakupu nowych sterowników.
IEC 61131-3
Nadzieja na zmianę tej sytuacji pojawiła się w latach 90. ubiegłego wieku. Wówczas organizacja IEC (International Electrotechnical Commision) rozpoczęła prace nad standaryzacją własności funkcjonalnych, eksploatacyjnych oraz procesu programowania sterowników programowalnych. W efekcie powstała specyfikacja zawarta obecnie w standardzie IEC 61131.
Dla środowiska programistów PLC szczególne znaczenie miała część trzecia tego dokumentu, która definiuje języki programowania sterowników. Chociaż przestrzeganie wytycznych tego standardu nie jest obowiązkowe, coraz częściej jest on odniesieniem dla twórców narzędzi programistycznych.
Ułatwia to posługiwanie się nimi programistom, którzy również znają tę specyfikację. Ma również wpływ na cały cykl życia kodu, usprawnia oraz przyspiesza jego projektowanie, wdrożenie, testowanie i modernizację.
Krzysztof GołąbMultiprojekt
Różnorodność producentów sterowników na rynku pociągnęła za sobą pojawienie się różnego typu oprogramowania do ich obsługi. Rosło zatem zagrożenie, że następstwem będzie zróżnicowanie sposobów programowania PLC. W pewnym momencie do każdego urządzenia potrzebny byłby osobny specjalista, a programiści musieliby poświęcać dużo czasu na naukę. W związku z tym wprowadzenie pewnych standardów w pisaniu programów było bardzo pomocne przede wszystkim dla automatyków tworzących aplikacje na sterowniki PLC. Spowodowało to na pewno dużą oszczędność czasu dla firm, a co za tym idzie również kosztów. Obecnie, nawet jeśli programista ma do czynienia z nowym urządzeniem od innego producenta, to i tak wie, że niezależnie od zastosowanego oprogramowania, język programowania będzie zachowany. Jako dystrybutor sterowników FATEK często spotykamy się z niepokojem ze strony przyszłych użytkowników, czy przejście z innego sterownika na nasz będzie odbywało się bez większych problemów. Dzięki jednak standardowi i językowi LD proces ten jest w większości przypadków bezproblemowy - kwestią jest zazwyczaj raczej odszukanie podobnej funkcjonalności w oprogramowaniu, a nie w samym języku programowania.
Wady i zalety stosowania standardowego i dedykowanego urządzenia trzeba rozpatrywać na dwa sposoby - od strony użytkownika oraz producenta. Patrząc od strony producenta - zdobycie klienta i nauczenie go obsługi urządzenia wiąże się ze związaniem klienta z firmą na długie lata. Dotyczy to szczególnie sytuacji, gdy rozwiązanie jakiejś aplikacji jest unikalne. Zapewne gdyby nie rynek i wymagania klientów, byłby to preferowany rodzaj współpracy dla producentów. Z kolei patrząc ze strony klientów - zastosowanie standardowych, uniwersalnych, czy tzw. otwartych rozwiązań powoduje, że w momencie awarii czy w najgorszym wypadku upadłości aktualnego dostawcy, klient zawsze może w miarę szybko zastąpić dotychczasowe rozwiązanie nowym. Stosowanie urządzeń standaryzowanych wymusza też konkurencyjność pod względem cenowym na rynku. Klient nie jest zmuszony do korzystania z jednego rozwiązania - może w każdej chwili, np. z powodu ceny, zmienić dostawcę urządzeń. Będzie to skutkowało nauką nowego oprogramowania czy zapoznaniem się z nowym urządzeniem od strony sprzętowej, ale nie będzie musiało się to wiązać z długimi szkoleniami programistów jakiegoś nowego języka programowania.
W naszym odczuciu przeważy trend standaryzacji. Już w tym momencie klienci bardzo niechętnie patrzą na produkty, które mają tzw. zamknięte protokoły komunikacyjne, czyli komunikację unikalną tylko dla jednego dostawcy. Zdają się to zauważać producenci, którzy coraz częściej tworzą grupy zrzeszające różnych wytwórców, nieraz konkurencyjnych, pracujących nad wspólnym standardem dla swoich klientów. Przykładem mogą być tutaj te związane z Ethernet Powerlink czy EtherCAT - każda z organizacji zajmujących się tymi standardami zrzesza po kilkaset różnych firm. |
JEDNOSTKI ORGANIZACYJNE I TYPY DANYCH W IEC 61131-3
W standardzie IEC 61131-3 scharakteryzowano najważniejsze elementy języków programowania sterowników (rys. 1). Zamieszczono w nim m.in. definicje podstawowych pojęć, ogólne zasady tworzenia kodu oraz zdefiniowano tzw. jednostki organizacyjne oprogramowania. Te ostatnie to funkcje, bloki funkcyjne oraz programy.
Są to podstawowe komponenty aplikacji użytkownika, które można też przenosić między różnymi projektami. Funkcje oraz bloki funkcyjne mogą być tworzone przez programistę (listing 1), ma on również do dyspozycji standardowe rozwiązania.
Przykładem są funkcje konwersji typów, liczbowe (m.in. trygonometryczne, logarytmiczne, dodawania, mnożenia), wyboru (na przykład wartości maksymalnej lub minimalnej) i porównywania oraz operacje na bitach, ciągach znaków oraz typach danych czasowych i datach.
Przykładem standardowych bloków funkcyjnych są natomiast elementy dwustanowe (przerzutniki), detekcji zbocza, liczniki oraz timery. W specyfikacji tej określono również typy danych, na których operuje program. Zdefiniowane zostały słowa kluczowe, które identyfikują poszczególne typy danych, zakresy wartości, jakie mogą one przyjmować oraz ilość pamięci wymaganą do ich przechowywania.
Elementarne typy danych to: typ boolowski, liczby całkowite, rzeczywiste, dane czasowe i daty (przykładowo DATE, TIME_OF_DAY, czyli czas dnia, DATE_ AND_TIME, czyli data i czas dnia), ciągi znaków, bajt oraz słowo. Z wykorzystaniem podstawowych typów danych programista może też definiować własne, tzw. pochodne typy danych. Na przykład w ten sposób można stworzyć typ danych obejmujący stany wejść analogowych sterownika.
KONFIGURACJA, ZMIENNE I SFC
W IEC 61131-3 wprowadzono też pojęcie konfiguracji. Termin ten można wyjaśnić w oparciu o model oprogramowania przedstawiony na rysunku 2. Przyjmuje się w nim, że program niezbędny do realizacji danego zadania sterowania jest specyficznym dla konkretnego systemu sterowania połączeniem wielu komponentów sprzętowych (m.in. jednostek przetwarzania oraz pamięci).
W obrębie w ten sposób rozumianej konfiguracji można wyróżnić zasoby, które realizują konkretne zadania. Te ostatnie odpowiadają za wykonanie programów oraz bloków funkcyjnych. W obrębie zasobu można zdefiniować kilka zadań, które są wykonywane okresowo lub w momencie wystąpienia sygnału wyzwalającego, na przykład zmiany wartości danej zmiennej.
Programy składają się z kolei z funkcji oraz bloków funkcyjnych napisanych w jednym z języków programowania znormalizowanych w IEC 61131-3. W normie określono też kilka typów zmiennych, które różnią się zasięgiem. Na przykład zmienne lokalne są dostępne tylko w obrębie jednostki organizacyjnej, w której zostały zadeklarowane.
Zmienne globalne z kolei służą do wymiany danych między różnymi jednostkami. Unika się w ten sposób błędów spowodowanych powtarzającymi się nazwami zmiennych. IEC 61131-3 obejmuje też przedstawienie sposobu tworzenia tzw. sekwencyjnych schematów funkcyjnych (Sequential Function Chart, SFC).
Służą one do graficznego przedstawiania algorytmu sterowania za pomocą oddzielnych kroków oraz przejść między nimi (rys. 3 a, b). Z tymi ostatnimi powiązane są warunki - jeżeli dany jest spełniony, następuje przełączenie z kroku bieżącego na następny. Każdy krok z kolei składa się z zestawu instrukcji zwanych akcjami. Kroki, warunki oraz akcje są implementowane w wybranym języku programowania.
Przykład deklaracji bloku funkcyjnegoFUNCTION_BLOCK Blok_funkcji Fragment programu w kodzie STl := 25; |
JĘZYKI PROGRAMOWANIA PLC
W IEC 61131-3 zdefiniowano cztery języki programowania sterowników (rys. 4), przy czym wyróżnić można tutaj dwie grupy - tekstowe oraz graficzne. Do pierwszej zaliczane są języki listy instrukcji (Instruction List, IL) oraz tekstu strukturalnego (Structured Text, ST). W grupie języków graficznych są natomiast języki schematów drabinkowych ( Ladder Diagram, LD) oraz schematów bloków funkcyjnych (Function Block Diagram, FBD).
Język listy instrukcji jest językiem niskiego poziomu i ma składnię podobną do języków typu asembler. Program w tym przypadku składa się z sekwencji rozkazów, z których każdy kolejny zaczyna się w nowej linii. Każda instrukcja składa się z operatora, który określa działanie do wykonania oraz operandu, czyli stałej lub zmiennej.
Przykładami operatorów są: LD, który ładuje operand, JMP, który wykonuje skok do etykiety o nazwie określonej operandem, CAL, który wywołuje blok funkcyjny o nazwie takiej jak operand tej instrukcji oraz RET realizujący powrót z wywołanego wcześniej bloku lub funkcji. Dostępne są też operatory arytmetyczne (ADD, SUB, MUL, DIV), porównania (GT, GE, EQ, NE, LE, LT) oraz logiczne (AND, OR, XOR, NOT).
Z kolei ST, drugi język typu tekstowego, jest językiem wysokiego poziomu. Jego składnia jest podobna do składni na przykład języków C lub Pascal. Jej podstawowymi elementami są wyrażenia oraz instrukcje, m.in. przypisania (:=), wyboru (IF, CASE), pętle (FOR - gdy liczba powtórzeń jest znana, WHILE oraz REPEAT - gdy liczba iteracji jest nieokreślona) oraz wywołania bloku funkcyjnego (listing 2). W wypadku języka tekstu strukturalnego w jednej linii można zamieścić kilka instrukcji, a każda z nich powinna być zakończona średnikiem.
GRAFICZNE JĘZYKI PROGRAMOWANIA
W językach zaliczanych do tej grupy algorytm sterowania implementowany jest z wykorzystaniem standardowych symboli graficznych. W drabinkowym, który jest jednym z najczęściej używanych i prawdopodobnie najlepiej znanych języków programowania sterowników programowalnych, symbole te umieszcza się w obwodach przypominających szczeble w schematach układów przekaźnikowych.
Są one z dwóch stron ograniczane przez szyny prądowe, a ich podstawowymi elementami są styki oraz cewki. Te pierwsze elementy przekazują do połączenia po prawej stronie styku stan z jego lewej strony, jednocześnie nie modyfikując wartości przypisanej im zmiennej. Zestandaryzowane typy styków to: normalnie otwarte, normalnie zamknięte oraz reagujące na zbocze narastające i opadające.
Cewki przekazują natomiast stan połączenia z lewej strony na prawą, równocześnie powodując zmianę wartości przypisanej im zmiennej. Dostępne są następujące znormalizowane typy cewek: normalne, negujące, ustawiające, kasujące oraz reagujące na zbocze narastające i opadające. Oprócz tego specyfikacja języka LD dopuszcza też stosowanie funkcji oraz bloków funkcyjnych (rys. 5).
Obwód może mieć przypisaną etykietę. Poszczególne instrukcje są wykonywane z lewej strony do prawej, a kolejne obwody przetwarzane są jeden po drugim. Można też wykonać skok do obwodu o określonej etykiecie. Język schematów bloków funkcyjnych jest bardzo podobny do języka LD, z tą różnicą że nie są w nim wykorzystywane styki oraz cewki (rys. 6).
W zamian używane są symbole obrazujące funkcje lub bloki funkcyjne, które połączone tworzą obwód. Kolejność przetwarzania obwodów można zmienić podobnie jak w języku drabinkowym, wykonując przejście do obwodu o określonej etykiecie.
WYBÓR JĘZYKA PROGRAMOWANIA
W pewnych zastosowaniach niektóre języki programowania zdefiniowane w normie IEC 61131-3 sprawdzają się lepiej niż inne. Przykładowo język listy instrukcji charakteryzuje prostota, a dzięki temu łatwo i szybko można się go nauczyć oraz tworzyć w nim kod.
Ponadto program napisany w IL w porównaniu do pozostałych zajmuje mniej miejsca w pamięci sterownika, wykonuje się też szybciej niż kod zapisany w formacie graficznym. W przeciwieństwie do języków graficznych analiza programów napisanych w języku instrukcji jest jednak trudniejsza - łatwo można też przeoczyć ewentualne błędy.
Ponadto implementacja skomplikowanych algorytmów w tym języku jest dość żmudna i trudna. Z kolei język tekstu strukturalnego sprawdza się zwłaszcza w implementacji złożonych algorytmów, obliczeń matematycznych, operacji na łańcuchach oraz na tablicach. Kody programów napisanych w ST są w porównaniu do tych w języku instrukcji bardziej czytelne oraz przejrzyste. Są one jednak niestety również zwykle dłuższe niż w wypadku IL.
LD VS. FBD
Język drabinkowy swoją popularność zawdzięcza przejrzystości zapisu, dzięki której kod w przypadku niezbyt długich programów można szybko zrozumieć, nawet bez specjalistycznego przygotowania. Wynika to głównie z podobieństwa składni tego języka do schematów obwodów elektrycznych.
Niestety implementacja złożonych funkcji, przykładowo matematycznych, sterowania lub przetwarzania danych jest dosyć trudna. Podobnie napisanie, a później interpretacja długich oraz skomplikowanych programów w tym wypadku jest kłopotliwa. Z tych powodów zakres możliwości wykorzystania LD jest ograniczony do realizacji prostych algorytmów sterowania niezbyt złożonymi procesami.
Problem z czytelnością kodu w wypadku długich kodów sterujących skomplikowanymi zadaniami dotyczy również języka schematów bloków funkcyjnych. Ogólnie jednak struktura aplikacji napisanej w języku FBD jest łatwiejsza w interpretacji niż w przypadku języka LD.
Jeżeli programista ma problem z wyborem konkretnego języka programowania w danej aplikacji, może także używać różnych języków jednocześnie.Opisywana norma dopuszcza taką sytuację. Przykładowo pisząc kod w jednym z języków, część z wykorzystywanych w nim funkcji można zaimplementować w innym.
OPROGRAMOWANIE
Narzędzia do programowania sterowników według wytycznych normy IEC 61131-3 powinny spełniać kilka warunków. Przede wszystkim zapewnić muszą wsparcie dla tworzenia kodu we wszystkich językach zdefiniowanych w tym standardzie, w tym w kilku jednocześnie. Zmienne globalne oraz lokalne powinny być rozróżniane oraz automatycznie kojarzone z odpowiednimi adresami sprzętowymi.
Program musi też rozpoznawać oraz pozwalać na używanie tylko znormalizowanych typów danych. Użytkownik powinien mieć także możliwość korzystania ze zestandaryzowanych jednostek organizacyjnych, na przykład w celu przekształcenia często używanych podprogramów w bloki funkcyjne, których później może używać wielokrotnie.
Program powinien również dopuszczać oraz ułatwiać korzystanie z komponentów programów udostępnianych w bibliotekach standardowych. Oprócz tego ważne są wszelkie dodatkowe funkcje usprawniające proces tworzenia kodu. Przykładem jest sprawdzenie poprawności oraz testowanie programu w trybie offline, czyli z użyciem wbudowanego symulatora, bez konieczności korzystania z docelowego sterownika.
FUNKCJE DODATKOWE
Jeżeli w trakcie kompilacji kodu wykryte zostaną błędy, powinny one zostać odpowiednio oznaczone. Istotnym wsparciem dla programistów jest też wyświetlanie wskazówek na temat rodzaju błędu oraz tego, jak go poprawić. Podpowiedzi są również przydatne w czasie tworzenia oraz edycji kodu, dlatego w niektórych aplikacjach dostępne są na przykład mechanizmy upraszczające wprowadzanie kodu.
Stosowane rozwiązania to m.in. listy rozwijane, wyświetlanie podpowiedzi oraz filtrowanie dostępnych instrukcji na podstawie kilku znaków początkowych słowa podanego przez użytkownika. Ważnym etapem procesu programowania PLC jest przesłanie skompilowanego programu do sterownika.
Wymagane są zatem odpowiednie narzędzia do konfiguracji oraz nawiązania łączności z urządzeniem docelowym za pośrednictwem różnych standardowych interfejsów komunikacyjnych. Powinna być również dostępna opcja uruchomienia programu już po zapisaniu go w pamięci sterownika oraz jego modyfikacji w trybie pracy online.
Komfort pracy programistów poprawiają też takie opcje, jak możliwość dodawania do kodu komentarzy, wsparcie przy opracowywaniu dokumentacji i zarządzaniu projektami oraz ich różnymi wersjami, usprawnienie konfiguracji ustawień sprzętowych sterowników oraz ogólnie intuicyjność obsługi.
Przykładami aplikacji do programowania sterowników zgodnych ze standardem IEC 61131-3 są: SX-Programmer Expert oraz SX-Programmer Standard z oferty firmy VIX Automation, WinCC firmy Siemens, logi. CAD firmy logi.cals dystrybuowany przez Encon, pakiet Control Builder firmy ABB, zenonLogic oferowany przez CopaData oraz Control FPWinPro firmy Panasonic.
PODSUMOWANIE
Wymienić można kilka zalet stosowania się w procesie programowania PLC do wytycznych normy IEC 61131-3. Jest to m.in. możliwość uzyskania przejrzystej struktury programu dzięki wprowadzeniu ujednoliconych jednostek organizacyjnych. Dzięki zmianom w zakresie deklaracji zmiennych uzyskuje się z kolei odciążenie programisty w kwestii adresowania zmiennych oraz kontroli ich nazw.
Ponadto ponieważ standard dopuszcza definiowanie własnych typów danych, a programista ma do wyboru jeden z czterech znormalizowanych języków programowania, tworzony kod może być lepiej dostosowany do wymagań danego zadania sterowania.
Bardzo ważna zaletą jest też możliwość tworzenia kodu przenośnego w postaci bibliotek funkcji oraz bloków funkcyjnych, których następnie można używać w różnych projektach. Ułatwia to tworzenie oprogramowania dla różnych platform sprzętowych.
Przykładem jest biblioteka Motion Control Library opracowana przez organizację PLCopen. Zebrano w niej bloki funkcyjne wykorzystywane w realizacji różnych zadań w zakresie sterowania ruchem.
Monika Jaworowska
Więcej informacji o normie IEC 61131-3 można znaleźć na stronie organizacji PLCopen.
Zajmuje się ona m.in. sprawdzaniem zgodności aplikacji do programowania PLC z tym standardem.
www.plcopen.org