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!
ich habe ein paar Fragen bzgl. dem Ansprechen von Queues und Daten eines SubVIs aus einem Haupt VI heraus. Hintergrund der Frage ist, dass ich eine etwas umfangreichere Ansteuerung für einen Messaufbau in Labview schreibe. Das Ganze wird als Event-driven Queued State Machine aufgebaut. Eine Producer Schleife nimmt die Benutzereingaben entgegen und verteilt sie auf die entsprechenden Queues. Die einzelnen Teile sind alle schon mehr oder weniger vorhanden. Also alles eigentlich kein großes Hexenwerk sondern im Wesentlichen Fleißarbeit. Dummerweise weiss ich seit gestern, dass mein VI später einmal auch als SubVi verwendet werden soll (der Messaufbau für den ich grade ein VI schreibe soll Teil eines grösseren Aufbaus werden der dann ebenfalls über LabView gesteuert werden soll). Ich habe gestern lange gegoogelt und versucht herauszufinden wie ich das am besten bewerkstellige. Die Steuerbefehle für mein VI werden sich aus dem großen Messaufbau ergeben. Es ist also keine direkte Benutzerinteraktion mit meinem VI notwendig, es muss nur permanent laufen um seine Steuer-, Überwachungs- und Messaufgaben zu erfüllen. Ich muss eigentlich nur Steuerbefehle weiterreichen und ein paar Daten abgreifen.
Kann ich (wenn mein VI als SubVI verwendet wird) aus dem HauptVI Einträge in die Queues meines VIs reinschreiben? Evtl. in dem ich die Queue einfach über ihren Namen referrenziere? Bekomme ich Probleme wenn mein VI zweimal als SubVi verwendet wird (evtl. wird der Messaufbau zweimal verwendet)?
Eine zweites Problem ist, dass ein Teil der Messdaten aus meinem VI im HauptVI benötigt werden (vorraussichtlich zwei Arrays zur Weiterverarbeitung der Messwerte und zwei Graphen um dem Anwender den aktuellen Zustand des Systems zu zeigen). Diese müssen zur Laufzeit zur Verfügung stehen, d.h. es reicht nicht sie am Ende über die Connectors des SubVI auszugeben. Gibt es da irgendeine elegantere Lösung als globale Variablen? Insbesondere da ich keine Ahnung habe wie ich das mit den globalen Variablen machen soll, wenn mein VI zweimal als SubVI verwendet wird.
(12.04.2012 09:26 )Dande schrieb: Kann ich (wenn mein VI als SubVI verwendet wird) aus dem HauptVI Einträge in die Queues meines VIs reinschreiben? Evtl. in dem ich die Queue einfach über ihren Namen referrenziere?
Das ist ohne Probleme möglich.
Zitat: Bekomme ich Probleme wenn mein VI zweimal als SubVi verwendet wird (evtl. wird der Messaufbau zweimal verwendet)?
In deinem SubVI wird ja die Queue ausgewertet, d.h. wenn du diese VI zweimal identisch verwendest, gibt es zwei "Queue-Auswerter", die miteinander konkurrieren, was nur Murks ergibt. Mit anderen Worten: die Queue-Namen müssen sich unterscheiden. Eine mögliche Lösung: Den Queue-Namen nicht fest verdrahten, sondern per Variable vom Hauptprogramm übergeben, á la "Messaufbau1" und "Messaufbau2".
Zitat:Eine zweites Problem ist, dass ein Teil der Messdaten aus meinem VI im HauptVI benötigt werden (vorraussichtlich zwei Arrays zur Weiterverarbeitung der Messwerte und zwei Graphen um dem Anwender den aktuellen Zustand des Systems zu zeigen). Diese müssen zur Laufzeit zur Verfügung stehen, d.h. es reicht nicht sie am Ende über die Connectors des SubVI auszugeben. Gibt es da irgendeine elegantere Lösung als globale Variablen? Insbesondere da ich keine Ahnung habe wie ich das mit den globalen Variablen machen soll, wenn mein VI zweimal als SubVI verwendet wird.
Vorschlag: Erledige das dann doch auch per Queue. Diesmal liest dein Hauptprogramm die Queue aus und deine SubVIs schreiben rein.
ich habe ein paar Fragen bzgl. dem Ansprechen von Queues und Daten eines SubVIs aus einem Haupt VI heraus. Hintergrund der Frage ist, dass ich eine etwas umfangreichere Ansteuerung für einen Messaufbau in Labview schreibe. Das Ganze wird als Event-driven Queued State Machine aufgebaut. Eine Producer Schleife nimmt die Benutzereingaben entgegen und verteilt sie auf die entsprechenden Queues. Die einzelnen Teile sind alle schon mehr oder weniger vorhanden. Also alles eigentlich kein großes Hexenwerk sondern im Wesentlichen Fleißarbeit. Dummerweise weiss ich seit gestern, dass mein VI später einmal auch als SubVi verwendet werden soll (der Messaufbau für den ich grade ein VI schreibe soll Teil eines grösseren Aufbaus werden der dann ebenfalls über LabView gesteuert werden soll). Ich habe gestern lange gegoogelt und versucht herauszufinden wie ich das am besten bewerkstellige. Die Steuerbefehle für mein VI werden sich aus dem großen Messaufbau ergeben. Es ist also keine direkte Benutzerinteraktion mit meinem VI notwendig, es muss nur permanent laufen um seine Steuer-, Überwachungs- und Messaufgaben zu erfüllen. Ich muss eigentlich nur Steuerbefehle weiterreichen und ein paar Daten abgreifen.
Kann ich (wenn mein VI als SubVI verwendet wird) aus dem HauptVI Einträge in die Queues meines VIs reinschreiben? Evtl. in dem ich die Queue einfach über ihren Namen referrenziere? Bekomme ich Probleme wenn mein VI zweimal als SubVi verwendet wird (evtl. wird der Messaufbau zweimal verwendet)?
Eine zweites Problem ist, dass ein Teil der Messdaten aus meinem VI im HauptVI benötigt werden (vorraussichtlich zwei Arrays zur Weiterverarbeitung der Messwerte und zwei Graphen um dem Anwender den aktuellen Zustand des Systems zu zeigen). Diese müssen zur Laufzeit zur Verfügung stehen, d.h. es reicht nicht sie am Ende über die Connectors des SubVI auszugeben. Gibt es da irgendeine elegantere Lösung als globale Variablen? Insbesondere da ich keine Ahnung habe wie ich das mit den globalen Variablen machen soll, wenn mein VI zweimal als SubVI verwendet wird.
Vielen Dank schon mal für eure Hilfe
Daniel
PS: Verwendet wird LabView 2011
Hallo Daniel
Ja prinzipiell kannst du die VI's über die Namen referenzieren, oder (datenflusstechnisch schöner) den Queue als Eingang bzw Ausgang definieren.
Dein Hauptproblem scheint aber beim doppelt verwendeten SubVI zu liegen. Damit wir dir dort weiterhelfen können wäre es hilfreich zu wissen was du damit genau anstellen willst. Soll es quasi als eigenständige Instanz laufen oder sich an seinen anderen Aufruf "erinnern"? Weshalb könnte der Messaufbau 2x aufgerufen bzw. verwendet werden? Werden die beiden Instanzen des SubVI seriell oder parallel abgearbeitet?
Danke schon mal für die Antworten. Hier nochmal zum kurzen Verständniss des Aufbaus (in abstrahierter Form um euch nicht mit den Details zu langweilen):
"Mein" Messaufbau kann wunderbar alleine betrieben werden und erfüllt dabei auch seinen Zweck.
Wird er betrieben so muss permanent gemessen, geregelt und überwacht werden. D.h. das Steuer VI muss permanent laufen.
Der Messaufbau ist aber auch für einen größeren Messaufbau als Teilmessung interessant, auch mehrfach an verschiedenen Stellen. Da die einzelnen Messungen unabhängig voneinander sind, muss das VI also mehrfach unabhängig nebeneinander laufen und darf sich nicht von anderen Instanzen beeinflussen lassen.
Ich denke THL hat die Lösung schon beschrieben. Die Queuenamen per Eingang an das VI weiterreichen, das VI über die Queues steuern und die Daten per (ebenfalls übergebener Queue) wieder herausholen. Ich werde das Ganze mal so umsetzen und dann vom Ergebniss berichten.
Hi Dande,
ich hab ein ähnliches Problem wie du. Ich entprelle Lichtschranken eines Systems, und je nach Modul kommen unterschiedlich viele Lichtschranken zum Einsatz. Habe ein VI zum betreiben einer Lichtschranke erstellt. Hast du schon eine möglichkeit gefunden das VI öffters auszuführen. Hast du es über einen Queue realisiert (vielleicht ein Beispiel)?
Gruß
Also ich kann viel weniger Zeit in das Projekt stecken als ich gerne hätte, sprich ich vom Endausbau bin ich noch meilenweit entfernt, aber ein paar Erkenntnisse hab ich schon:
Also auf die Queues eines SubVI zuzugreifen funktioniert, wenn man die Queue einfach über den Namen referenziert.
Also auf die Queues eines SubVI zuzugreifen funktioniert, wenn man die Queue einfach über den Namen referenziert.
Wenn man das VI einfach zweimal in ein HauptVI reinlegt, kommen sich die Queues in die Quere. Sie heissen ja auch gleich. Das hab ich gelöst, in dem ich an die VI einen Queue Name Prefix übergebe. Schon hat jede Instanz des VIs seine eigene Queue.
Wenn man ein Programm zweimal ausführt, scheinen sich die Queues nicht in die Quere zu kommen (Wir haben ein paar Programme die Queues verwenden per Application Buildes zu ausführbaren Programmen gemacht und die kann man problemlos mehrfach laufen lassen).
Mein VI dynamisch n-fach als SubVI zu starten hab ich noch nicht ausprobiert.
Ich hoffe das hilft dir schon mal ein wenig weiter.
Daniel
Danke, das ging super schnell!
Ich werde das bei Gelegenheit auf jeden Fall auch versuchen, so zu realisieren.
Denk daran, wenn du ein erstelltes VI als SubVI nutzen möchtest und mehrfach einsetzt, es in den VI-Einstellungen als ablaufinvariante einzustellen.
Gruß Robert
Habe jetzt den Thread kurz gelesen, mir fällt dazu noch ein Hinweis ein.
Es gib außer Queues noch Melder, und ein wesentlicher Unterschied ist:
Aus einer einer Queue kann nur einmal gelesen werden. Nach dem Lesen aus der Queue ist das Element nicht mehr in der Queue.
Anders beim Melder: Das Element kann mehrere Male gelesen werden. Das Element wird nicht durch Lesen, sondern durch Überschreiben mit einem neuen Element gelöscht.
Die Synchonisation funktioniert trotzdem: Das mehrfache Lesen funktioniert nur einnmal pro Ikon "Auf Meldung warten" , also salopp gesagt nur einmal pro empfangendes SubVI. Ansonsten wartet der Melder auf den Empfang eines neues Elementes.
Man kann sogar sagen: Melder haben mehr Funktionalität als Queues. Aber der logisch unvermeidbare Preis dafür ist eben, daß keine Datenpufferung über mehr als das eine Element möglich ist.