Raspberry Pi jako PLC

| Technika

Walory edukacyjne Raspberry zostały docenione na wielu polach przez niezliczonych amatorów elektroniki. Dlaczego więc nie wykorzystać tego jednoukładowego komputera, by nauczyć się programowania PLC? Trudno wyobrazić sobie poważną aplikację przemysłową opartą na RPi, jednak do celów półprofesjonalnych i tworzenia niezależnych rozwiązań wydaje się w sam raz.

Raspberry Pi jako PLC

Raspberry Pi 3 jest w stanie z powodzeniem funkcjonować jako komputer osobisty, a jego parametry przewyższają moc obliczeniową części sterowników przemysłowych. Jednocześnie różnica w cenie pomiędzy Raspberry a typowymi sterownikami PLC jest kolosalna, dlatego Pi to świetne rozwiązanie dla osób chcących rozpocząć naukę programowania, poszerzyć swoją wiedzę lub zbudować system sterowania bez ponoszenia dużych nakładów finansowych.

Sterowanie za pomocą raspberry Pi

Jest wiele sposobów na budowanie układów sterowanych za pomocą popularnej "maliny". Każdy układ sterowania musi mieć możliwość komunikacji ze światem zewnętrznym. W przypadku Raspberry Pi najprostszym sposobem, by to osiągnąć, jest wykorzystanie portu GPIO (General Purpose Input/Output).

Piny mogą zostać skonfigurowane jako wejścia lub wyjścia dyskretne, a część z nich może zostać wykorzystana do komunikacji z innymi urządzeniami mikroprocesorowymi przy użyciu interfejsów I²C lub SPI. Jeśli chodzi o programowanie, to możliwości również są duże. Począwszy od wbudowanych narzędzi, jak Python i Scratch, przez ARM assembler, aż po powszechnie stosowane języki programowania takie jak C i C++.

Języki programowania PLC

Rys. 1. REX Control System

Cechą charakterystyczną tworzenia aplikacji dla sterowników PLC jest konieczność korzystania ze specyficznych języków programowania. W znacznej wielkości środowisk programistycznych wykorzystywanych jest pięć języków zdefiniowanych w normie IEC 61131-3. Została ona stworzona przez organizację IEC, aby ułatwić pracę programistom. Standaryzacja języków jest czynnikiem pozwalającym skupić się na treści programu, a nie na narzędziu używanym do jego napisania. Sprzyja to uniezależnieniu od dostawców sprzętu, a także ułatwia przenoszenie programów na inne sterowniki.

Wspomniane wcześniej kilka języków to IL (Instruction List), ST (Structured Text), LD (Ladder Diagram), FBD (Function Block Diagram) i SFC (Sequential Function Chart). Obecnie produkowane sterowniki pozwalają na tworzenie aplikacji w jednym, kilku lub wszystkich wymienionych wcześniej językach. Tę samą cechę mają przedstawione poniżej środowiska programistyczne, co pozwala na szybkie wdrożenie w nowe środowisko programistom znającym języki IEC oraz na zgłębienie ich tajników osobom, które chciałyby dopiero zacząć swoją przygodę z PLC.

Platforma programistyczna CODESYS

Raspberry znajduje się na liście urządzeń obsługiwanych przez platformę programistyczną CODESYS. Umożliwia ona programowanie RPi przy użyciu języków zgodnych z IEC 61131-3, czyli IL, ST, LD, FBD, SFC oraz niezdefiniowanego w IEC języka CFC. Tak zróżnicowane możliwości pozwalają na wybór swojego ulubionego języka lub nauczenie się nowego.

Wymagane jest zainstalowanie pakietu, dostępnego na stronie producenta. Nie jest on darmowy, chociaż można z niego korzystać również bez opłacenia licencji, jednak wprowadzono ograniczenie czasowe pozwalające na dwugodzinne sesje, po których należy zresetować Raspberry. Konfiguracji RPi do współpracy ze środowiskiem dokonuje się z menu CODESYS.

