LabVIEWForum.de - Problem mit Referenz bei Applikation

LabVIEWForum.de

Normale Version: Problem mit Referenz bei Applikation
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

folgende Ausgangslage:

- 2 von einander getrennte VIs
- mit einem VI möchte ich auf die Bedien-/Anzeigeelemente des anderen zugreifen
- Übergabe der Referenz der Bedienelemente als Parameter an das andere nicht möglich, da dieses eben kein Sub-VI ist

eine Lösung:

beim Start des ersten VIs Umwandeln der Referenz in vorzeichenlose 32-Bit-Zahl, schreiben dieser Zahl in eine Datei. Das zweite VI liest beim Aufruf diese Zahl ein und wandelt es in die Referenz zurück. Über Eigenschaftsknoten kann ich dann auf die Objekte des ersten VIs zugreifen.

Ist zwar bißchen von hinten durch die Brust ins Auge geschossen, funktioniert aber. Wink

zum eigentlichen Problem:

Wenn ich eine *.exe damit erstelle funktioniert's nicht mehr.

Ein an den Eigenschaftsknoten im zweiten VI angeschlossener Fehlerbehandler meldet Fehler 1055 "Ungültige Objektreferenz". Die U32-Zahl in der Hilfsdatei stimmt soweit.

Hat jemand 'ne Idee, woran das liegen könnte, wie ich es beseitigen kann, bzw. weiß jemand 'ne elegantere Lösung als die mit der Datei?
Ja,

ich habe mal was mit Umgebungsvariablen probiert.

Das würde funktionieren mit der Übertragung von einem Vi ins andere.

Früher wurde das mit globalen Variablen gelöst.

So hab' ich jedenfalls deine Anforderungen verstanden...

Svente
' schrieb:Ja,

ich habe mal was mit Umgebungsvariablen probiert.

Das würde funktionieren mit der Übertragung von einem Vi ins andere.

Früher wurde das mit globalen Variablen gelöst.

So hab' ich jedenfalls deine Anforderungen verstanden...

Svente

Hallo,

danke für die Antwort.

Umgebungsvariablen kann ich (noch) nicht benutzen, da ich im Moment nur LV 7.1 benutze.

Ursprünglich habe ich auch globale Variablen benutzt, habe dann aber das Haupt-VI kompiliert und das zweite VI, das nun auf die Elemente des Haupt-VIs zugreifen soll, wird dynamisch aufgerufen.
Und als *.exe funktionierte das eben auch nicht. Habe zu dem Zeitpunkt aber etwas unter Zeitdruck gestanden und nicht lange nach Ursachen gesucht und dann gleich die oben beschriebene Variante ausprobiert. Nur klappt die eben auch nicht Angry

Bin im Moment gerade dabei, wieder mit den Globalen Variablen herumzuprobieren, wär aber nicht schlecht, wenn jemand für obiges Problem auch 'ne Lösung kennt, vielleicht braucht man's nochmal.
Wenn Du die beiden VIs nicht separat kompilierst kannst Du auf die gleichen globalen variablen zugreifen. Damit beide Fenster aufgehen und beide Vis laufen musst Du nur von einem der beiden aus das zweite aufrufen (natürlich unter den Vi-optionen "Front panel öffnen bei start" (oder so ähnlich) anwählen). Du wirst in beiden VIs wahrscheinlich while loops haben. ruf das zweite VI auserhalb des WHILE-loops auf, dann läuft das "sub-vi" parallel mit deinem haupt-while loop. Wenn Du als stop-bedingung für beide WHILE-Loops in beiden VIs ne globale Variable benutzt, dann klappt auch das Beenden vorbildlich.

Hoffe das hilft,

Kai
' schrieb:Wenn Du die beiden VIs nicht separat kompilierst kannst Du auf die gleichen globalen variablen zugreifen.
Kai


Hallo,

mittlerweile habe ich 'ne Lösung gefunden.
Das Problem ist, daß ich ein Programm entwickle, was aus lizenzrechtlichen Gründen als Applikation auf 'nem anderen Rechner läuft. Zum Zeitpunkt der Erstellung des eigenständig laufenden Programm ist aber noch nicht klar, welche Funktionen es alles erfüllen soll. Daher werden dann im Einsatz dynamisch Sub-VIs aufgerufen, die dann die jeweilige Funktionalität erfüllen. Daher müssen sie separat kompiliert werden, wobei ja nur das Hauptprogramm kompiliert wird.
Nun entsteht aber bei der verwendung globaler Variablen das Problem, daß das globale-Variablen-VI zum einen in die Applikation (fest) eingebunden ist, wenn ich die dynamischen Sub-VIs aufrufe, ich dieses VI aber nochmal separat liefern muß, da die Sub-VIs sonst nicht ausführbar sind.
Das merkwürdige ist nur, daß ohne separates glob.-Var.-VI einige SubVIs laufen, einige nicht. Mit dem separaten laufen alle, aber nun ist es zweimal vorhanden. Die Applikation greift auf das in ihr eingebundene zu, und die SubVIs auf das gleichnamige ungebundene. Es sind also zwei verschiedene, und trotzdem klappt's Unsure

Da mir das ganze bißl schwammig ist, wollte ich versuchen, die globalen Variablen rauszuschmeißen.
Das ganze geht, indem ich von den SubVIs aus die Anzeige- und Bedienelemente des Hauptprogramms auslese und damit an die benötigten Größen zum Lesen und Schreiben herankomme:

- VI-Referenz auf aktuelles Sub-VI öffnen
- Eigenschaftsknoten "Aufrufende" liefert Namen des (aufrufenden) Hauptprogramms
-> VI-Referenz des Hauptprogramms öffnen
-> Eigenschaftsknoten auf VI-Referenz mit Eigenschaft "Alle Bedienelement-Werte ermitteln" in Verbindung mit Elemente = true bzw. false liefert dann Feld aus Bedien bzw. Anzeige-Element als Cluster aus Objektname und dem aktuellen Wert als "flattened Data String"
- dieses Feld nur noch nach gewünschtem Bedienelementname durchsuchen und Werte aus dem "flat Data"-String mittels "String in Daten konvertieren" lesbar machen, der ObjektTyp ist ja bekannt und ändert sich nicht

Das funktioniert ganz gut.
Referenz-URLs