JavaScript Möglichkeit String bei Signaleingang zu splitten

Inxession

Captain
Registriert
Sep. 2008
Beiträge
3.187
Hallo CB Gemeinde ..

ich habe zuhause einen kleinen Industrie Roboter, welcher über Ethernet IP mit Node-Red kommuniziert und darüber "steuerbar" ist.

Da der Roboter nur 8000 Zeilen kann, ich aber Programme mit weitaus mehr Zeilen einspeisen will, möchte ich nun die POSE Werte nacheinander über die TCP Out Node an den Roboter schicken und dort decodieren.

Das System selbst läuft bereits ... nur habe ich noch keine Möglichkeit gefunden, eine Zeile aus einem String, erst nach einem Signaleingang auszugeben.

Ich kann die Split Node mit einem msg.delay verbinden und so die weiteren Zeilen verzögern.
Oder die Javascript Funktion .split("\n") verwenden ... die Ausgabe ist immer die gleiche und auch die Richtige. Jedoch wird immer die komplette Datei gelesen bei einem Trigger und nach Einstellung verzögert.

Ich will aber ..
Signaleingang -> Erste Zeile lesen -> an Roboter senden -> Roboter bewegt sich -> Signal an Node-Red
Signaleingang -> Zweite Zeile lesen -> an Roboter senden -> Roboter bewegt sich -> Signal an Node-Red
Signaleingang -> Dritte Zeile ......

usw.

Ich steh hier wahrscheinlich nur vor einem Wald mit zu vielen Bäumen.
Aber genau hier erhoffe ich mir etwas Input von Euch.

Danke und Gruß
Michael
12.png
 
Zuletzt bearbeitet:
Flow ist im Spoiler...

Ist aber grundsätzlich egal.

Es soll einfach die nächste Ausgabe verzögert werden, bis ein Signaleingang ansteht.
 
Klingt spannend.
Hast Du Dir in node's API schon die AsyncHooks angeschaut? Offensichtlich willst Du ja auf ein externes Event ("Signaleingang") hin eine Funktion ausführen lassen, vllt. wäre das etwas für Deine Zwecke.
Ich bin selber ziemlich raus, lange her dass ich (mit dem Raspberry Pi) etwas mit node.js gebastelt habe, aber Dein Problem ist doch bestimmt nicht die Stringverarbeitung in JavaScript, sondern die asynchrone (i.e. Event-basierte) Ausführung, oder?
Falls Du das Projekt hinbekommst, planst Du vllt. schon einen Leserartikel davon zu machen?
 
Das Problem ist, das die Datei Zeile für Zeile auf einmal ausgegeben wird, und nicht jede einzelne Zeile nach einem Trigger.

Ich hab jetzt mit Flow Variablen rumprobiert, bin aber leider noch nicht weiter gekommen.

Eine andere Möglichkeit wäre, die Einzelnen Textzeilen in Arrays ausgeben zu lassen, damit ich hinterher die Arrays einzeln ziehen kann.

Aber auch diese Funktion bring ich noch nicht zum laufen.

Bezüglich Leserartikel ... könnte ich sicher machen. Je nach Interesse. Ich glaube aber nicht das hier allzu großes Interesse herrscht?!
 
Update ...

Ich bin jetzt einen Schritt weiter gekommen, und habe es geschafft, das jede Zeile ein einzelnes Array besetzt.

Nun scheitere ich aber beim auslesen.

Ich habe nun eine Flow-Variable (temp) mit 99xxx Arrays

Wenn ich nun msg.payload = flow.get('temp[137]') auslese, bekomme ich die Ausgabe des 137. Arrays ...

Nun versuche ich den Integer im Array bei jedem Aufruf zu inkrementieren. Aber daran scheitert die Kontrollstruktur scheinbar.

Also beim festlegen der Daten passiert folgendes ...

Funktion
----> String ----> flow.set('cnt',0)
------------- ----> var temp = msg.payload.split("\n");
------------- ----> flow.set('temptxt',temp);
------------- ----> return msg;

Funktion
----> Trigger ---> var counter = flow.get('cnt');
------------- ----> msg.payload = flow.get('temptxt[counter]');
------------- ----> flow.set('cnt',+1);
return msg;




bei Jedem Trigger soll also der counter um 1 hoch gezählt werden.
Invalid property expression: unexpected c at position 8

nutze ich statt
------------- ----> msg.payload = flow.get('temptxt[counter]');
eine Ganzzahl ... also
------------- ----> msg.payload = flow.get('temptxt[12345]');
funktioniert die Ausgabe problemlos.


Ich müsste aber den Ausgabestring bei jedem Trigger erhöhen.

Jemand eine Idee?
 
Und nun hab ichs geschafft.

Jetzt muss ich nur noch kleinere Anpassungen machen und dann kann ich loslegen.
 
Zurück
Oben