LABORATORIUM PRZEMYSŁOWYCH SYSTEMÓW STEROWANIA

Podobne dokumenty
LABORATORIUM PRZEMYSŁOWYCH SYSTEMÓW STEROWANIA

LABORATORIUM PRZEMYSŁOWYCH SYSTEMÓW STEROWANIA

Elementy oprogramowania sterowników. Instrukcje podstawowe, funkcje logiczne, układy czasowe i liczenia, znaczniki

1 Podstawy c++ w pigułce.

Podstawy Programowania C++

LABORATORIUM PRZEMYSŁOWYCH SYSTEMÓW STEROWANIA

1 Podstawy c++ w pigułce.

Sterowniki Programowalne (SP)

Programowanie sterowników B&R

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Podstawy programowania skrót z wykładów:

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Pierwsze kroki z easy Soft CoDeSys Eaton Corporation. All rights reserved.

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

SFC zawiera zestaw kroków i tranzycji (przejść), które sprzęgają się wzajemnie przez połączenia

LABORATORIUM PRZEMYSŁOWYCH SYSTEMÓW STEROWANIA

CoDeSys 3 programowanie w języku drabinkowym LD

W 5_2 Typy języków programowania sterowników PLC (zdefiniowane w IEC-61131) - języki graficzne (LD, FBD); języki tekstowe (ST, IL).

Pętla for. Wynik działania programu:

LABORATORIUM PRZEMYSŁOWYCH SYSTEMÓW STEROWANIA

Programowanie sterowników przemysłowych / Jerzy Kasprzyk. wyd. 2 1 dodr. (PWN). Warszawa, Spis treści

Programowanie w języku Python. Grażyna Koba

LABORATORIUM PRZEMYSŁOWYCH SYSTEMÓW STEROWANIA

LABORATORIUM PRZEMYSŁOWYCH SYSTEMÓW STEROWANIA

Ćwiczenie 9 Podstawy programowania PLC w języku ST

Opracował: Jan Front

Szkoła programisty PLC : sterowniki przemysłowe / Gilewski Tomasz. Gliwice, cop Spis treści

Ćwiczenie 9 Podstawy programowania PLC w języku ST

Zapis algorytmów: schematy blokowe i pseudokod 1

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Układy VLSI Bramki 1.0

Ćwiczenia z S Komunikacja S z miernikiem parametrów sieci PAC 3200 za pośrednictwem protokołu Modbus/TCP.

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.

Architektura systemów komputerowych Laboratorium 13 Symulator SMS32 Operacje na bitach

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

CoDeSys 3 programowanie w języku FBD

lekcja 8a Gry komputerowe MasterMind

CoDeSys 3 programowanie w języku CFC

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

LibreOffice Calc VBA

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

Wstęp do programowania

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Program szkoleniowy. 24 h dydaktycznych (18 h zegarowych) NAZWA SZCZEGÓŁY CZAS

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Języki programowania wysokiego poziomu. PHP cz.2.

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja, - liczby losowe

Konstrukcje warunkowe Pętle

STEROWANIE URZĄDZENIAMI PRZEMYSŁOWYMI ĆWICZENIE 4 BLOKI FUNKCYJNE

ECDL Podstawy programowania Sylabus - wersja 1.0

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Instrukcja obsługi Konfigurator MLAN-1000

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Informatyka II. Laboratorium Aplikacja okienkowa

Język programowania: Lista instrukcji (IL Instruction List)

Komentarz technik mechatronik 311[50]-01 Czerwiec 2009

Przykład programowania PLC w języku drabinkowym - ćwiczenie 6

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Pascal - wprowadzenie

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Cw.12 JAVAScript w dokumentach HTML

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

Spis treści. Dzień 1. I Rozpoczęcie pracy ze sterownikiem (wersja 1707) II Bloki danych (wersja 1707) ZAAWANSOWANY TIA DLA S7-300/400

Programowanie - instrukcje sterujące

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

UMOWY INSTRUKCJA STANOWISKOWA

Podstawy Programowania Podstawowa składnia języka C++

OBIEKTY TECHNICZNE OBIEKTY TECHNICZNE

ARKUSZ EGZAMINACYJNY ETAP PRAKTYCZNY EGZAMINU POTWIERDZAJĄCEGO KWALIFIKACJE ZAWODOWE CZERWIEC 2010

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

Materiały dodatkowe. Simulink PLC Coder

Programowanie w języku C++ Grażyna Koba

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

Język programowania PASCAL

Każde wykonanie bloku instrukcji nazywamy pojedynczym przebiegiem lub iteracją pętli.

Podstawy programowania. Ćwiczenie. Pojęcia bazowe. Języki programowania. Środowisko programowania Visual Studio

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Ogranicz listę klasyfikacji budżetowych do powiązanych z danym kontem księgowym

Technologie informacyjne - wykład 12 -

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Fragment tekstu zakończony twardym enterem, traktowany przez edytor tekstu jako jedna nierozerwalna całość.

JĘZYKI PROGRAMOWANIA STEROWNIKÓW

Programowanie obiektowe

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Podstawy programowania Laboratorium. Ćwiczenie 2 Programowanie strukturalne podstawowe rodzaje instrukcji

I. Program II. Opis głównych funkcji programu... 19

Podstawy programowania w języku C i C++

Wstęp do informatyki- wykład 7

Typy, klasy typów, składnie w funkcji

Pętle. Dodał Administrator niedziela, 14 marzec :27

