Programowanie funkcyjne w PLC a FBD - co warto wiedzieć

Leonard Wojciechowski .

19 kwietnia 2026

Schemat przedstawia strukturę programu, gdzie "OB Main" komunikuje się z "Block 1" i "Block 2", ilustrując zastosowanie języka funkcyjnego.

Gdy trzeba opisać obliczenia, logikę sterowania albo przetwarzanie sygnałów z czujników, sposób myślenia oparty na funkcjach potrafi znacząco uporządkować projekt. Wyjaśniam, czym jest język funkcyjny, czym różni się od języka FBD używanego w automatyce oraz kiedy podejście funkcyjne pomaga w programowaniu sterowników PLC, układów regulacji i systemów nadzoru.

Funkcje porządkują kod i ułatwiają przewidywalne sterowanie

  • Dwie różne idee często kryją się pod podobnymi nazwami: programowanie funkcyjne oraz graficzne bloki funkcyjne FBD.
  • Czysta funkcja zwraca wynik na podstawie danych wejściowych i nie zmienia ukrytego stanu systemu.
  • Automatyka PLC korzysta głównie z FBD, ST, LAD i SFC zgodnych z rodziną norm IEC 61131-3.
  • Największa korzyść to modularność, łatwiejsze testowanie i ponowne wykorzystanie fragmentów programu.
  • Najważniejsze ograniczenie polega na tym, że rzeczywisty sterownik musi obsługiwać czas, pamięć, wejścia, wyjścia i stany urządzeń.

Schemat logiczny myjni samochodowej, wykorzystujący język funkcyjny do sterowania procesem.

Co oznacza to określenie w programowaniu

Programowanie funkcyjne opisuje działanie aplikacji za pomocą funkcji przypominających funkcje matematyczne. Dla tych samych danych wejściowych funkcja powinna zwrócić ten sam wynik, bez zmieniania przypadkowych zmiennych, rejestrów czy elementów otoczenia.

W klasycznym podejściu imperatywnym program mówi przede wszystkim, co ma zostać wykonane po kolei. W podejściu funkcyjnym ważniejsze jest opisanie, jak przekształcić dane. Zamiast zmieniać jedną zmienną w kilku miejscach, buduje się mniejsze operacje i łączy je w większą całość.

Najważniejsze cechy podejścia funkcyjnego

  • Niezmienność danych, czyli unikanie nadpisywania wartości w trakcie obliczeń.
  • Czyste funkcje, które nie mają ukrytych skutków ubocznych.
  • Funkcje wyższego rzędu, mogące przyjmować inne funkcje jako argumenty lub zwracać je jako wynik.
  • Kompozycja, czyli budowanie większego algorytmu z mniejszych, łatwych do sprawdzenia elementów.
  • Opis zależności zamiast ręcznego sterowania każdym krokiem programu.

Przykładowo funkcja przeliczająca sygnał z przetwornika temperatury może otrzymać wartość surową, zakres pomiarowy i parametry czujnika, a następnie zwrócić temperaturę w stopniach Celsjusza. Nie musi wiedzieć, z którego modułu wejściowego pochodzi sygnał. Dzięki temu łatwo wykorzystać ją ponownie w kilku maszynach.

Trzeba jednak zachować ważne rozróżnienie. Programowanie funkcyjne jest paradygmatem projektowania oprogramowania, a nie jedną konkretną składnią. Języki takie jak Haskell, Erlang, F# czy częściowo Scala mocno wspierają ten sposób pracy, natomiast wiele popularnych języków, w tym Python, C# i JavaScript, tylko udostępnia wybrane mechanizmy funkcyjne.

Jak łączy się z automatyką i sterowaniem

W automatyce spotykam dwa pojęcia, które łatwo pomylić. Pierwszym jest opisany wyżej paradygmat funkcyjny, a drugim FBD, czyli Function Block Diagram, po polsku graficzny język bloków funkcyjnych. FBD przedstawia program za pomocą bloków i połączeń sygnałowych, ale samo użycie bloków nie oznacza jeszcze programowania funkcyjnego w ścisłym, matematycznym sensie.

Norma IEC 61131-3 opisuje języki i elementy wykorzystywane w sterownikach programowalnych, między innymi Structured Text, Ladder Diagram, Function Block Diagram i Sequential Function Chart. W praktyce oznacza to, że automatyk może dobrać sposób zapisu do zadania, zamiast próbować rozwiązywać całą aplikację jednym językiem.

