Strona główna ASTOR
Automatyka w praktyce

Funkcja, blok funkcyjny, program – zmodyfikuj program w Codesys dla lepszej funkcjonalności
Kurs programowania w Codesys odc. 10

Kontakt w sprawie artykułu: Mateusz Pytel - 2022-10-10

Z tego artykułu dowiesz się:

  • czym jest obiekt typu POU,
  • jakie są typy obiektów w środowisku Codesys,
  • jak jednostki organizacyjne wpływają na budowę aplikacji.

Zapraszamy na kolejny odcinek naszego kursu. Dotyczy on funkcji, bloków funkcyjnych oraz programów w środowisku Codesys. Znajomość zastosowań i funkcjonalności tych obiektów organizacyjnych jest niezwykle przydatna podczas organizacji projektu. Jednostki organizacyjne pozwalają zwiększyć przejrzystość aplikacji, którą tworzysz oraz usprawnić jej działanie poprzez szereg funkcjonalności, zależnych od rodzaju obiektu.

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.

Czym jest POU – Program Organization Unit?

Obiekt typu POU jest jednostką organizacyjną programu w projekcie. Kod źródłowy aplikacji sterownika jest zapisywany w tego typu obiektach. W środowisku Codesys istnieją trzy typy jednostek organizacyjnych:

  • Program
  • Funkcja
  • Blok funkcyjny

Model oprogramowania IEC 61131-3, z programami, blokami funkcyjnymi i funkcjami do tworzenia projektów PLC, zapewnia wydajne programowanie, umożliwiając kopiowanie i ponowne wykorzystanie bloków programowych, które zostały już wdrożone i przetestowane w innym miejscu lub zidentyfikowanie i dezaktywowanie ich w celu rozwiązania problemów.

Jak więc dodać jedną z jednostek do aplikacji? Otwórz drzewko projektu i naciśnij prawym przyciskiem myszy opcję Application. Ukaże ci się pasek funkcji. Wybierz opcję Add object, a następnie wybierz POU.

Dodawanie POU, źródło: ASTOR

Po dokonaniu wyboru otworzy się nowe okno dialogowe. Służy ono do wyboru typu projektu oraz języka programowania, w którym zapisany zostanie kod źródłowy.

Zanim jednak przejdziesz do utworzenia obiektu, poznasz dokładnie jego typy oraz ich własności i funkcjonalności.

Typy obiektów w środowisku Codesys

Program

Pierwszym typem obiektu dostępnym w Codesys jest program. Program jest jednostką organizacyjną, która dostarcza jedną lub więcej wartości podczas wykonywania. Po wykonaniu programu wszystkie wartości są zachowywane do następnego wykonania. Kolejność wywoływania programów w ramach aplikacji jest określona w obiektach zadań. Możesz rozpoznać program w drzewie projektowym, poprzez skrót PRG przy nazwie jednostki. Program jest głównie używany jako miejsce do wywoływania innych jednostek, nazywany jest wtedy programem głównym.

Programy można wywoływać w innych programach oraz blokach funkcyjnych. Wywoływanie programu nie jest dozwolone w funkcji. Program nie posiada także instancji. Jeżeli jednostka organizacyjna wywoła program i w wyniku tego zmienią się wartości programu, to zmiany te są zachowane do następnego wywołania programu. Wartości programu są zachowane również wtedy, gdy powtórne wywołanie nastąpi przez inne POU.

Wywoływanie programu

Program jest wywoływany dzięki komendzie wpisanej do obiektu. Przykładowa składnia wygląda następująco:

<program>(<zmienna wejściowa> := <wartość>, <wartość wyjściowa> => <wartość>);

Dla przykładu, został stworzony program z jedną zmienną wejściową i jedną wyjściową oraz dodatkowa zmienna zawarta w obiekcie wywołującym program:

  • Zmienna1 – zmienna wejściowa programu „Program_PLC”
  • Zmienna10 – zmienna wyjściowa programu „Program_PLC”
  • Wyjscie – zmienna dodatkowa zawarta w obiekcie „PLC_PRG”
