How to / Komunikacja przemysłowa

Routery komórkowe w przykładowych aplikacjach Node-RED

28.02.2021 Producent: Advantech Zastosowanie: Zakłady przemysłowe, Gaz i Paliwa, Woda i ścieki, Energetyka
Wizerunek autora
Jarosław Molenda Inne artykuły tego autora
Routery komórkowe w aplikacjach Node-RED

Wstęp

1. Moduły rozszerzeń Node-RED

    1.1 Konfiguracja modułu Node-RED

    1.2 Logi w Node-RED

2. Dostępne bloki Nodes

    2.1 Struktura katalogów w Node-RED

    2.2 Nody czyli bloki funkcyjne powiązane bezpośrednio z routerem

    2.3 Moduły użytkownika

3. Przykładowe aplikacje Flow

    3.1 Włączenie lub wyłączenie diody LED w routerze

    3.2 Komunikacja HTTP

    3.3 Przesyłanie danych przez protokół MQTT

    3.4 Statystyki Ping

Wstęp

Dużą zaletą routerów komórkowych Advantecha jest możliwość korzystania z graficznego środowiska programistyczne Node-RED opartego o Node.js. Umożliwia ono tworzenie połączeń z różnorodnymi urządzeniami, bez konieczności programowania w językach wyższego poziomu. Node-RED pozwala użytkownikowi na łatwe przeciąganie i upuszczanie gotowych bloków funkcyjnych bezpośrednio w oknie przeglądarki internetowej. Dane i pomiary mogą być też w taki sam sposób wizualizowane w nowoczesnym dashboardzie graficznym. Dla bardziej zaawansowanych użytkowników możliwe jest dodawanie własnych skryptów pisanych w JavaScript. Na stronie https://flows.nodered.org dostępny jest również bogaty zbiór ciągle aktualizowanych bloków, które można dodawać online do tworzonych aplikacji.

Rysunek: Przykład edytora Node-RED działającego na routerze v3

Moduł użytkownika Node-RED nie jest częścią oprogramowania routera. Można go pobrać ze strony producenta https://ep.advantech-bb.cz/user-modules. Proces instalacji modułów użytkownika został opisany w kolejnym punkcie i jest dedykowany tylko do nowszych rozwiązań v3 (SmartStart, SmartFlex, SmartMotion, ICR).

1. Moduły rozszerzeń Node-RED

Przed instalacją Node-Reda konieczne jest zainstalowanie modułu użytkownika Node.js opartego o JavaScript, który jest wymagany do działania Node-RED. Po instalacji bloku Node-RED dostępne są podstawowe bloki funkcyjne i można je rozszerzać poprzez instalacje innych modułów Node-RED. Instalacja modułów odbywa się z poziomu interfejsu konfiguracyjnego użytkownika routera w przeglądarce. Wszystkie zainstalowane moduły są widoczne w zakładce User Modules.

Rysunek: Lista dostępnych modułów rozszerzeń

1.1 Konfiguracja modułu Node-RED

Po załadowaniu modułu Nod-RED niezbędna jest jego dalsza konfiguracja.

Rysunek: Konfiguracja modułu Node-RED

Sekcja Information zawiera logi z komunikatami Node-RED oraz licencje wszystkich zainstalowanych węzłów. Przy konfiguracji można automatycznie uruchomić Node-RED na dowolnym porcie TCP (domyślnie 1880) wraz ze startem routera. Można też wybrać poziom logów oraz podać dedykowaną ścieżkę w przeglądarce. Return oznacza powrót do głównego menu routera.

W kolejnym kroku należy przejść do przeglądarki i wpisać adres IP routera oraz port TCP po dwukropku. Uruchomienie interfejsu użytkownika może zająć do 30 sekund. Należy upewnić się czy używasz protokołu HTTPS (nie HTTP). Autoryzacja przy logowaniu odbywa się za pomocą tych samych poświadczeń co w logowaniu w routerze. Zarządzanie użytkownikami odbywa się w głównym menu routera w sekcji Users. Jeśli jesteś zainteresowany skorzystaniem z innego procesu uwierzytelniania, proszę zapoznaj się z dokumentacją: https://nodered.org/docs/security