Siemens S Konfiguracja regulatora PID

Robert Barański, AGH, KMIW MathScript and Formula Nodes v1.0

Ćwiczenie 10 Wizualizacja

Stan/zdarzenie Nexo. Zmienne wirtualne. Zdarzenia wirtualne

Warsztaty dla nauczycieli

Transkrypt:

AKADEMIA GÓRNICZO- HUTNICZA IM. STANISŁAWA STASZICA W KRAKOWIE LABORATORIUM PRZEMYSŁOWYCH SYSTEMÓW STEROWANIA Wydział Inżynierii Mechanicznej i Robotyki Katedra Automatyzacji Procesów Przedmiot: Przemysłowe Systemy Sterowania (PSS) Laboratorium 13: Tekst strukturalny ST: Implementacja w sterownikach B&R. 1 2 3 4 5 6 7 8 9 10 11 12 13 Kraków

Cel ćwiczeń laboratoryjnych 1. Zapoznanie się z podstawami programowania sterowników PLC w języku tekstu strukturalnego (ST). 2. Realizacja prostych programów napisanych w języku ST. 3. Nauka korzystania z funkcji i bloków funkcyjnych w języku tekstowym. 4. Zaznajomienie się ze sposobami konwersji typów danych. 4. Wykonanie zadania sterowania bramą garażową w oparciu o język tekstu strukturalnego, którego efektem będzie działający program wraz z wizualizacją na panelu HMI. Po ukończeniu zajęć student powinien potrafić: 1. Znać podstawy języka ST, umieć wykorzystać podstawowe instrukcje i operacje do tworzenia prostych programów realizowanych w sterowniku PLC. 2. Umieć korzystać z funkcji i bloków funkcyjnych w języku tekstowym oraz samodzielnie tworzyć swoje własne funkcje lub bloki funkcyjne. 3. Znać sposoby jawnej i niejawnej konwersji typów danych oraz umieć rozważnie stosować te metody. 4. Samodzielnie utworzyć działający program napisany w języku ST wraz z wizualizacją w środowisku Automation Studio.

Wstęp Tekst strukturalny (Structured Text, ST) jest językiem programowania, którego podstawowa koncepcja opiera się na elementach języka BASIC, Pascal i ANSI C. Jest językiem wysokiego poziomu przeznaczonym do programowania układów automatyki. Dzięki standardowym konstruktom, które zawiera, programowanie w nim przebiega szybko i w nieskomplikowany sposób. W ST wykorzystano wiele tradycyjnie przyjętych cech języków wysokiego poziomu, m.in. zmienne, operatory, funkcje i elementy sterowania przebiegiem programu. Tekst strukturalny (ST) wchodzi w skład standardu IEC Standard IEC 61131-3 jest to jedyny stosowany na całym świecie standard dla języków programowania, wykorzystywany w programowalnych sterownikach logicznych. Norma ta uwzględnia też m.in. języki logiki drabinkowej (LD), listy instrukcji (IL) i diagramu bloków funkcyjnych (FBD). Zgodnie z normą IEC 61131 3 program podzielono na jednostki organizacyjne oprogramowania POU (ang. Program Organization Units), wśród których wyróżniamy trzy typy: funkcje - generuje jedną wartość wyjściową, która jest jednoznacznie określona przez wartości parametrów wejściowych bloki funkcji - generują jedną lub kilka wartości wyjściowych, które zależą nie tylko od aktualnych wartości wejściowych, ale mogą też zależeć od wartości wejściowych i wyjściowych w poprzednich chwilach czasowych programy - logiczny zestaw instrukcji, elementów i konstrukcji języka programowania niezbędnych do realizacji zadania czyli może zawierać funkcje i bloki funkcji oraz inne elementy (często bliki funkcji) np. do komunikacji Funkcje edytora Edytor języka jest edytorem tekstowym uwzględniającym szeroki wachlarz funkcji uzupełniających. Polecenia i słowa kluczowe są wyróżniane kolorami. Obszary w polu edycji można rozwijać i zwijać, a dla zmiennych i konstruktów przewidziano funkcję automatycznego uzupełniania treści (SmartEdit). Rysunek 1 Funkcje edytora Edytor odznacza się następującymi funkcjami i cechami: Rozróżnianie wielkości znaków (małe i duże litery) Auto uzupełnianie (SmartEdit, <CTRL> + <SPACE>, <TAB>) Rozpoznawanie odpowiadających sobie par nawiasów Rozwijanie i zwijanie konstruktów (zarysy) Wstawianie komentarzy do bloków Rozpoznawanie adresów URL Znaczniki wierszy zmodyfikowanych

