(18.06.2019 08:19 )83Daniel schrieb: Ich hab da ein Problem mit dem Starten einer TCP Verbindung wenn ich sie in einem asynchronen VI starte.
Ich starte asynchron ein VI und gebe diesem IP, Port und ein Queue mit. In dem VI wird die Verbindung aufgebaut, und die Referenz über das Queue weitergeben. Wenn ich anschließend an einer anderen Stelle die Verbindungsreferenz aus dem Queue entnehme und etwas über die Verbindung senden will erhalte ich den LabVIEW Fehler: (Hex 0x1) Ungültiger Eingangsparameter…
Die Referenz ist nicht 0 / NULL.
Kennt jemand dieses Verhalten oder könnte es mir erklären?
Du hast hier noch ein Problem. TCP Refnums sind LabVIEW Refnums und die Unterliegen einer automatischen Aufräumung in LabVIEW sobald das ToplevelVI in dem die Refnum erzeugt wurde beendet wird. Ein VI das als asynchrones VI aufgerufen wird, gilt als ToplevelVI da es kein Diagram gibt in dem es als subVI aufgerufen wird. Deine Idee um das Öffnen der TCP Verbindung in einem asynchronen VI zu machen, das die Referenz dann in eine Queue schiebt und sich danach beendet funktioniert also nicht. Und es gibt KEINE Möglichkeit um LabVIEW zu sagen dass es die Referenz nicht automatisch aufräumen soll. Und die Refnum ist nicht NULL aber eben doch abgeschlossen, wie wenn Du ein TCP Close darauf ausgeführt hättest, und daher ungültig.
Mögliche Lösungen:
1) Öffnen der Verbindung nicht asynchron machen sondern innerhalb des Codes an dem jetzt Du Dein asynchrones VI startest.
2) Nicht nur die Verbindung in Deinem asynchronen VI machen sondern auch die ganze Datenkommunikation mit dem Server. Dein asynchrones VI ist dann also ein selbständiger Thread der solange aktiv bleibt wie die Verbindung mit dem Server instand bleibt. Statt die Refnum durch eine Queue an Dein Programm durchzugeben sollte Dein Connectionhandler stattdessen selber eine CommandQueue verwenden mit der Du Kommandos schicken kannst um etwas zum Server zu schicken oder zu lesen, aber auch ein Quit event, wenn der Handler sich beenden soll, und eine ResponseQueue mit dem Dein Handler Daten an Deine Applikation liefern kann.
Diese Möglichkeit scheint Dir vielleicht am Anfang komplizierter aber ist eigentlich logischer, da alle Kommunikation in Deinem Handler zusammengefasst ist. Und wenn Du diesen Handler als Clone konfigurierst kannst Du ohne extra Mühe auch mehere solcher Handler nacheinander zu verschiedenen Servern starten und parallel laufen lassen.