Szkola PLC – Tryby pracy linii

start-stop-line

Ostatnio przekazałem Ci dużo wiedzy teoretycznej. Pisałem Ci o instrukcji warunkowej IF, o operatorach logicznych, arytmetycznych oraz binarnych. Omówiłem Ci też dostępne typy funkcji. Teraz wykorzystamy to wszystko w praktyce.

Tryby pracy liniii

Do dalszych prac nad linią technologiczną wykorzystamy projekt, którym ostatnio posługiwaliśmy się podczas wykonywania IO test.

Projekt TIA Portal możesz pobrać tutaj.

Projekt Factory IO możesz pobrać tutaj.

Warstwy

Pisałem Ci o praktykach dobrego programowania Pojawiły się tam warstwy, które powinno się stosować w projekcie. W skrócie pozwala to zrobić bardziej przejrzysty projekt, w którym też łatwiej analizuje się oraz modyfikuje kod programu.

Do projektu dodamy pięć warstw. W przypadku TIA Portal dodanie warstwy polega na kliknięciu prawym klawiszem myszki na Program blocks i wybraniu Add new group. Przedstawia to poniższy rysunektia-add-group

W ten sposób należy dodać następujące warstwy:

00_Error – warstwa błędów
01_Visu – warstwa wizualizacji
02_Management – warstwa zarządzająca
03_Logic – warstwa logiczna
04_Hardware – warstwa sprzętowa

Do każdej warstwy będziemy dodawać bloki danych i funkcje, które będą realizować zadania zgodne z tą warstwą. Jak pewnie się domyślasz, w każdej warstwie może być dużo funkcji. Aby nie popełniać błędów podczas wywoływania ich, to utworzymy jedną dodatkową funkcje. Posłuży ona, jako miejsce do wywołał wszystkich innych funkcji z warstwy. Będzie to pewnego rodzaju klasa łącząca. Ta funkcja będzie się powtarzać dla każdej warstwy. Do poszczególnych warstw dodajemy następujące funkcje typu FC.

00_Error – ERR_ClassError
02_Management – MAN_ClassManagement
03_Logic – LOG_ClassLogic
04_Hardware – HD_ClassHardware

Dodane funkcje przedstawia poniższy rysunek

tia-projekt-z-warstwami

Do nazwy każdej funkcji został dodany przedrostek, który jest skrótem od nazwy warstwy. Dzięki temu można zorientować się, do jakiej warstwy należy dana funkcja. Pomaga to również podczas wywoływania funkcji. Wystarczy wpisać tylko przedrostek, a pojawi nam się lista wszystkich funkcji, jakie są w tej warstwie. Teraz wszystkie te funkcje należy wywołać w bloku OB1. Przedstawia to poniższy kod programu

"ERR_ClassError"();
"MAN_ClassManagement"();
"LOG_ClassLogic"();
"HD_ClassHardware"();

Mamy tylko cztery wywołania. Kod bloku OB1 nie zmieni się do końca projektu.

Tryby pracy linii

Od teraz zaczniemy stopniowo realizować założenia projektowe. Chciałbym, abyś wydrukował sobie ten plik. Każdy zrealizowany punkt powinien zostać zaznaczony plusem, że został zrobiony.

Jak wiesz, linia może znajdować się w jednym z czterech trybów pracy. Zaczniemy od obsługi trybu automatycznego oraz manualnego.

Do tego celu będzie nam potrzebna funkcja. Jak wiesz, do projektu w TIA Portal można dodać funkcję typu FC oraz FB. Nam będzie potrzebna funkcja, która potrafi przechować stan swoich parametrów. Więc musimy użyć funkcji FB. Ponieważ robimy teraz zdania związane z zarządzaniem linią, więc tą funkcje dodamy do warstwy Management.

Zaczniemy od realizacji punktu numer 2.

Tworzymy nową funkcję FB w warstwie Management, którą nazwiemy MAN_ChooseMode. Do funkcji trzeba przekazać stany przycisków. Dlatego w sekcji interfejsu tworzymy dwa parametry wejściowe typu Bool o nazwach ButtonAuto oraz ButonManual. Należy utworzyć też dwa parametry typu Bool o nazwach ModeAuto oraz ModeManual. Kod funkcji przedstawiano poniżej