Podstawowe elementy języka ST w Automation Studio W tej części zostaną opisane szczegółowo podstawowe elementy ST Wyrażenia Wyrażenie jest konstruktem, który po obliczeniu zwraca określoną wartość. Wyrażenia składają się z operatorów i argumentów operacji. Argument operacji może być zmienną, stałą lub wywołaniem funkcji. Argumenty operacji łączy się za pomocą operatorów Przypisanie Rysunek 2 Przykładowe wyrażenia Przypisanie składa się ze zmiennej, przedstawionej po lewej stronie i do której przydzielony jest wynik obliczenia lub wyrażenia po prawej stronie za pomocą operatora ":=". Każde przypisanie musi kończyć się znakiem średnika, ";". Rysunek 3 Przykładowe przypisanie Wykonanie powyższego wiersza kodu powoduje, że wartość "Result" będzie dwa razy większa od wartości zmiennej "ProcessValue". Dostęp do bitów zmiennych Tworząc przypisania można także operować wyłącznie poszczególnymi bitami. W tym celu wstaw znak kropki (".") za nazwą zmiennej. Wówczas dostęp będzie możliwy według numeru bitu, poczynając od 0. Numery bitów można również zastąpić stałymi. Rysunek 4 Dostęp do drugiego bitu w "ProcessValue" Dokumentacja kodu źródłowego: Komentarze Komentarze są bardzo ważną częścią kodu źródłowego. Opisują one treść kodu, dzięki czemu jest on bardziej czytelny i zrozumiały. Dzięki komentarzom ty i inne osoby możecie zrozumieć czym jest program, nawet gdy został napisany dawno temu. Komentarze nie są kompilowane i nie wpływają w żaden sposób na wykonywanie programów. Komentarze należy bezwzględnie zamykać w nawiasach z gwiazdkami: (*treść komentarza*). Istnieje dodatkowa forma komentarzy, wprowadzana za pomocą "//". W edytorze można zaznaczyć kilka wierszy jednocześnie i dodać do nich komentarz za pomocą ikony na pasku narzędzi. Ta metoda jest rozszerzeniem wskazanej w obowiązującej normie IEC. Rysunek 5 Komentowanie bloku tekstu

Rysunek 6 Warianty komentarzy Kolejność operacji Istnieje wiele operatorów, a co za tym idzie, zasadniczą kwestią jest priorytet każdego z nich. Priorytet operatorów ma ogromne znaczenie dla rozwiązywania wyrażeń. Wyrażenia są rozwiązywane rozpoczynając od operatora o najwyższym priorytecie. Operatory o tym samym priorytecie są wykonywane w porządku od lewej do prawej strony wyrażenia. Rysunek 7 Priorytety operatorów Wyrażenia są rozwiązywane przez kompilator. Na poniższych przykładach przedstawiono, jak nawiasy wpływają na wynik wyrażenia. Rysunek 8 Wpływ nawiasów na wynik wyrażenia

Standardowe funkcje języka ST Funkcja Nazwa Typ argumentu ABS() Wartość bezwzględna SINT, INT, DINT, USINT, UINT, UDINT, REAL, LREAL Typ wartości zwracanej SINT, INT, DINT, USINT, UINT, UDINT, REAL, LREAL Przykład A:=ABS(IN) ACOS() Arcus cosinus REAL, LREAL REAL, LREAL A:= ACOS(IN) ASIN() Arcus sinus REAL, LREAL REAL, LREAL A:= ASIN(IN) ATAN() Arcus tangens REAL, LREAL REAL, LREAL A:= ATAN(IN) COS() Cosinus REAL, LREAL REAL, LREAL A:= COS(IN) EXP() Eksponenta REAL, LREAL REAL, LREAL A:= EXP(IN) EXPT() Funkcja wykładnicza IN1: REAL, LREAL IN2: SINT, INT, DINT, USINT, UINT, UDINT, REAL, LREAL REAL, LREAL A:= EXPT(IN1, IN2) LN() Logarytm naturalny REAL, LREAL REAL, LREAL A:= LN(IN) LOG() Logarytm dziesiętny REAL, LREAL REAL, LREAL A := LOG(IN) MOD() Modulo SINT, INT, DINT, USINT, UINT, SINT, INT, DINT, USINT, UDINT UINT, UDINT A := MOD(IN1,IN2) SIN() Sinus REAL, LREAL REAL, LREAL A := SIN(IN) SQRT() Pierwiastek kwadratowy REAL, LREAL REAL, LREAL A:= SQRT(IN) TAN() Tangens REAL, LREAL REAL, LREAL A:=TAN(IN) LIMIT() BOOL, SINT, INT, DINT, USINT, BOOL, SINT, INT, DINT, Limit wartości UINT, UDINT, REAL, LREAL USINT, UINT, UDINT, MAX() MIN() MUX() SEL() Wartość maksymalna Wartość minimalna Wybór wartości Selekcja wartości BOOL, SINT, INT, DINT, USINT, UINT, UDINT, REAL, LREAL BOOL, SINT, INT, DINT, USINT, UINT, UDINT, REAL, LREAL K: SINT, INT, DINT, USINT, UINT, UDINT INx: BOOL, SINT, INT, DINT, USINT, UINT, UDINT, REAL, LREAL, TIME, DATE_AND_TIME, STRING, Array, Structure G : BOOL INx: BOOL, SINT, INT, DINT, USINT, UINT, UDINT, REAL, LREAL, TIME, DATE_AND_TIME, STRING, Array, Structure REAL, LREAL BOOL, SINT, INT, DINT, USINT, UINT, UDINT, REAL, LREAL BOOL, SINT, INT, DINT, USINT, UINT, UDINT, REAL, LREAL BOOL, SINT, INT, DINT, USINT, UINT, UDINT, REAL, LREAL, TIME, DATE_AND_TIME, STRING, Array, Structure BOOL, SINT, INT, DINT, USINT, UINT, UDINT, REAL, LREAL, TIME, DATE_AND_TIME, STRING, Array, Structure A:= LIMIT (MN, IN, MX) A:=MAX(INx) A:=MIN(INx) A:= MUX (K, INx) A := SEL (G, IN0, IN1) ROL() ROR() SHL() SHR() SIZEOF() Przesunięcie bitów w lewo z obrotem Przesunięcie bitów w prawo z obrotem Przesunięcie bitów w lewo Przesunięcie bitów w prawo Rozmiar zmiennej w bajtach IN: SINT, INT, DINT, USINT, UINT, UDINT N : SINT IN: SINT, INT, DINT, USINT, UINT, UDINT N : SINT IN: SINT, INT, DINT, USINT, UINT, UDINT N : SINT IN: SINT, INT, DINT, USINT, UINT, UDINT N : SINT BOOL, SINT, INT, DINT, USINT, UINT, UDINT, REAL, LREAL, TIME, DATE_AND_TIME, STRING, Array, Structure SINT, INT, DINT, USINT, UINT, UDINT SINT, INT, DINT, USINT, UINT, UDINT SINT, INT, DINT, USINT, UINT, UDINT SINT, INT, DINT, USINT, UINT, UDINT UDINT A:= ROL (IN, N) A:= ROR (IN, N) A: = SHL (IN, N) A:= SHR (IN, N) A:= SIZEOF(IN)