Przykładowe logowanie Node-RED w przeglądarce: https://192.168.1.1:1880

Rysunek: Okno logowania Node-RED

1.2 Logi w Node-RED

W konfiguracji mamy następujące opcje logów: brak, krytyczny, błąd, ostrzeżenie, informacje (ustawienie domyślne), debugowanie, ślad. Wszystkie komunikaty widoczne są w zakładce Log. Tutaj znajdują się też informacje o zainstalowanych komponentach i ich wersjach (która wersja Node-RED, Node.js itp.), plik ustawień, katalog użytkownika, pliki JSON itp. (można uzyskać do nich dostęp lub edytować je, na przykład przez SSH po zalogowaniu się do router). Zawiera również informacje dotyczące startu / stopu poszczególnych komponentów (flow) oraz informacje o błędach (te same informacje będą wyświetlane na pulpicie nawigacyjnym Node-RED w interfejsie użytkownika Node-RED w sekcji debug). Możesz także pobrać te wiadomości i zapisać je na swój komputer jako plik tekstowy poprzez przycisk Save Log.

Rysunek: Przykładowe logi

2. Dostępne bloki Nodes

System pakietów NPM nie jest instalowany w module użytkownika z powodu ograniczeń platformy routera w wersji v3.

Opis bloków:

Advantech cyklicznie udostępnia nowe bloki funkcyjne, które można dogrywać przez moduł użytkownika z poziomu interfejsu routera. Możliwe jest też zainstalowanie dodatkowych bloków nie autoryzowanych przez Advantecha (nie pobranych od nas), ale takie działania są podejmowane na własne ryzyko i nie zapewniamy dla nich wsparcia.

By zainstalować dodatkowy blok należy skopiować wcześniej przygotowane pliki (zainstalowane w niezależnej wersji node-red) do katalogu / usr / lib / node_modules / node-red / nodes / extra path w routerze i zrestartować działający Node-RED.

Można także odinstalować dowolny, nieużywany blok. Dla przykładu, jeżeli nie jest używany pakietu dashboardu (który ma rozmiar 6 MB i potrzebne jest więcej miejsca na dysku), należy usunąć folder instalacyjny node-red-dashboard tego pakietu w / usr / lib / node_modules / node-red / nodes / extra path w routerze. Następnie należy zresetowć router.

Rysunek: Lista dostępnych bloków

2.1 Struktura katalogów w Node-RED

/usr/lib/node_modules – W tym folderze i jego podfolderach Node.js szuka dodatkowych modułów funkcyjnych. Jeden z podfolderów jest oznaczony jako „node-red” z instalacją Node-RED.

/usr/lib/node_modules/node-red/settings.js – Plik z konfiguracją Node-RED i konfiguracją uwierzytelniania.

/usr/lib/node_modules/node-red/nodes – W tym folderze i jego podfolderach Node-RED szuka bloków funkcyjnych. Można tu umieszczać zewnętrzne bloki node w jednym z poniższych podfolderach lub we własnym utworzonym podfolderze. Do instalacji są następujące podfoldery:

/usr/lib/node_modules/node-red/nodes/router – Bloki Node-RED dedykowane dla routera

/usr/lib/node_modules/node-red/nodes/extra – Bloki Node-RED innych firm

/var/log/module-nodered – Logi z Node-RED są zapisywane w tym pliku. Maksymalny rozmiar pliku wynosi 1MB I po jego przekroczeniu dane będą nadpisywane.

2.2 Nody czyli bloki funkcyjne powiązane bezpośrednio z routerem

Blok binary in wysyła 1 lub 0 na wyjście payload w zależności od stanu wejścia cyfrowego na routerze. Binary out kontroluje wyjście cyfrowe na routerze.

Signal led odpowiada za kontrolę diody LED na routerze.

Hw monitoring monitoruje parametry sprzętowe. Możesz wybrać temperaturę w stopniach Celsjusza i napięcie zasilania w woltach.