//point nr. 2
IF (#ButtonAuto = TRUE AND #ButtonManual = FALSE) THEN
#ModeAuto := TRUE;
#ModeManual := FALSE;
ELSIF (#ButtonAuto = FALSE AND #ButtonManual = TRUE) THEN
#ModeAuto := FALSE;
#ModeManual := TRUE;
END_IF;

Pierwsza instrukcja warunkowa IF sprawdza, czy został naciśnięty przycisk od wyboru trybu automatycznego oraz czy nie jest wciśnięty przycisk od wyboru trybu ręcznego. Jeżeli ten warunek zawarty w nawiasie jest spełniony (jest prawdziwy) to do parametru wyjściowego ModeAuto jest przypisywany stan wysoki a do parametru ModeManual stan niski.

Jeżeli ten warunek nie jest spełniony (nie jest prawdziwy) to jest sprawdzany kolejny warunek zawarty w nawiasie obok ELSIF. Tutaj zostało zawarte sprawdzenie, czy przycisk od wyboru trybu automatycznego nie jest wciśnięty oraz czy został wciśnięty przycisk od wyboru trybu ręcznego. Jeżeli ten warunek jest prawdziwy to wykonywane jest przypisywanie odpowiednich wartości do parametrów wyjściowych tej funkcji.

Zatem ta funkcja zajmuje się przełączaniem trybu pracy pomiędzy automatycznym a manualnym. Dodatkowo zabezpiecza, aby dwa tryby pracy nie były uruchomione w tym samym czasie.

Zanim wywołamy tą funkcję, to potrzebujemy bloku danych, który będzie przechowywał tryby pracy, w jakim znajduje się linia.

Do warstwy Management dodajemy globalny blok danych o nazwie MAN_LineMode. Do tego bloku należy dodać pięć zmiennych typu Bool o następujących nazwach: Auto, Manual, StartLine, StopLine oraz Error.

Teraz pozostało nam wywołać funkcję MAN_ChooseMode() w funkcji MAN_ClassManagement(). Aby to zrobić, to wpisujemy nazwę funkcji, czyli MAN_ChooseMode. Następnie otwieramy nawias, co spowoduje pojawienie się okna Call option, które służy do utworzenia bloku instance DB. W polu Name pozostawiamy nazwę, taką jaką jest, a na końcu dopisujemy cyfrę 2 (numer który jest aktualnie w polu Number). Dzięki temu nazwa bloku danych jest niepowtarzalna. Wywołanie tej funkcji już z przypisanymi parametrami przedstawiono poniżej

"MAN_ChooseMode_DB2"(ButtonAuto:="Auto",
ButtonManual:="Manual",
ModeAuto=>"MAN_LineMode".Auto,
ModeManual=>"MAN_LineMode".Manual);

Do parametrów wejściowych ButtonAuto oraz ButtonManual przypisano odpowiednio przyciski Auto oraz Manual. Do parametrów wyjściowych ModeAuto oraz ModeManual powiązano ze zmiennymi znajdującymi się w bloku danych MAN_LineMode.

Teraz zajmiemy się napisaniem kodu programu, który zrealizuje punkty 3, 4, 6, 8 z założeń projektowych. Teraz obsłużymy włączanie i wyłączanie linii. Do tego będzie potrzebna nam kolejna funkcja typu FB. Do warstwy Management dodajemy funkcję FB o nazwie MAN_ControlLine. W sekcji interfejsu tworzymy dwa parametry wejściowy typu Bool o nazwach ButtonStart oraz ButtonStop. Parametry posłużą do przekazania stanów przycisków, którymi linię można uruchomić i zatrzymać. Linia nie może się uruchomić, gdy jest błąd oraz powinna zostać natomiast zatrzymana, gdy błąd się pojawi. Zatem potrzebny jest nam jeszcze jeden parametr wejściowy, aby mieć informacje o aktualnym stanie błędów (czyli czy jest jakikolwiek błąd, czy go nie ma). Trzeci parametr wejściowy będzie także typu Bool o nazwie GlobalError.

Utworzymy także dla tej funkcji dwa parametry wyjściowe, które będą zwracać aktualny stan linii. Parametry będą typu Bool o nazwach LineStart oraz LineStop. Kod funkcji przedstawiono poniżej

//point nr 3, 4, 6, 8
IF (#ButtonStart = TRUE AND #ButtonStop = FALSE) THEN
#LineStart := FALSE;
#LineStop := TRUE;
ELSIF (#ButtonStart = TRUE AND #GlobalError = FALSE) THEN
#LineStart := TRUE;
#LineStop := FALSE;
ELSIF (#ButtonStop = FALSE OR #GlobalError = TRUE) THEN
#LineStart := FALSE;
#LineStop := TRUE;
END_IF;

Pierwsza instrukcja warunkowa sprawdza, czy oba przyciski nie zostały naciśnięte w tym samym czasie (należy pamiętać, że przycisk Stop to styk NC). Jeżeli taka sytuacja się wydarzy, to linia zostaje zatrzymana. Do parametrów wyjściowych są przypisywane odpowiednie wartości.

Następna instrukcja warunkowa sprawdza, czy linia może zostać uruchomiona. Jeżeli przycisk uruchomiający linię zostanie wciśnięty i nie pojawił się wcześniej jakiś błąd to linia zostaje włączona. Gdy ten warunek jest spełniony, to parametrom wyjściowym zostaje przypisany odpowiedni stan.

Ostatnia instrukcja warunkowa sprawdza, czy linia powinna zostać zatrzymana. Zdarzeniami, które mogą to spowodować, to wciśnięcie przycisku Stop (stan tego przycisku przekazuje do funkcji parametr ButtonStop) lub pojawił się jakikolwiek błąd. Gdy jedna z tych sytuacji będzie miała miejsce, to parametrom wyjściowym tej funkcji zostają przypisane odpowiednie wartości.

Teraz pozostało nam tylko wywołać tą funkcje w MAN_ClassManagement(). Tą czynność należy wykonać analogicznie, jak w przypadku poprzedniej funkcji FB. Wywołanie z przypisanymi parametrami przedstawiono poniżej

"MAN_ControlLine_DB3"(ButtonStart:="Start",
ButtonStop:="Stop",
GlobalError:=FALSE,
LineStart=>"MAN_LineMode".StartLine,
LineStop=>"MAN_LineMode".StopLine);

Parametrom wejściowym przypisano stany przycisków. Ponieważ nie mamy jeszcze zmiennej przechowującej informacje o błędzie, więc do tego parametru na chwilę obecną przypisujemy FALSE. Parametry wyjściowe tej funkcji są powiązane ze zmiennymi z bloku danych MAN_LineMode.

Sygnalizacja świetlna

Założenia projektowe mówią też o tym, aby tryb pracy był widoczny, czyli aby sygnalizacja świetlna informowała wizualnie o aktualnym stanie linii. Zrealizujemy to za pomocą kolumny sygnalizacyjnej oraz podświetlenia przycisków.

Te założenia projektowe wykonany już w warstwie logicznej. Tworzymy nową grupę o nazwie Light. Do tej grupy dodajemy funkcję FC o nazwie LOG_BacklightButton. Teraz napiszemy kod programu realizujący punkty 11, 14, 17 oraz 18. Nie wiemy jeszcze, jak zrobić pulsowanie, więc to wykonamy już w niedalekiej przyszłości. W tym momencie włączymy tylko podświetlenie. Tryby pracy linii przechowywane są w bloku danych MAN_LineMode, więc należy skorzystać z tych zmiennych. Kod funkcji przedstawiono poniżej

//point nr 11
"ResetLight" := "MAN_LineMode".Error;
//point nr 14
"White" := "MAN_LineMode".StartLine;
//point nr 17
"AutoLight" := "MAN_LineMode".Auto;
//point nr 18
"ManualLight" := "MAN_LineMode".Manual;

Zgodnie z założenia projektowymi dla każdej diody podświetlającej dany przycisk przypisujemy stan zmiennej, która przechowuje tą informację.

W analogiczny sposób zrobimy dla kolumny sygnalizacyjnej. Wykonamy teraz punkty 13 oraz 15. Do grupy Light dodajemy funkcję FC o nazwie LOG_ColumnLight. Kod tej funkcji przedstawiono poniżej

//point nr 13
"GreenVSI" := "MAN_LineMode".StartLine;
//point nr 15
"YellowVSI" := "MAN_LineMode".Manual AND "MAN_LineMode".StartLine;
//
"RedVSI" := "MAN_LineMode".Error;

Założenia projektowe numer 15 mówi, że lampa żółta powinna być włączona, gdy został wybrany tryb pracy ręcznej oraz linia pracuje. Dlatego zastosowano operator binarny ­AND.

Obie funkcje należy wywołać funkcji LOG_ClassLogic(). Przedstawia to poniższy kod

"LOG_BacklightButton"();
"LOG_ColumnLight"();

Tym razem podczas wywoływania funkcji nie przypisujemy żadnych wartości do parametrów, ponieważ te parametry nie zostały utworzone. Z tego względu pomiędzy nawiasami nic się nie znajduje.

Każda funkcja porządkuje pewne rzeczy, czyli grupuje zadania związane z podświetleniem przycisków oraz sterowaniem kolumną sygnalizacyjną. W razie konieczności modyfikacji funkcjonalności związanych np. z podświetleniem przycisków, to wiesz od razu, gdzie znajduje się kod odpowiedzialny za te czynności.

Testowanie

Mamy już napisany cały kod odpowiedzialny za tryby pracy linii. Czas sprawdzić, jak działa w praktyce. Aby to zrobić, to trzeba na samym początku zrobić kompilacją całego kodu programu. Następnie, gdy kompilacja zakończyła się sukcesem, to należy wgrać kod programu do sterownika.

Pozostało nam przejść do Factory IO i sprawdzić, jak działa napisany program. Uruchamiamy symulację linii technologicznej przygotowanej do szkoły PLC poprzez naciśnięcie przycisku PLAY znajdującego się na samej górze.

Teraz za pomocą przycisków Auto i Manual (przyciski znajdujące się obok linii w Factory IO) wybieramy tryb pracy linii. Naciśnięcie przycisku powoduje włączenie jego podświetlenia.

Wykorzystujemy przyciski Start oraz Stop podłączone fizycznie do sterownika S7-1200, aby włączyć i zatrzymać linię. Naciśnięcie przycisku Start powinno spowodować, że zielona lampa na kolumnie powinna być włączona, gdy został wybrany tryb Auto. Jeżeli wybrano tryb Manual to dodatkowo na kolumnie powinna być włączona żółta lampa.

Szkielet programu

Mając już obsłużone tryby pracy możemy przygotować szkielet programu, który będziemy w dalszych odcinkach szkoły PLC rozwijać. Ten główny szkielet programu umieścimy w funkcji LOG_ClassLogic(). Kod przedstawiono poniżej

IF ("MAN_LineMode".StartLine) THEN
IF ("MAN_LineMode".Manual) THEN
//TODO MODE manual
;
ELSIF ("MAN_LineMode".Auto) THEN
//TODO MODE AUTO
;
END_IF;
ELSE
//TODO line STOP or LINE ERROR
;
END_IF;

Została napisana sekwencja instrukcji warunkowych, gdzie w odpowiednich miejscach zostanie umieszczony kod programu realizujący zadania opisane w tym momencie komentarzem.

Nagranie wideo

Poniżej nagranie pokazujące, jak krok po kroku napisać kod realizujący tryby pracy

 Projekt TIA Portal

Aktualny projekt linii technologicznej możesz pobrać tutaj: Projekt – Szkoła PLC.

Praca domowa

Zadanie 1

W ramach testu możesz zamiast funkcji FB o nazwie MAN_ChooseMode() użyć funkcji typu FC. Czy wówczas działanie będzie poprawne?

Zadanie 2

Zmodyfikuj funkcję LOG_ColumnLight w taki sposób, aby można byłą ją w szybki sposób wykorzystać do kontroli jeszcze jednej kolumny. Zakładamy, że kolejna kolumna zachowuje się w taki sam sposób, jak kolumna obecna. Modyfikacja funkcji LOG_ColumnLight() powinna być tak wykonana, że w przypadku obsługi dwóch kolumn należałoby funkcję LOG_ColumnLight() wywołać dwa razy.

 

//———-
Licencja FACTORY I/O wypożyczona dzięki uprzejmości firmy Encon-Koester Sp. z o. o. Sp. K.
Encon-Koester Sp. z o. o. Sp. k.
ul. Gagarina 4
54-620 Wrocław

ec

//————-

Kurs-wideo-CZPP

Więcej w kursie wideo: Chcę zostać programistą PLC

Nagrania są dostępne w wersji online jak również na płytach DVD. Napisz mailem, jaką wersje wybierasz.

Podziel się tym wpisem na:
  • Facebook
  • Google Bookmarks
  • Twitter
  • Wykop

Komentarz

  1. Michał

    Tragedia ten SCL pod katem czytelności kodu

    Powtórz
    1. Tomasz Gilewski (Autor postu)

      Jeżeli używałeś wcześnie języków graficznych, to pierwsze odczucie może takie być. Nie trzeba dużo czasu, aby się przyzwyczaić. Osoby, które przesiadają się z języka C lub Pascala nie mają takich trudności. Jednak pamiętaj o dużych możliwościach języka SCL.

      Powtórz

Pozostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>