Grupy Poleceń Niżej przedstawione grupy poleceń są podstawowymi konstruktami programowania wysokiego poziomu. Operacje na funkcjach Boole'a Argumenty operacji nie muszą zawsze mieć typu danych "BOOL". Rysunek 9 Przegląd spójników boole'owskich Matryca prawdziwości dla tych operacji przedstawia się następująco: Rysunek 10 Matryca prawdziwości dla spójników boole'owskich Operacje na funkcjach Boole'a można łączyć ze sobą w dowolny sposób. Kolejne zestawy nawiasów poprawiają czytelność programu, a także gwarantują prawidłowe rozwiązywanie wyrażenia. Jedynymi możliwymi wynikami wyrażenia są: "TRUE" (logiczne 1) lub "FALSE" (logiczne 0). Rysunek 11 Porównanie logiki drabinkowej z tekstem strukturalnym Nawiasy są tu zbędne, ponieważ "NOT" ma wyższy priorytet niż "AND". Niemniej powinno się używać nawiasów, aby program był bardziej przejrzysty.

Rysunek 12 Wykorzystanie operatorów logicznych do realizacji funkcji logicznych Operacje arytmetyczne Kluczową zaletą języków programowania wysokiego poziomu jest to, iż łatwo radzą sobie z operacjami arytmetycznymi. Tekst strukturalny uwzględnia podstawowe operacje arytmetyczne stosowane w aplikacjach: Rysunek 13 Przegląd operacji arytmetycznych Typ danych zmiennych i wartości zawsze ma krytyczne znaczenie dla obliczeń. Wynik obliczany jest po prawej stronie wyrażenia i dopiero następnie przydzielany do odpowiadającej mu zmiennej. Wynik zależy od przyjętych typów danych i składni (notacji). Rysunek 14 Wykonane przez kompilator, przekształcenie niejawne Wartość wynikowa "*Błąd" odpowiada następującej wiadomości o błędzie kompilatora: "Error 1140: Incompatible data types: Cannot convert REAL to INT.". Błąd ten występuje, ponieważ nie można przydzielić wyrażenia do tego typu danych.

Komunikaty o błędach W środowisku Automation studio o wystąpieniu błędów, ostrzeżeń lub komunikatów dowiadujemy się z okna Output Results znajdującego się po lewej stronie w dolnej części ekranu. Komunikaty pojawiają się podczas kompilacji projektu, z każdym wywołaniem procesu kompilacji bieżąca lista komunikatów jest czyszczona. Rysunek 15 Okno Output Results 1- Przyciski do filtrowania danego rodzaju komunikatów wyświetlanych w oknie. 2- Przycisk do usunięcie listy ( ), usunięcia filtrów ( ) przejście do pozycji komunikatu w kodzie ( ). 3- Pole wejściowe do wyszukiwania komunikatów. 4- Liczba komunikatów ogólnie, oraz tych zaznaczonych. Przykład 1 Napisz program do liczenia średniej z 3 liczb. Program napiszemy wykorzystując własną funkcję. Zaznaczając w zakładce Logical View ikonę naszego programu (1), w oknie toolbox po prawej stronie ukaże się nam obiekt Function/Function Block (2), który należy zaznaczyć. Rysunek 16 Dodanie funkcji do programu

Przeciągając ikonę Function/Function Block (3 ) do naszego programu (4), ukaże się nam okno, w którym możemy wstępnie zadeklarować naszą funkcję. Rysunek 17 Okno tworzenia funkcji/bloku funkcyjnego Należy wpisać jej nazwę (1) oraz wybrać, czy chcemy utworzyć funkcję, czy blok funkcyjny (2). W przypadku funkcji konieczne jest również zdefiniowanie typu wartości zwracanej przez funkcję (3), w naszym przypadku wartością zwracaną będzie REAL. Po wypełnieniu wymaganych pól przechodzimy do kolejnego okna(4). Jest to okno, w którym wstępnie możemy zdefiniować zmienne lokalne danego bloku funkcyjnego lub funkcji, jej parametry wejściowe, wyjściowe oraz wejściowo-wyjściowe. Aby dodać daną zmienną, naciskamy prawym przyciskiem myszy na polu ze zmiennymi i wybieramy opcję Add new parameter (1), lub naciskamy przycisk Add (2). Rysunek 18 Dodawanie parametrów bloku funkcyjnego Po naciśnięciu przycisku Finish możemy przejść do napisania kodu naszej funkcji do liczenia średniej z 3 liczb. Rysunek 19 Kod programu funkcji

