Do Projektu iAutomatyka dołączyli:

https://iautomatyka.pl/wp-content/uploads/2019/08/IMG_0908.jpg

10 porad dobrego programowania sterowników PLC

autor: Kasparski.

Większość ludzi, którzy zajmują się programowaniem, zapewne zgodzi się ze stwierdzeniem, że poznanie danego języka programowania a umiejętne jego wykorzystanie w aplikacji to dwie zupełnie różne sprawy. Bez względu na to, czy zabierasz się za swój pierwszy mikrokontroler, piszesz aplikację w C# czy też uruchamiasz linię montażową, nie zostaniesz z dnia na dzień nowym Lwem Tołstojem, skoro dopiero co opanowałeś alfabet. Nierzadko nawet kilkuletnie doświadczenie to za mało, by bez zawahania nazwać samego siebie dobrym programistą.

Nie istnieje jeden niepodważalnie najlepszy sposób programowania. Zapewne ilu automatyków, tyle pomysłów na rozwiązanie danego problemu. Nauka programowania to ciągły proces, który musi uzupełniać praktyka. W miarę uzyskiwania doświadczenia nabiera się wprawy i wykształca swój własny styl prowadzenia kodu. Jeżeli pracujesz w grupie projektowej, to prędzej czy później dojdziesz do wniosku, że standaryzacja i trzymanie się pewnych ustalonych zasad jest po prostu niezbędne do efektywnej pracy.

W tym artykule podzielę się kilkoma spostrzeżeniami na temat programowania sterowników PLC. Opracowanie będzie skupiało się na językach strukturalnych takich jak język FBD (Funtion Block Diagram), język ST (Structure Text) czy język SFC (Sequance Flow Chart). Osoby, które programują w klasycznym języku drabinkowym, niestety nie znajdą informacji na jego temat. Zebrane doświadczenia będą przedstawiane na przykładzie sterowników Mitsubishi Electric i oprogramowania GX Works 3.


1. Strukturyzuj dane 

Nie stosowałeś do tej pory struktur danych? Zacznij! Zrewolucjonizują Twój kod. Struktura danych to funkcjonalność, która pozwala na gromadzenie danych różnego typu w jednej jednostce organizacyjnej. Za przykład weźmy dane potrzebne do sterowania przetwornicą częstotliwości. Do obsługi jednej osi mogą być potrzebne takie dane jak przykładowo: start CW, start CCW, stop, reset, error, kod błędu, zadana częstotliwość, monitor napięcia, monitor prądu, monitor prędkości i tym podobne. Jednym tchem można wymienić co najmniej 10 podstawowych danych, a do pełnej obsługi zazwyczaj potrzeba znacznie więcej. W przypadku gdy w projekcie mamy 10 przetwornic to już sama podstawowa obsługa wymaga od nas deklaracji co najmniej 100 zmiennych. W przypadku użycia struktury definiujemy ją tylko raz. Następnie tworzymy instancje w postaci zmiennych o danym typie struktury.

Wykorzystanie struktur oprócz błyskawicznego powielania zestawów zmiennych pozwala również znacząco uporządkować kod programu. Pomaga też w przydzielaniu adresów bez niepotrzebnego rozrzucania i pomijania wolnych rejestrów.

Rozpoczynając nowy projekt, zazwyczaj zaczynam od stworzenia podstawowych struktur:

  • stCmd do deklaracji wszystkich ogólnych komend potrzebnych w projekcie.
  • stSts – do przechowywania wszystkich statusów informujących o stanie aplikacji.
  • stPrm – do definicji zmiennych, które są parametrami maszyny (podtrzymywane bateryjnie)
  • stDI – wejścia cyfrowe
  • stDO – wyjścia cyfrowe
  • stAI – wejścia analogowe
  • stAO – wyjścia analogowe
  • stInv – do obsługi falowników
  • stSvo – do obsługi serwonapędów
  • stHMI – do obsługi panelu operatorskiego
  • stAlarm – alarmy i błędy

Częstym pytaniem, które sobie zadawałem, było: Czy zmienna, której używam, jest bardziej komendą czy bardziej parametrem? Jako parametry postanowiłem zaklasyfikować tylko te dane, które muszą być podtrzymywane bateryjnie.

Z tak przygotowanymi strukturami postępy w pracy następują bardzo szybko. Warto pamiętać o możliwości zagnieżdżania struktur, tzn. używania struktury jako składowej innej struktury. Podczas pisania kodu oprogramowanie autouzupełniania nazwy, co dodatkowo usprawnia pracę.

