Algorytm GRAFCET: Jak programować sterowniki PLC metodą GRAFCET

GRAFCET porządkuje programowanie sterowników PLC, ale sam graf nie gwarantuje poprawnego działania maszyny. Główne znaczenie mają zasady przechodzenia między etapami, obsługa równoległych gałęzi oraz sposób przeniesienia grafu do drabinki lub tekstu strukturalnego. W artykule wyjaśniamy, jak działa GRAFCET, jak uniknąć błędów wynikających z kolejności szczebli i jak krok po kroku zbudować niezawodny program dla sterownika PLC.

Algorytm GRAFCET: co jest w grafie, a czego w nim nie ma

Graf opisuje zachowanie układu sterowania, nie jego konstrukcję. Etapy są stanami, przejścia niosą warunki (receptywności), a akcje przypisane do etapów mówią, co sterownik robi, gdy dany etap jest aktywny. Strzałki łączą etap z przejściem, przejście z etapem, i tak naprzemiennie. Etap nigdy nie sąsiaduje bezpośrednio z etapem, a przejście z przejściem. Ta naprzemienność przydaje się przy kodowaniu, bo każdy element grafu ma swój odpowiednik w pamięci sterownika.

O czym graf nie mówi, to kolejność przeliczania szczebli, czas cyklu i sposób odświeżania wyjść. Z jednego poprawnego grafu można więc napisać dwa programy, które na maszynie zachowają się różnie. Graf jest specyfikacją, a program realizacją. Zasady przejścia od jednego do drugiego są zapisane w normie PN-EN 60848, która opisuje GRAFCET, a nie w instrukcji konkretnego producenta sterownika.

Przewaga metody pojawia się dopiero przy kodzie, który powtarza strukturę grafu. Technolog, mechanik i programista czytają wtedy ten sam rysunek, a zmiana procesu sprowadza się do dopisania etapu i przejścia w grafie oraz w jednym, przewidywalnym miejscu programu. Jeśli kod jest pisany „na wyczucie”, rysunek i program rozjeżdżają się po pierwszej poprawce na rozruchu. Zaleta czytelności znika wtedy bez śladu.

Reguły ewolucji grafu, na których opiera się cały kod

Ewolucję grafu opisuje kilka reguł. Programisty dotyczą przede wszystkim te o kolejności i jednoczesności, bo tu najczęściej psuje się tłumaczenie na kod. Na początku aktywne są wyłącznie etapy początkowe, a wszystkie pozostałe są nieaktywne. Przejście jest odblokowane, gdy wszystkie etapy bezpośrednio je poprzedzające są aktywne. Przejście odblokowane z prawdziwą receptywnością zostaje przekroczone, i to bez zwłoki oraz bez możliwości odroczenia. Przekroczenie dezaktywuje wszystkie etapy poprzedzające i aktywuje wszystkie następujące.

Receptywność bywa poziomem (czujnik jest załączony) albo zdarzeniem (zbocze narastające sygnału). W drugim przypadku sam bit z wejścia nie wystarczy. Potrzebny jest detektor zbocza, który daje prawdę na jeden cykl, bo w innym razie warunek będzie spełniony tak długo, jak trwa sygnał.

Jednoczesność przekroczeń

Gdy w tej samej chwili gotowych jest kilka przejść, wszystkie są przekraczane jednocześnie. Graf nie przewiduje między nimi żadnej kolejności. Dotyczy to równoległych gałęzi po rozgałęzieniu typu AND, a także niezależnych części tego samego grafu. Program odtwarza tę regułę tylko wtedy, gdy wszystkie przejścia ocenia na stanie z początku cyklu, zanim którykolwiek etap zmieni wartość. Jeśli kod zmienia etap i od razu ocenia następne przejście, wynik zależy od kolejności szczebli, a w grafie takiej zależności nie ma.

Osobny przypadek to rozgałęzienie typu OR, czyli wybór ścieżki. Graf sam nie rozstrzyga, którą wybrać, gdy prawdziwe są dwie receptywności naraz. Autor musi albo wykluczyć je wzajemnie w warunkach, albo nadać jednej priorytet, i dopiero to trafia do kodu.

Etap aktywowany i dezaktywowany w tej samej chwili

Zdarza się, że jedno przekroczenie ma aktywować etap, a inne w tym samym momencie go dezaktywować. Najczęściej dzieje się tak w pętli albo tam, gdzie dwie gałęzie schodzą się w jednym etapie. Według reguły etap pozostaje wtedy aktywny, a aktywacja wygrywa z dezaktywacją. W drabince przekłada się to na dwa sposoby: albo szczebel kasujący stoi przed ustawiającym, albo etap jest komórką z dominacją ustawiania. Przy odwróconej kolejności etap zgaśnie w cyklu, w którym graf wymaga, żeby żył, a maszyna zatrzyma się bez widocznego powodu.

Którą drogą z grafu do sterownika