Należy zadeklarować wcześniej 4 zmienne potrzebne do realizacji tego zadania. Rysunek 20 Deklaracja zmiennych w programie Kolejnym krokiem jest wywołanie funkcji wewnątrz programu cyklicznego. Rysunek 21 Kod programu cyklicznego zawierający wywołanie funkcji do liczenia średniej Sprawdzenie poprawności działania naszego programu jest możliwe w trybie monitoringu, nadając odpowiednie wartości zmiennym wejściowym, w zmiennej wynik obserwujemy średnią z wprowadzanych wartości. Rysunek 22 Sprawdzenie poprawności działania programu w trybie monitoringu Niejawna konwersja typu danych Za każdym razem, gdy w kodzie programu realizowane jest przydzielanie, kompilator sprawdza typy danych. Przydziały w instrukcji są wykonywane w porządku od prawej do lewej. Zmienna zatem musi mieć dość miejsca, by zachować wartość. Konwersja mniejszego typu danych w większy wykonywane jest niejawnie przez kompilator i nie wymaga od użytkownika żadnych czynności. Próba przydzielenia wartości o większym typie danych do zmiennej o mniejszym typie danych skutkuje błędem kompilatora. W takich przypadkach konieczna jest tzw. jawne konwersja typu danych. Jawna konwersja typu danych Rysunek 23 Przykłady niejawnego przekształcenia typu danych Mimo, że niejawna konwersja typu danych jest metodą prostszą w użyciu od konwersji jawnej, nie zawsze należy używać jej w pierwszej kolejności. Schludność programu wymaga prawidłowego postępowania z typami danych poprzez używanie jawnej konwersji typu danych.

Poniższe przykłady przedstawiają przypadki, w których konieczne jest jawne przekształcenie typu danych. W omawianym przypadku występuje ryzyko błędu przekroczenia zakresu podczas dodawania: Rysunek 24 Błąd przekroczenia zakresu może wystąpić bezpośrednio na prawo od operatora przydziału. W tym przypadku typ danych dla wyniku powinien mieć dość wolnego miejsca dla sumy z operacji dodawania. Wynikiem tego konieczny jest większy typ danych. Podczas dodawania należy przekształcić co najmniej jeden z argumentów operacji w większy typ danych. Kompilator wykonuje niejawne przekształcenie drugiego argumentu operacji. Rysunek 25 Za pomocą przekształcenia jawnego można zapobiec błędom przekroczenia zakresu. Argumenty operacji obliczane na platformach 32-bitowych są przekształcane w wartości 32 bitowe. W tym przypadku dodawanie nie skutkuje błędem przekroczenia zakresu. W środowisku Automation studio dostępnych jest wiele funkcji do konwersji danych. Aby zobaczyć pełną listę tych funkcji, należy w oknie Logical View rozwinąć folder Libraries i odnaleźć bibliotekę AslecCon, w której wnętrzu znajduje się lista dostępnych funkcji. Rysunek 26 Lista dostępnych funkcji konwersji typów danych

Operatory porównawcze Tekst strukturalny uwzględnia proste konstrukcje służące porównywaniu zmiennych. Zwracają one wartość "TRUE" lub "FALSE". Operatory porównawcze i operacje logiczne są zwykle używane jako warunki w instrukcjach takich, jak np. IF, ELSIF, WHILE oraz UNTIL. Decyzje Rysunek 27 Przegląd logicznych operatorów porównawczych Instrukcja "IF" jest jednym ze sposobów podejmowania decyzji w programie. Znasz już operatory porównawcze. Można ich tu użyć Rysunek 28 Składnia instrukcji "IF" Wyrażenia porównawcze można łączyć ze spójnikami boole'owskimi, umożliwiając jednoczesne testowanie wielu warunków. Rysunek 29 Używanie wielu wyrażeń porównawczych Instrukcja "IF" może uwzględniać dodatkowe zagnieżdżone instrukcje "IF". Należy pamiętać, aby nie używać zbyt wielu poziomów zagnieżdżeń, ponieważ zwykle czyni to program za mało przejrzystym. Instrukcja "CASE" - Maszyny stanu Instrukcja "CASE" porównuje zmienną krokową z wieloma wartościami. Jeżeli jedno z porównań jest zgodne, wówczas zostaną wykonane instrukcje powiązane z tym krokiem. Jeżeli żadne z porównań nie jest zgodne, wówczas zostanie wykonany kod programu pod klauzulą "ELSE", tak, jak w przypadku instrukcji "IF".