Funkcja a blok funkcyjny

Element Jak działa Typowe zastosowanie
Funkcja Zwykle zwraca wynik na podstawie wejść i nie przechowuje własnego stanu Skalowanie pomiaru, obliczenia, konwersje, kontrola zakresu
Blok funkcyjny Może przechowywać stan między kolejnymi cyklami sterownika Timer, licznik, regulator PID, sekwencja ruchu
Blok FBD Graficznie łączy funkcje, bloki i sygnały Logika procesu, sterowanie zaworami, napędami i alarmami

Różnica ma znaczenie przy urządzeniach zależnych od czasu. Timer TON musi pamiętać, kiedy rozpoczęło się odliczanie, a regulator PID przechowuje między innymi uchyb całkujący. To nie jest już prosta funkcja matematyczna, lecz element ze stanem, który zachowuje informacje między kolejnymi cyklami programu.

Właśnie dlatego nie nazywam każdego programu z blokami funkcyjnymi programowaniem funkcyjnym. Trafniej powiedzieć, że FBD korzysta z modularnego modelu blokowego, który częściowo przypomina komponowanie funkcji. Dla codziennej pracy projektanta PLC to podobieństwo jest bardzo użyteczne, ale nie powinno prowadzić do błędnych wniosków.

Gdzie podejście funkcyjne daje realną przewagę

Najlepsze efekty widać tam, gdzie instalacja przetwarza dużo podobnych sygnałów. Jeśli mamy 20 czujników temperatury, nie ma sensu tworzyć 20 niezależnych wersji tego samego algorytmu. Lepiej przygotować jedną funkcję do skalowania, filtracji i kontroli zakresu, a potem wywoływać ją dla kolejnych kanałów.

Przetwarzanie pomiarów

Typowy łańcuch może wyglądać tak: odczyt wartości surowej, przeliczenie na jednostkę fizyczną, filtr dolnoprzepustowy, sprawdzenie limitów i przekazanie wyniku do regulatora. Każdy etap powinien mieć jedno jasno określone zadanie. Gdy odczyt zaczyna być niestabilny, łatwiej wtedy ustalić, czy problem leży w skalowaniu, filtrze, przewodzie czy samym czujniku.

Logika alarmowa

Funkcje pomagają również przy alarmach. Zamiast mieszać warunki awarii silnika, brak potwierdzenia stycznika i przekroczenie temperatury w jednym dużym fragmencie programu, można rozdzielić je na osobne testy. Taka struktura ułatwia diagnostykę, zwłaszcza gdy operator musi szybko ustalić, dlaczego maszyna zatrzymała cykl.

Regulacja i obliczenia technologiczne

W sterowaniu temperaturą, ciśnieniem lub prędkością często pojawiają się obliczenia, które można zapisać jako niezależne funkcje. Przykładem jest wyznaczenie wartości zadanej na podstawie receptury, kompensacja wpływu temperatury otoczenia albo ograniczenie sygnału wyjściowego do zakresu 0-100 procent.

W mojej ocenie największą zaletą nie jest sama elegancja kodu, tylko powtarzalność zachowania. Jeżeli ta sama funkcja przelicza sygnał w całej instalacji, poprawka wykonana w jednym miejscu może usunąć błąd z wielu podobnych fragmentów. Trzeba oczywiście ponownie przetestować wszystkie scenariusze, bo centralna zmiana może wpłynąć na kilka maszyn naraz.

Przeczytaj również: Telemetria przemysłowa - jak zbudować zdalny pomiar?

Przykład funkcji w Structured Text

Poniższy przykład pokazuje prostą funkcję ograniczającą wartość do ustalonego przedziału. To mały element, ale w automatyce przydaje się przy zadawaniu prędkości, otwarcia zaworu albo mocy grzałki.

FUNCTION LimitValue : REAL
VAR_INPUT
    Value : REAL;
    MinValue : REAL;
    MaxValue : REAL;
END_VAR

IF Value < MinValue THEN
    LimitValue := MinValue;
ELSIF Value > MaxValue THEN
    LimitValue := MaxValue;
ELSE
    LimitValue := Value;