Wybór zależy od tego, z czego korzysta programista. Jeśli środowisko udostępnia język SFC, graf można przenieść niemal wprost. Przed uruchomieniem trzeba jednak sprawdzić w dokumentacji, jak dostawca wykonuje przejścia i czy obsługuje akcje warunkowe, bo SFC w sterowniku bywa podzbiorem GRAFCET. Gdy sterownik ma tylko drabinkę, rozwiązaniem są komórki bistabilne, po jednej na etap. Przy sterownikach z tekstem ustrukturyzowanym naturalna jest maszyna stanów. Wszystkie trzy drogi prowadzą do tego samego zachowania, o ile odtworzą reguły z poprzedniej części.

Jak programować sterowniki PLC metodą GRAFCET w języku drabinkowym

Kod drabinkowy z komórkami bistabilnymi ma ściśle ustaloną kolejność działań i dobrze się ją sprawdza z grafem w ręku. Najpierw powstają deklaracje, potem szczeble przejść, następnie etapy, a na końcu wyjścia. Poniższa lista jest procedurą, którą można odhaczać przy każdym nowym grafie.

  1. Zadeklaruj po jednym bicie na każdy etap i po jednym na każde przejście. Etapy początkowe ustaw przy pierwszym cyklu programu lub przy zimnym starcie, a pozostałe wyzeruj.
  2. Dla każdego przejścia zapisz szczebel, w którym bit przejścia jest iloczynem wszystkich etapów poprzedzających i receptywności. Jeśli receptywność jest zdarzeniem, użyj detektora zbocza.
  3. Dla każdego etapu zapisz ustawianie od przejść wchodzących (przy kilku wchodzących połącz je sumą logiczną) i kasowanie od przejść wychodzących. Szczebel kasujący umieść przed ustawiającym.
  4. Szczeble przejść trzymaj w bloku wcześniejszym niż szczeble etapów. Żadne przejście nie może czytać etapu, który w tym samym cyklu zmienił się wyżej.
  5. Wyjścia zapisz w ostatnim bloku, po jednej cewce na wyjście. Warunkiem jest suma logiczna etapów, w których to wyjście ma być załączone.
  6. Timery i liczniki uruchamiaj aktywnością etapu, a ich wyjście wstaw do receptywności przejścia, które etap opuszcza.

Dlaczego przejścia mają osobne bity? Bo bit przejścia zamraża stan z początku cyklu. Etapy zmieniają się dopiero w drugim bloku i żadne przejście nie widzi zmiany, którą wywołało jego sąsiednie. Rozgałęzienie równoległe wymaga wtedy jednego bitu przejścia, który ustawia kilka etapów naraz. Zbieżność działa podobnie, tyle że bit przejścia czeka na wszystkie etapy gałęzi. Żaden z tych przypadków nie potrzebuje specjalnego szczebla, więc kod pozostaje schematyczny.

Przeczytaj także:  Wprowadzenie do technologii Pick by Voice

Jedna uwaga o wyjściach. Cewka tego samego wyjścia w kilku miejscach programu kończy się tym, że działa ostatnia. Dlatego akcje etapów zbiera się w jednym bloku jako sumę logiczną. Jest to też jedyne miejsce, które trzeba przejrzeć, gdy ktoś pyta, dlaczego zawór jest załączony.

Ile kosztuje zła kolejność szczebli: kalkulacja na jednym grafie

Rachunek opiera się na przyjętych założeniach, a nie na pomiarze. Graf jest liniowy, ma osiem etapów (X0 jako początkowy, potem X1–X7) i siedem przejść T1–T7, gdzie Tk łączy X(k−1) z Xk. Cykl programu trwa 10 ms. Wyjścia fizyczne sterownik zapisuje na końcu cyklu, z obrazu procesu. Przypadek skrajny to taki, w którym receptywności wszystkich przejść są prawdziwe od startu, na przykład czujniki położenia są załączone, a przycisk startu trzymany.

Trzy sposoby ułożenia szczebli

W wersji pierwszej przejście i zmiana etapu leżą w jednym szczeblu, a szczeble idą rosnąco od X0. W pierwszym cyklu X0 przekazuje aktywność do X1, ten od razu do X2 i tak dalej do X7. Cały graf zostaje przebiegnięty w jednym cyklu, czyli w 10 ms. Na końcu cyklu aktywny jest tylko X7, więc wyjścia przypisane do X1–X6 nie dostały ani jednego zapisu na zewnątrz. Siłowniki pominęły sześć ruchów, choć w programie „wszystko się zgadza”.

W wersji drugiej szczeble idą malejąco, od X7 do X0. Przejście X6→X7 jest oceniane przed X5→X6, więc w jednym cyklu aktywność przesuwa się najwyżej o jeden etap. Siedem przejść zajmuje wtedy siedem cykli, czyli 70 ms (siedem razy 10 ms), a każdy etap pośredni żyje co najmniej jeden pełny cykl i dostaje własny zapis wyjść. Metoda działa, ale jest krucha. Graf z pętlą nie ma kolejności szczebli, która omijałaby problem w całości, bo któraś strzałka zawsze idzie w odwrotną stronę. Wstawienie nowego szczebla w złe miejsce cofa efekt bez żadnego komunikatu.