Urządzenie jest wyszukiwane w sieci lokalnej, a po wybraniu z listy adresu IP następuje przesłanie odpowiednich plików. Proces jest bardzo prosty i nie wymaga od użytkownika konfiguracji żadnych dodatkowych parametrów. Skonfigurowane Raspberry jest traktowane przez CODESYS jak każdy inny sterownik. Połączenie z RPi może być nawiązywane po kablu, jak również bezprzewodowo.

CODESYS to rozbudowane środowisko i pozwala na wykorzystanie wielu możliwości Raspberry. Do dyspozycji programisty zostaje oddany port GPIO, można obsługiwać jego wejścia i wyjścia cyfrowe, a także korzystać z protokołów SPI, I²C i 1-wire. Ponadto oferowana jest implementacja protokołów korzystających z interfejsów Ethernet i RS-485, takich jak Modbus RTU i TCP, OPC, EtherCAT, Profinet. Środowisko pozwala też na stworzenie wizualizacji, którą uruchamia się w przeglądarce internetowej.

Oprogramowanie REX Control System

REX Control System to oprogramowanie przeznaczone dla systemów sterowania działających na Windowsie i Linuksie. Stworzone w nim programy mogą być uruchamiane na zwykłych komputerach PC, laptopach, komputerach przemysłowych czy sterownikach PAC (Programmable Automation Controller). Popularność układów sterowania opartych na Raspberry Pi skłoniła twórców oprogramowania do dodania komputera do listy obsługiwanych urządzeń.

REX pozwala na tworzenie aplikacji w języku graficznym Function Block. Jest to jeden z języków zdefiniowanych w standardzie IEC 61131-3. Programy stworzone dla RPi pozwalają na wykorzystanie portu GPIO urządzenia oraz na obsługę protokołów komunikacji takich jak Modbus, I²C, SPI, TCP i UDP.

Środowisko REX zbudowane jest z kilku modułów. Do tworzenia programów w języku FBD wykorzystywany jest moduł RexDraw, podgląd i diagnostyka uruchomionych aplikacji jest możliwa dzięki RexView, a RexCore to moduł instalowany na urządzeniu docelowym, którego zadaniem jest wykonywanie stworzonych programów.

Do dyspozycji oddano dwa sposoby wizualizacji układu sterowania w przeglądarce internetowej, obydwa wykorzystujące HTML. Pierwszy, nazwany WebBuDi, to proste narzędzie, pozwalające na tworzenie bardzo prostych ekranów HMI. Edycja wyświetlanych elementów polega na zmianie kodu pliku HTML zawierającego wizualizację. Druga opcja pozwala na tworzenie o wiele bardziej rozbudowanych i atrakcyjnych graficznie aplikacji HMI.

Tworzenie wizualizacji jest dość nietypowe i wymaga zainstalowania programu graficznego Inkscape z rozszerzeniem RexHMI. Elementy graficzne są tworzone przy użyciu standardowych narzędzi Inkscape, a następnie przypisuje się im zmienne zadeklarowane w aplikacji zbudowanej w REX Control System. Utworzoną wizualizację trzeba wyeksportować, aby móc przenieść ją na urządzenie, które ma umożliwiać jej wyświetlanie.

Niestety REX Control System podobnie jak CODESYS nie jest środowiskiem darmowym. Bez wykupionej licencji aplikacja przestaje działać po dwóch godzinach i należy zresetować Raspberry. Środowisko jest dosyć proste i pozwala na wykorzystanie tylko jednego języka FBD, jednak ma bogate możliwości w kwestii protokołów komunikacji. Prostota może być dużą zaletą, zwłaszcza dla początkujących, ale brak obsługi pozostałych języków zdefiniowanych przez IEC to poważne ograniczenie.

Projekt OpenPLC

OpenPLC to projekt, którego założeniem jest otwarcie czarnej skrzynki, jaką jest sterownik PLC i stworzenie sterownika o otwartej architekturze zarówno sprzętowej, jak i programistycznej. Twórcy projektu udało się zbudować własny sprzęt, jednak aby ułatwić potencjalnym odbiorcom korzystanie z oprogramowania, wspiera ono inne platformy takie jak Raspberry i Arduino. Programy uruchamiane na Raspberry pozwalają na wykorzystanie portu GPIO oraz na komunikację po Modbusie.