W zależności od konkretnej aplikacji instrukcję "CASE" można wprowadzić celem skonfigurowania tzw. maszyn stanu lub automatów. Rysunek 30 Składnia instrukcji "CASE" Co cykl programu wykonywany jest jeden krok instrukcji "CASE". Zmienna krokowa powinna mieć typ danych "liczba całkowita dodatnia" (np. USINT, UINT, UDINT). W kodzie programu należy używać stałych lub elementów typów danych wyliczeniowych, zamiast stałych wartości liczbowych. Zastąpienie wartości tekstem czyni kod programu o wiele czytelniejszym. Ponadto jeżeli wartości te trzeba zmienić w programie, to konieczna zmiana wprowadzana jest tylko w deklaracji, a nie w kodzie programu. Pętle W wielu aplikacjach konieczne jest, aby sekcje kodu były wykonywane wielokrotnie w tym samym cyklu. Ten rodzaj przetwarzania danych nazywamy pętlą. Kod w pętli jest wykonywany aż do wystąpienia określonego warunku zakończenia pętli. Pętle służą do skracania programów i nadania przejrzystości ich kodowi. Problemem w tym przypadku jest zdolność do poszerzenia funkcjonalności programu. W zależności od struktury programu może wystąpić błąd uniemożliwiający programowi wyjście z pętli dopóki nie zainterweniuje mechanizm monitorowania czasu w sterowniku. Aby uniknąć występowania nieskończonych pętli należy zawsze zadbać o możliwość przerwania pętli po określonej liczbie jej powtórzeń. Istnieją dwa podstawowe typy pętli: takie, gdzie sterowanie w pętli rozpoczyna się od góry, i takie, w którym rozpoczyna się od dołu. Pętle, w których sterowanie rozpoczyna się od góry (FOR, WHILE) sprawdzają warunek zakończenia przed wejściem w pętlę. Pętle, w których sterowanie rozpoczyna się od dołu (REPEAT) sprawdzają warunek zakończenia na końcu pętli. Pętla zawsze musi wykonać przynajmniej jeden cykl. Instrukcja "FOR" Instrukcja "FOR" służy do wykonywania sekcji programu z ograniczoną liczbą powtórzeń. Pętle "WHILE" i "REPEAT" przeznaczone są dla aplikacji, w których nie jest odgórnie znana liczba cykli. Rysunek 31 Elementy instrukcji "FOR"

Licznik pętli "Index" jest inicjalizowany wartością początkową "StartVal". Pętla powtarza się aż ilość jej powtórzeń osiągnie wartość zmiennej końcowej "StopVal". W tym przypadku licznik pętli przyrasta o 1, co zwane jest "BY step" (o krok). Jeżeli dla przyrostu "step" przyjmiemy wartość ujemną, wówczas pętla będzie odliczała wstecz. Typ danych licznika pętli, wartości początkowej i wartości końcowej musi być taki sam. Warunek ten można spełnić stosując jawna konwersja danych. Instrukcja "WHILE" W przeciwieństwie do instrukcji "FOR", pętle "WHILE" nie zależą od licznika pętli. Ten typ pętli jest wykonywany dopóty, dopóki warunek lub wyrażenie ma wartość "TRUE". Pętla powinna mieć określony koniec, aby podczas wykonywania programu nie wystąpiło przekroczenie czasu cyklu. Rysunek 32 Elementy instrukcji "WHILE Wykonanie instrukcji powtarza się dopóty, dopóki warunek ma wartość "TRUE". Jeżeli warunek zwraca wartość "FALSE" podczas pierwszej jego oceny, wówczas instrukcja nie zostanie wykonana w ogóle. Przykład 2 Korzystając z pętli WHILE wygenerujmy wykres funkcji sinus. Dodając zmienną do projektu, konieczne jest zdefiniowanie jej typu, rozwijając listę dostępnych typów (1), wybieramy typ danej wyjściowe REAL (2). W Automation Studio możemy deklarować zmienne jako tablice, w polu Array index range: (3) wpisujemy ilość elementów tablicy danego typu, którą chcemy utworzyć. Rysunek 33 Tworzenie zmiennej tablicowej.

Naciskając przycisk OK. (4) tworzona jest zmienna tablicowa o zadanej liczbie elementów, które numerowane są od indeksu 0. Rysunek 34 Utworzona zmienna tablicowa Wykorzystując pętle WHILE, wpiszemy do tablicy pełny okres funkcji sinus. Rysunek 35 Zapis funkcji sinus do tablicy Wykres przedstawiający zawartość tablicy prezentuje się następująco: Instrukcja "REPEAT" Rysunek 36 Wykres funkcji sinus Pętla "REPEAT" różni się od pętli "WHILE" tym, że warunek zakończenia sprawdzany jest dopiero po wykonaniu pętli. Oznacza to, że pętla zostanie wykonana co najmniej raz bez względu na warunek zakończenia. Rysunek 37 Elementy instrukcji "REPEAT Wykonanie instrukcji powtarza się dopóki warunek "UNTIL" nie osiągnie wartości "TRUE". Jeżeli warunek "UNTIL" jest prawdziwy od samego początku, to instrukcje zostaną wykonane jeden raz. Jeżeli warunek "UNTIL" nigdy nie przyjmuje wartości "TRUE", to instrukcje są powtarzane bez końca, skutkując błędem czasu wykonania programu.

Instrukcja "EXIT" Instrukcja "EXIT" może być używana w każdym typie pętli przed spełnieniem warunku zakończenia. Po wykonaniu instrukcji "EXIT" pętla zostanie zakończona. Rysunek 38 Elementy instrukcji "EXIT Po wykonaniu instrukcji "EXIT" pętla zostanie zakończona bez względu na to, czy osiągnięto warunek zakończenia, czy też wartość końcową pętli. W przypadku pętli zagnieżdżonych kończone są wyłącznie pętle zawierające instrukcję "EXIT". Funkcje, bloki funkcyjne i akcje Funkcje i bloki funkcyjne rozszerzają funkcjonalność języka programowania. Akcje służą do nadania skuteczniejszej struktury programom. Funkcje i bloki funkcyjne można wstawiać za pomocą paska narzędzi. Rysunek 39 Wstawianie funkcji i bloków funkcyjnych z paska narzędzi Wywoływanie funkcji i bloków funkcyjnych Funkcje są podprogramami, które po wywołaniu zwracają określoną wartość. Funkcję można wywołać m.in. za pomocą wyrażenia. Argumenty funkcji (parametry wejściowe), są wartościami przekazywanymi do funkcji. Są one oddzielane przecinkami. Rysunek 40 Wywoływanie funkcji z jednym argumentem Bloki funkcyjne Blok funkcyjny wyróżnia się tym, że może przyjąć kilka argumentów i zwracać wiele wyników. W przeciwieństwie do funkcji należy zadeklarować zmienną wystąpienia, której typ danych jest taki sam jak bloku funkcyjnego. Zaletą bloku funkcyjnego jest to, że może on obsługiwać zadania złożone, obliczając wynik w ciągu kilku cykli.