Bloki SMS odpowiedzialne za odbieranie i wysyłanie SMSów z routrera.

Odbieranie lub publikowanie wiadomości z magistrali XBus.

2.3 Moduły użytkownika

Advantech cyklicznie tworzy moduły użytkownika, które można dogrywać do palety bloków funkcyjnych w Node-Red.

Moduły FTP i SFTP umożliwiają tworzeni połączeń FTP i SFTP oraz operacje: list, get, put, delete.

Moduł GPSD pobiera dane lokalizacyjne GPS z routera.

Moduł GZIP umożliwia dekompresję danych wejściowych do formatu utf8. W przypadku gdy dane wejściowe są w postaci ciągu string to zostaną skompresowane.

KNX to otwarty standard automatyki budynkowej. Powyższe bloki umożliwiają obsługę KNXnet / IP zarówno w postaci surowej, jak i z urządzeniami wyższego poziomu. Bardziej oficjalny opis znajduje się w oficjalnym  dokumencie na stronie https://flows.nodered.org/node/node-red-contrib-knxjs

Bloki Modbus dodają do routera obsługę protokołów Modbus/TCP w sieci Ethernet oraz Modbus/RTU w sieci szeregowej RS. Umożliwiają odczytywanie wartości w określonych rejestrach Holding / Input Register oraz sprawdzenie / wysterowanie stanów Input / Coil Status.

Zainstalowanie modułu MQTT broker spowoduje dodanie brokera MQTT, który może być wykorzystany do podłączania zewnętrznych lub wewnętrznych (dostępnych w podstawowej wersji Node-RED) klientów MQTT. 

W poniższym przykładzie wykorzystujemy bloki MQTT-in oraz MQTT-out do wzajemnej komunikacji bez dodatkowych brokerów zewnętrznych takich jak mosquitto. Dodatkowy opis można znaleźć na stronie https://flows.nodered.org/node/node-red-contrib-mqtt-broker

By przetestować komunikację możesz ustawić „localhost” w bloku MQTT-in i MQTT-out jak poniżej.

3. Przykładowe aplikacje Flow

Poniższe przykłady można zaimportować do Node-RED za pomocą kodu JSON. Aby zaimportować przykład do interfejsu użytkownika Node-RED, po prostu trzeba skopiować kod JSON podany w przykładzie. Kod wstawia się poprzez górne menu w prawym górnym rogu interfejsu użytkownika Node-RED, wybierając opcję Importuj -> Clipboard. W ten sam sposób możliwe jest wyeksportowanie kodu. W takiej sytuacji należy zaznaczyć wszystkie bloki na palecie użytkownika i wybrać z menu opcję Export.

Rysunek: Import projektu przez Clipboard

Należy wkleić kod JSON do pola wejściowego Import -> Clipboard , jak pokazano na poniższym rysunku.

Rysunek: Import nodów przez JSON

3.1 Włączenie lub wyłączenie diody LED w routerze

W pierwszej kolejności należy zaimportować poniższy kod JSON.

[{"id":"332fed03.319632","type":"inject","z":"2fdae8a2.1f1e","name":"ON", "topic":"","payload":"true","payloadType":"bool","repeat":"","crontab":"", "once":false,"x":176.5,"y":33.01666259765625,"wires":[["6b35babe.53a5c4"]] },{"id":"544bcbf6.9236cc","type":"inject","z":"2fdae8a2.1f1e","name":"OFF", "topic":"","payload":"false","payloadType":"bool","repeat":"","crontab":"", "once":false,"x":175.5,"y":118.01666259765625,"wires":[["6b35babe.53a5c4"] ]},{"id":"6b35babe.53a5c4","type":"signal_led","z":"2fdae8a2.1f1e","led": "USR","inverting":false,"defaultState":"0","name":"USRLED","x":324.5,"y": 75.63333129882812,"wires":[]}]