Oprogramowanie OpenPLC Editor, dostępne na stronie projektu OpenPLC, zostało stworzone jako część projektu Beremiz, inicjatywy mającej na celu stworzenie darmowego środowiska deweloperskiego niezależnego od platformy sprzętowej. Edytor ten jest po pierwsze darmowy, a po drugie daje możliwość pisania programów we wszystkich pięciu językach IEC 61131-3. Projekty są zapisywane w postaci plików XML, natomiast pliki, które mają zostać załadowane do sterownika, są konwertowane do formatu .st (Structured Text).

Uruchomienie programu napisanego w OpenPLC Editor na Raspberry wymaga zainstalowania kilku pakietów plików (biblioteki, sterowniki I/O, itp.). Sam proces ładowania aplikacji do RPi jest wykonywany przy użyciu przeglądarki internetowej na komputerze.

Do tłumaczenia plików .st stworzonych w OpenPLC Editor do postaci, która może być odczytana przez Raspberry, wykorzystywany jest kompilator MatIEC. Jego zadaniem jest przetłumaczenie programu napisanego przez użytkownika do C. Aplikacja uruchamiana na platformie docelowej jest tworzona z plików C w połączeniu z kodem źródłowym OpenPLC.

OpenPLC jest projektem open source i wciąż jest w fazie rozwoju. Interfejs jest surowy, a korzystanie z oferowanych możliwości wymaga od użytkownika trochę więcej wysiłku niż chociażby w przypadku CODESYS. Niewątpliwą zaletą jest jednak brak konieczności ponoszenia nakładów finansowych na oprogramowanie. Kolejnym minusem jest brak możliwości stworzenia wizualizacji przy użyciu tego samego środowiska, w którym pisany jest program. Istnieje jednak możliwość komunikacji po Modbusie z dowolnym oprogramowaniem typu SCADA.

Dodatkowe płytki dla Raspberry

Jedną z cech charakterystycznych i niewątpliwą zaletą sterowników PLC jest ich uniwersalność pod względem możliwości podłączania wejść i wyjść, a także komunikacji cyfrowej przy użyciu różnych protokołów. Umożliwia to szybką i wygodną budowę układów sterowania, bez poświęcania nadmiernej uwagi elektronice stojącej za standardowymi układami I/O sterownika.

Poza interfejsami cyfrowymi Raspberry dysponuje tylko portem GPIO, który pozwala na podłączanie wejść i wyjść, jednak trudno nazwać goldpiny wystające z płytki komputera trwałym i niezawodnym interfejsem I/O. Punkty wejść/wyjść nie są zabezpieczone przed nieprawidłowym podłączeniem czy przepięciami poprzez chociażby optoizolację, a sam sposób podłączania przewodów nie zapewnia trwałości połączenia. Z pomocą przychodzą producenci dodatkowych płytek, które można podłączyć do Raspberry Pi.

Rozszerzenie PiXtend

Tab. 1. Pixtend - podstawowe parametry

PiXtend jest bardzo rozbudowanym rozszerzeniem możliwości Raspberry i tak jak inne urządzenia tego typu jest podłączany do portu GPIO "maliny". Połączenie wykonywane jest za pomocą przewodu wstążkowego, znajdującego się w zestawie. Dodatkowo, dostępne są dwa warianty obudowy - metalowa i plastikowa, które zabezpieczają zestaw PiXtend plus Raspberry przed uszkodzeniami, nadając estetyczny wygląd, a także umożliwiają montaż na szynie DIN lub na płycie montażowej. Płytka ma wbudowany zasilacz o napięciu wejściowym 12-24 VDC i wyjściowym 5 VDC, który stanowi źródło zasilania dla RPi oraz wszystkich elementów składowych PiXtend.

Mózgiem układu jest mikrokontroler ATmega32A, którego zadaniem jest obsługa i przetwarzanie sygnałów zewnętrznych. Firmware PiXtend jest napisany w języku C i może być dowolnie zmieniany, jednak tylko oryginalny zapewnia zgodność CE. Komunikacja między płytką rozszerzeń a Raspberry jest realizowana poprzez interfejs SPI.

