LabVIEWForum.de - Referenzen in Variable speichern und in SubVI aufrufen

LabVIEWForum.de

Normale Version: Referenzen in Variable speichern und in SubVI aufrufen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo,

ich habe in einem Programm verschiedene Anzeige- und Bedienelemente, nennen wir sie Bedien, Anzeige1 und Anzeige2. Um auf die Elemente drauf zugreifen zu können aus einem SubVI heraus, muss ich mit Referenzen arbeiten.

Ich habe in dem Program die Referenzen in einer funktionalen gloablen Variable zwischengespeichert. Das SubVI soll die Referenzen aus der FGV lesen, dass die Anzeige- und Bedienelemente steuern soll.

Leider nimmt das SubVI - das in dem Bild dargestellt ist - den Wert nicht an. Was mache ich da falsch?
LabVIEW arbeitet streng typdefiniert. Einen "Variant-Datentyp" an ein "Bundle By Name" anzuschließen führt also automatisch zu einem "Broken Wire".

Lösung: An dieser Stelle musst du den "Variant" erst einmal in den richtigen Cluster-Datentyp überführen.

Gruß, Jens
Ich kann die Referenzadresse nicht in einer FGV speichern. Ich habe einen Cluster erzeugt, in dem vier Elemente zum Speichern der Referenzadresse erzeugt. Den hab ich in die FGV eingefügt. Leider erkennt das SubVI die Referenzadressen nicht - kann ich keine Referenzen von Objekten in einem SubVI zwischenspeichern, um sie an mehreren Stellen weiterverwenden zu können?
Hallo Hasenfuss,

doch, sowas kann man schon machen. Nur muss dein verarbeitendes VI eben genau den Typ der Referenz (bzw. den zugrundeliegenden Datentyp) kennen, um die Referenz weiterzuverwenden…

Was für Referenzen hast du denn da erzeugt? Welche Bedienelemente stecken dahinter?
Wieso musst du mit Referenzen hantieren - statt gleich die Daten in der FGV zu bündeln?
Hmm
Ich hab folgendes gemacht - ich bin auf "Referenz erzeugen" gegangen beim Element. Dann hatte ich die Referenz und am Ausgang hab ich gesagt - Bedienelement erzeugen. Dieses Bedienelement hab ich kopiert und in einen Cluster eingefügt - siehe das Frontpanel mit dem Cluster.

Ich habe in meiner Oberfläche eine Vielzahl von Bedienelementen, die ich alle mit Initialwerten füttern muss und später natürlich auch die Anzeigewerte anzupassen habe. Deshalb ist mein Blockdiagramm sehr voll. Meine Idee ist es, die Referenzen der Elemente in einer FGV zu speichern und dann z.B. die Initialisierungen in einem SubVI zu machen, was dort die Initialwerte setzt oder so.
Hallo Hasenfuss,

Zitat:Ich hab folgendes gemacht - ich bin auf "Referenz erzeugen" gegangen beim Element. Dann hatte ich die Referenz und am Ausgang hab ich gesagt - Bedienelement erzeugen. Dieses Bedienelement hab ich kopiert und in einen Cluster eingefügt - siehe das Frontpanel mit dem Cluster.
Ich habe in meiner Oberfläche eine Vielzahl von Bedienelementen,
Und jetzt willst du für diese "Vielzahl von Bedienelementen" jeweils eine Referenz erzeugen und in diesem Cluster in der FGV ablegen? Hmm

Es ist dann doch viel einfacher, einfach eine Referenz auf das FP deines VIs zu holen und sich darüber alle Control-Referenzen zu holen. Dann filtert man die interessanten Bedienelemente über ihr Label - welches man dazu natürlich nach einem sinnvollen Schema benannt haben muss…

So sieht das bei mir aus:
[attachment=52959]
Bei "1" werden die Referenzen auf die FP-objekte eingesammelt, bei "2" werden die zu setzenden Werte aus einer Datei geladen und dann über das Label der Controls zugewiesen…
Das ist natürlich sehr elegant :-)

Kannst Du Dir mal mein SubVI anschauen? Ich rufe das SubVI aus dem HauptVI auf und übergebe die VI-Referenz. Dann hab ich einen Eigenschaftsknoten mit Panel verwendet, dann Elemente. Das Array gehe ich in einer Schleife durch. Mit BeschrText frage ich ab, ob es sich um das Element handelt, dem ich einen Wert übergeben möchte, in dem ich den in einer Case-Anfrage auswerte.

Was mir daran nicht so gut gefällt ist, dass sich die Bezeichnung in dem Case nicht automatisch ändert, wenn ich die Bezeichnung eines Elements in dem Hauptprogramm ändere. Aber es ist auf jeden Fall 1000mal besser, was ich mir da gestern zusammengebastelt habe.

Kann ich denn an meinem jetzigen Entwurf noch etwas besser machen?
Hallo Hasenfuss,

Zitat:Was mir daran nicht so gut gefällt ist, dass sich die Bezeichnung in dem Case nicht automatisch ändert, wenn ich die Bezeichnung eines Elements in dem Hauptprogramm ändere.
Warum sollte es?
Du hast einen Case namens "True" - wieso sollte dieser Case-Name mit dem Label irgendeines Controls verknüpft sein???

Zitat:Kann ich denn an meinem jetzigen Entwurf noch etwas besser machen?
Ich übergebe an Punkt 2 im obigen Bild zwei Arrays: eines mit Labels, eines mit Werten. Und über das Array mit den Labels suche ich mir das passende Control heraus! (Es gibt da so Funktionen wie "Search1DArray"…)
Das hat die Vorteile:
- Ich kann eine Config-Datei verwenden und dort mit dem Texteditor Labels ändern/hinzufügen/löschen - ganz nach Bedarf…
- Wenn ich das passende Control zum Label gefunden habe, kann ich den Controltyp abfragen und den zu übergebenden Wert passend aufbereiten (ich arbeite hier nur mit Zahlen oder boolschen Werten, das macht die Sache einfacher)…
Cool, danke für Deine Antwort.

Ich hab jetzt in dem Beispiel zwei Array-Konstanten angelegt, die dann später z.B. für die Frontpanelelementsbezeichnung und den Initialwert stehen sollen und in der zweiten for-Schleife zugeordnet werden. Leider muss ich erst noch eine primäre for-Schleife anlegen, damit ich aus Elemente[] eine Liste von den Bezeichnungen kriege.

Meinst Du das so von der Art her?

Auf alle Fälle bin ich schon mal erleichtert, dass ich nicht so komplizierte FGVs anlegen muss, um die einzelnen Referenzadressen abzuspeichern. Auf die Idee wäre ich ohne Dich nicht gekommen - ganz herzlichen Dank deshalb nochmal.
Hallo Hasenfuss,

Zitat:Leider muss ich erst noch eine primäre for-Schleife anlegen, damit ich aus Elemente[] eine Liste von den Bezeichnungen kriege.
Sowas muss man ja pro VI nur ein einziges Mal durchführen…

Zitat:Meinst Du das so von der Art her?
Ja, in der Art. In der letzten Schleife dann noch die passende Referenz mittels IndexArray (und nicht per AutoIndizierung!) aus dem Referenzen-Array holen…
Und etwas Fehlerbehandlung schadet auch nicht, wenn man mal nicht das korrekte Label vergeben hat und deshalb keine passende Referenz gefunden wird!
Seiten: 1 2
Referenz-URLs