Programowanie sterowników PLC – porady dla inżynierów

W artykule przedstawiono informacje, które mogą okazać się pomocne przy programowaniu sterowników logicznych (PLC), w szczególności obejmujące zagadnienia z popularnie stosowanej logiki drabinkowej.

Logika drabinkowa, cykle skanowania programowalnych sterowników logicznych (PLC), liczby dziesiętne kodowane binarnie oraz kody wielokrotnego użytku to niektóre z tematów dotyczących programowania sterowników PLC, a zarazem zebranych w artykule porad, jakich udziela Frank Lamb, członek Rady Doradczej Wydawnictwa Control Engineering i założyciel firmy Automation Consulting Services Inc., partnera Control Engineering. Porady przedstawiono, analizując trzy różne punkty widzenia.

Logika drabinkowa i cykle skanowania sterowników PLC

Prawie wszystkie sterowniki PLC na całym świecie wykonują cykle skanowania (cykle pracy – scan cycle) w ten sam sposób. Najpierw jednostka centralna (CPU) odczytuje stany wejść fizycznych i zapisuje je w tablicy pamięci (memory table), nazywanej zwykle tablicą wejść (input table). Tablica ta jest potem wykorzystywana przy realizacji programu. Istnieją różne typy rejestrów, które są wykorzystywane w różnych platformach. Rejestry te są aktualizowane w miarę przetwarzania logiki od lewej do prawej strony na każdym szczeblu drabinki i od góry do dołu, w każdym programie standardowym (routine). Obejmuje to aktualizację tablicy wyjść, która później zostanie wykorzystana do sterowania urządzeniami fizycznymi podłączonymi do sterownika PLC.

Program sterownika PLC może wywoływać różne podprogramy (subroutine) w różnych celach, ale warto zwrócić uwagę, że kolejność wywołań tych podprogramów może mieć znaczenie. Zależnie od tego, gdzie rejestry pamięci i tablice wyjść są aktualizowane, stany wyjść fizycznych mogą być opóźnione o maksymalnie dwa cykle skanowania. W każdym z przypadków program przechodzi przez różne procedury, gdy są one wywoływane, a następnie powraca do miejsc, z których były one wywołane i ostatecznie dociera do końca oryginalnej, głównej procedury cyklicznej – programu głównego. Większość programów tworzonych dla sterowników PLC działa według przedstawionego tu pokrótce schematu, wykorzystując początkową procedurę cykliczną – program główny, który jest stosowany do wywoływania wszystkich innych procedur – podprogramów.

Jednak niektóre programy działają, korzystając z periodycznej bazy czasowej zamiast ciągłej, chociaż rozwiązanie to nie jest popularne. Większość programów wykorzystuje zatem konfigurację ciągłą, w której kolejne procedury, funkcje i działania są wykonywane tak szybko, jak to tylko możliwe (bez rezerwacji ustalonych, jednolitych przedziałów czasowych). Po wykonaniu całego kodu, kontroli logiki i uaktualnieniu wszystkich tablic (z wyjątkiem tablic wejść, które były napisane na początku cyklu skanowania), wynikowa tablica wyjść lub treść rejestru są zapisywane do wyjść fizycznych.

To, jak długo trwa ten proces przetwarzania wszystkich zapisanych działań i procedur, zależy od platformy (szybkości procesora), ilości kodu w programie oraz typów użytych instrukcji. Czasami programiści wolą użyć pętli w programie lub wykonać powtarzające się wywołania tych samych podprogramów. Wszystko to ma wpływ na całkowity czas cyklu skanowania. Zwykle dla takich programów dostępna jest dokumentacja podająca czas realizacji dla różnych instrukcji, jednak nie ma sensu dodawanie wszystkich okresów realizacji tych zakodowanych procedur czy funkcji, aby oszacować czas całkowity. Czasy te są podane zasadniczo w celach orientacyjnych.

Czas realizacji cyklu skanowania może wynosić aż 80 ms. Jeśli jest on dłuższy od 50 ms (dla projektu sterowania maszyną), to użytkownik powinien poszukać sterownika z procesorem o większej mocy obliczeniowej lub sposobów redukcji albo optymalizacji kodu, by działał on bardziej efektywnie. Wpływ czasu skanowania dłuższego od 50 ms na reakcję wyjść w projekcie sterowania pojedynczą maszyną może być znaczący, natomiast w projekcie sterowania całym procesem jego znaczenie jest znikome.