Przykładowe wywołanie programu, źródło: ASTOR

Funkcja

Funkcja to jednostka organizacyjna, która podczas wykonywania dostarcza dokładnie jeden element danych. Nie posiadają one wewnętrznej informacji o stanie, oznaczając że funkcja nie zapisuje wartości zadeklarowanych wewnątrz nich zmiennych do następnego wywołania. Wywołania funkcji z tymi samymi wartościami zmiennych wejściowych zawsze dostarczają tę samą wartość wyjściową. Z tego powodu nie możesz używać zmiennych i adresów globalnych w funkcji. Warto także zaznaczyć, że w językach tekstowych, takich jak język strukturalny, funkcje mogą być także operatorami.

Funkcje używa się głównie do wykonywania operacji niewymagających przechowywania wartości, czyli np. do przekazywania danych, skomplikowanych obliczeń matematycznych. Deklaracja powinna wyglądać następująco:

FUNCTION <nazwa> : <typ danych>

Poniżej deklarujesz zmienne wejściowe i zmienne funkcji.

Funkcja jest wywoływana nieco inaczej niż program, ponieważ mając jedno wyjście, rezultat zwracany przez funkcje należy zapisać do zmiennej w następujący sposób:

<zmienna>:=<nazwa funkcji>(<zmienne wejściowe>);

Dla przykładu, została stworzona funkcja z dwiema zmiennymi wejściowymi oraz dodatkowa zmienna zawarta w obiekcie wywołującym program:

  • Zmienna0 – zmienna wejściowa programu „Funkcja_PLC”
  • Zmienna20 – zmienna wejściowa programu „Funkcja_PLC”
  • Wyjscie – zmienna dodatkowa zawarta w obiekcie „PLC_PRG”
Przykładowe wywołanie funkcji, źródło: ASTOR

Zgodnie z normą IEC 61131-3 funkcje mogą posiadać dodatkowe wyjścia. Dodatkowe wyjścia są deklarowane w funkcji pomiędzy słowami kluczowymi VAR_OUTPUT i END_VAR. Funkcja jest wywoływana zgodnie z następującą składnią:

<funkcja> (<zmienna wyjściowa funkcji 1> => <zmienna wyjściowa 1>, <zmienna wyjściowa funkcji n> => <zmienna wyjściowa n>)

Blok funkcyjny

Blok funkcyjny jest jednostką, która podczas wykonywania dostarcza jedną lub więcej wartości. Wywołanie bloku funkcjonalnego następuje zawsze poprzez instancję, która jest kopią bloku funkcjonalnego. Po wykonaniu wartości zmiennych wyjściowych i zmiennych wewnętrznych zostają zachowane do następnego wykonania. Oznacza to, że blok funkcjonalny przy wielokrotnym wywołaniu nie musi dostarczać tych samych wartości wyjściowych przy tych samych zmiennych wejściowych.

Oprócz funkcjonalności opisanych w IEC 61131-3, w CODESYS można wykorzystać bloki funkcyjne do następujących funkcjonalności programowania obiektowego:

  • Rozszerzenie bloku funkcyjnego
  • Implementacja interfejsów
  • Metody
  • Właściwości

Najwyższy wiersz części deklaracyjnej zawiera następującą deklarację:

FUNCTION_BLOCK <specyfikator dostępu> <nazwa bloku funkcji> \| EXTENDS <bloku funkcji> \| IMPLEMENTS <rozdzielona przecinkami lista interfejsów>.

Najczęściej można spotkać bloki funkcyjne zapisane jak poniżej:

Przykładowa deklaracja bloku funkcyjnego, źródło: ASTOR

Wywołanie odbywa się zawsze poprzez instancję bloku funkcjonalnego. Podczas wywoływania bloku funkcyjnego zmieniają się tylko wartości danej instancji, której deklaracja wygląda następująco.

<instancja> : <blok funkcyjny>;

Przykładowe wywołanie bloku funkcyjnego, źródło: ASTOR

Dostęp do zmiennej bloku funkcyjnego w części implementacyjnej uzyskujemy w następujący sposób:

<instancja>.<zmienna>.