2. Używaj opisowych nazw zmiennych

Podczas deklaracji zmiennej postaraj się by zarówno sama nazwa, jak i ścieżka do niej prowadząca jednoznacznie określały funkcję jaką pełnią. Patrząc na zmienne Axis1.cmd.bServoOn i Axis1.sts.bServoOn nawet świeżo upieczony automatyk bez trudu rozpozna, która z nich jest poleceniem włączenia silnia, a która potwierdzeniem jego stanu. Również Tobie, nawet w przypadku powrotu do projektu po jakimś czasie, o wiele łatwiej będzie się odnaleźć, jeżeli do przechowywania pozycji silnika w pulsach i milimetrach zamiast Axis1.sts.dFeedPosition1 i Axis1.sts.dFeedPosition2 użyjesz kolejno Axis1.sts.dFeedPosition_pls oraz Axis1.sts.dFeedPosition_mm.

Dobrym zwyczajem jest określanie typu zmiennej w jej nazwie. Zazwyczaj robi się to poprzez użycie skrótu literowego określającej typ przed nazwą zmiennej. Np. stAxis1.cmd.bServoOn od razu podpowiada nam, że zmienna ServoOn jest typu bit (boolean). W swoich projektach stosuję następujące oznaczenia:

  • b – Bit;
  • w – Word [Signed];
  • u – Word [Unsigned];
  • d – Double Word [Signed];
  • ud – Double Word [Unsigned];
  • e – FLOAT [Single Precision];
  • s – String;
  • t – Time;
  • fb – function block;
  • st – structure;
  • fun – function;
  • Tablice można określać poprzez zestawienie typu danej z wielkością tablicy. Przykładowo 10-elementową tablicę zmiennych typu word zostałaby opisana skrótem: w10NazwaZmiennej a 16-elementowa tablica bitów: b16NazwaZmiennej;

Kolejną z dobrych praktyk jest wskazywanie typu danej podczas przypisywania wartości np.:

  • stAxis1.cmd.bServoOn:=True zamiast stAxis1.cmd.bServoOn:=1;
  • stAxis1.cmd.eAbsPosition:=3000.0 na miejsce stAxis1.cmd.eAbsPosition:=3000;

3. Utrzymuj porządek w kodzie

Jeżeli brałeś udział w powstawaniu dużego projektu, to zapewne już na własnej skórze przekonałeś się, że Twoim największym wrogiem jest bałagan w programie. Nie ma się co dziwić. Nie tak łatwo zapanować nad setkami linii kodu i tysiącem zmiennych, które pojawiają się i znikają w zależności od aktualnego pomysłu na rozwiązanie problemu. Ani się obejrzysz a na Twojej liście zmiennych lokalnych znajdziesz 15 pozycji o nazwie test1 z kolejnym indeksem. Czapkę śliwek temu, kto po 2 tygodniach będzie w stanie powiedzieć, co jest faktycznie wykorzystywane, a co tylko niepotrzebnie zapycha sterownik. Dlatego staraj się na bieżąco porządkować kod programu.

4. Dziel projekt na sekcje i podsekcje

Nie wrzucaj wszystkiego do jednego worka. Postaraj się w logiczny sposób ułożyć strukturę projektu i trzymaj się jej. Pamiętaj, że maszyny mogą pracować nawet kilkanaście lat i być może ktoś zupełnie nowy będzie musiał wgryźć się w Twój sposób pisania. Będąc konsekwentnym, z pewnością ułatwisz mu pracę.

W prowadzonych przez siebie projektach stosuję podział ze względu na pełnioną funkcję w projekcie. Poniżej znajdziesz listę przykładowych sekcji:

  • wykonawcza napędu,
  • do obsługi wyjść cyfrowych i analogowych,
  • do komunikacji z urządzeniami peryferyjnymi,
  • do obsługi panelu operatorskiego i receptur,
  • do obliczeń matematycznych,
  • do deklarowania alarmów i błędów maszyny,
  • do zaprogramowania sekwencji działania maszyny,
  • program główny, w którym znajdują się wszystkie pozostałe funkcjonalności.

5. Gotowe rozwiązania zamykaj w postaci bloków funkcyjnych

Czasem w zupełnie różnych projektach pojawią się dokładnie te same funkcjonalności. Jeżeli już raz poświeciłeś czas na obsługę danego mechanizmu, to poświęć mu jeszcze chwilę, by ułatwić sobie pracę w przyszłości. Zapisz go w postaci bloczka funkcyjnego.

Jeżeli to, co stworzyłeś, było wyjątkowo innowatorskie i wymagało nie lada wysiłku, to zamknięcie kodu w postaci bloku umożliwi Ci ochronę Twojej pracy. Nadanie hasła zabezpieczy newralgiczną część programu przy jednoczesnym swobodnym dostępie do reszty projektu.

6. Używaj różnych języków programowania

Do najczęściej spotykanych języków programowania sterowników PLC możemy zaliczyć:

  • język FBD (Funtion Block Diagram);
  • język ST (Structure Text);
  • język SFC (Sequance Flow Chart);
  • język LD (Ladder Diagram);

Każdy z nich posiada swoje wady i zalety. Dlatego wybrany język do jednych zastosowań nadaj się wyśmienicie, a w innym przypadku praca na nim mogłaby być prawdziwą udręką. W swoich projektach zazwyczaj, w zależności od realizowanej funkcji, używam następujących języków:

W programie głównym umieszczam zazwyczaj dużą ilość bloczków funkcyjnych. Dzięki dużej przejrzystości języka FBD ich obsługa staję się bardzo intuicyjna.

Z kolei do prowadzenia obliczeń stosuję język ST. Wyśmienicie nadaje się on do zapisywania długich działań matematycznych. Umożliwia również łatwą konwersję danych bez konieczności tworzenia dodatkowych zmiennych np.:

ePredkoscLiniowaWalka := ePromienWalka * Int_to_real(wPredkoscKatowaSilnika);

Język SFC idealnie nadaje się do programowania kolejności następujących po sobie zdarzeń, dlatego używam go do pisania sekwencji pracy maszyny. Podobną funkcjonalność można też uzyskać za pomocą języka ST, stosując tzw. mechanizm maszyny stanu. Elementy składowe algorytmu można łatwo rozbudowywać poprzez użycie dostępnej w języku ST funkcji case. Gwarantuje ona również, że kolejny punkt maszyny stanu zostanie wykonany dopiero w następnym skanie cyklu PLC.

Wszelkie błędy zgłaszane przez maszynę powinny być możliwe do zlokalizowania i zinterpretowania bez zbędnego zagłębiania się w kod. Podprogram, w którym znajduje się obsługa alarmów, powinien być napisany tak czytelnie, jak to tylko możliwe. Cechę tą zapewniają: język FBD i język drabinkowy LD. Do LD często przyzwyczajony jest dział utrzymania ruchu, co jest jego dodatkowym atutem. Ostatnim elementem, o którym chciałbym wspomnieć, są funkcje i bloczki funkcyjne. Programowanie ich w języku ST daje dużą elastyczność przy przenoszeniu gotowych rozwiązań na inne sterowniki. Zwykłe „Ctr+C”, „Ctr+V” potrafi zaoszczędzić godziny pracy. Jeżeli dany bloczek funkcyjny przewidziany jest do wielokrotnego użycia w programie, a trzeba ograniczać ilość kroków sterownika, to można pokusić się o użycie języka LD. Zajmuje on najmniej miejsca w sterowniku.

7. Stosuj techniki redukujące liczbę kroków programu

Istnieje wiele sposób sposobów na osiągnięcie tego samego efektu przy użyciu różnej składni programu. Producenci PLC doskonale znają swój kompilator i zdają sobie sprawę z jego mocnych stron. Dlatego warto wczytać się w ich rekomendacje dotyczące sposobu redukcji liczby kroków programu. Poniżej zamieszczam kilka porad od Mitsubishi Electric.

  • Wykonuj wyliczenia numeru elementu tabeli na zewnątrz indeksu:

  • Przypisuj adresy zmiennym globalnym:

  • Używaj odpowiedniego typu bloków funkcyjnych, w zależności od planowej liczby wywołań:

  • Staraj się unikać niepotrzebnych konwersji danych:

8. Zakładaj rezerwową liczbę zmiennych

W miarę postępu prac zazwyczaj liczba zmiennych powiększa się w nieprzewidywalny sposób. Czasem przyczyną są powody, które trudno było przewidzieć na początku projektu, a czasem nowe wymagania maszyny. Jeżeli przed rozpoczęciem projektu szacujesz jaki blok danych będzie potrzebny na daną funkcjonalność, to przemnóż swój wynik przynajmniej razy 1.5. Unikniesz dzięki temu problematycznego przebudowywania struktury pamięci sterownika i licznych błędów z tym związanych.

9. Przechowywanie kolejnych wersji

Rada ta dotyczy nie tyle programowania, ile zapisu kolejnych wersji programu. Jeżeli otwierając swój ostatni projekt, znajdziesz w katalogu pliki o nazwach: Projek1, Projek1Final, Projek1Final2, Projekt1Final3, Projek1FinalFinal, Projek1FinalFinal2… – to ta rada jest właśnie dla Ciebie. Zamiast silić się na nowe, coraz bardziej finezyjne nazwy, stosuj nazewnictwo z wykorzystaniem daty i godziny powstania pliku. Polecam następujący format: NazwaProjektu_RRRRMMDD_GGMM. Dzięki temu pliki będą uporządkowane chronologicznie, a Ty z łatwością odnajdziesz się w postępie prac.


10. Bądź ostrożny

Sterownik PLC to nie komputer. Jeżeli zrobisz w nim jakiś nieprzemyślany błąd, to zamiast irytującego okienna z exception error możesz urwać przysłowiową „wirującą masę na sprężynie”. Dlatego nowe projekty zawsze zaczynaj od obsługi funkcji bezpieczeństwa. Przetestuj je, zanim zabierzesz się za pozostałe funkcjonalności. Uruchamiając coś po raz pierwszy, pamiętaj o trzymaniu ręki na grzybie bezpieczeństwa. Możesz w okamgnieniu uszkodzić mechanikę lub – co gorsza – zrobić krzywdę sobie i innym. W dalszej kolejności, po zadbaniu o bezpieczeństwo, zajmij się trybem serwisowym i ręcznym, a dopiero na samym końcu pracą automatyczną.

Podsumowanie

W ostatnich czasach widać coraz silniejszy trend przenikania się światów IT i automatyki. Funkcjonalności, które jeszcze niedawno zarezerwowane były dla komputerów, już dziś stają się standardem w sterownikach PLC. Umiejętności takie jak obsługa baz danych, programowanie web serwera czy znajomość języków programowania wysokiego poziomu już wkrótce mogą dołączyć do katalogu niezbędnych kwalifikacji każdego automatyka. Wypracowanie solidnych zasad programowania sterowników PLC jest z pewnością dobrą podstawą do dalszego rozwoju w tych kierunkach.

Artykuł został nagrodzony w Konkursie iAutomatyka – edycja Sierpień 2019

Nagrodę Stripax + zestaw gadżetów  dostarcza ambasador konkursu, firma Weidmüller.



Utworzono: / Kategoria: , ,

Reklama



PRZECZYTAJ RÓWNIEŻ



NAJNOWSZE PUBLIKACJE OD UŻYTKOWNIKÓW I FIRM

Reklama



POLECANE FIRMY I PRODUKTY
  • ITP14 to uniwersalny wyświetlacz procesowy do monitorowania i kontroli procesów przemysłowych. To urządzenie ma zwartą, znormalizowaną konstrukcję i pasuje do standardowego otworu montażowego ⌀22,5 mm na lampy sygnalizacyjne. Zapewnia to sz...
  • Ten kurs zawiera podstawy z dziedziny serwomechanizmów. Składa się z pierwszego modułu wprowadzającego, pełnego kursu o serwomechanizmach. Mini kurs przeprowadzi Cię przez podstawowe zagadnienia związane z serwomechanizmami. Zaczniemy od sa...
  • Systemy RFID są ekonomiczne, uniwersalne i zapewniają niezawodność procesów, np. w intralogistyce. Zadania związane z identyfikacją stały się teraz łatwiejsze, szczególnie gdy potrzebna jest duża liczba punktów identyfikacji, dzięki  głowic...
  • Obsługa za pomocą urządzeń mobilnych zapewnia wygodę i ciągłość pracy Operatorzy maszyn mogą teraz płynnie przełączać kontrolę nad maszyną między głównym interfejsem HMI a urządzeniami mobilnymi. Nowa funkcja systemu mapp View firmy B&R...
  • PR200 to uniwersalne i łatwe w obsłudze urządzenie zaprojektowane w plastikowej obudowie do montażu na szynie DIN jako alternatywa dla PLC. Przekaźnik jest dostępny w kilku wersjach dla napięcia stałego i przemiennego. Jest wyposażony w cyf...
  • Autor: Paweł Wiącek, Kierownik Produktu Czujniki Przemysłowe, SICK Sp. Z o.o. SLT – Smart Light Tower, czyli inteligentna optyczna kolumna sygnalizacyjna pracująca po IO-Link   SLT zapewnia elastyczność w wizualizacji przebiegu procesó...