Zapis dziesiętny w kodzie binarnym (BCD) jest klasą kodowania binarnego liczb dziesiętnych. W zapisie tym każda liczba dziesiętna jest reprezentowana przez ustaloną liczbę bitów, zwykle cztery lub osiem. Zapis BCD jest całkiem odmienny od stosowanego przez ludzi do obliczeń i może to spowodować problemy dla użytkowników programowalnych sterowników logicznych.

Zapis dziesiętny w kodzie binarnym a sterowniki PLC

Zapis cyfr dziesiętnych w kodzie binarnym (BCD – binary-coded decimal) jest klasą kodów binarnych (zwykle reprezentowanych przez cztery lub osiem bitów). W celu poprawnej interpretacji liczb dziesiętnych zapisanych w tym kodzie przez ludzi, muszą oni dodać poszczególne bity reprezentujące cyfry liczb w swoich rejestrach pamięci, aby dokonać ich konwersji na podstawę kolejnych potęg podstawy 10, ponieważ są tak „zaprogramowani”, że myślą i działają zazwyczaj w systemie dziesiętnym.

Przed pojawieniem się i popularyzacją ekranów dotykowych jako interfejsy numeryczne dla operatorów sterowników PLC były stosowane wyświetlacze 7-segmentowe i przełączniki tarczowe (obracane palcem). Również w okresie przed pojawieniem się sterowników PLC właśnie te wspomniane elementy były powszechnie stosowane w interfejsach komunikacji ludzi i maszyn cyfrowych. Już w czasach komputera ENIAC (pierwszego elektronicznego komputera uniwersalnego – lata 50. XX w. w USA) użytkownicy mogli manipulować odpowiednimi wtykami, wybierając nastawy i żądane funkcje takiej maszyny cyfrowej, jednak wykorzystywanie wyświetlaczy i przełączników obrotowych do monitorowania i zmian liczb dziesiętnych było znacznie łatwiejsze. Osobnym problemem była jednak bardzo duża liczba koniecznych wejść i wyjść (I/O) dla sygnałów sterowania oraz monitoringu. Każdy segment przełącznika obrotowego wymagał czterech wejść (oraz zasilania), podczas gdy każdy wyświetlacz 7-segmentowy wymagał czterech wyjść (oraz dwóch biegunów zasilania). Jednak to właśnie wykorzystanie liczb całkowitych ze znakiem lub bez znaku, ale w postaci dziesiętnej było łatwiejsze, niż korzystanie z zestawów przycisków i kontrolek.

Powszechnym problemem przy programowaniu sterowników PLC jest matematyka, ponieważ każdy typ danych musi być wyraźnie zadeklarowany na platformie i przekonwertowany, jeśli typy danych nie są równoważne. Ale to nie wszystko. Standardowe typy danych układów czasowych (timerów) i liczników korzystają z kodowania BCD w swoich strukturach. Jest tak, ponieważ struktury bazują na rozwiązaniach z czasów, w których operatorzy i programiści pracowali, korzystając z łączników obrotowych i wyświetlaczy 7-segmentowych. W rzeczywistości nastawy układów czasowych są nadal wprowadzane w postaci „S5T#3S” (przykład dla nastawy 3-sekundowej). Układ czasowy wykorzystuje trzy cyfry w kodzie BCD (12 bitów) i dwa bity dodatkowe dla podstawy czasu. Dotyczy to także liczników, co oznacza, że liczą one od -999 do +999.

Tymczasem w układzie cyfrowym każda sekcja czterocyfrowa może tylko przenosić wartości bitów od 0000 do 1001. Dla następnej wartości, zamiast indeksowania do 1010 („10” w liczbie dziesiętnej ze znakiem lub bez albo „A” w zapisie szesnastkowym), następny bit zostaje „wyrzucony” do następnej sekcji bitów. Oznacza to, że ostatnie sześć kombinacji bitów (A-F) jest skutecznie marnowanych – co nie jest możliwe w strukturze BCD.

Struktura lub podstawa kodowania BCD jest nadal możliwa do wykorzystania w wielu nowszych ekranach dotykowych, jednak większość programistów ma tendencję do wybierania podstawy całkowitej do wyrażania liczb dziesiętnych. Kod BCD jest czymś w rodzaju systemu operacyjnego DOS, szkoły inżynierskie nadal rozpoczynają od niego naukę, jednak ludzie tak naprawdę nie wiedzą, skąd on pochodzi. Zapoznanie się ze starymi rozwiązaniami technicznymi, bazującymi na łącznikach obrotowych i wyświetlaczach 7-segmentowych może się okazać niezwykle pomocne w wyjaśnieniu części tej tajemnicy i przyczyn stosowania kodowania BCD.

