LabVIEWForum.de
Client Server Anwendung mit Producer-Consumer Template - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Datenkommunikation (/Forum-Datenkommunikation)
+---- Thema: Client Server Anwendung mit Producer-Consumer Template (/Thread-Client-Server-Anwendung-mit-Producer-Consumer-Template)



Client Server Anwendung mit Producer-Consumer Template - echtzeit - 13.01.2010 14:49

Hallo LabVIEWgemeinde,
Ich habe aus den simple client-server Beispielen von LabVIEW mit dem Producer-consumer-template ein Beispiel "gezimmert.
Der Server wartet ewig, bis sich der client meldet. Jetzt fängt er an Daten zu senden (da ich mir über einen grundlegenden Zusammenhang im Unklaren bin, ist dies nur ein Minimalbeispiel. Als "Daten" werden hier nur die Anzahl der Iteration "gesendet".)

Auf dem Client läuft jetzt die Producer-consumer loop. Nur wenn Daten auf der aufgebauten Verbindung ankommen, soll die consumer loop arbeiten.

(Hintergrund: das server VI ist eigentlich ein subVI das auf einem RT-Target liegt. Sobald der user am Host aktuelle Messdaten angezeigt bekommen möchte, "clickt" er auf "call for data" und lässt sich die Daten in einem Graph anzeigen. Dies habe ich wie gesagt hier alles weggelassen...)

Wenn ich auf "call for data" drücke, läuft der "Zähler" auf dem Frontpanel des clientVI wie gewünscht hoch (der server sendet also seine "Daten" und der client verarbeitet sie wie gewünscht.)
Sobald ich auf "IDLE" drücke unterbreche ich die producer-consumer-Verbindung. Ich dachte jetzt, der Server arbeitet ja noch und sendet seine Daten jetzt ins "Leere".
Pustekuchen.... wenn ich nämlich wieder auf "call for data" drücke (und somit die producer-consumer-verbindung wieder aufnehme) beginnt der "Zähler" auf dem Frontpanel des clientVI an der Stelle, an der er vorher aufgehört hatte...
Das bedeuted, es gehen keine Daten verloren. Ich möchte aber keine alten Daten, sondern nur die aktuellen..es dürfen ruhig Daten verloren gehen..

Wo bitteschön werden denn die Daten (in diesem Fall unerewünschterweise) zwischengespeichert?? In irgendeinem rießigen Netzwerkbuffer auf meinem Windows-PC??

[attachment=23604]

[attachment=23603]

Bitte um Aufklärung...Tongue

Edit1:
P.S.:Ich verwende LabVIEW 8.6

Edit2:
Lösung wäre für mich also (wenn meine vermutung mit dem Netzwerkbuffer stimmt? Unsure ) diesen Buffer zu löschen direkt nachdem ich "call for data" drücke....aber so eine Funktion gibts nicht.....


Client Server Anwendung mit Producer-Consumer Template - SeBa - 13.01.2010 15:29

Wenn ich die Screenshots richtig deute, dann liest deine Producerloop die Daten vom Netzwerk und schreibt sie in eine Queue. In der Consumerloop liest du dann Daten aus der Queue aus.

Dann hast du genau hier deinen Puffer erzeugt... -> die Queue.

Wenn du der Queue keine max. Größe gibst und die Daten verlustbehaftet einfügst, bleiben die da drin bis du sie abholst.

Alternativ kanst du die Queue auch leeren und die Daten der Queue die bis dahin angelaufen sind ins Nirgendwo schicken... hört sich für mich aber nicht so gut an, da die Queue dann immer größer wird, bis mal endlich wieder jemand Daten sichtet.


Also max. Größe der Queue festlegen und Elemente verlustbehaftet einfügen.


Gruß SeBa


Client Server Anwendung mit Producer-Consumer Template - echtzeit - 13.01.2010 15:45

Jein..Big Grin

Wenn "call for data" gedrückt ist, werden die Daten eingelesen und in die queue geschrieben.

Aber im Falle von "IDLE":

[attachment=23607]

wird nichts eingelesen und auch nichts in die queue geschrieben.
Da es in LabVIEW keine Funktion gibt für "Netzwerkbuffer löschen" müsste ich mir eine dll schreiben, dass sobald wieder "call for data" eingestellt ist, ersteinmal der Netzwerkbuffer gelöscht wird.
..oder ich stoppe eben im Falle von "IDLE" das Senden des Servers...

noch mehr Optionen?

Grüße,
riorio


Client Server Anwendung mit Producer-Consumer Template - SeBa - 13.01.2010 16:11

Ich hab jetzt einfach mal das TCP lesen Gedöns aus dem Call for Data Case auch in den IDLE Case kopiert, allerdings ohne die Daten in die Queue zu schreiben. Die gehen also ins Leere.

Damit funktioniert es. Der Counter springt nach Pause auf den aktuellen wert vom to_Host VI.


Gruß SeBa


Client Server Anwendung mit Producer-Consumer Template - eg - 13.01.2010 16:23

Ich vermute, dass solange die Verbindung zwischen dem Client und Server offen bleibt, existiert dieser Puffer.
Deshalb würde ich die Verbindung im IDLE clientseitig schliessen. Der Server bekommt es auch mit (Fehlermeldung) und soll aus der inneren Schleife rausgehen und in die außere Schleife (die es bei dir noch nicht gibt) springen.