Język strukturalny (ST). Kurs programowania w Codesys odc. 7
Z tego artykułu dowiesz się:
- czym jest język strukturalny ST,
- jak tworzy się programy z wykorzystanie ST w Codesys,
- jaką składnie posiada ST,
- jakie są najważniejsze jego funkcje i jak je stosować.
Witamy w kolejnej części naszego kursu programowania w Codesys. Ostatnio poznałeś/aś podstawy tworzenia wizualizacji. W tym odcinku wracamy do programowania. Poznasz kolejny język dostępny w środowisku Codesys – język strukturalny, w skrócie ST od ang. Structured Text. Jest on odpowiedni dla użytkowników, którzy wolą tworzyć program przy pomocy tekstu, niż przeciągnięć graficznych elementów. Język ST to język pisemny, przypominający wyglądem i składnią takie języki programowania jak C lub Python. Chcesz dowiedzieć się więcej? Zapraszamy na kolejny odcinek kursu!
Kurs programowania w Codesys
Część I – Podstawowe funkcjonalności środowiska Codesys
- 1. Pierwsze kroki w Codesys. Jak stworzyć program? | Kurs programowania w Codesys odc. 1
- 2. Pierwsze podłączenie i przygotowanie Codesys do pracy ze sterownikiem PLC | Kurs programowania w Codesys odc. 2
- 3. Język drabinkowy (LD) | Kurs programowania w Codesys odc. 3
- 4. Typy danych w Codesys, rodzaje zmiennych, sposoby ich tworzenia | Kurs programowania w Codesys odc. 4
- 5. Język schematów blokowych (FBD) | Kurs programowania w Codesys odc. 5
- 6. Tworzenie podstawowej wizualizacji HMI | Kurs programowania w Codesys odc. 6
- 7. Język strukturalny (ST) | Kurs programowania w Codesys odc. 7
- 8. Diagnostyka w Codesys – jak sprawdzać działanie oprogramowania i sterownika? | Kurs programowania w Codesys odc. 8
- 9. Język bloków funkcyjnych (CFC) | Kurs programowania w Codesys odc. 9
- 10. Funkcja, blok funkcyjny, program – zmodyfikuj program w Codesys dla lepszej funkcjonalności | Kurs programowania w Codesys odc. 10
Część II – Zaawansowane funkcje i możliwości środowiska Codesys
- 11. Komunikacja EtherCAT – konfiguracja i przykładowa aplikacja | Kurs programowania w Codesys odc. 11
- 12. Softmotion – synchronizacja serwonapędów przy pomocy sterownika PLC| Kurs programowania w Codesys odc. 12
- 13. Komunikacja Modbus RTU i TCP/IP – jak skonfigurować najpopularniejszy protokół komunikacyjny w Codesys? | Kurs programowania w Codesys odc. 13
- 14. Tworzenie projektów w Codesys ze sterownikami bezpieczeństwa Safety | Kurs programowania w Codesys odc. 14
- 15. Konfiguracja maszyny CNC z wykorzystaniem sterownika PLC – obsługa G-Code | Kurs programowania w Codesys odc. 15
- 16. Integracja sterownika PLC z systemem SCADA w Codesys| Kurs programowania w Codesys odc. 16
- 17. Połączenie i skomunikowanie sterownika PLC z robotem Kawasaki w Codesys| Kurs programowania w Codesys odc. 17
Dodatkowe materiały i lekcje dla kursantów:
Czym jest i jak działa język ST?
Język Structured Text, podobnie jak język drabinkowy, jest zdefiniowany w międzynarodowej normie IEC 61131-3. Wprawdzie Ladder Diagram wciąż pozostaje najczęściej używanym językiem programowania sterowników PLC, jednak język ST plasuje się w notowaniu tuż za nim.
Jak już wspomniałem, język ST przypomina języki C, Pascal lub Python. Dlatego większość programistów, którzy posiadają choćby minimalne doświadczenie z tymi językami, korzysta też z języka strukturalnego. Podobieństwa polegają główne na sposobie pisania programu oraz deklaracji zmiennych, używanych do jego wykonania. Ponieważ język strukturalny jest językiem pisemnym, program będziesz w całości zapisywać za pomocą klawiatury i praktycznie nie spotkasz w nim elementów graficznych.
Język strukturalny czy drabinkowy? Który wybrać?
Każda funkcja, którą poznałeś/aś w odcinku 3 o języku drabinkowym, jest również dostępna w języku ST. Mówimy tu o funkcjach logicznych (takich jak AND, OR, XOR), operacjach matematycznych (dodawanie, odejmowanie itd.), a także o blokach funkcyjnych (jak np. zegary i liczniki). W przypadku obu języków, napisany w nich program będzie wykonywał się na takiej samej zasadzie. Pozwoli Ci to w łatwy sposób łączyć ze sobą różne funkcje, a nawet całe bloki funkcyjne, bez ryzyka pojawienia się błędów, co jest niezwykle przydatne przy tworzeniu zaawansowanych projektów.
To główne podobieństwa języka strukturalnego i języka drabinkowego. Jednak trzeba wspomnieć o znaczącej różnicy między nimi.
Język ST jest bardziej zaawansowany pod względem możliwości. Co to konkretnie oznacza? Otóż język ten wykorzystuje się w głównej mierze do tworzenia zaawansowanych projektów, ponieważ zapewnia więcej funkcji, które można wykorzystać podczas programowania. Pozwala to na wykonywanie przez sterownik bardziej skomplikowanych operacji, które potrzebują dużej mocy obliczeniowej. Natomiast język LD, ze względu na swoją strukturę i mniejszą dostępność funkcji, jest używany do prostszych projektów. Podczas poznawania składni oraz dostępnych funkcji języka ST przekonasz się, dlaczego istnieje taka zależność.
Język strukturalny warto stosować gdy:
- Tworzysz zaawansowany projekt – przy zaawansowanych programach pisemny język programowania jest łatwiejszy do zrozumienia.
- Projekt ma być ogólnodostępny – ze względu na małe różnice w sposobie pisania, program zapisany w języku ST można łatwo przekonwertować do innego środowiska.
- Projektujesz algorytmy i obliczenia matematyczne – język ST posiada najprostszą strukturę obliczeń matematycznych, co ułatwia pisanie algorytmów.
- Stosujesz dużą ilość pętli – pętle w języku drabinkowym są problematyczne do zaprojektowania, więc przy ich dużej ilości zaleca się stosowanie języka ST.
Jak stworzyć projekt w języku ST w Codesys?
Przejdźmy więc do Codesys! Tak samo jak w przypadku języka drabinkowego, poznasz możliwości działania oprogramowania Codesys wraz z językiem ST oraz zrealizujesz przykłady w symulatorze. Zapewne wiesz już jak utworzyć nowy program. Jeżeli jednak przegapiłeś/aś wcześniejsze odcinki, zapoznaj się z podstawami przedstawionymi w odcinku 1.
Przy tworzeniu nowego projektu, musisz zmienić język programowania na Structured Text (ST).
Aby zacząć pracę nad programem, otwórz segment o nazwie PLC_PRG. Znajdziesz go w drzewku głównym, domyślnie znajdującym się po lewej stronie ekranu.
Jak widzisz program wygląda prawie identycznie, jak w przypadku programowania w języku drabinkowym. Możesz jednak zauważyć, że ToolBox, który już poznałeś/aś w odcinku 3 jest pusty. (Jeżeli nie widzisz takiego okienka, kliknij w prawym górnym rogu w głównym menu opcję View, a następnie wybierz ToolBox.) Dlaczego okno ToolBox jest puste? Niestety, przy projektowaniu za pomocą języka strukturalnego, Codesys nie posiada „szablonów”, takich jak przy stosowaniu języka drabinkowego. Jedynym sposobem na dodanie wybranej struktury jest jej własnoręczne wpisanie za pomocą klawiatury.
Jak zapisać algorytm w języku ST? Składnia kodu
Na początek musisz się zaznajomić ze składnią języka ST. Zaczniemy od trzech podstawowych zasad:
- deklaracja zmiennych i komendy poleceń muszą być zakończone średnikiem;
- kompilator nie widzi różnicy między małymi i dużymi literami, więc można ich używać dowolnie;
- odstępy nie spełniają żadnej funkcji, służą tylko do poprawy kodu.
A teraz typy danych. W normie IEC 61131-3 zawarta jest informacja o dwóch typach danych: elementarnych oraz pochodnych.
Elementarne typy danych to:
- Integer – przechowuje wartości liczbowe. Przykładowe pochodne to: int, uint, sint.
- Float – przechowuje zwykle duże wartości liczbowe. Pochodne to Real i Lreal
- Time – przechowuje wartości czasu. Przykładowe pochodne to: Time, Date.
- String – przechowuje ciąg znaków lub wartości bitowe. Przykładowe pochodne to: Bool, String, Byte, Word.
Znasz już podstawowe zasady i zmienne, przejdźmy więc do operatorów. Operatorem nazywamy konstrukcję jedno bądź wieloargumentową, zwracającą wartość.
Argument to nic innego, jak wartość lub jedna z danych, przekazana do parametru funkcji. Wieloargumentowa konstrukcja to taka, która korzysta z więcej niż jednego argumentu, aby wykonać operację.
W języku ST możemy uwzględnić:
- operatory arytmetyczne,
- operatory porównania,
- operatory operacji logicznych,
- operatory operacji bitowych,
- operatory przypisania.
O wszystkich rodzajach operatorów dowiesz się z dalszej części tego odcinka.
Funkcja to wydzielona część programu, wykonująca określone operacje, możliwa do wykonania podczas wykonywania programu. Funkcje stosuje się, aby uprościć program główny i zwiększyć czytelność kodu. Funkcje to np.: zegary oraz liczniki.
W funkcjach najczęściej używamy zmiennych. Zmienna to konstrukcja, dzięki której możemy przechowywać różnego rodzaju dane. Każdej zmiennej nadajemy nazwę. Używamy jej później, kiedy odwołujemy się do miejsca w pamięci, gdzie schowane są dane, które chcemy wykorzystać. Każda zmienna otrzymuje inny typ danych do przechowywania.
Dodawanie komentarzy i deklarowanie zmiennych w języku ST
W języku ST istnieje możliwość dodawania komentarzy do kodu programu. Możesz dzięki nim zapisać pewne objaśnienia lub wskazówki odnoszące się do linijki kodu lub nawet do całej jego sekcji. Poniżej zobaczysz 3 sposoby tworzenia komentarzy.
Deklaracja zmiennych
Deklaracje zmiennej możesz wykonać ręcznie lub poprzez poznaną już przez Ciebie podczas kursu funkcję Auto Declare (naciśnięcie klawiszy SHIFT i F2). Tym razem jednak nie będziesz korzystać z tego narzędzia, a zadeklarujesz zmienną ręcznie.
Deklarowanie w języku strukturalnym jest identyczne jak w języku drabinkowym. Nadanie typu zmiennej odbywa się poprzez dopisanie dwukropka „:” pomiędzy nazwę a typ zmiennej.
Utworzyłeś właśnie pierwszą zmienną lokalną. Możesz dodać jej domyślną wartość, którą przyjmie zaraz po rozpoczęciu programu. Robimy to następująco:
Tym sposobem możesz nadać wartość domyślną każdemu typowi zmiennej.
W przypadku używania dużych ilości zmiennych, zaleca się używanie prefiksów w ich nazwach. Ułatwia to identyfikację typu zmiennej, a także poprawia czytelność kodu.
Operatory przypisania, porównania i arytmetyczne
Instrukcja przypisania jest fundamentalną instrukcją zawartą w normie IEC. Zapisuje się ją następująco
X:=Y;
Kompilator odczytuje tę instrukcję w znaczeniu: „Odczytaj wartość Y i zapisz ją pod zmienną X”.
Do instrukcji przypisania możesz dołączyć np. operacje matematyczne.
X:=Y+50;
Wtedy zmienna X otrzyma wartość Y, zwiększoną o 50.
Operatorem przypisania jest symbol „:=”. Oznacza on przypisanie wartości Y oraz przypisanie jej zmiennej X. Częstym błędem jest mylenie tego symbolu z symbolem operatora porównania „=”.
Użycie operatora porównania w przypadku takim jak powyżej, dokona operacji porównania i zwróci nam wartość Prawda lub Fałsz.
X=Y
Jak możesz zauważyć, powyższa linijka kodu nie jest zakończona średnikiem. Nie jest ona instrukcją, a operacją, dlatego dodanie średnika na końcu linijki kodu jest błędem.
Operatorami porównania są:
- = (równa się),
- < (mniejsze od),
- <= (mniejsze od bądź równe),
- > (większe niż),
- >= (większe od bądź równe),
- <> (nierówne).
Przejdziemy teraz do operatorów logicznych. Służą one do wykonywania operacji logicznych, w których jako rezultat otrzymujemy wartości typu BOOL, czyli Prawda/Fałsz.
Operatory logiczne dostępne w języku ST:
- AND (suma logiczna),
- OR (alternatywa logiczna),
- XOR (alternatywa rozłączna),
- NOT (zaprzeczenie).
Przykładowe użycie operatora logicznego wygląda następująco:
X AND Y
Jeżeli obie wartości X i Y to Prawda, operacja zwróci wartość Prawda. Jeśli jedna lub obie wartości to Fałsz, operacja zwróci wartość Fałsz.
Ostatnim rodzajem operatorów, są operatory arytmetyczne. Dzięki nim możesz dokonywać odpowiednich operacji matematycznych.
Operatory matematyczne wyglądają następująco:
- + (dodawanie),
- – (odejmowanie),
- * (mnożenie),
- ** (potęgowanie),
- % (dzielenie modulo).
Przykładowe użycie operatora matematycznego:
wWynik:= X+Y;
Pod zmienną wWynik zapisze się wynik dodawania wartości X i Y.
Operacje bitowe
Operacje bitowe możesz wykonywać dzięki operatorom logicznym oraz funkcjom. Operacja logiczna jest wykonywana na każdym bicie wartości. Przykładowo:
wWynik:= 14 AND 9;
W zmiennej wWynik zapiszemy wynik operacji logicznej na 4 bitach, wykorzystując bity wartości zawarte w operacji. Wartości w postaci binarnej wyglądają następująco:
14 = 1110
9 = 1001
Aplikując funkcję logiczną AND między bitami obu liczb, otrzymasz wynik równy 1000. Wartość binarna wyniku odpowiada liczbie 8. Sterowniki PLC posiadają także możliwość wykorzystania funkcji operujących na bitach. Dzięki nim można zmieniać wartości zmiennych typu BYTE, WORD oraz DWORD.
Funkcje bitowe to:
- ROR (obrót bitowy w prawo),
- ROL (obrót bitowy w lewo),
- SHR (przesunięcie bitowe w prawo),
- SHL (przesunięcie bitowe w lewo).
Obrót bitowy polega na zmianie kolejności bitów w bajcie. Na zdjęciu poniżej możesz zobaczyć schemat przedstawiający funkcję ROL. Pierwszy bit z lewej jest przepisywany na miejsce pierwszego bitu z prawej. Pozostałe bity są przepisywane o jedno miejsce w lewo.
Taka operacja zapisana w środowisku Codesys wygląda następująco:
Przykładowe użycie funkcji ROL, źródło: ASTOR
Wyniki użycia funkcji ROL na dwóch typach danych różnią się, ponieważ typy BYTE i WORD mają różną ilość bitów.
Analogicznie do funkcji ROL, funkcja ROR przesuwa bity w prawo.
Funkcja SHL powoduje przesunięcie bitów w lewo, ale z prawej strony wpisywane są zera.
Taka operacja zapisana w środowisku Codesys wygląda następująco:
Analogicznie do funkcji SHL, funkcja SHR przesuwa bity w prawo.
Instrukcje warunkowe
Znasz już podstawowe instrukcje dostępne w Codesys, które możesz zapisać w języku strukturalnym. Czas przejść do pisania bardziej rozwiniętych konstrukcji.
Instrukcja IF
Na początek instrukcja warunkowa IF. Jak sama nazwa wskazuje, stawia ona warunek, od którego zależy wykonanie dalszej części programu. Warunek ten ma postać aktualnego stanu zmiennej. Mówiąc kolokwialnie: jeżeli zmienna x jest w stanie wysokim, to zrób to, a jak nie to tamto.
Program ukazuje działanie zbiornika z czujnikiem poziomu cieczy. Stan zaworu jest zależny od stanu czujnika, dzięki skonstruowaniu prostej instrukcji warunkowej IF.
Instrukcja warunkowa IF posiada też możliwość sprawdzenia kilku warunków pod rząd. Załóżmy, że Twój program w przypadku niespełnienia pierwszego warunku, ma przejść do sprawdzenia kolejnego. W takiej sytuacji stosujemy wyrażenie ELSIF, które jest wykorzystywane do przejścia między warunkami.
Użycie wyrażenia ELSEIF ukazane jest na zdjęciu poniżej:
Zmodyfikowany kod poprzedniego programu obejmuje teraz dwa czujniki. W pierwszej kolejności sprawdzany jest stan dolnego czujnika, a w przypadku nie spełnienia pierwszego warunku, sprawdzany jest drugi warunek.
Przykładowa składnia dla warunków ELSIF i ELSE:
IF [warunek] THEN
<instrukcja>;
ELSIF [warunek] THEN
<instrukcja>;
ELSE
<instrukcja>;
END_IF;
Warto też wspomnieć, że użycie wyrażenia ELSE nie jest obowiązkowe, jeśli program nie musi wykonać żadnej operacji w przypadku nie spełnienia warunku.
Instrukcja CASE
Inną instrukcją warunkową jest instrukcja CASE. Czym różni się IF od CASE? Otóż instrukcja IF działa na zasadzie Prawda/Fałsz, czyli polecenie wykona się, jeśli warunek jest prawdziwy. CASE działa na zasadzie numerycznej. Co to oznacza?...
Zobacz pełną wersję artykułu na naszej stronie Kurs programowania w Codesys odc. 7
Więcej ciekawych treści możesz także znaleźć na stronie Poradnik Automatyka
źródło: ASTOR
Słowa kluczowe
ASTOR, automatyka, CODESYS, język strukturalny, Poradnik Automatyka, programowanie