Słowo wstępu
Mamy wstępnie skonfigurowany komputer przemysłowy i wiemy jak go obsługiwać. Pora go wykorzystać w sensownej aplikacji. Na początku spróbujemy przenieść możliwości panelu HMI do przeglądarki internetowej na PC i na telefonie. Oznacza to, że będziemy sterować PLC przy pomocy graficznego interfejsu. Dla częściowego ułatwienia sobie pracy wykorzystamy darmowe gotowe oprogramowanie Red Node wraz z rozszerzeniami. W ten sposób, aspekty związane z komunikacją sprowadzą się do zainstalowania jednego modułu.
W Red Node programy zapisujemy w sposób graficzny i tekstowy. Łączymy ze sobą odpowiednie węzły (Node) i wpisujemy w nie wymagane operacje. Co więcej, w przeciwieństwie do LAD, nie operujemy sygnałem boolowskim, tzn. prawda/fałsz, przekazywanym z lewej strony na prawą, tylko wiadomością. Można ją interpretować jako strukturę zawierającą pola ze zmiennymi, jako data block zawierający informacje o procesie, jako paczkę danych. Nie przesyłamy więc jednej informacji, a cały pakiet, który możemy dowolnie przetwarzać. Oto kilka przydatnych linków:
Strona Node Red:
Połączenie z S7:
Wizualizacja:
Wskaźnik prawda/fałsz, lampka sygnalizacyjna:
Przygotowanie środowiska
Co będzie potrzebne:
IoT 2050 skonfigurowany zgodnie z poprzednim artykułem,
sterownik PLC s7-1200,
komputer do pisania programów PLC i Node Red,
okablowanie.
Układ połączeń
Żeby mieć stały podgląd na program w PLC, musimy mieć stałe połączenie między PLC i PC. Do PLC musimy też podłączyć IoT. Jeśli nasz sterownik nie posiada dwu gniazd Ethernetowych, to musimy się posiłkować switchem. Tak też zrobiłem. Do switcha podłączyłem PC, PLC, router i IoT.
Oprogramowanie
Jako sposób komunikacji wybrałem połączenie przez PuTTy, a dostęp do Internetu odbywa się, wykorzystując metodę z dwoma statycznymi adresami IP, opisaną w poprzednim artykule. Pierwszy adres odpowiada za połączenie IoT z PC oraz z PLC 192.168.0.50, drugi jest odpowiedzialny za połączenie z Internetem 192.168.1.50. Pamiętamy o ustawieniu bramki i DNS!
Potrzebujemy pobrać i zainstalować odpowiednie oprogramowanie. Uruchamiamy PuTTy i IoT. Czekamy, aż IoT się uruchomi i łączymy się z nim tak samo, jak w poprzednim artykule. Logujemy się jako root. Do instalacji uprawnienia root są wskazane, ale do uruchomienia, nie ma takich wymagań.
Instalujemy poniższe pakiety w podanej kolejności:
Node Red – bazowy pakiet
sudo npm install -g –unsafe-perm node-red
Node Red contrib s7 – połączenie z PLC
sudo npm install -g node-red-contrib-s7
Node Red contrib dashboard – pozwala na łatwe tworzenie graficznego UI
sudo npm install -g node-red-dashboard
Node Red contrib ui led – dodaje lampkę sygnalizacyjną do UI
sudo npm install -g node-red-contrib-ui-led
Żeby odczytać adres IP IoT, możemy użyć komendy:
hostname -I , I jak Irena.
Program na PLC
Film pokazujący konfigurację PLC i uruchomienie Node Red
Przejdźmy teraz do TIA Portal i przykładowego projektu. Projekt powinien zawierać program i blok danych, którym będziemy operować.
Mając gotowy projekt, musimy wyłączyć optymalizację bloku danych Kontrola. Jest to wymóg, bez którego spełnienia nie połączymy bloku danych z IoT. Optymalizację wyłącza się w ustawieniach bloku danych, tak jak pokazano poniżej.
Kolejnym krokiem jest pozwolenie zewnętrznym urządzeniom na dostęp do PLC oraz ustawienie odpowiedniego poziomu zabezpieczeń. Musimy to zrobić, żeby IoT w ogóle mogło się połączyć z naszym PLC. Wchodzimy w ustawienia PLC i zaznaczamy poniższe opcje.
Pozostało nam, wgrać cały projekt oraz konfigurację na PLC. Z Tia Portal potrzebujemy zapisać, np. jako zrzuty ekranu, wykorzystane przez nas adresy wejść, wyjść, pamięci M itd. Będziemy korzystać też ze zrzutu bloku danych, na którym widać offset (adres względem bloku danych) poszczególnych elementów oraz numer bloku np. DB3.
Uruchomienie Node Red
Trzeba pamiętać, że dla każdego użytkownika, program jest zapisywany osobno. Jeśli program napiszemy jako root, a później zalogujemy się jako inny użytkownik, to program będzie pusty. Aby połączyć się z Node Red i móc pisać program, będziemy musieli wpisać w przeglądarce internetowej adres IP naszego IoT. Mamy wpisane w IoT dwa adresy, który jest poprawny? Oba. Pierwszy przy połączeniu przewodowym, drugi przy połączeniu bezprzewodowym (połączenie do routera). Możemy pisać program zdalnie, wykorzystując telefon, tablet lub inne urządzenie z przeglądarką internetową i połączeniem WiFi w naszej sieci. Łączymy się wówczas pod IP wykorzystywane do połączenia IoT z Internetem.
Node Red uruchamiamy komendą:
node-red
Ponieważ Node Red nie jest uruchamiany ze startem systemu IoT, to musimy każdorazowo go uruchamiać.
Jeśli wszystko jest dobrze zainstalowane, zobaczymy dane podobne do poniższych. Błędy [error] nie są teraz istotne, bo wynikają z mojego wcześniejszego programu, wrócimy do tego później.
W naszej stacji otwieramy przeglądarkę internetową i w polu adresu, podajemy adres IP naszego IoT (zależny od rodzaju połączenia). Musimy też dopisać numer portu po IP. Domyślnym portem jest 1880. W moim przypadku adres ma postać:
192.168.0.50:1880
Ukazuje nam się poniższe okno:
Pierwszy program w Node Red
Film pokazujący pisanie programu i prezentujący jego działanie:
https://youtu.be/OrTojsWqpZs
Dodawanie elementów odbywa się poprzez przeciąganie wybranego bloczku z lewej strony na obszar opisany flow. Flow oznacza tu program. Bloczki mają wejścia i wyjścia. Jeśli bloczek nie wymaga aktywacji, posiada samo wyjście. Jeśli przetwarza dane lub wymaga aktywacji, to posiada wejście i wyjście. Szukamy bloku o nazwie s7 in w zakładce plc i dodajemy go do programu. Przy jego pomocy, możemy odczytywać dane z PLC.
Do każdego bloku jest dostępna pomoc zawierająca objaśnienia jego funkcji i ustawień. Możemy ją sprawdzić klikając na dodany blok i klikając ikonę książki z prawej strony ekranu.
Poprzez dwukrotne kliknięcie na wybranym bloku, otwieramy jego opcje. Otwieramy opcje s7 in.
Niektóre bloczki mają do wyboru parametry z rozwijanej listy. Część z nich ma narzucone przez oprogramowanie wartości i nie można ich zmienić, a część jest przeznaczona do edycji przez użytkownika. Jeżeli możemy edytować lub dodać jakiś parametr, to obok pola z listą wyboru znajduje się symbol ołówka. Dzięki niemu możemy edytować istniejące parametry lub dodawać nowe. Dodawanie odbywa się poprzez wybranie z listy parametrów ’parametru’ z nazwą zaczynającą się na Add new…, a następnie edycje nowego parametru.
Skonfigurujmy połączenie z PLC. Klikamy ikonę ołówka obok pola Add new s7 endpoint. Przechodzimy w ten sposób do ustawień połączenia z PLC. Typ połączenia zostawiamy jako ISO-on-TCP i wpisujemy adres IP naszego PLC. Port zostawiamy domyślny, 102. Rack zostawiamy 0, a Slot na 1, bo wykorzystujemy S7-1200, w przypadku S7-1500 ustawienie się nie zmienia, a w przypadku S7-300 i S7-400, ustawienie wyglądało by tak: rack = 0, slot = 2.
Cycle time odpowiada za częstość wymiany danych. Małe wartości mogą zmniejszyć płynność działania GUI.
Timeout odpowiada za czas oczekiwania IoT na pierwszą odpowiedź z PLC. Zwiększmy wartość do 5s. Po ich przekroczeniu IoT wyświetli informację o błędzie połączenia, tak jak było u mnie przy włączeniu node-red. W przypadku jednorazowego błędu tego typu, problem jest niewielki (sporadyczne zakłócenie komunikacji), jeśli błąd połączenia występowałby ciągle, np. przy każdej próbie przesłania informacji, to problem byłby poważny. Rozwiązaniem byłoby sprawdzenie ustawień połączenia odbierającego dane z PLC i wysyłającego dane. Jeśli to by nie pomogło, trzeba by szukać informacji na stronie z projektem Node Red contrib s7 i na forum Siemensa.
Ustawienie Debug zostawiamy bez zmian.
W oknie Name wpisujemy nazwę naszego połączenia. Jeśli jej nie podamy, będzie widoczna jako adres IP PLC.
Mając skonfigurowane połączenie, przechodzimy do wyboru zmiennych, na których będziemy operować. Przechodzimy do zakładki Variables. Teraz przydadzą się nam zrzuty ekranu z bloku danych i programu z TIA Portal. Dodatkowo przyda nam się opis adresowania zmiennych ze strony:
https://github.com/netsmarttech/node-red-contrib-s7
W polu Address wpisujemy adres absolutny zmiennej, którą chcemy odczytywać. Jeśli korzystamy z bloku danych, adres ma postać DBx,zy , gdzie X to numer bloku danych, Z rodzaj zmiennej zgodny z podanymi na stronie, a Y offset zmiennej w bloku danych.
Jeśli podajemy adres zmiennej typu I, Q, M, podajemy adres standardowo tzn. np. I0.0, M10.3 itd.
W polu Name podajemy nazwę zmiennej. Jest to nazwa, pod jaką będzie widoczny adres w programie Node Red, czyli jest to coś podobnego do taga w TIA Portal. Uwaga: Polskie znaki są dozwolone. Problem może stanowić znak spacji w nazwie zmiennej np. wejście nr1. Przy odczycie program nie wskaże błędu, ale przy próbie przetworzenia zmiennej, program nie będzie działał zgodnie z oczekiwaniami. Zamiast znaku spacji możemy używać znaku podkreślenia: _ , wejście_nr1.
Przechodzimy do uzupełniania, podając adresy zmiennych, które chcemy wykorzystać w projekcie. Jeśli chcemy odczytywać zmienną typu Time, to wpisujemy jej adres jako DI, czyli double int. Offset podajemy jako liczbę całkowitą (5, 24, 17, itd.), chyba że odnosimy się do bitów, wtedy podajemy adres jako liczbę zmiennoprzecinkową. Wartość po przecinku jest z zakresu od 0 do 7, ponieważ bajt ma tylko osiem bitów (3.0, 45.7, 13.2, itd.). Zatwierdzamy zmiany przyciskiem Add.
Zostaniemy przeniesieni z powrotem do okna edycji bloku s7 in. Jak widać ustawienie połączenia zostało zapisane i dodane. Teraz przechodzimy do wyboru sposobu odczytu danych. W okienku Mode wybieramy All variables. Oznacza to, że każdorazowo zostaną odczytane wszystkie zmienne i zostaną przesłane w jednej wiadomości. Ustawienie All variables, one per message, też odczytuje wszystkie zmienne, ale wysyła je kolejno w wiadomościach. Zamiast jednej zawierającej 10 zmiennych, dostaniemy 10 wiadomości zawierających po jednej zmiennej. Single variable pozwala na odczytanie tylko jednej zmiennej i wysłanie jej wartości w wiadomości.
Kolejną ważną opcją jest Emit only when value changes (diff), ogranicza ona potrzebę ciągłego odpytywania PLC o wartości zmiennych. Jeśli wartość dowolnej z odczytywanych zmiennych się nie zmienia w czasie, ustawionym w połączeniu, wiadomość nie zostanie wysłana. Mniejsze obciążenie, płynniejsze działanie.
W Name wpisujemy nazwę bloczku, wyświetlaną w programie. Jeśli jej nie podamy, to będzie widoczna nazwa domyślna, czyli nazwa PLC PLC_1.
Klikamy Done.
Odczytujemy z PLC, pora coś zapisywać. Dodajemy bloczek s7 out. Różnica między s7 in, a s7 out (prócz kierunku wymiany danych) polega na tym, że możemy odczytać z PLC wiadomość zawierającą wszystkie wybrane zmienne wykorzystując jeden bloczek. W przypadku zapisu do PLC, zapisujemy max do jednej zmiennej na bloczek. Oznacza to, że chcąc ustawić np. 12 zmiennych, musimy dodać 12 bloczków s7 out. Dodajemy dwa bloczki s7 out, jako PLC wybieramy skonfigurowane wcześniej przez nas połączenie PLC_1. Jako zmienne ustawiamy wej_0_wirt i (w drugim bloczku) czas_set.
Podgląd sytuacji
Bloczek debug służy do podglądu danych od niego wysyłanych.
Dodajmy bloczek debug i połączmy go z PLC_1. W jego ustawieniach jako Output ustawiamy z listy complete msg object. Klikamy Deploy i wgrywamy program na IoT.
Wchodzimy w podgląd konsoli klikając ikonę z owadem z prawej strony. Po naciśnięciu przycisku na PLC, zmieniamy stan jednej z odczytywanych zmiennych. PLC wysyła wiadomość a jej zawartość jest widoczna w nowo otworzonym oknie. Rozwijamy objekt, następnie payload i uzyskujemy podgląd na treść wiadomości. Każdą wiadomość można podzielić na trzy elementy: payload – właściwa zawartość z danymi, topic – temat wiadomości, nagłówek, _msgid – numer ID wiadomości. Dzięki temu podglądowi znamy strukturę wiadomości. Interesuje nas składowa payload i jej zawartość. Chcąc dobrać się do konkretnej zmiennej posługujemy się formatem msg.payload.x, gdzie x to nazwa zmiennej np. msg.payload.wej_0_fiz.
Bloczek debug nie jest nam już potrzebny więc go usuwamy. (Usuwamy poprzez zaznaczenie i naciśnięcie klawisza Delete)
Z wiadomości chcemy uzyskać informacje o stanach wejść i wyjść fizycznych, czasie zliczonym przez timer oraz stan zmiennej M10.0. Dodajemy pięć bloczków function (jeden na każdą zmienną, którą chcemy wyłuskać) i wchodzimy w ich ustawienia. Wpisujemy funkcję analogiczną do poniższej. Wyłuskuje ona konkretną zmienną ze struktury wiadomości, a następnie tworzy nową wiadomość której zawartość składa się tylko z jednej zmiennej. Nowa, uproszczona wiadomość, jest przekazywana dalej. Następnie łączymy wszystkie bloczki funkcji do bloczku s7 in.
Panele HMI pozwalają na tworzenie kilku ekranów, między którymi użytkownik może się przemieszczać. Node Red posiada podobny system, w którym mamy do dyspozycji ‘ekrany’ nazywane Tab. Elementy na nich są dodawane automatycznie i kolejność ich wyświetlania zależy od kolejności dodania. Aby móc uporządkować elementy na ekranach, wykorzystuje się grupy Group, które na wybranym ekranie wydzielają obszar dla kilku elementów. Możliwość konfiguracji ekranów i grup pojawia się po dodaniu elementu, który będzie widnieć na wizualizacji.
Do wizualizacji zmiennych logicznych nadaje się bloczek led. Dodajemy cztery sztuki obok odpowiednich bloczków funkcji (tych ze zmiennymi logicznymi). Domyślnie led ma trzy stany, prawda, fałsz i nieokreślony. Dla stanu nieokreślonego ma barwę szarą, dla pozostałych stanów, barwę można skonfigurować. Warto wpisać w pole Label nazwę wyświetlaną przy diodzie na wizualizacji.
Teraz przechodzimy do tworzenia grupy, czyli wydzielonego obszaru ekranu. Klikamy symbol ołówka obok Group. Zostajemy przeniesieni do ustawień grupy. Musimy podać jej nazwę, określić szerokość okna i wybrać ekran, do którego jest przypisana. Domyślnie nie ma żadnego ekranu, więc musimy stworzyć nowy. Klikamy ikonę ołówka obok okna Tab.
Teraz możemy skonfigurować nowy ekran. Nadać nazwę, wybrać ikonę, określić widoczność i możliwość obsługi z menu nawigacyjnego. Zmiany zatwierdzamy klikając Add.
Na liście z wyborem ekranów możemy zobaczyć naszą stronę Główna. Stwórzmy jeszcze jedną stronę, o nazwie Wykresy. Stwórzmy i przypiszmy grupy Sygnały wyjściowe z PLC i Sygnały wejściowe PLC do ekranu Główna. Zmiany zatwierdźmy przyciskiem Add lub Update jeśli aktualizujemy parametry. Dodatkowo stwórzmy grupę Wykresy i przypiszmy ją do ekranu o tej samej nazwie. Na koniec przypiszmy do wskaźników LED Grupę Sygnały wyjściowe z PLC na ekranie Główny. Akceptujemy Done.
Zmienne nie boolowskie dobrze jest wizualizować za pomocą bloczków text, gauge, chart. Dodajmy text (grupa Sygnały wyjściowe z PLC na stronie Główna ) i chart (grupa Wykresy, strona Wykresy) i połączmy je z ostatnim bloczkiem funkcji (ten od msg.payload.czas_read).
W bloczku text możemy podać etykietę Label, oraz format wartości. Domyślnie jest to {{msg.payload}}, ale może być potrzeba wyświetlenia tematu wiadomości, albo konkretnego jej elementu. Wówczas możemy podać {{msg.topic}} albo {{msg.payload.czas_read}}. Funkcja poprzedzająca, robi taką konwersję za nas, więc nie musimy nic zmieniać.
W chart możemy skonfigurować ustawienia wykresu. Zmieńmy ustawienie X-axis last 10 minutes. Sprawi ono, że na wykresie będzie widoczny przebieg z ostatnich 10 minut. Opcję Y-axis ustawmy na min 0, max 10000. Spowoduje to ograniczenie maksymalnej wyświetlanej wartości do 10000ms, czyli 10s. Resztę ustawień zostawiamy.
Sprawdźmy co mamy. Wgrajmy program przyciskiem Deploy i otwórzmy GUI. W tym celu otwieramy w przeglądarce nowe okno lub zakładkę i wpisujemy adres IP z portem oraz z dopiskiem /ui. Na przykład 192.168.0.50:1880/ui . Otwiera się nam strona albo raczej panel, na którym mamy zawarte nasze diody, wykres i wartość liczbową. Kolejność elementów domyślnie zależy od kolejności dodania.
Aby wejść na drugi ekran, wybieramy z rozwijanego menu po prawej stronie zakładkę wykresy.
Wiemy już, że program działa w zakresie odczytywania, więc wracamy do strony z programem i dorabiamy możliwość zapisu. Jako prosty zadajnik można wykorzystać bloczek buton, ale generuje on tylko impuls. Dlatego lepszy (w naszym przypadku) jest bloczek switch działający jako przycisk bistabilny. Do zadawania wartości posłużyć może numeric, slider, text input. Numeric pozwala na zmianę wartości o określony skok. Slider dodaje suwak, którym zmieniamy wartości. Text input pozwala na bezpośrednie wpisanie żądanej wartości. Dodajmy text input. W switchu ustawiamy label na Start/Stop, a w text input Ustaw czas oraz w obu dajemy grupę Sygnały wejściowe PLC na stronie Główna. Resztę ustawień zostawiamy bez zmian. Połączmy switch z wej_0_wirt, a text input z czas_set. Klikamy Deploy i sprawdzamy działanie programu.
Program działa, wizualizacja działa, wszystko działa. Uzyskujemy dostęp do PLC, taki sam jak w przypadku HMI. Jednak jeśli chodzi o możliwości, to IoT bije HMI na głowę. Panel HMI ogranicza swoją rolę do wizualizacji i akwizycji danych. IoT pozwala na wizualizację na dowolnym sprzęcie z wejściem Ethernet lub połączeniem WiFi (nawet telefon). (Połączenie WiFi wymaga dodatkowo modułu pozwalającego WiFi i ustawienie adresu IP. Reszta jest bez zmian. ) Umożliwia on akwizycję danych oraz ich obróbkę. Pozwala na korzystanie z baz danych SQL i wiele więcej, ale o tym w innym artykule.
댓글