Do Projektu iAutomatyka dołączyli:

Publikacja zgłoszona do 🎁 Konkursu iAutomatyka

10 porad programowania sterowników PLC

4963 wyświetleń, 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 FBD (Funtion Block Diagram), ST (Structure Text) czy 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ć:

  • FBD (Funtion Block Diagram);
  • ST (Structure Text);
  • SFC (Sequance Flow Chart);
  • 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. 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, co 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.

Od Redakcji: dyskusja na temat tego artykułu odbywa się w Klubie Automatyka. Warto tam zajrzeć gdyż pojawiło się sporo ciekawych komentarzy.

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

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

Newsletter

Zapisz się i jako pierwszy otrzymuj nowości!

Zapoznałem się i akceptuję klauzulę informacyjną.
26 sierpnia 2019 / Kategoria: , ,

Reklama

NAJNOWSZE PUBLIKACJE OD UŻYTKOWNIKÓW I FIRM

>KLIKNIJ<

MAXOLUTION® – factory automation według SEW-EURODRIVE

MAXOLUTION® – factory automation według SEW-EURODRIVE

>KLIKNIJ<

Sterowanie ogrodem – LOGO 8 z web serwerem

Sterowanie ogrodem – LOGO 8 z web serwerem

>KLIKNIJ<

Automatyczny Podcast #20: Automatyczny Podcast od kuchni, czyli kulisy powstania audycji o automatyce

Automatyczny Podcast #20: Automatyczny Podcast od kuchni, czyli kulisy powstania audycji o automatyce

>KLIKNIJ<

Pomiary z wykorzystaniem promieniowania jonizującego? Rozpad atomowy w przemyśle

Pomiary z wykorzystaniem promieniowania jonizującego? Rozpad atomowy w przemyśle

>KLIKNIJ<

WARSZTATY SZKOLENIOWE: WPROWADZENIE DO CYBERBEZPIECZEŃSTWA SYSTEMÓW AUTOMATYKI WG IEC 62443

WARSZTATY SZKOLENIOWE: WPROWADZENIE DO CYBERBEZPIECZEŃSTWA SYSTEMÓW AUTOMATYKI WG IEC 62443

>KLIKNIJ<

VII Mistrzostwa Polski Branży Automatyki Przemysłowej w Piłce Nożnej – P+F Cup ’20

VII Mistrzostwa Polski Branży Automatyki Przemysłowej w Piłce Nożnej – P+F Cup ’20

>KLIKNIJ<

Gromadzenie danych w Przemyśle 4.0. to szansa dla polskich firm

Gromadzenie danych w Przemyśle 4.0. to szansa dla polskich firm

>KLIKNIJ<

Automatyka + IT w optymalizacji produkcji. Jak wykorzystałem easyE4 w aplikacji klasy OEE

Automatyka + IT w optymalizacji produkcji. Jak wykorzystałem easyE4 w aplikacji klasy OEE

>KLIKNIJ<

Łatwo i niedrogo – integrujemy system wizyjny

Łatwo i niedrogo – integrujemy system wizyjny

>KLIKNIJ<

Zdalne programowanie sterowników Beckhoff z użyciem chmury

Zdalne programowanie sterowników Beckhoff z użyciem chmury

>KLIKNIJ<

Małe, wielozadaniowe: wyświetlacze temperatury i wartości procesowych firmy akYtec

Małe, wielozadaniowe: wyświetlacze temperatury i wartości procesowych firmy akYtec

>KLIKNIJ<

Wykorzystaj Automaticon, żeby poszerzyć swoją wiedzę! Bezpłatne seminaria 18 marca

Wykorzystaj Automaticon, żeby poszerzyć swoją wiedzę! Bezpłatne seminaria 18 marca

>KLIKNIJ<

Co musisz wiedzieć o wykorzystaniu laserów w przemyśle? Wywiad z Panasonic Industry

Co musisz wiedzieć o wykorzystaniu laserów w przemyśle? Wywiad z Panasonic Industry

>KLIKNIJ<

Programowanie PLC od podstaw – kurs dla automatyków i elektryków odc. 5 – Jak odmierzać czas w programie sterującym i jak konfigurować timery?

Programowanie PLC od podstaw – kurs dla automatyków i elektryków odc. 5 – Jak odmierzać czas w programie sterującym i jak konfigurować timery?

>KLIKNIJ<

Mini-PLC w technologii chłodzenia

Mini-PLC w technologii chłodzenia

>KLIKNIJ<

Automatyczny Podcast #19: Silnik elektryczny

Automatyczny Podcast #19: Silnik elektryczny

>KLIKNIJ<

Odwiedź nas na targach Food Tech Expo w Nadarzynie | 3-5 marca 2020

Odwiedź nas na targach Food Tech Expo w Nadarzynie | 3-5 marca 2020

>KLIKNIJ<

„System nerwowy” Przemysłowego Internetu Rzeczy

„System nerwowy” Przemysłowego Internetu Rzeczy

>KLIKNIJ<

Systemy diagnostyki drgań silników i napędów

Systemy diagnostyki drgań silników i napędów

>KLIKNIJ<

Przekaźnik czasowy – działanie, budowa i zastosowanie

Przekaźnik czasowy – działanie, budowa i zastosowanie





MOŻESZ SIĘ TYM ZAINTERESOWAĆ

  • Pomiar odległości to jedna z podstawowych dziedzin w technologii czujników. Do określania położenia w różnorodnych zastosowaniach wykorzystywana jest szeroka gama procesów. Firma Pepperl+Fuchs już teraz – w odróżnieniu od konkurencji ...
  • Poniższy poradnik jest zbiorem schematów połączeń elektrycznych. W poradniku zapoznamy się z podstawami wprowadzenia do systemów przekaźnikowych, sekwencji przełączeń przekaźników, porównania systemów przekaźnikowych z systemami tradycyjnym...
  • 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...
  • Seria EX-Z Czujniki z serii EX-Z to jedne z najmniejszych urządzeń tego typu na świecie. Najcieńszy model posiada grubość jedynie 3 mm co zostało osiągnięte przez zastosowanie nowych półprzewodników i dzięki temu wyeliminowanie przewodów. B...
  • Przy użyciu flexROOM® można szybko i łatwo realizować automatykę budynkową na potrzeby biur i budynków administracyjnych, zgodną z obowiązującymi normami i efektywną energetycznie. flexROOM® to szeroki wachlarz rozwiązań dla automatyki budy...
  • ROUTER VPN EWON COSY 131 Zapewnia sprawny i prosty w obsłudze zdalny dostęp do dowolnego urządzenia Kompatybilność z najważniejszymi markami i protokołami sterowników PLC (m.in. Siemens, Allen-bradley, Omron…) Szybie zarządzenie roote...



KATEGORIE ARTYKUŁÓW
POLECANE ARTYKUŁY
Wydarzenia