W przykładzie użyto dwóch wejściowych bloczków Inject do wysterowania bloku signal led odpowiadającego za lampkę w routerze. Konfiguracja odbywa się poprzez dwukrotne kliknięcie na bloczku.

Rysunek: Widok bloków na palecie użytkownika

By wgrać gotowy program kliknij czerwony przycisk Deploy w prawym górnym rogu. Do wysterowania diody LED klikamy przyciski znajdujące się przed bloczkami Inject true oraz false (pomarańczowa strzałka). Po kliknięciu przycisku true blok signal led otrzyma komunikat boolen true i na routerze zacznie świecić się dioda LED USR jak na poniższym rysunku. Naciśnięcie przyciku false spowoduje zgaszenie diody.

Włączona dioda LED

3.2 Komunikacja HTTP

W pierwszej kolejności zaimportuj kod JSON. W tym przykładzie punkt końcowy http odpowiada na żądania GET z pewną zawartością statyczną (np. stroną HTML).

[{"id":"59ff2a1.fa600d4","type":"http in","z":"3045204d.cfbae","name":"","url":"/hello","method":"get","swaggerDoc":"","x":100,"y":80,"wires":[["54c1e70d.ab3e18"]]},{"id":"54c1e70d.ab3e18","type":"template","z":"3045204d.cfbae","name":"page","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"\n    \n    \n       

Hello World!

\n    \n","x":250,"y":80,"wires":[["266c286f.d993d8"]]},{"id":"266c286f.d993d8","type":"http response","z":"3045204d.cfbae","name":"","x":390,"y":80,"wires":[]}]

Wykorzystujemy bloki  „http in” (wysyłający żądania z komendą get, gdzie można zdefiniować adres URL np. /hello), „template” (gdzie dodajemy stronę HTML o wyglądzie Hello World!) i „http response” (odpowiadający na żądanie) . By uruchomić aplikację klikamy czerwony przycisk Deploy w prawym górnym rogu. Po wprowadzeniu zdefiniowanego URL /hello (z węzła „http in”) do przeglądarki internetowej (w tym przypadku https: // : 1880 / hello), jako odpowiedź zobaczymy zdefiniowaną stronę HTML:

3.3 Przesyłanie danych przez protokół MQTT

W powyższym przykładzie będziemy pobierali dane ze zdalnego brokera umieszczonego na portalu iot.eclipse.org przez protokół MQTT. Za komunikacje odpowiada tylko jeden bloczek. W podobny sposób możemy tez wgrywać nasze dane.

W polu Server podajemy adres brokera i port do korespondencji. W polu Topic tytuł suscrybowanego odbiorcy, czyli pobieranego I/O. W QoS (Quality of Service) poziom usługi, gdzie 2 oznacza najwyższy poziom w którym otrzymujemy potwierdzenie dostarczenia/odebrania wiadomości. Jeżeli uzyskamy prawidłowe połączenie z brokerem bo dostaniemy informacje connected bezpośrednio przy bloczku. 

Dzięki bloczkowi do debugowania msg.paylod możemy mieć podgląd do odczytywanych wiadomości.  Informacje podawane są w postaci obiektowej i możemy je rozbijać w zależności od przypisanej nazwy.

Kod programu:

[{"id":"39a91837.2af6b8","type":"mqtt in","z":"c36940f4.544f","name":"","topic":"Advantech/00D0C9F7230E/data","qos":"2","broker":"c716450e.a0e668","x":239,"y":1000.000072479248,"wires":[["f31978b.8c1a488"]]},{"id":"f31978b.8c1a488","type":"debug","z":"c36940f4.544f","name":"","active":true,"console":"false","complete":"false","x":430,"y":1100,"wires":[]},{"id":"2a6ba98a.bf8156","type":"mqtt in","z":"c36940f4.544f","name":"","topic":"Advantech/00D0C9FAC3EA/data","qos":"2","broker":"830ddbaa.dcf0c8","x":210,"y":1240,"wires":[["5dd118ee.c9bd88"]]},{"id":"5dd118ee.c9bd88","type":"debug","z":"c36940f4.544f","name":"","active":true,"console":"false","complete":"false","x":580.0234375,"y":1211.0390625,"wires":[]},{"id":"c716450e.a0e668","type":"mqtt-broker","z":"","broker":"iot.eclipse.org","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthPayload":""},{"id":"830ddbaa.dcf0c8","type":"mqtt-broker","z":"","broker":"iot.eclipse.org","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthPayload":""}]

3.4 Statystyki Ping

W tym przykładzie cyklicznie pingujemy stronę www.advantech.com, zapisujemy wyniki do pliku tekstowego i pokazujemy je na wykresie chart. Mamy też możliwość pobrania archiwizowanych danych.

W pierwszej kolejności dodajemy ścieżkę / var / nodered do archiwizacji danych.

Rysunek: Konfiguracja ścieżki pliku

Następnie należy utworzyć strukturę folderów do podanej ścieżki. Można to zrobić przez zalogowanie się do routera (przez SSH na porcie TCP 22 z autoryzacją użytkownika wprowadzoną do routera – SSH należy włączyć w routerze w zakładce SSH Configuration) i uruchomienie poleceń:

lub podłączenie do routera przez FTP i utworzenie folderów /var/nodered/ i /var/nodered/data. Następnie przegrywamy obrazek przycisku z linku do katalogu /var/nodered/download.svg.  https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/Download_alt_font_awesome. svg/512px-Download_alt_font_awesome.svg.png

Kod wynikowy kod JSON:

[{"id":"2c84ad78.fa6f92","type":"ui_chart","z":"8ee72921.8c00d8","name":"Chart","group":"ae1455d7.c2f2c8","order":1,"width":0, "height":0,"label":"Pings","chartType":"line","legend":"false","xformat":"HH:mm","interpolate":"linear","nodata":"","dot": false,"ymin":"0","ymax":"100","removeOlder":"5","removeOlderPoints":"","removeOlderUnit":"60","cutout":0,"useOneColor":false, "colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x": 441.5,"y":159.64999389648438,"wires":[[],[]]},{"id":"d9e078ec.f791b","type":"file","z":"8ee72921.8c00d8","name":"","filename": "/var/nodered/data/pings.dat","appendNewline":true,"createDir":true,"overwriteFile":"false","x":422.5,"y":101.08331298828125, "wires":[]},{"id":"69a0b6f4.2b1978","type":"tail","z":"8ee72921.8c00d8","name":"","filetype":"text","split":true,"filename": "/var/nodered/data/pings.dat","x":169.5,"y":160.08331298828125,"wires":[["2c84ad78.fa6f92"]]},{"id":"17ec4dcb.6c5392","type": "ui_template","z":"8ee72921.8c00d8","group":"ae1455d7.c2f2c8","name":"Download button","order":0,"width":"2","height":"1", "format": "", "storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":472.5,"y":202.6500244140625,"wires":[[]]},{"id": "21f9f5c8.52674a","type":"ping","z":"8ee72921.8c00d8","name":"","host":"www.advantech.com","timer":"10","x":149.5,"y": 100.41668701171875,"wires":[["d9e078ec.f791b"]]},{"id":"ae1455d7.c2f2c8","type":"ui_group","z":"","name":"Networking monitor", "tab":"8912138.b569e7","disp":true,"width":"8"},{"id":"8912138.b569e7","type":"ui_tab","z":"","name":"Advantech demo","icon": "dashboard"}]

Rysunek: Ping flow

Po wgraniu aplikacji (czerwony przycisk Deploy w górnym prawym rogu) zobaczymy wizualizację statystyk pod adresem https://<ip-address-of-the-router>:1880/ui

Rysunek: Pobieranie i wizualizacja danych na wykresie chart

Na wykresie znajdują się statystyki pingów (w milisekundach, router musi być połączony z Internetem) oraz przycisk do pobierania pliku var / nodered / data / pings.dat. Ścieżka do pliku jest wykorzystywana do zapisywania wyników pingów do pliku danych, do odczytu na wykresie i  pobierania pliku danych.