Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Bei der Erweiterung einer bestehenden Labview Steuerung stosse ich an folgendes Problem.
Ausgangslage:
In einer (meiner Meinung nach) grösseren Steuerung möchte ich verschiedene Programmteile in SubVIs auslagern um die Übersichtlichkeit des Hauptprogrammes zu verbessern.
Beim aktuellen Teil muss ich Dutzende Werte an das SubVI übergeben, wobei es nicht möglich ist alle Controls/Indicators einzeln zu übergeben (so viele Drähte kann ich nicht anschliessen).
Nun habe ich mir überlegt ich könnte im Main VI ein Cluster mit Referenzen auf FP Elemente erstellen und dann dieses an die SubVIs übergeben.
Im SubVI kann ich dann den Cluster wieder zerlegen und über die einzelnen Referenzen auf die FP Elemente des Main VIs zugreifen.
Anstelle eines Clusters wäre auch ein Array eine Möglichkeit, dann muss ich jedoch die einzelnen Elemente über den Index (also eine Zahl) referenzieren
und nicht wie beim Cluster einfach über den Namen des Elementes (somit wäre ich abhängig von der Reihenfolge der Elemente im Array, was mir nicht gefällt).
Meine eigentlichen Fragen sind:
1) Macht dieses Vorgehen mit dem Erstellen eines Referenzen-Clusters als Übergabewert für die SubVis Sinn,
oder gibt es bessere/einfachere Lösungen zum übergeben vieler Werte?
2) Gibt es eine Möglichkeit (z.B. mit einer Schleife) automatisch alle Referenzen vom Main VI in ein Cluster hineinzupacken?
(Ich habe es versucht indem ich zuerst ein Array mit allen Referenzen erstellt habe und dieses dann in ein Cluster umgewandelt habe.
Jedoch sind mir so die Namen der Clusterelemente verloren gegangen und in [0], [1], [2], usw. umgewandelt worden)
3) Wenn ich bei meiner Lösung neue Elemente im Referenzen-Cluster ergänzen will, muss ich jeweils das Cluster Control anpassen
(im Main VI und in allen SubVis in denen ich den Cluster verwende). Könnte man das umgehen?
Besten Dank im Voraus für jede Idee oder jeden Tip!
Zitat:1) Macht dieses Vorgehen mit dem Erstellen eines Referenzen-Clusters als Übergabewert für die SubVis Sinn, oder gibt es bessere/einfachere Lösungen zum übergeben vieler Werte?
Direkt die Werte ans subVI übergeben statt Referenzen und hinterher wieder PropertyNodes?
Eine schöne Producer-Consumer-Struktur? Notifier, Queues?
Zitat:2) Gibt es eine Möglichkeit (z.B. mit einer Schleife) automatisch alle Referenzen vom Main VI in ein Cluster hineinzupacken?
(Ich habe es versucht indem ich zuerst ein Array mit allen Referenzen erstellt habe und dieses dann in ein Cluster umgewandelt habe.
Jedoch sind mir so die Namen der Clusterelemente verloren gegangen und in [0], [1], [2], usw. umgewandelt worden)
- "Elemente[]"-Property des Frontpanels (oder der Panes) liefert dir alle FP-Elemente als Array. Das Label kann man dann zu jeder Referenz auslesen…
- Wenn du einen (typdefinierten) Cluster mit benannten Referenzen haben willst, musst du ihn "zu Fuß" selbst anlegen und befüllen
- Es gibt da schöne Key-Value-Table-Implementierungen, die auch machen, was du da vorhast…
Zitat:3) Wenn ich bei meiner Lösung neue Elemente im Referenzen-Cluster ergänzen will, muss ich jeweils das Cluster Control anpassen
(im Main VI und in allen SubVis in denen ich den Cluster verwende). Könnte man das umgehen?
Nein, das kann man nicht umgehen.
Aber mit einer Typdefinition erleichtern!
Ich hatte mal ein ähnliches Problem.
Das habe ich mit Variant gelöst.
Man muss zwar auch alle Referenzen einzeln einladen, aber die Verbindung zum SubVI bleibt immer gleich und muss bei Erweiterungen oder Änderungen nicht angepasst werden.
Man bearbeitet nur die VIs, die von dem neuen Teil betroffen sind.
Ich habe es nun folgendermassen gelöst:
Im Main VI habe ich "zu Fuss" ein grosses Cluster mit allen wichtigen FP-Elemente-Referenzen erstellt (knapp 60 Referenzen).
In den verschiedenen SubVIs pick ich mir dann die entsprechenden Referenzen aus dem Cluster raus und lese, resp. schreibe die Elemente.
Ich finde dies nicht die eleganteste Lösung, aber sie funktioniert und wenn das Cluster mal erstellt ist, dann ist die Fleissarbeit erledigt.
Das Cluster habe ich mit einer Typendefinition erstellt (habe dies zum 1. Mal genutzt, danke GerdW für den Tipp).
Hier noch einige Kommentare zu euren Anmerkungen:
1) Die Werte direkt an die SubVIs zu übergeben ist für mich im aktuellen Fall keine Option, da es je nach SubVI bis zu ca. 30 Übergabewerte und Matrizen sind.
Ein SubVI z.B. führt einen Messvorgang durch und erstellt dabei grössere Datenmatrizen, welche im Main VI zur Laufzeit in 2D & 3D Plots angezeigt werden sollen.
Mit den verwendeten Referenzen auf die Plots vom Main VI kann ich dies einfach machen.
2) Ich habe als Alternative noch versucht mit der "Elemente[]"-Property des Frontpanels ein Referenzen-Array zu erstellen, habe es aber nicht geschafft
Referenzen der Elemente welche ich in einem Container (Tab Control) befinden zu erhalten.
3) Wie erwähnt habe ich nun die Typendefinition das erste mal verwendet, ist doch eine feine Sache.. :-)
Zitat:habe es aber nicht geschafft Referenzen der Elemente welche ich in einem Container (Tab Control) befinden zu erhalten.
Du bekommst doch die Referenz auf das Tab-Control (oder z.B. auch Cluster). Und diese haben wiederum auch eine "Elemente[]"-Property!
Man muss sich halt durch alle wichtigen Referenzen hindurch iterieren…
Zitat:Ein SubVI z.B. führt einen Messvorgang durch und erstellt dabei grössere Datenmatrizen, welche im Main VI zur Laufzeit in 2D & 3D Plots angezeigt werden sollen.
Das subVI legt die Messdaten in einem Notifier ab. Das MainVI liest den Notifier und zeigt die Daten an…
Wenn man mit so vielen Referenzen arbeitet, sollte man auch immer bedenken, dass diese relativ langsam arbeiten!
Du solltest aufpassen, dass dein Programm durch das ganze PropertyNode-Schreiben nicht zu langsam wird. Jedes Setzen einer PropertyNode hat den (kleinen) unangenehmen Nebeneffekt, dass ein Update des Frontpanel erzwungen wird. Damit kann man ein Programm heftig ausbremsen oder sogar komplett zum Stillstand bringen, wenn wegen irgendwelcher anderer Effekte ein Wechsel in den UI-Thread gerade nicht möglich ist. Durch geschickten Einsatz von Defer Panel Updates kannst du das aber positiv beeinflussen.
(19.01.2017 18:05 )Oli_N schrieb: 3) Wie erwähnt habe ich nun die Typendefinition das erste mal verwendet, ist doch eine feine Sache.. :-)
Wurde nach 10 Jahren LabVIEW auch höchste Zeit.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Noch einmal vielen Dank für eure Hinweise und Tipps.
Ich muss das Thema jedoch noch einmal aufgreifen, da ich an einer andern Stelle in meiner Steuerung nun erneut an dasselbe Problem stosse
und mit meiner aktuellen Umsetzung nur begrenzt glücklich bin (funktionieren tut allerdings alles).
Im Anhang befinden sich VIs in denen ich mein Problem auf einfache Art und Weise zeigen möchte.
Im Main VI sind 4 verschiedene Arten implementiert um eine grosse Anzahl von Werten (auch Arrays und Matrizen) an ein SubVI zu übergeben:
Variante 1:
Funktioniert nur mit einer begrenzten Anzahl Werte (in meiner Steuerung leider zu wenig).
Variante 2:
Funktioniert, ist aber aufwendig von Hand "zusammenzubasteln"..
Variante 3:
Funktioniert, ist aber aufwendig von Hand "zusammenzubasteln"..
Vorteil gegenüber Variante 2 ist dass mit Hilfe der Referenzen im SubVI einfach auf die Variable im Main geschrieben werden kann
Variante 4:
Versuch mit Notifier, so wirklich elegant gelingt es mir aber leider nicht.
Die eigentliche Frage ist, wie macht man die Übergabe der Werte ans SubVI am elegantesten?
Besten Dank im Voraus für jede Anregung.
Gruss
Oli
01.02.2017, 15:25 (Dieser Beitrag wurde zuletzt bearbeitet: 01.02.2017 15:30 von GerdW.)
Variante 1:
Alles, was über das 4-2-2-4-Pattern beim ConnectorPane hinausgeht, ist nicht wirklich zu empfehlen…
Variante 2:
Würde ich sehr empfehlen, aber nur mit typdefiniertem Cluster!
Und dann bitte mit (Un)BundleByName arbeiten!
Variante 3:
Wie Variante 2: mit typdefniertem Cluster und (Un)BundleByName.
Hat aber den Nachteil, auf Werte per langsamer Propertynode zuzugreifen…
Zitat:Variante 4: Versuch mit Notifier, so wirklich elegant gelingt es mir aber leider nicht.
Genau. Für jedes Control einen eigenen Notifier anlegen, ist schon sehr aufwendig. Und diese Notifier dann im subVI dann auch noch den richtigen Anzeigen zuzuordnen…
Finde ich sehr umständlich und sehr unpraktisch! (Warum nicht ein Notifier, der den Cluster aus Variante 2 speichert!?)
Zitat:Die eigentliche Frage ist, wie macht man die Übergabe der Werte ans SubVI am elegantesten?
Entweder Variante 2.
Oder man legt sich einen "zentralen" Datenbuffer an (z.B. eine FGV), die dann alle Programmteile nutzen können. In der FGV könnte man dann Variantattribute zum Speichern der Werte nutzen und dann auch gleich die Control-Namen als Key verwenden. Allerdings hast du mit der Vorgabe, "beliebige" Werte (bool, num, Arrays, Strings) zu speichern, schon recht hohe Ansprüche.
Manchmal hilft es auch, reine Konfigurationsdaten (einmal definieren, dann nur noch unverändert nutzen) von Messdaten (ständig neue Werte, die weitergereicht werden müssen) zu trennen…
Besten Dank GerdW für deine Erläuterungen!
Ich habe nun alles nach "Variante 2" aufgebaut und es funktioniert bis jetzt auch ohne Probleme.
Selbstverständlich habe ich typdefinierte Cluster und auch (Un)BundleByName verwendet (hatte das nur in meinen Beispielen vereinfacht).