Istnieje kilka sposobów wykorzystania możliwości oferowanych przez PiXtend. Najważniejszym z punktu widzenia przemiany Raspberry w sterownik PLC jest współpraca modułu rozszerzeń ze środowiskiem CODESYS. Ponadto, interfejsy komunikacyjne i punkty I/O mogą być obsługiwane z poziomu konsoli Raspbiana, a także wykorzystywane w programach pisanych w C, dzięki udostępnianym przez producenta bibliotekom.

Układ INTELLISYS PIO

Tab. 2. PIO - podstawowe parametry

Jest to układ o wiele prostszy niż opisany powyżej. Płytka PIO jest tej samej wielkości co RPi i ma przelotki pasujące do pinów portu GPIO Raspberry. Połączenie następuje poprzez nałożenie jednej płytki na drugą. Do układu należy podłączyć zasilanie 12 VDC, które wystarcza do zaspokojenia potrzeb Raspberry i płytki PIO.

Płytka została przystosowana do współpracy z opisywanym wcześniej oprogramowaniem REX Control System. Na stronie producenta dostępne są również do pobrania biblioteki wymagane do wykorzystania PIO w projektach tworzonych w C, Javie i Pythonie.

Wydajność Raspberry 

Raspberry dysponuje większą mocą niż typowe sterowniki PLC. W celu weryfikacji wydajności przeprowadzone zostały testy polegające na wgraniu do urządzenia programu stworzonego w środowisku CODESYS, a następnie mierzeniu obciążenia procesora. Wyniki zostały przedstawione w tabeli 3. Do testów wykorzystano Raspberry Pi 3.

Czas trwania jednego cyklu programu dla poszczególnych elementów definiowanych w środowisku CODESYS, takich jak podprogramy czy wizualizacja, może być ustawiany przez programistę. Dla podprogramów minimalna wartość to 1 ms, dla wizualizacji 40 ms. CODESYS wykorzystuje jeden z czterech rdzeni procesora.

Jeśli rzeczywisty czas wykonania cyklu programu jest dłuższy od zadanego, to obciążenie rdzenia CPU0 wzrasta w znaczący sposób, w krytycznym przypadku aż do 100%, co grozi utworzeniem kolejki zadań do wykonania, oczekujących na wolne zasoby procesora. Sytuacja taka jest niedopuszczalna, dlatego należy dopasować czas cyklu do rozmiarów i stopnia skomplikowania programu.

Kod programu do testów

Do testów czas cyklu programu został ustawiony na 1 ms. W bibliotekach CODESYS znajduje się funkcja taskinfo pozwalająca na zmierzenie rzeczywistego czasu cyklu. Ponadto informacje na temat liczby cykli i ich czasów (minimalny, maksymalny, średni) są dostępne w zakładce Task Configuration. Do badania obciążenia procesora i użycia pamięci wykorzystana została komenda TOP uruchamiana z konsoli Raspbiana.

Typowy program sterownika PLC, który mógłby na przykład sterować automatyką w domu jednorodzinnym, ma do obsłużenia kilkadziesiąt punktów IO lub rejestrów odczytywanych po protokole komunikacji, trochę logiki i wizualizację. Testy przeprowadzone na RPi wykazały, że kod napisany w języku ST zawierający tysiąc operacji na zmiennych typu BOOL, INT lub REAL stanowi znikome obciążenie dla urządzenia i bez trudu wykonywany jest w cyklu 1 ms.

Należało podnieść poprzeczkę, aby sprawdzić, do czego rzeczywiście zdolne jest Raspberry Pi. Przeprowadzono cztery testy oznaczone numerami od 1 do 4, a wyniki zamieszczono w tabeli 3. Test numer 1 polegał na wykonaniu 10 pętli FOR wykonujących po 1000 powtórzeń. W każdej z dziesięciu pętli zagnieżdżono pętlę wykonującą 100 powtórzeń, zawierającą instrukcję IF ELSE. Wewnątrz instrukcji warunkowych zostały umieszczone operacje arytmetyczne dodawania lub odejmowania zmiennych typu INT. W ramce obok zamieszczono kod użyty podczas testów.