END_IF;

Ta funkcja nie zna urządzenia, operatora ani trybu pracy. Dostaje dane i zwraca wynik, więc można ją łatwo sprawdzić testami. W realnym projekcie dodałbym jeszcze kontrolę błędnych parametrów, na przykład sytuacji, w której wartość minimalna jest większa od maksymalnej.

Jak wybrać podejście do projektu PLC

Nie ma jednego języka najlepszego dla każdej aplikacji. Wybór zależy od wielkości programu, doświadczenia zespołu, wymagań serwisowych i rodzaju sterowanego procesu. Dla małej szafy, którą będzie utrzymywał elektryk, przejrzysty LAD lub FBD może być praktyczniejszy niż rozbudowany kod tekstowy.

Potrzeba w projekcie Najczęściej wygodne rozwiązanie Dlaczego
Prosta logika załączeń i blokad LAD lub FBD Łatwe śledzenie sygnałów i diagnostyka online
Obliczenia, pętle i operacje na tablicach ST Zwięzły zapis algorytmów matematycznych
Regulacja ciągła Gotowy blok PID lub własny FB Możliwość przechowywania parametrów i stanu regulatora
Proces wieloetapowy SFC, sekwencja stanów lub odpowiednio podzielone FB Jasne przedstawienie etapów cyklu i przejść
Wspólne obliczenia dla wielu urządzeń Funkcje wielokrotnego użytku Mniej duplikacji i prostsze testowanie

W małych projektach często przesadza się z abstrakcją. Tworzenie wielu warstw funkcji tylko po to, aby kod wyglądał nowocześnie, może utrudnić serwis. Z drugiej strony kopiowanie tego samego fragmentu w 30 miejscach niemal zawsze kończy się niespójnością. Szukam środka, w którym moduł ma sens techniczny, a osoba utrzymująca maszynę nadal rozumie jego działanie.

Przy wyborze sprawdzam też ograniczenia platformy. Różni producenci mogą inaczej obsługiwać typy danych, inicjalizację zmiennych, wywołania bloków, pamięć retencyjną czy wykonanie programu w kilku zadaniach czasowych. Kod wyglądający na uniwersalny nie zawsze zachowa się identycznie na sterownikach różnych marek.

Jak uniknąć typowych błędów w sterowaniu funkcyjnym

Pierwszy błąd polega na myleniu funkcji bezstanowej z blokiem, który pamięta dane. Jeżeli blok timera lub regulatora zostanie wywołany nieregularnie albo w kilku miejscach, jego zachowanie może stać się trudne do przewidzenia. Każdy element przechowujący stan powinien mieć jednoznaczny cykl wywołania i jasno opisane warunki startu.

Drugi problem to ukryte skutki uboczne. Funkcja, która z pozoru tylko oblicza temperaturę, ale przy okazji kasuje alarm albo zapisuje wartość do globalnej zmiennej, szybko staje się trudna do testowania. Takie działania lepiej oddzielić i nazwać wprost.

  • Nie kopiuj bez kontroli tego samego algorytmu do wielu urządzeń.
  • Nie mieszaj obliczeń, komunikacji, alarmów i sterowania wyjściami w jednym bloku.
  • Opisuj jednostki, na przykład stopnie Celsjusza, bary, herce lub procenty.
  • Sprawdzaj granice, wartości zerowe, brak sygnału i przekroczenie zakresu.
  • Testuj tryb ręczny, automatyczny, awaryjny i ponowne uruchomienie sterownika.

Szczególnie zdradliwe są błędy związane z kolejnością wykonania. W sterowniku program zwykle działa cyklicznie, więc wynik użyty przez jeden blok może pochodzić z poprzedniego cyklu, jeśli struktura programu została źle zaprojektowana. W przypadku szybkich sygnałów, enkoderów i regulacji trzeba dodatkowo uwzględnić czas skanu oraz priorytet zadania.

Nie pomijałbym też dokumentacji. Nazwa funkcji powinna mówić, co robi, a komentarz powinien wyjaśniać nietypowe założenia, zakresy i reakcję na błąd. Dobra dokumentacja skraca późniejszy serwis bardziej niż efektowna, lecz nieczytelna architektura.

Co sprawdzić przed wdrożeniem sterowania funkcyjnego