Za pomocą różnych instancji można wywołać kilka bloków funkcyjnych tego samego typu, z różnymi argumentami. Rysunek 41 Argumenty (kolor zielony) i wyniki (kolor czerwony) dla bloku funkcyjnego "TON()" Wywołując blok funkcyjny można przekazać wszystkie argumenty lub tylko niektóre z nich. Parametry wejściowe (argumenty) i wyniki są dostępne w kodzie programu za pomocą elementów instancji bloku funkcyjnego. Rysunek 42 Wykorzystanie bloku funkcyjnego "TON()" W wariancie 1. wywołania wszystkie parametry są bezpośrednio przekazywane w chwili wywołania bloku funkcyjnego. W wariancie 2. wywołania parametry są przydzielane elementom zmiennej wystąpienia. W obu przypadkach żądany wynik musi zostać odczytany ze zmiennej wystąpienia po wystąpieniu wywołania. Należy pamiętać, że aby korzystać z danego bloku funkcyjnego konieczne jest dodanie odpowiedniej biblioteki w środowisku Automation Studio, zawierającej dany zestaw bloków. Wywołanie akcji Akcja jest kodem programu który można dodawać do programów i bibliotek. Akcje to kolejny element umożliwiający strukturyzację programów, a ponadto można je pisać w językach programowania innych niż język programu je wywołującego. Akcje są identyfikowane poprzez swoje nazwy. Wywoływanie akcji przebiega bardzo podobnie do wywoływania funkcji. Jedyną różnicą jest brak parametrów wejściowych (argumentów), oraz fakt, że akcja nie zwraca żadnej wartości. Jeżeli przyjmiemy instrukcję "CASE" do sterowania złożoną sekwencją działań, to treści poszczególnych kroków "CASE" można przenieść do akcji. Pozwala to zminimalizować

wielkość programu. Jeżeli taka możliwość jest potrzebna w innej części programu, wystarczy ponownie przywołać omawianą akcję. Rysunek 43 Wywoływanie akcji w programie głównym Zadanie do samodzielnego wykonania: Sterowanie napędem bramy garażowej Tematem projektu jest zaprogramowanie układu sterowania uchylnych drzwi garażowych. Mechanizm napędzany jest silnikiem komutatorowych prądu stałego 24 V. Drzwi są wyposażone w dwa czujniki krańcowe zamknięcia i otwarcia typu NC (Normal Close), oraz czujnik optyczny refleksyjny wykrywający pojawienie się przeszkody w trakcie zamykania bramy. Zmianę kierunku ruchu drzwi uzyskuje się poprzez zmianę biegunowości napięcia zasilającego silnik. Schemat obwodu zasilania silnika ze zmianą biegunowości przedstawiony jest poniżej. Drzwi mają być zamykane i otwierane za pośrednictwem dwukanałowego pilota radiowego z odbiornikiem. Wyjściem centralki radiowej są dwa styki zwierne NO (Normal Open), które zamykają się w chwili naciśnięcia odpowiedniego przycisku. Rysunek 44 Widok bramy garażowej

Sterownik PLC powinien realizować następującą sekwencję ruchu drzwi: Naciśnięcie na pilocie przycisku otwarcia (S1) powinno spowodować całkowite otwarcie bramy natomiast naciśnięcie przycisku (S2) jej zamknięcie. Po naciśnięciu przycisków S1 lub S2 załączony zostaje silnik elektryczny poprzez styczniki K1 lub K2 zależnie od kierunku ruchu bramy (K1 otwiera bramę, natomiast K2 ją zamyka) Wyłączenie napędu drzwi następuje po osiągnięciu przez nie punktów krańcowych, sygnalizowanych przez wyłączniki krańcowe otwarcia (S4) i zamknięcia (S3). W celu ochrony przed uszkodzeniem wjeżdżającego samochodu, zamknięcie bramy może być zrealizowane dopiero po 10 sekundach od momentu zadziałania górnej krańcówki. Czujnik optyczny (B1) wykrywa pojawiającą się przeszkodę w trakcie zamykania bramy, wymuszając jej otwarcie. W przypadku zadziałania czujnika B1 następuje blokada napędu bramy, odblokowanie następuje dopiero po trzykrotnej aktywacji krańcówki dolnej S3. W przypadku, gdy użytkownik zapomni zamknąć drzwi garażu, po upływie 10 minut od otwarcia drzwi układ automatycznie zamyka drzwi (dla celów symulacji czas ten można zredukować do np. 30 sekund). Układ sterujący nie powinien reagować na naciśnięcie pilota podczas ruchu drzwi. Rysunek 45 Schemat obwodu zasilania silnika sterującego ruchem bramy garażowej Celem ćwiczenia jest napisanie działającego programu sterującego bramą garażową w języku tekstu strukturalnego ST.

W tym celu należy zadeklarować odpowiednie zmienne potrzebne do prawidłowej pracy układu. Rysunek 46 Deklaracja zmiennych w programie Automation Studio Na stanowisku laboratoryjnym występuje tylko 1 przycisk NC, jednak w środowisku Automation Studio możliwe jest podczas mapowania wejść/wyjść odwrócenie działania danej zmiennej zaznaczając opcję INVERSE. Wykorzystamy tę opcję w przykładzie poniżej, gdzie przedstawiono przykładowy sposób powiązania zmiennych z fizycznymi elementami na stanowisku. Rysunek 47 Mapowanie cyfrowych wejść Wejścia cyfrowe 3 i 4 zostały również odwrócone, ponieważ zgodnie z treścią zadania wyłączniki krańcowe są normalnie zamknięte, natomiast wejście cyfrowe 2 zostało odwrócone, aby występujący na stanowisku przycisk NC pełnił rolę przycisku NO. Rysunek 48 Mapowanie cyfrowych wyjść Zadanie można wykonać korzystając m.in. z instrukcji CASE tworząc maszynę stanów dla naszego systemu. Aby napisany program był czytelniejszy, można wartości występujące w instrukcji CASE zastąpić stałymi zdefiniowanymi i nazwanymi przez użytkownika. Deklaracja zmiennych może wyglądać następująco: Rysunek 49 Deklaracja zmiennych maszyny stanu

Poniżej przedstawiony jest kod programu w języku ST, realizujący funkcje otwierania bramy. Ćwiczenie 1 Rysunek 50 Program realizujący funkcje otwierania bramy Napisz program realizujący przedstawione zadanie. Do tego celu możesz posłużyć się podanym wyżej przykładem, uzupełniając go o niezbędne elementy lub stworzyć własny program, którego działanie będzie pokrywało się z treścią zadania. Ćwiczenie 2 Utwórz w środowisku Automation Studio wizualizację przedstawiającą działanie układu sterowania bramą garażową. Przetestuj jej działanie na panelu HMI dostępnym na stanowisku Aby stworzyć wizualizację ruchu samej bramy garażowej, można wykorzystać grupę bitmap, której grafiki będą reprezentowały pojedynczy stan bramy. Należy pamiętać, że konieczne jest wtedy użycie zmiennej STAN, w zależności od wartości tej zmiennej na ekranie HMI będzie wyświetlana inna grafika. Istnieje również możliwość zasymulowania ruchu bramy, wykorzystując element bargraph. W ustawieniach elementu, wystarczy określić ruch słupka ku dołowi, należy również stworzyć zmienną, której wartość będzie inkrementowana w trakcie opuszczania bramy oraz dekrementowana przy jej podnoszeniu. Rysunek 51 Ustawienia elementu bargraph

Przykładowy widok wizualizacji układu sterowania bramą garażową. Rysunek 52 Przykładowa wizualizacja bramy garażowej Skalowanie i normalizacja Do przetwarzania zakresów zmiennych używane są przeważnie dwie operacje: Normalizacja oraz skalowanie, w praktyce występują one zawsze razem. Pierwsza z nich normalizuje parametr VALUE wewnątrz zakresu wartości wyspecyfikowanych przez parametry MIN i MAX. Druga operacja skaluje znormalizowany parametr VALUE(0.0 <= VALUE <= 1.0) do typu danej i zakresu wartości wyspecyfikowanych przez parametry MIN i MAX. Blok funkcyjny wykonujący operację skalowania i normalizacji można wykonać samemu w kilku linijkach kodu. Należy utworzyć nowy blok funkcyjny i dodać go do programu. Potrzebne będą zmienne wejściowe zawierające wartości minimalne i maksymalne wartości wejściowej jak i wielkości skalowanej oraz sama zmienna skalowana. Ponieważ zmienna przechowująca wartość z wejścia analogowego jest typu INT, należy wejście zadeklarować w tym typie. Wyjściem bloku funkcyjnego będzie zmienna skalowana, która zależnie od potrzeb może być różnego typu. Można również dodać zmienną lokalną w programie przechowującą wartość wielkości znormalizowanej, zmienna ta może być np. typu REAL. Przykładowa deklaracja zmiennych bloku funkcyjnego do skalowania wielkości analogowej. Rysunek 53 Deklaracja zmiennych lokalnych bloku funkcyjnego

Rysunek 54 Przykładowy kod programu w języku ST do skalowania wielkości wejściowej. Ćwiczenie 3 Dodaj do projektu zmienną, której zadaniem będzie przełączanie trybu między automatycznym a ręcznym. Zmienna ta nie musi być powiązana z fizycznym wejściem sterownika, wystarczy utworzyć ją w wizualizacji. W trybie automatycznym zachowana będzie funkcjonalność układu zgodna z treścią zadania, natomiast w trybie ręcznym należy wykorzystać znajdujący się na stanowisku potencjometr, do ręcznego sterowania położeniem bramy. Aby zrealizować to ćwiczenie, konieczne jest zadeklarowanie w programie nowej zmiennej typu INT, która będzie przechowywała wartość z wejścia analogowego. Zmienną tą należy przeskalować do wartości zadeklarowanych w bargraph ie a następnie przypisać jej wartość do zmiennej Poziom, której wartość prezentuje bargraph.