Wymiana danych między urządzeniamia za pomocą Node-RED

Cześć. Na początku opiszę zamysł zastosowania Node-RED. Głównie chodzi o odczytywanie danych z Modbus serwera przez Node- RED, a następnie po odczytaniu jakiś danych zmiana ich pod konkretną komendę i wysłanie ich dalej do kolejnego urządzenia.
Modbus serwer postawiony jest na sterowniku PLC w odpowiedni sposób, aby mieć komunikacje z Node-RED postawionym na Raspberry PI.
Na Node-RED korzystam z biblioteki Modbus. Na ten moment jestem w stanie odczytać dane z bloku danych na PLC poprzez Modbus-READ. Kolejnym krokiem jest przekształcenie lub dodanie do danych odpowiedniej komendy, aby móc wysłać do kolejnego urządzenia przez usb informacji(np. komendy), tak aby można było sterować np silnikiem, to urządzenie również można obsługiwać za pomocą terminala i pythona. Mam bibliotekę i node “serial out” - wydaję mi się, że może się przydać :smiley: Moje pytania to jak mam przetworzyć moje dane wejściowe, aby uzyskać na wyściu to czego oczekuje i co powinienem zastosować, aby za pomocą Node-REDa wysyłać informacje wyjściową do mojego sterownika końcowego(nie PLC, tylko połączonego za pomocą usb do raspberry). Załóżmy, że mam pakiet danych kilku liczb, który Node-RED odczytuje [0,0,0,0,0,0,0] wstępnie chciałbym, żeby pierwsza liczba to była prędkość, druga to pozycja, a trzecia np. opóźnienie itd. Zakładam, że na stałe do pierwszej pozycji na wyjściu przypisana jest komenda "ustaw prędkość = “i tutaj Node-RED ma wpisać daną wejściową” i wysłać dalej druga pozycja "ustaw pozycje = “i tutaj Node-RED ma wpisać daną wejściową” itd
Będę wdzięczny za wszelkie sugestie i pomoc jak to należałoby wykonać :slight_smile:

Kierunek jest dobry. To urządzenie to jakiś rzeczywiste, czy na razie abstrakcyjne?
Wszystko zależy od protokołu komunikacji. Reszta jest całkiem realna do zrobienia.

Mam złe doświadczenia, pracuje jakoś niestabilnie. Może to kwestia chipa w konwerterze USB<>RS lub sterowników. Lepiej zastosować jakiś konwerter LAN<>RS.

1 Like

Rzeczywiste, funkcjonuje już manualnie, gdy w terminalu wpisuje odpowiednie komendy:) teraz kwestia tego, aby to zautomatyzować - nazywa się ODrive v3.6.
Dostępne protokoły to USB, UART,CANopen. Aktualnie mam podpięte to pod Raspberry USB i działa dobrze :slight_smile:

O ile dobrze zrozumiałem dokumentację ( a zbytnio się nie przykładałem :wink: ) USB i UART są tożsame i używają protokołu ASCII.
Z tym, że USB tworzy wirtualny UART.
Protokół jest tekstowy, więc dla pierwszych prób możesz użyć węzła inject w którym z łapy do payload wpiszesz jakąś komendę. Trochę zabawy będziesz miał z dodaniem na końcu ciągu wymaganego znaku :slight_smile:
Następnie tak przygotowany payload wysyłasz przez węzeł serial_out (dla poleceń bez odpowiedzi) lub serial_request. W zasadzie to wszystko - reszta zależy od inwencji i to już zwykła rzemieślnicza robota w postaci składania wymaganego ciągu znaków.

Np. napisać kilka pomocniczych węzłów funkcyjnych, które zrobią automatycznie tylko na postawie parametrów - tak jak w przykładzie arduino.

1 Like

Czy mógłbyś podpowiedzieć jak skonfigurować węzły incject i serial out?

Więc ustaw tak samo.
flows (74).json (1,9 KB)

1 Like

Właśnie tak próbowałem i niestety bez skutku. Mam połączenie z moim urządzeniem (napis connected) pod serialem out, ale wysyłając odpowiednią komendę przez inject - nawet zmieniając rodzaj z string na global bądź flow itd brak ruchów ze strony mojego silnika, po stronie płytki sterującej wszystko ok, ponieważ jak rozłączam node-red i podłączam się ręcznie na nowym terminalu to po wpisaniu tej samej komendy silnik się porusza.

Jeśli nic więcej nie namieszałeś z ustawieniami portu uart, to tylko może być problem ze znakami na końcu linii.
Wpisując z terminala - po klepnięciu entera, do tego co wpisałeś dodawane są
dwa znaki . Są to znaczniki po których odbiorca poznaje zakończenie transmisji.
Co prawda w przykładzie arduino na końcu dodawane jest tylko ‘\n’ new line.

serial_ << "w axis" << axis << ".requested_state " << requested_state << '\n';

Za inject, przed wysłaniem dodaj ten nod, który do komendy dopisze co trzeba.
flows (33).json (255 bajtów)

1 Like

Cześć. Czy mógłbyś zerknąć na moje flows?
Próbowałem z tym co wyżej napisałeś, ale po kilkukrotnej próbie coś się stało z moim odrive i na nic nie reaguje, będę pewnie musiał go do ustawień fabrycznych przywrócić :smiley:
flows.json (2,6 KB)

Po co to wstawiłeś? Ma być tak ja w oryginale.

serial_ << "w axis" << axis ".requested_state" << requested_state << '\n';

To był tylko przykład, że w arduino dodają na końcu tylko \n.
Komuś kto mało wie w temacie, lepiej za dużo nie mówić :wink:

W ogóle, czy tylko z NR?
Jak pisałem, nod serial jest mało stabilny… albo wysyłając głupoty coś trwale przestawiłeś.
Ten proces to powinien wyglądać i zwracać tak.

1 Like

Próbowałem bez tego :slight_smile: ale jeszcze raz na koniec spróbowałem z tym kodem co podrzuciłeś :stuck_out_tongue: ale nie ten plik wstawiłem :stuck_out_tongue:
Jeśli chodzi o odrive to zrestartuje i spróbuję jeszcze raz od początku go skonfigurować :slight_smile:

Jeśli Tego prostego wysyłania nie przejdziesz, to nie ma sensu iść dalej.
Jak na razie nic więcej nie jestem w stanie dodać.

1 Like

Tak jak podejrzewałem, nie konfiguracja w Node-Red była problematyczna tylko rodzaj komendy. Okazuje się, że gdy chcę wysyłać w ten sposób muszę w inny sposób wysyłać komendy do Odrive :slight_smile: więc podsumowując sterowanie z “ręki” z węzła inject i payload wysyłany przez węzeł serial_out działa :slight_smile:
Zostaje kwestia obróbki danych zczytanych po Modbusie.

Jeśli pobawisz się węzłem template i zrozumiesz, to składanie komend nie będzie trudne.

1 Like

Dziękuję za pomoc. Pozdrawiam :slight_smile: