LabVIEWForum.de
UDP Verbindung zwischen mehreren PCs - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Datenkommunikation (/Forum-Datenkommunikation)
+---- Thema: UDP Verbindung zwischen mehreren PCs (/Thread-UDP-Verbindung-zwischen-mehreren-PCs)

Seiten: 1 2


UDP Verbindung zwischen mehreren PCs - Michael_ - 12.03.2010 15:51

Also es ist nur eine Netzwerkkarte im PC eingebaut, aber 2 weitere virtuelle NW-Karten sind vorhanden. Vielleicht liegt es daran!
Ich werde es mal versuchen die Karten zu deaktivieren!
Und vielleich hab ich das falsch formuliert. Die Daten kommen praktisch unverzögert am PC an, werden jedoch Verzögert von LabVIEW verarbeitet! Wirkt fast so, als werden die Daten in einen Buffer geschrieben, welcher erst später ausgelesen wird...
Programme kommen noch!


UDP Verbindung zwischen mehreren PCs - Michael_ - 13.03.2010 13:54

Also hier das Programm, welches die Datenkommunikation erledigt!


UDP Verbindung zwischen mehreren PCs - rolfk - 13.03.2010 18:06

' schrieb:Also hier das Programm, welches die Datenkommunikation erledigt!

Also erst mal würde ich nur ein UDP Open machen und da auch keine Adresse anschliessen. Dann würde ich den Addressenausgang vom UDP Read auswerten und die Daten dieser Adresse gemäss verteilen. Voila! Das Timeout des UDP read müsste dann natürlich recht klein sein und der entsprechende Timeout error muss auch ausgewertet werden (im Falle eines solchen Fehlers also keine Daten verteilen da ja nichts reingekommen ist). Bei allen anderen Fehlern ausser Timeout, die Verbindung schliessen und allenfalls neu öffnen.

Der netaddress input ist optional und nicht gedacht um zu bestimmen mit welchem Client man Verbindung haben möchte. Schliesslich ist man ein Server und der akzeptiert grundsätzlich jede Verbindung, (aber weist Anfragen eventuel ab basierend auf Authentifizierung oder Ausgangsaddresse).

Der netaddress Input ist gedacht um den Serversocket eventuel nur mit einer bestimmten lokalen Netzwerkkarte zu verbinden statt mit allen. Ansonsten könnte es bei multiplen Netzwerkkarten und komplexen Netzwerkstrukturen zu unübersichtlichen Routingproblemen im Netzwerklayer kommen. Der grosse Delay könnte gerade davon kommen, dass Du die netaddress angeschlossen hast. Da das wohl die Addresse des Clients ist und nicht die lokale Addresse eines lokalen Netzwerkinterfaces, gerät das Routing im Socketdriver wohl etwas in Schwierigkeiten.


UDP Verbindung zwischen mehreren PCs - Michael_ - 13.03.2010 18:45

Also erstmal Danke für eure Antworten und Tipps!

' schrieb:Also erst mal würde ich nur ein UDP Open machen und da auch keine Adresse anschliessen. Dann würde ich den Addressenausgang vom UDP Read auswerten und die Daten dieser Adresse gemäss verteilen. Voila!

Das Auswerten der Adresse wäre ja so nicht falsch, jedoch für meine Anwendung eher ineffektiv, da ich die Daten der beiden PCs dauerhaft miteinander Vergleichen muss, und daher die verschiedenen Daten im selben Zyklus benötige!
Deshalb erscheint für mich diese Lösung zwar richtig, aber eher ungeeignet, da dies die Auswertung der Daten zeitlich verlängern würde!

Gibt es über UDP keine Möglichkeit in einem Zyklus von 2 verschiedenen Sendern zu empfangen? Bitte helft mir weiter!
mfg


UDP Verbindung zwischen mehreren PCs - jg - 13.03.2010 18:48

Einige Fehler und überflüssige Sachen hat Rolf schon erklärt.

Weiterhin hast du das Datenflussprinzip von LabVIEW nicht beachtet: Die lokalen Variablen mit den UDP-Refnums sind überflüssig, ja sogar gefährlich. Es ist nicht garantiert, dass die UDP-Open-Befehle vor deiner Lese-Schleife starten. Ohne Datenfluss ist die Reihenfolge zufällig.

Nächster Fehler: Beide Read-VIs in einer Schleife: Wenn jetzt einer deiner Slaves nichts sendet, dann wartet das eine Read-VI bis zu seinem programmierten Timeout (in diesem Fall 25 s), bevor der Durchlauf ein weiteres Mal gestartet wird. Während dieser Warte-Zeit liest natürlich das andere Read-VI nichts.

Lösung: 2 parallele unabhängige While-Schleifen.

Wenn du dann, wie von Rolf angedeutet, Probleme mit 2 Verbindungen hast, stell auf eine um, das müsste langen:
[attachment=25129]

Gruß, Jens

EDIT:
' schrieb:Das Auswerten der Adresse wäre ja so nicht falsch, jedoch für meine Anwendung eher ineffektiv, da ich die Daten der beiden PCs dauerhaft miteinander Vergleichen muss, und daher die verschiedenen Daten im selben Zyklus benötige!
Das Auswerten, woher das Paket kommt, machst du am Ausgang des Read-VI! (s. mein Bsp oben). Die Unterscheidung hast du eigentlich schon durch die beiden unterschiedlichen Ports gemacht. Der Eingang am Open VI gibt nicht wie bei TCP/IP die Adresse an, zu der ein Open geschehen soll, sondern sagt, auf welche lokalen Netzwerkadresse die Verbindung geöffnet werden soll!
' schrieb:Gibt es über UDP keine Möglichkeit in einem Zyklus von 2 verschiedenen Sendern zu empfangen?
Verkleinere vor allem den Timeout des Read-VI! Denn wie schon gesagt, wenn einer nichts sendet, dann steht auch das andere Read-VI still...

Gruß, Jens


UDP Verbindung zwischen mehreren PCs - Michael_ - 13.03.2010 19:04

Ok gut. Wie LabVIEW ein VI abarbeitet ist mir tatsächlich noch unbekannt! gibt es hierzu vielleicht irgendwelche skripten oder erklärungen?? Die könnten mir vielleicht auch weiterhelfen!
Ich werde dein Beispiel sofort auf meine Anwenung umschreiben und testen, sobald ich wiederan die Anlage kann!
mfg


UDP Verbindung zwischen mehreren PCs - rolfk - 13.03.2010 21:23

' schrieb:Also erstmal Danke für eure Antworten und Tipps!
Das Auswerten der Adresse wäre ja so nicht falsch, jedoch für meine Anwendung eher ineffektiv, da ich die Daten der beiden PCs dauerhaft miteinander Vergleichen muss, und daher die verschiedenen Daten im selben Zyklus benötige!
Deshalb erscheint für mich diese Lösung zwar richtig, aber eher ungeeignet, da dies die Auswertung der Daten zeitlich verlängern würde!

Gibt es über UDP keine Möglichkeit in einem Zyklus von 2 verschiedenen Sendern zu empfangen? Bitte helft mir weiter!
mfg

Ob Du da jetzt zwei Server machst oder nur einen, da die Clients ja wohl nicht synchronisiert sind ist das Parallelisieren der zwei Empfängerloops zum Zwecke der Synchronisation recht sinnlos. Das hilft dafür absolut nicht. Mit einem Shiftregister und etwas logischer Programmierung kannst Du die zwei zeitlich am nächsten beineinanderliegenden Werten genau so gut vergleichen wie wenn Du die von zwei parellelen Empfängern hereinskommst. Verzögerung findet maximal für die Länge des Read-timeouts statt, kannst Du Dir also selber bestimmen.

So eine Applikation schreit ganz einfach nach einem Producer-Consumer Modell. Man hat den Producer (UDP Reader) der die Daten auf Basis der Senderaddresse in einen Buffer oder eine Queue schreibt und den Consumer der diese Daten regelmässig daraus liest und vergleicht und was immer anderes Du machen willst. Man kann auch noch eine Sicherung einbauen, dass der Consumer auf Basis eines Timestamps des letzten geposteten Wertes eines Kanals überprüft ob schon wieder ein neuer Wert reingekommen ist, und im Falle dass dem nicht so ist eine Warnung oder einen Fehler erzeugt.

Aber die Addresse am UDP Open sollte echt weg wenn Du nicht mehrere Netzwerkkarten hast, und wenn Du das schon hast solltest Du die Addresse des Netzwerkinterfaces angeben dass Du für die Kommunikation verwenden willst nicht die des Clients.


UDP Verbindung zwischen mehreren PCs - Michael_ - 15.03.2010 15:30

Ok habe eure Vorschläge jetzt umgesetzt!
Das Receive Programm funktioniert wunderbar, auch ohne Verzögerung!

Jedoch braucht offenbar die restliche Auswertung der Daten so lange, denn mit dieser tritt die verzögerung auf!
Werde einfach die Infrastruktur des Projektes etwas ändern, sodass dies nicht auftritt!
oder gibt es eine Möglichkeit, dass ich 2 VIs parallel nebeneinander ablaufen lassen kann?

mfg


UDP Verbindung zwischen mehreren PCs - Y-P - 15.03.2010 16:37

Du kannst sie (in manchen Fällen) beide nebeneinander in eine Whileschleife packen, aber besser ist, wenn Du jedes VI in eine eigene Whileschleife packst, dann läuft auf jedem Core eine Schleife und somit ein SubVI.

Gruß Markus

' schrieb:oder gibt es eine Möglichkeit, dass ich 2 VIs parallel nebeneinander ablaufen lassen kann?