Zatem dodaj do istniejącego bloku zmienną wejściową typu BOOL i nazwij ją xWej. Następnie dodaj zmienną wyjściową typu BOOL o nazwie xWyj oraz prosty kod widoczny na zdjęciu.

Kod bloku funkcyjnego, źródło: ASTOR

Następnie w programie głównym dodaj nowe zmienne typu BOOL. Nazwij je xPrzycisk1 oraz xPrzycisk2. Dodaj także dwie kolejne zmienne typu BOOL oraz nazwij je xLED1 i xLED2. Będą one wejściami do instancji bloków funkcyjnych. Zapisz poniższe komendy w kodzie programu głównego.

Instancja(xWej:=xPrzycisk1,xWyj=>xLED1);

Instancja2(xWej:=xPrzycisk2,xWyj=>xLED2);

Program główny, źródło: ASTOR

Taki program wykona dwie instancje jednego bloku funkcyjnego, czyli wykona oddzielne operacje zawarte w kodzie bloku funkcyjnego wykorzystując inne zmienne do realizacji rozkazów w bloku funkcyjnym.

Z zewnątrz instancji bloku funkcjonalnego możesz uzyskać dostęp tylko do zmiennych wejściowych i wyjściowych bloku funkcjonalnego, nie do zmiennych wewnętrznych. Dostęp do instancji bloku funkcjonalnego jest ograniczony do jednostki, w którym instancja została zadeklarowana, chyba że instancja została zadeklarowana jako globalna. Podczas wywoływania instancji można przypisać zmiennym bloku funkcjonalnego żądane wartości.

Przykładowym blokiem funkcyjnym może być np. timer. Wywołanie jego instancji wygląda następująco:

Przykładowe wywołanie bloku funkcyjnego, źródło: ASTOR

W językach tekstowych można podczas wywołania bloku funkcjonalnego bezpośrednio przypisać wartości do zmiennych wejściowych i/lub wyjściowych. Przypisanie wartości do zmiennej wejściowej odbywa się przy pomocy :=. Przypisanie wartości do zmiennej wyjściowej odbywa się przy pomocy =>. Przykładowo, wywoływana jest instancja CMD_TMR bloku funkcjonalnego timera z przypisaniami do zmiennych wejściowych IN i PT. Następnie zmienna wyjściowa Q timera jest przypisywana do zmiennej A

CMD_TMR (IN := %IX5, PT := 100=);

A:= CMD_TMR.Q;

Jak jednostki organizacyjne wpływają na budowę aplikacji?

Użytek jednostek organizacyjnych wpływa na przejrzystość oraz zwięzłość aplikacji. Dzięki nim, nie będziesz musiał powtarzać kodu oraz tworzyć niepotrzebnie długich, wielotematycznych programów. Jednostki organizacyjne pozwolą Ci podzielić twoje algorytmy, aby móc wykorzystywać je ponownie, za pomocą wywołania jednostki.

Przykładowo, jeśli musisz wykonać wielokrotnie te same rozkazy, najlepiej zapisać je w formacie funkcji. Jednakże, gdy te rozkazy, mają być wykonane wielokrotnie w tym samym czasie, wykorzystując inne dane, należy użyć bloku funkcyjnego i możliwości wykorzystywania wielu instancji.  Programu używa się głównie jako podstawy aplikacji, w której wywołuje się pozostałe jednostki organizacyjne oraz do podtrzymania wartości zmiennych do następnego wykonania pętli programowej.

W tym odcinku to już wszystko. W kolejnym dowiesz się, jak skonfigurować komunikację z wykorzystaniem protokołu MQTT.

Do zobaczenia!

Autor artykułu: Mateusz Steczkowski

Newsletter Poradnika Automatyka

Czytaj trendy i inspiracje, podstawy automatyki, automatykę w praktyce

Please wait...

Dziękujemy za zapis do newslettera!

Czy ten artykuł był dla Ciebie przydatny?

Średnia ocena artykułu: 3 / 5. Ilość ocen: 2

Ten artykuł nie był jeszcze oceniony.

Zadaj pytanie

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *