[KURS PLC, CZĘŚĆ 7] Sterowniki SIMATIC S7-1200 (CPU1211C) – tworzenie funkcji
Tworzenie nowego projektu
W TIA Portal tworzymy nowy projekt, który należy nazwać 07_Programming. Konfiguracje sterownika przeprowadzamy analogicznie, jak w poprzednich odcinkach. Tworzymy dwie tablice PLC tags i dodajemy do nich tagi zgodnie z rysunkiem umieszczonym poniżej.
W tablicach pojawiły się nowe tagi Switch oraz LedRed.
Do projektu dodajemy blok OB1 z wybranym językiem SCL. Następnie należy dodać instrukcje przedstawione poniżej.
„LedBlue” := „Button”;
„LedRed” := „Switch”;
Powyższy kod działa w ten sposób, że poziom logiczny z wejścia cyfrowego jest przenoszony na wyjście cyfrowe. Analogicznie dla każdej linii.
Skompilujmy teraz projekt, zaprogramujmy sterownik, następnie sprawdźmy działanie napisanego kodu, czy sterownik PLC wykonuje zadania zgodnie z założeniami.
Teraz zastanawiasz się kiedy wykorzystamy nowo poznane bloki do tworzenia funkcji. Użyjemy funkcji w tym momencie, a dokładnie bloku FC. Dodaj do projektu funkcję typu FC i nadaj jej nazwę LedControl. Poniższy rysunek przedstawia widok bloku funkcji typu FC.
Widzisz, że edytor jest taki sam dla funkcji typu FC, jak w przypadku bloku OB. Funkcje FC (tak samo FB) muszą być wywołanie (umieszczone w kodzie programu), aby mogły być wykonane. O uruchomieniu bloku FB lub FC decyduje programista. Dlatego wywołanie funkcji FC lub FB polega na umieszczeniu jej w kodzie programu bloku OB lub innej funkcji FC lub FB.
Z tego względu funkcje FB i FC mogą przyjmować parametry wejściowe oraz zwracać wypracowany wynik przez parametry wyjściowe.
Na powyższym rysunku widzisz, że został utworzony jeden parametr wejściowy (Input) o nazwie PushButton oraz jeden parametr wyjściowy o nazwie Led.
W sekcji kodu widzisz jedną instrukcje, która działa na takiej samej zasadzie, jak omawiany kod z bloku OB1. Wartość zmiennej przypisanej do parametru wejściowego PushButton zostanie przypisana do parametru wyjściowego Led. Krótko mówiąc stan z wejścia funkcji (z parametru wejściowego) jest przekazywany na wyjście (do parametru wyjściowego).
Teraz utworzoną funkcje LedControl trzeba wywołać w bloku OB1, co przedstawia poniższy rysunek.
Do parametrów funkcji przypisano odpowiednie tagi. Obecnie każdy parametr funkcji znajduje się w nowej linii. Jednak jest także możliwość umieszczenia wszystkich parametrów w jednej linii. Parametry zawszę są rozdzielone przecinkiem.
Przejdź teraz do kompilacji projektu (teraz można użyć opcji kompilacji tylko samego kodu programu czyli opcji Software (only changes)). Kompilacja powinna zakończyć się sukcesem. Wówczas zaprogramuj sterownik. Sprawdź, czy układ działa w taki sam sposób jak poprzednio.
Struktura naszego obecnego programu (zawierającego wywołania funkcji LedControl w bloku OB1) została przedstawiona na poniższym rysunku.
Tym razem jest to już program modułowy (nazywany też strukturalnym), ponieważ jest realizowane wywołanie określonych bloków kodu (w naszym przypadku funkcji LedControl) wykonującego specyficzne zadanie.
Nasze zadanie to zapalenie diody LED. Mamy dwa przyciski i dwie diody, z czego każda para to niezależne podzadanie. Dlatego została utworzona jedna funkcja i następnie wywołana dwukrotnie.
W tym wypadku przebieg wykonywanego programu wygląda w taki sposób, że z bloku OB1 następuje wywołanie funkcji LedControl z przypisanymi do parametrów tagami Button oraz LedBlue. Wówczas zostaje wykonany kod znajdujący się w tym bloku FC i powrót do bloku OB1. Wtedy wartość z parametru wyjściowego funkcji Led jest przypisywana do tagu LedBlue.
Następnie jest wywoływana ponownie funkcja LedControl, ale do parametrów tej funkcji są już przypisane inne tagi, czyli Switch oraz LedRed. Po wykonaniu kodu znajdującego się w tym bloku funkcji następuje powrót do bloku OB1. Wtedy wartość z parametru wyjściowego funkcji Led jest przypisywana do tagu LedRed. Ponieważ nie ma dalszych instrukcji, nastąpi rozpoczęcie cyklu programowego od początku.
Dobra praktyka programowania mówi, że funkcja powinna robić tylko jedno zadanie. Tak jest w naszym przypadku. Podzielenie całego zadania na jak najmniejsze części upraszcza i przyśpiesza wdrażanie całej aplikacji. Pozwala to także zmniejszyć rozmiar wykorzystanej pamięci. Każda instrukcja zajmuje określony rozmiar w pamięci. Tworząc funkcje nie podwajamy kodu. W ten sposób łatwiej jest również wprowadzać poprawki i modyfikacje kodu.
Przeprowadźmy zmianę w działaniu układu. Jeżeli przycisk jest zwolniony, to dioda LED świeci. Naciśnięcie przycisku powoduje wyłączenie diody LED, aby nie świeciła.
Można powiedzieć, że odwracamy działanie przycisku. Aby przeprowadzić taką modyfikację, skorzystamy z operatora dostępnego w języku S7-SCL. Jest to operator negacji i jest zapisywany jako NOT. Wynikiem działania tego operatora jest stan przeciwny do aktualnie występującego na określonym tagu lub zmiennej.
Jak się zapewne domyślasz, zmianę wykonamy w kodzie funkcji LedControl. Poniżej został umieszczony kod po modyfikacji.
#Led := NOT #PushButton;
Operator NOT wstawiamy przed zmienną lub tagiem, którego stan chcemy zmienić na przeciwny.
Pozostało nam wykonać ostatnią kompilację kodu programu i programowanie sterownika. Sprawdź teraz poprawność działania napisanego kodu. Poniższy wykres przedstawia reakcje programu na naciśnięcia przycisków.
Widzisz, że jeżeli na wejściu cyfrowym I0.2 (Button) jest stan niski, to na wyjściu cyfrowym Q0.0 (LedBlue) jest stan wysoki.
Tomasz Gilewski