Sumarycznie, w każdym cyklu program miał do wykonania milion operacji arytmetycznych. To zadanie wykraczające daleko poza typowe aplikacje wykonywane na sterownikach PLC. Poza kodem napisanym w ST Raspberry miało za zadanie odczyt stu 16-bitowych rejestrów po protokole komunikacji Modbus TCP oraz obsługę wizualizacji wyświetlanej w przeglądarce komputera PC znajdującego się w sieci lokalnej. Wizualizacja składała się z dwudziestu bargrafów wyświetlających wartości odczytane po Modbusie. Obsłużenie takiej liczby elementów graficznych wymagało zwiększenia bufora danych w ustawieniach wizualizacji.

Tab. 3. Wyniki testów obciążenia Raspberry

Z danych znajdujących się w tabeli 3 wynika, że ustawiony na potrzeby testu 1 czas cyklu 1 ms to o wiele za mało do wykonania tak dużej ilości obliczeń, jakie zawierał program testowy. Rzeczywisty czas cyklu podczas jego wykonywania to 44 ms, a rdzeń procesora obsługujący program stworzony w CODESYS jest znacznie przeciążony. Pomimo to nadal możliwe jest swobodne korzystanie z Raspberry.

Materiał wideo z serwisu YouTube odtwarzany w przeglądarce jest wyświetlany płynnie. Istnieje bardzo prosty sposób na zredukowanie obciążenia procesora, wystarczy zwiększyć zadany czas cyklu. Podczas testu 4 uruchomiono program taki jak w teście 1, ale z czasem cyklu zwiększonym do 100 ms. Wartości obciążenia obserwowane po wpisaniu komendy TOP zmalały w znaczący sposób.

Test numer 2 polegał na uruchomieniu programu takiego jak w teście 1, ale bez komunikacji po protokole Modbus. W teście 3 dodatkowo usunięto wizualizację. Odczyt stu rejestrów i wyświetlenie dwudziestu bargrafów to w porównaniu z milionem operacji arytmetyczny niewiele, jednak usunięcie tych elementów spowodowało widoczny spadek obciążenia procesora RPi.

Podsumowując, Raspberry jest w stanie radzić sobie z bardzo dużą ilością obliczeń, a jeżeli brakuje mu mocy, wystarczy zwiększyć czas cyklu programu. 100 ms ustawione w programie testowym 4 to czas absolutnie zadowalający do domowych zastosowań. Próby wykonywane na dużo bardziej realistycznych ilościach zmiennych dowodzą, że Raspberry jest w stanie wykonywać typowe programy tworzone dla sterowników PLC w praktycznie dowolnych czasach cyklu, chociaż producent zaznacza, że CODESYS uruchomiony na RPi nie jest systemem czasu rzeczywistego i optymalny czas cyklu programu wynosi 50 ms. Należy uważać, aby nie obciążyć procesora zbyt dużą ilością obliczeń, ponieważ prowadzi to do zatrzymania wtyczki CODESYS i uniemożliwia komunikację Raspberry ze środowiskiem COSESYS zainstalowanym na komputerze.

Do kompatybilności Raspberry z CODESYS prawie nie można mieć zarzutów. Urządzenie jest rozpoznawane bez problemów, konfiguracja i wgrywanie programów przebiega gładko i podczas testów tylko kilkukrotnie zdarzyła się nieudana próba załadowania programu do RPi połączonego przez sieć Wi-Fi.

Podsumowanie

Dostępność odpowiedniego oprogramowania i modułów rozszerzeń w postaci płytek współpracujących z portem GPIO sprawia, że Raspberry może z powodzeniem funkcjonować jako domowy sterownik PLC. Testy dowiodły, że urządzenie jest w stanie bez problemów uruchamiać programy napisane w językach przeznaczonych dla PLC. Cena i możliwość korzystania z pozostałych funkcji RPi to atuty przemawiające za wykorzystaniem go do omawianych celów. Należy jednak przypomnieć, że nawet po doposażeniu o płytkę rozszerzeń, Raspberry Pi nie jest przemysłowym sterownikiem PLC i pozostanie w sferze automatyki domowej i edukacyjnej.

Piotr Ziółkowski