Wersja trzecia to bity przejść obliczane w osobnym bloku przed etapami, jak w procedurze wyżej. Czas jest taki jak w drugiej, 70 ms, ale wynik nie zależy już od kolejności bloków ani od późniejszych poprawek. Za niezależność płacisz siedmioma dodatkowymi bitami, czyli piętnastoma zamiast ośmiu, oraz siedmioma szczeblami przejść więcej. Etapy wymagają łącznie szesnastu cewek: osiem ustawiających (z inicjalizacją) i osiem kasujących (z zerowaniem końcowym). Przy kilkudziesięciu etapach przyrost pamięci jest rzędu kilkudziesięciu bitów, więc liczy się raczej czytelność programu niż zasób sterownika.

Wzór ogólny jest prosty: przy poprawnym wykonaniu graf liniowy z n przejściami potrzebuje co najmniej n cykli, czyli n razy czas cyklu, jeśli wszystkie receptywności są od początku spełnione. Gdy ten czas jest za długi dla procesu, skraca się go przez skrócenie cyklu albo przez przeprojektowanie grafu na gałęzie równoległe, a nie przez kolejność szczebli.

Maszyna stanów w tekście ustrukturyzowanym

W języku tekstowym ta sama logika wychodzi krócej, a reguła jednego przejścia na cykl wynika z samej konstrukcji. Zmienna całkowita lub typ wyliczeniowy przechowuje numer aktywnego etapu. Instrukcja CASE wykonuje tylko gałąź bieżącego stanu, a w niej instrukcje IF sprawdzają receptywności wychodzących przejść. Po spełnieniu warunku do zmiennej stanu trafia numer następnego etapu, a zmiana obowiązuje od następnego cyklu. Nie ma szansy, żeby etap „przeskoczył” dalej w tym samym przebiegu, więc kłopot z kolejnością szczebli nie istnieje.

Wyjścia i akcje w osobnym bloku

Wyjścia przypisuje się po instrukcji CASE, w oddzielnym fragmencie, który porównuje zmienną stanu z numerami etapów. Akcje ciągłe to zwykłe przypisanie warunkowe. Akcję jednorazową przy wejściu w etap rozpoznasz po różnicy między stanem bieżącym a stanem zapamiętanym z poprzedniego cyklu, a tę zmienną aktualizujesz na samym końcu. Dzięki temu logika przejść i logika wyjść nie mieszają się w jednej gałęzi, a zmiana akcji nie wymaga ruszania warunków.

Gałęzie równoległe

Jedna zmienna stanu opisuje jeden aktywny etap, więc rozgałęzienie typu AND jej nie obsłuży. Każda gałąź dostaje własną zmienną stanu i własną instrukcję CASE, a gałąź nadrzędna uruchamia je jednym przejściem. Zbieżność sprawdza, czy wszystkie gałęzie dotarły do swoich ostatnich etapów, i dopiero wtedy przekracza przejście wyjściowe. Wymagana jest przy tym dyscyplina: przejścia zbieżności ocenia się na stanach z początku cyklu, bo inaczej wraca zależność od kolejności, tylko już nie w szczeblach, lecz w wierszach kodu.

Warunki brzegowe i weryfikacja przed uruchomieniem

Po zakończeniu kodowania sprawdza się trzy rzeczy, które graf pomija. Pierwsza to stan po zaniku zasilania. Trzeba zdecydować, czy etapy są pamiętane, czy sterownik wraca do początkowego, i zapisać to w specyfikacji, bo samo rysowanie grafu o tym nie przesądza. Druga to zatrzymanie awaryjne. Łańcuch bezpieczeństwa należy do sprzętu, a nie do kodu, ale po jego zwolnieniu program musi wiedzieć, od którego etapu startuje. Trzecia to zdublowane wyjścia, czyli dokładnie jedno miejsce zapisu dla każdego.

W pierwszej kolejności szuka się dwóch objawów błędnej synchronizacji: dwóch aktywnych etapów w jednej gałęzi liniowej oraz braku zapisu wyjścia w etapie, który „na rysunku” istnieje. Pomaga symulator, na przykład w stylu FluidSIM, który uruchamia graf bez maszyny, oraz podgląd bitów etapów online w środowisku sterownika. Dobrze też pokazać graf technologowi, który zna proces, przed pierwszym rozruchem, bo to on najszybciej zauważy brakującą receptywność. Poprawka jest wtedy edycją grafu, a nie poszukiwaniem błędu w programie.

W procesie przygotowania tekstu korzystaliśmy z narzędzi generatywnej AI. Przed publikacją artykuł sprawdziła i zweryfikowała redakcja.

Algorytm GRAFCET: Jak programować sterowniki PLC metodą GRAFCET
Przewiń na górę