LabVIEWForum.de - Problem mit Datasocket Ping Pong

LabVIEWForum.de

Normale Version: Problem mit Datasocket Ping Pong
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

ich bin zur Zeit dabei mich in die DataSockets einzuarbeiten. Im Anhang befinden sich 2 Vi’s.

Ping sendet einen Befehl an Pong welcher dann die gewünschte Antwort zurück liefert. Soweit so gut.

Das Problem ist, wenn ich einen Befehl sende kommt dieser bei Pong an und sollte das entsprechende Resultat liefert leider ist dieses immer um 1 zu spät.
Beispiel: Beide Vi’s wurden gestartet. Man drückt auf senden, dann sollte ein String (Data…….plus zähl Nummer) zurückgeliefert werden.
Diese geschieht aber erst nach dem zweiten Mal wenn ich send drücke. Auch so verhält sich die Umschaltung zwischen info/data.

Kann mir da jemand weiterhelfen?

LG Hubert
Hallo zusammen,

das Problem liegt am ping. Habe nun das Vi umgebaut und teste das mal über Nacht.

Da es im Augenblick mit dem Localhost kommuniziert bin ich mir nicht sicher wie das Vi in einem richtigen Netzwerk verhält.

Was sind hierzu euere Erfahrungswerte in Bezug auf waits und Timeout’s?

Im Anhang das überarbeitete Vi.

LG Hubert
Halloo Hubert,

das löst aber die Problematik nicht. Du wartest jetzt lediglich 100ms und hoffst, dass "pong" diese 100ms reichen um die Antwort zu senden.

Ich bin ja fast geneigt, zu schreiben, dass die Verwendung von "Datasocket" die Problematik auslöst.

Da steckt von Anfang an ein leerer String in dstp://localhost/lesen - auch wenn dein "pong" noch gar nicht gestartet wurde. Wenn du "Datasocket read" aufrufst, dann bekommst du nur den zuletzt geschriebenen String. Du kannst zwar auf einen neuen String warten, doch wenn der leere String noch nicht gelesen wurde, dann ist der Neu und es wird auch nicht gewartet.
Hallo Martin,

erstmal danke für deine Antwort.

Ich bin mir nicht sicher ob ich dich richtig verstehe.
Meinst du mit lesen den leeren String den ich am Type Variant angeschlossen habe.
Siehe Bild.
(09.11.2021 16:41 )Hubert R. schrieb: [ -> ]Ich bin mir nicht sicher ob ich dich richtig verstehe.

vermutlich nicht - ich hätte gleich ein Bild dazu machen sollen.

Wenn du das erste ping (das aus deinem ersten Beitrag) ein wenig ergänzt (siehe Bild), dann funktioniert es schon:

[attachment=62103]

Also am Anfang ein Read einfügen. In dem String steht noch nichts sinnvolles drin (nur ein leerer String), deshalb wird damit gar nichts gemacht. Beim später folgende Read Aufruf wartet das Read auch tatsächlich auf den von pong aktualisierten String.
Hallo Martin,
soweit verstanden. Mir ist schon die Tage vorher etwas ähnliches durch den Kopf gegangen.
Ich habe nach einen "buffer clear" oder etwas Ähnlichen gesucht. Wie bei einer RS Schnittstelle oder einer queue.
Aber nachdem ich nichts gefunden habe, bin ich davon ausgegangen, dass die Funktionen das selber organisieren.

Auf die einfache Idee bei der Initialisierung einfach mal ein lesen auszulösen bin ich nicht gekommen. Manchmal sieht man den Wald vor lauter Bäumen nicht.

Hierzu noch eine Frage. Müsste ich nicht konsequenterweise auf beiden Seiten also Ping und Pong einen Read bei der Initialisierung machen?

Herzlichen Dank für die Lösung.

Gruß Hubert
(10.11.2021 08:47 )Hubert R. schrieb: [ -> ]Müsste ich nicht konsequenterweise auf beiden Seiten also Ping und Pong einen Read bei der Initialisierung machen?

Nein, weil das Pong ja nur einen leeren String bekommt und damit nichts anfangen kann (unbekanntes Kommando). Es führt einfach
keine Aktion aus (sendet keine Antwort).
Ja, weil du eventuell später etwas mehr Komfort einbaust und z.B. Pong bei einem unbekannten Kommando einen Fehler ausgibt.
Referenz-URLs