Język drabinkowy LD
Kurs programowania w Codesys odc. 3
Kontakt w sprawie artykułu: Rafał Pilch - 2021-01-25
Podczas kursu dowiesz się:
- czym jest język drabinkowy,
- jak z niego korzystać w oprogramowaniu Codesys,
- jakie możliwości ma język drabinkowy.
Po zapoznaniu się z podstawami tworzenia programu i komunikacji ze sterownikiem PLC, przyjrzyj się bliżej językom programowania, jakie oferuje Codesys. W tym odcinku poznasz język drabinkowy. Dowiesz się, jak tworzyć program przy jego pomocy, a także jakie ma możliwości. Zaczynajmy!
Kurs programowania w Codesys
Część I – Podstawowe funkcjonalności środowiska Codesys
1. Pierwsze kroki w Codesys. Jak stworzyć program?2. Pierwsze podłączenie i przygotowanie Codesys do pracy ze sterownikiem PLC.
3. Język drabinkowy (LD).
4. Typy danych w Codesys, rodzaje zmiennych, sposoby ich tworzenia.
5. Język schematów blokowych (FBD).
6. Tworzenie podstawowej wizualizacji HMI.
7. Język strukturalny (ST).
8. Diagnostyka w Codesys – jak sprawdzać działanie oprogramowania i sterownika?
9. Język bloków funkcyjnych (CFC).
10. Funkcja, blok funkcyjny, program – zmodyfikuj program w Codesys dla lepszej funkcjonalności.
Część II – Zaawansowane funkcje i możliwości środowiska Codesys
11. Komunikacja MQTT – jak skonfigurować w Codesys?12. Komunikacja EtherCAT – konfiguracja i przykładowa aplikacja.
13. Softmotion – synchronizacja serwonapędów przy pomocy sterownika PLC.
14. Komunikacja Modbus RTU i TCP/IP w środowisku Codesys.
15. Tworzenie projektów w Codesys ze sterownikami bezpieczeństwa Safety: architektura systemu bezpieczeństwa.
16. Programowanie sterownika bezpieczeństwa w Codesys.
17. Integracja sterownika PLC z systemem SCADA w Codesys.
18. Konfiguracja maszyny CNC z wykorzystaniem sterownika PLC – obsługa G-Code.
Dodatkowe materiały i lekcje dla kursantów:
1. Jak stworzyć wirtualny serwonapęd w Codesys? Instrukcja krok po kroku.2. Przykładowa aplikacja Codesys w języku ST i LD: napełnianie i opróżnianie zbiorników wraz z alarmowaniem.
Najczęściej zadawane pytania:
Sprawdź odpowiedzi na najczęściej zadawane pytania dotyczące środowiska Codesys.Język drabinkowy – LD
Na początek trochę teorii. Język drabinkowy, często określany skrótem LD z ang. Ladder Diagram, jest jednym z pierwszych języków szeroko stosowanych w sterownikach PLC. Z tego też powodu aktualnie wciąż jest jednym z najpopularniejszych. Ma on postać zbliżoną do schematów elektrycznych, w których obwody zamykają się pomiędzy dwiema liniami zasilania, tworząc szczeble od których wziął swoją nazwę.
Skąd taka forma? Początki sterowników PLC są mocno związane z elektryką. Dawniej automatyka realizowana była przez pokaźne szafy sterownicze, w których można było znaleźć gąszcz przekaźników, cewek, styczników i innych prostych elementów elektryki. Wprowadzenie sterowników programowalnych zrewolucjonizowało podejście do automatyki, zastępując całe szafy jednym niewielkim urządzeniem. Problem był jednak taki, że za podłączanie i automatyzację wciąż byli odpowiedzialni elektrycy, którzy jeszcze niedawno montowali tuziny przekaźników zgodnie ze schematami. W związku z tym o programowaniu nowo wprowadzonych sterowników nie było wręcz mowy.
Producenci PLC, mając na uwadze fakt, że muszą przekonać elektryków do korzystania ze sterownika, postanowili wyjść im naprzeciw i stworzyć specjalny graficzny język programowania, który będzie przypominał schematy elektryczne, a jego logika będzie wprost nawiązywała do działania obwodów elektrycznych.
W taki sposób powstał właśnie język drabinkowy, który pogodził potrzebę programowania, z łatwym i przystępnym interfejsem dla elektryków. Z czasem język ten stał się światowym standardem i jest jasno określony w normie IEC 61131-3.
Język LD w Codesys
Tyle z ogólnej teorii, przejdźmy już do samego oprogramowania. Dowiesz się, jakie możliwości daje Ci Codesys jeżeli chodzi o wykorzystanie języka drabinkowego. Przykład zrealizujesz na symulatorze.
Chcesz dowiedzieć się, jak szybko i prosto przekonwertować program z symulatora na fizyczny sterownik? Sprawdź sekcję Tips&Tricks przeznaczoną dla subskrybentów kursu.
Jeżeli uważnie śledzisz kurs, to zapewne wiesz już, jak przygotować program do pracy w oparciu o język drabinkowy. Jeżeli natomiast przegapiłeś/aś wcześniejsze odcinki, zapoznaj się z podstawami w odcinku 1, gdyż dzisiaj rozpoczniesz pracę na w pełni przygotowanym i skonfigurowanym środowisku.
Po utworzeniu projektu otwórz segment przeznaczony do pisania programu, a więc PLC_PRG.
Poznasz teraz elementy języka drabinkowego, a także bloki funkcyjne, które oferuje Codesys. Po otwarciu PLC_PRG po prawej stronie zobaczysz okno ToolBox. Jeżeli nie widzisz takiego okienka, kliknij w prawym górnym rogu w głównym menu opcję View, a następnie wybierz ToolBox.
Segment ten to Twój przybornik. Znajdziesz w nim wszystkie elementy wykorzystywane podczas programowania. Codesys jest bardzo elastycznym środowiskiem, dlatego też oprócz klasycznych elementów języka drabinkowego, znajdują się tam niektóre bloki funkcyjne wykorzystywane w innych językach graficznych. Bloki wpasowują się w charakter języka drabinkowego, a dodatkowo zaoszczędzają wiele szczebli programu. Zacznijmy w takim razie analizę.
Jak zapewne zdążyłeś/aś zauważyć, elementy programu posegregowane są na kategorie. Pierwszą z nich jest General. W tej grupie znajdziesz najczęściej stosowane elementy, które zostaną omówione przy okazji kolejnych grup.
Następna grupa to Boolean Operators. W tej sekcji znajdziesz bloczki realizujące podstawowe zadania logiczne na zmiennych Boolowych, a więc 0/1.
AND wystawi stan wysoki na wyjściu tylko i wyłącznie wtedy, gdy na wejściu dwie lub trzy zmienne, w zależności od opcji, są w stanie wysokim.
OR na wyjściu poda stan wysoki w przypadku, gdy na którymkolwiek z wejść pojawi się stan wysoki.
XOR to specjalny wariant OR, w który poda na wyjściu stan wysoki tylko i wyłącznie wtedy, gdy którekolwiek z wejść poda logiczną jedynkę, przy zastrzeżeniu, że nie mogą oba wejścia jednocześnie być w stanie wysokim.
W grupie Math Operators zawarte są bloczki związane z operacjami matematycznymi. Warto pamiętać, że bloczki te operują na zmiennych rzeczywistych. W związku z tym podanie 1 lub 0 na wejście nie zostanie odczytane jako prawda lub fałsz, a zwyczajnie jako pełnoprawna liczba do obliczeń.
W tej sekcji są dwa typy bloczków: obliczeniowe, a więc ADD, SUB, MUL, DIV, czyli odpowiednio Dodaj, Odejmij, Pomnóż, Podziel, a także porównawcze, EQ, NE, LT, LE, GT, GE, odpowiednio, Równy, Nierówny, Mniejszy, Mniejszy bądź równy, Większy, Większy bądź równy.
Pamiętaj, że o ile bloczki obliczeniowe dają na wyjściu konkretne wyniki, o tyle bloczki porównawcze zwracają wartości logiczne prawda/fałsz czyli 1/0.
Przejdźmy teraz do pierwszej grupy bloków funkcyjnych, a więc Other Operators. Jak sama nazwa mówi, są to specjalne bloczki, które kryją w sobie funkcję działania, a więc często robią więcej niż tylko porównywanie czy dodawania wartości.
Pierwszym bloczkiem jest SEL, który można określić Selektorem. Posiada on trzy wejścia i działa na takiej zasadzie, że jeżeli na wejściu G pojawi się sygnał wysoki, to na wyjście bloczka przekazywany jest sygnał z wejścia IN1, jeżeli na G pojawi się stan niski, analogicznie odwrotnie.
Następnym bloczkiem jest MUX, który określa się mianem Multipleksu. Działa bardzo podobnie do bloczka SEL, z tym zastrzeżeniem, że na wejście K podaje się liczby całkowite od 0 w górę. Jeżeli na wejściu K pojawi się 0, to na wyjściu bloczka przekazywany jest sygnał z IN0, jeżeli 1 to IN1 i tak dalej.
Limit to bloczek, który ogranicza nam wartość podaną na wejściu IN. Można zdefiniować minimalną i maksymalną granicę wartości. Bloczek MOVE przenosi wartość z jednej zmiennej do drugiej, a bloczek Conversion zmieni typ zmiennej.
Przedostatnia grupa, Function Blocks, stanowi rozwinięcie bloków funkcyjnych. R_TRIG to bloczek reagujący na zbocze narastające, a F_TRIG na zbocze opadające.
Zbocze to określenie na moment przejścia sygnału w inny stan. Ze zboczem opadającym mamy do czynienia w momencie przejścia ze stanu wysokiego w niski, w przypadku narastającego – analogicznie odwrotnie. W związku z tym jest to sygnał impulsowy.
Przy pomocy bloczka SR wystawisz zmienną na stałe w stan wysoki, a dzięki bloczkowi RS zresetujesz tę zmienną ponownie do stanu niskiego.
TON to klasyczny timer dający możliwość opóźnienia załączenia zmiennej w stan wysoki. TOF działa odwrotnie do TON, gdyż po upływie zdefiniowanego czasu wystawi zmienną w stan niski.
Ostatnimi elementami w tym segmencie są liczniki. Liczniki zliczają każde jedno wejście zmiennej w stan wysoki. W przypadku CTU licznik zlicza w górę, natomiast w przypadku CTD – w dół.
Ostatnia grupa, Ladder Elements, to podstawowe elementy używane w języku drabinkowym.
Przy pomocy Network możesz rozbudować drabinkę o kolejny pusty szczebel.
Contact to klasyczny styk. Styk w języku drabinkowym podaje sygnał dalej, jeżeli zmienna przypisana do styku jest w stanie wysokim – tym samym zezwala na pracę dalszej części programu. W przeciwnym przypadku dalsza część programu za stykiem nie jest realizowana.
Negated contact to styk zanegowany, a więc działa identycznie jak klasyczny styk, z tym, że przekaże sygnał dalej w momencie, gdy zmienna do niego przypisana jest w stanie niskim, a więc odwrotnie do zwykłego styku. Przy pomocy Parallel contact i Parallel negated contact możesz podłączyć dodatkowy styk równolegle do linii (stworzyć warunek LUB). Coil to element wysterowywany przez linie w języku drabinkowym.
Zmienna przypisana do Coil, tłumaczonej na język polski jako Cewka, zmienia swój stan w zależności od tego, czy sygnał dotarł do cewki, czy też nie. Jeżeli dotarł – zmienna zmieni wartość na stan wysoki, jeżeli nie, będzie w stanie niskim. Przy pomocy Set Coil możesz ustawić zmienną w stan wysoki na stałe, tak więc wystarczy, że sygnał dotrze do cewki tylko raz i zmienna pozostanie już w logicznej 1, niezależnie czy sygnał nadal dociera, czy też nie. Taką zmienną można przywrócić do stanu niskiego wyłącznie przy pomocy Reset Coil.
Jump i Return to specjalne funkcje umożliwiające przeskakiwanie pomiędzy różnymi częściami kodu. Więcej na ich temat dowiesz się w przyszłych odcinkach kursu.
Wybierając Branch stworzysz nowy, równoległy szczebel, a przy pomocy Branch Start/END zakończysz dany szczebel lub rozpoczniesz nowy, niezależny.
Tworzenie programu w języku drabinkowym
Tworzenie programów w językach graficznych w Codesys ma wspólną i bardzo prostą mechanikę na zasadzie przeciągnij i upuść. Łapiąc za dowolny element, zaraz zobaczysz w oknie roboczym miejsca, w których można go podłączyć.
Zacznij od początku, a więc od stworzenia linii. Wybierz z ToolBox -> Ladder Elements element do tworzenia nowego segmentu sieci, a więc Network i przeciągnij go w puste pole robocze. W ten sposób tworzysz nowe pola pod linie kodu.
Następnie złap za styk, czyli blok Contact i przeciągnij w pole robocze. W tym momencie masz do wyboru kilka opcji. Przeciągając na Start here rozpoczniesz linię. Styk jest elementem, który zawsze musi zostać umieszczony na początku linii. W przypadku wybrania strzałki w górę lub w dół, automatycznie utworzy się nowa gałąź powyżej lub poniżej ze stykiem.
Zmienne w języku drabinkowym definiuje się tak samo, niezależnie od elementu dodanego do programu – klikając w pytajniki nad elementem i podając jego nazwę.
Po zatwierdzeniu zobaczysz okno, w którym definiujesz typ zmiennej i jej wartość początkową. Nazwij zmienną Zmienna1 określ jej typ jako Bool i daj jej wartość początkową 0.
Jeżeli korzystasz z fizycznego sterownika, zapraszam do sekcji Tips&Tricks, w której dowiesz się, jak łatwo przekonwertować program z symulatora na fizyczny sterownik i zmapować zmienną.
Następnie przetestuj dodawanie bloków funkcyjnych. Wybierz timer TON z sekcji Function Blocks z Toolbox i przeciągnij na obszar roboczy. Oprócz strzałek, które pojawią się nowe figury – deltoidy i prostokąt. Przeciągając element na deltoid umieścisz go za lub przed poprzednim elementem. Jeżeli przeciągniesz na prostokąt – nowy element pojawi się zawsze na końcu linii.
W tym przypadku wybierz prostokąt.
Każdy blok funkcyjny dodany do programu musi posiadać swoją unikalną nazwę. Codesys zaproponuje nazwę systemową, lecz możesz ją zmienić wedle uznania. W tym przypadku zmień nazwę na Timer1. Proces ten aktywuje okno kreacji zmiennej. Potwierdź, bez deklarowania wartości początkowej.
Następnie pozostały dwa wejścia do zdefiniowania. PT to zadany czas opóźnienia, ET to aktualny czas Timera. Stwórz adekwatne zmienne: Czas_zadany i Czas_Aktualny. W kreatorze zmiennych rozwiń opcję z trzech kropek przy definiowaniu wartości początkowej. Czas w programie Codesys oznacza się poprzez TIME#0ms, dlatego łatwiej skorzystać tutaj z gotowej podpowiedzi.
Aby zadać czas zmień wartość #0ms na #2s w zmiennej Czas_zadany.
Aby wysterować wyjście sterownika, trzeba jeszcze dodać cewkę, do której będzie można przypisać konkretne wyjście. Przeciągnij element Coil z segmentu Ladder Elements w Toolbox.
Pojawi się specjalne pole w obszarze roboczym, które umiejscowi cewkę w odpowiednim miejscu. Przypisz do cewki zmienną Zmienna2.
W tym przykładzie działasz na symulatorze. Jeżeli chcesz zmapować zmienną do fizycznego wyjścia, idź do sekcji Tips&Tricks.
Stwórzmy teraz drugi szczebel programu. Złap za element Contact i przeciągnij go na strzałkę w dół w obszarze roboczym. Styk zostanie automatycznie ustawiony w nowej gałęzi. Tym razem wybierz już wcześniej zdefiniowaną zmienną, którą przypisz do styku.
Kliknij raz na pytajniki i wybierz przycisk z trzema kropkami. W oknie, które się pojawi wybierz Zmienna2 i zatwierdź. W ten sposób możesz korzystać z innych zmiennych w programie.
Dodaj kolejny blok funkcyjny. Tym razem skorzystaj z CTU, a więc licznika zliczającego w górę. Przeciągnij licznik w obszar roboczy i umieść go zaraz za stykiem. Zmień nazwę bloku na Licznik1 i potwierdź powstanie nowej zmiennej.
CTU posiada 3 wejścia: CU – sygnał który będzie zliczany, RESET – sygnał resetujący cały licznik oraz PV – wartość do której licznik ma zliczać. Po osiągnięciu wartości podanej w PV na wyjściu Q pojawi się sygnał wysoki.
Na wyjściu CV podawana jest aktualna wartość licznika. Zdefiniuj zmienna Wartosc_Zadana na wejście PV oraz Wartosc_aktualna na wyjście CV. Przy definiowaniu zmiennej Wartosc_Zadana ustaw wartość początkową na 5.
Przedostatnim krokiem będzie dodanie cewki do drugiej gałęzi. Dodaj cewkę i określ ją jako Zmienna 3, następnie podłącz tę samą zmienną do wejścia RESET w bloczku CTU.
Ostatnim krokiem będzie wykorzystanie cewki SET. Jak pewnie wnioskujesz już z działania programu, Zmienna3 wejdzie w stan wysoki tylko na ułamek sekundy. Chcemy wyłapać tę zamianę, dlatego przeciągnij styk pod nową gałąź, zdefiniuj jako Zmienna3. Następnie dodaj element Set Coil i zdefiniuj jako Zmienna 4.
Tak oto udało się stworzyć pierwszy program w języku LD! Uruchom symulator i przetestuj jego działanie.
Program ten zlicza załączenia się wejścia 1 z dwusekundowym opóźnieniem. Jeżeli takich załączeń będzie przynajmniej 5, „zapali się” Zmienna 4, która poinformuje o tym stanie.
W tym odcinku to już wszystko. Poznałeś/aś podstawy języka drabinkowego, wiesz już jak tworzyć programy z jego wykorzystaniem – w związku z tym poeksperymentuj z pozostałymi bloczkami funkcyjnymi!
W kolejnym odcinku poznasz rodzaje zmiennych stosowanych w Codesys, dowiesz się, czym są, jak i gdzie się je stosuje.
Dzień dobry, czy przypadkiem w opisie bloku SEL nie ma błędu pisząc dwa razy, że na G pojawi się stan wysoki?
Dzień dobry, bardzo dziękuję za czujność – rzeczywiście wkradł się mały błąd. Oczywiście chodzi o to, że przy stanie wysokim zostanie wystawiony IN1, a NISKI stan sygnału na wejściu G wystawi IN0. Naniosłem poprawkę 🙂