Przed uruchomieniem instalacji przygotowałbym mały zestaw testów dla każdej funkcji. Sprawdziłbym wartości nominalne, graniczne i błędne, a przy blokach zależnych od czasu także zachowanie po zatrzymaniu, zaniku zasilania i ponownym starcie sterownika.

  • Zweryfikuj, czy każda funkcja ma jasno określone wejścia i wyjścia.
  • Sprawdź, czy jednostki oraz typy danych są zgodne w całym torze pomiarowym.
  • Przetestuj brak czujnika, wartość poza zakresem i przerwę w komunikacji.
  • Ustal, które bloki mogą przechowywać stan i gdzie ten stan jest inicjalizowany.
  • Porównaj działanie symulacji z zachowaniem prawdziwego wejścia i wyjścia.

Najrozsądniej zaczynać od małego modułu, na przykład skalowania jednego kanału analogowego albo kontroli temperatury. Dopiero gdy funkcja przejdzie testy i zachowuje się poprawnie w trybie ręcznym oraz automatycznym, warto użyć jej w większej liczbie miejsc.

Sam paradygmat funkcyjny nie zastąpi znajomości procesu, elektryki ani zasad bezpieczeństwa. Może jednak uporządkować logikę, ograniczyć liczbę powtórzeń i ułatwić analizę usterek. W automatyce to właśnie połączenie dobrego modelu programu z poprawnym projektem technicznym daje najbardziej przewidywalny rezultat.

FAQ - Najczęstsze pytania

Programowanie funkcyjne jest paradygmatem opartym na funkcjach, które przekształcają dane i najlepiej nie mają skutków ubocznych. FBD, czyli Function Block Diagram, to graficzny sposób zapisu programu za pomocą bloków i połączeń sygnałowych. Samo użycie bloków FBD nie oznacza więc programowania funkcyjnego w ścisłym sensie.
Funkcja sprawdza się przy obliczeniach bezstanowych, takich jak skalowanie pomiaru, konwersja, kontrola zakresu czy filtracja. Blok funkcyjny należy wybrać wtedy, gdy element musi pamiętać stan między cyklami, jak timer TON, licznik, regulator PID lub sekwencja ruchu.
Łańcuch przetwarzania można podzielić na niezależne etapy: odczyt wartości surowej, przeliczenie na jednostkę fizyczną, filtrację, sprawdzenie limitów i przekazanie wyniku do regulatora. Jedna funkcja może być następnie używana dla wielu podobnych kanałów, na przykład 20 czujników temperatury, co ogranicza duplikację i ułatwia testowanie.
LAD lub FBD są wygodne przy prostej logice załączeń, blokadach i diagnostyce online. Structured Text lepiej nadaje się do obliczeń, pętli i operacji na tablicach, gotowy blok PID lub własny FB do regulacji ciągłej, a SFC lub sekwencja stanów do procesów wieloetapowych. Funkcje wielokrotnego użytku warto stosować przy wspólnych obliczeniach dla wielu urządzeń.
Oceń artykuł

Średnia: 0.0 / 5 · 0 ocen

Tagi

plc fbd structured text pid alarmy
Autor Leonard Wojciechowski
Leonard Wojciechowski
Nazywam się Leonard Wojciechowski i od 10 lat zajmuję się tematyką techniki warsztatowej, elektryki oraz automatyki. Moje zainteresowanie tymi dziedzinami zaczęło się już w dzieciństwie, kiedy zafascynowany byłem działaniem różnych urządzeń. Od tamtej pory nieustannie poszerzam swoją wiedzę, a moim celem jest dzielenie się nią z innymi. W swoich tekstach staram się wyjaśniać skomplikowane zagadnienia w przystępny sposób, porównując różne źródła i śledząc aktualne trendy w branży. Piszę o różnorodnych aspektach techniki warsztatowej i elektryki, koncentrując się na praktycznych rozwiązaniach, które mogą pomóc czytelnikom w codziennych wyzwaniach. Zawsze dbam o to, aby moje informacje były rzetelne, zrozumiałe i aktualne, co pozwala mi na skuteczne przekazywanie wiedzy. Cieszę się, że mogę być częścią tej społeczności i mam nadzieję, że moje artykuły będą dla Was przydatne.
Komentarze (0)
Dodaj komentarz