Kod wielokrotnego użytku dla programowalnych sterowników logicznych (PLC) pozwala użytkownikom na elastyczność i umożliwia tworzenie takich struktur, które mogą być eksportowane z jednej aplikacji do innej (EN – enable – wejście logiczne zezwolenia na wykonanie operacji definiowanych funkcją; ENO – enable output – wyjście logiczne zezwolenia na wykonanie operacji definiowanych funkcją).

Zalety wykorzystywania kodu wielokrotnego użytku w programowaniu sterowników PLC

Wielu programistów zawdzięcza swoją wiedzę i umiejętności doświadczeniu w pracy z produktami marki Allen-Bradley firmy Rockwell Automation, ponieważ wiele z podstawowych sterowników PLC pracujących w przemyśle produkcyjnym to właśnie urządzenia z logo A-B (dotyczy przede wszystkim Stanów Zjednoczonych). Natomiast wprowadzenie rodziny produktów ControlLogix firmy Rockwell Automation stanowiło ogromny skok naprzód, jeśli chodzi o możliwości sterowników PLC. Wprowadzono w nich takie ulepszenia, jak struktura pamięci oparta na tagach (mapowanie pamięci definiowane przez użytkownika, tag-based PLCs), i umożliwiono wykorzystanie typów danych zdefiniowanych przez użytkownika (UDT – user-defined data type) oraz instrukcji typu add-on (AOI – add-on instructions). Tagi mogą być także lokalne dla każdego programu i możliwe jest ich powielanie w celu ponownego użycia.

Te możliwości, z wyjątkiem struktury pamięci opartej na tagach, istniały już od lat na innych platformach. Norma 61131 Międzynarodowej Komisji Elektrotechnicznej (IEC), obejmująca języki programowania, istnieje od 1993 roku, zaś sterowniki PLC innych firm już dawno miały zaimplementowane wspomniane możliwości. Ważną różnicą między starszymi systemami, opartymi tylko na rejestrach, a nowocześniejszymi jest możliwość tworzenia bloków kodu wielokrotnego użytku (re-usable code). Platformy obsługujące tę funkcję muszą mieć następujące trzy cechy:

Zmienne lokalne a globalne. Kod wielokrotnego użytku musi mieć zmienne, które odnoszą się do każdego przypadku tego kodu, w idealnym przypadku formatując dane tylko raz dla kodu oryginalnego. Oznacza to, że nazwy listy tagów lub symboli nie powinny być zmieniane dla każdego przypadku lub wywołania. Powielanie podprogramu kilka razy oraz konieczna w tym przypadku iteracja adresów wewnątrz niego, chociaż oszczędza czas, nie jest w rzeczywistości kodem wielokrotnego użytku.

Dane UDT. Tworzenie takich danych umożliwia budowanie struktur, które mogą być eksportowane z jednej aplikacji do innej. Umożliwiają one opisywanie komponentów przy użyciu terminów ogólnych, takich jak „Szybkość”, „Start” i „Odrzucenie”. Dane UDT nie wymagają systemów opartych na tagach, jednak niejako w zamian za to wymagają zaawansowanego użycia symboli.

Bloki samodzielne z możliwością ich zabezpieczania. Ważne jest, aby kod był zawarty w bloku, który umożliwia przepływ zmiennych z wejścia i do wyjścia i który jest zabezpieczony w taki sposób, że użytkownicy nie mogą zmieniać jego specyficznego przypadku. Zmiany te wymagają wprowadzenia hasła lub klucza programowego.

Są to tylko niektóre wymagania. Inne cechy, takie jak możliwość pisania kodu w innych językach programowania PLC, zgodnych ze wspomnianą normą IEC 16131, także pomagają w tworzeniu platform, które mają znacznie większe możliwości i są przyjazne dla użytkownika pod względem „szybkiego pisania kodu”. Niezależnie od tego, czy dana platforma wykorzystuje podprogramy ze zmiennymi lokalnymi, czy instrukcje mogące być dostosowane do użytkownika, kod wielokrotnego użytku jest kluczową częścią szybkiego tworzenia programów cechujących się ogromnymi możliwościami. Wiele platform umożliwia stosowanie kodu wielokrotnego użytku i każdą z nich charakteryzuje własna metoda.


Frank Lamb, członek Rady Doradczej Wydawnictwa Control Engineering i założyciel firmy Automation Consulting Services Inc., będącej partnerem Control Engineering ds. treści.