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!
23.11.2007, 01:02 (Dieser Beitrag wurde zuletzt bearbeitet: 02.12.2007 13:33 von jg.)
Ich hab folgenden Aufbau:
1. VI: Cluster (generiert einen Cluster)
2. VI: SubVI (Hat den Cluster als Eingang, rechnet irgendwas und deaktiviert dabei den kompletten Cluster)
3. VI: MainVI (Hier wird das SubVI aufgerufen, im realen Fall sind das 5 Stück)
Im 2. VI (SubVI) wird nun unter bestimmten Voraussetzungen der komplette Cluster solange deaktiviert, bis ein gewisser Wert von ner Schnittstelle gelesen wird. Die deaktivierung des Clusters und die Berechnungen finden alle hier statt.
Ich hätte nun gerne, dass im 3. VI, in dem das SubVI aufgerufen wird und welches als Bedienungselemente den Cluster hat, ebenfalls der Cluster deaktivert wird, wenn er gerade im 2. VI deaktivert ist. Im 2. VI wird der Cluster per Eigenschaftsknoten deaktivert mit einer Sequenz, zB Deaktivere Cluster -> warte 5000ms -> Aktiviere Cluster. Da jedoch sowohl die Deaktivierung als auch die Aktivierung im 2. VI stattfinden, kriegt das 3. VI wahrscheinlich gar nicht mit, dass da was deaktiviert wurde...wie kann ich dem 3. VI sagen: "Deaktiviere bitte den Cluster genau dann, wenn er im 2. VI auch deaktiviert ist und aktivier ihn wieder wenn er aktiviert ist?
Ich kann jeden Falls die Berechnungen und Aktivierung/Deaktivierung im 3. VI NICHT vornehmen, das wäre die einzige Voraussetzung.
Habe 3 VIs hochgeladen, die das ganze Problem vereinfacht darstellen...im Debug-Modus sieht man, dass nach Drücken einer Boolschen Taste im 2. VI alles deaktiviert wird, das 3. VI deaktiviert den Cluster jedoch nicht.
mainvi ruft subvi auf, subvi ruft cluster auf.
Du musst einen weiteren Eingang in deinem SubVI schaffen, an den du die Referenz zum Cluster in Main.vi übergibst. Diese Referenz kannst du dann einem weiteren Eigenschaftsknoten übergeben, mit dem du dann auch das Cluster im Main.vi deaktivieren kannst.
Im Main.vi selber erstellst du die Referenz zum Cluster mit der Funktion Programming -> Application Control -> VI Server Reference. Deren Ausgang dann einfach an den Eingang des SubVI legen.
Das Ganze ist recht seltsam, um nicht zu sage wirr. Du rufst das Cluster.Vi vom Subvi.vi aus auf. Das Cluster.VI ist einige µs aktiv und liefert einen Zahlenwert zurück In Anhängigkeit von Zahlenwert wird das Bedienelement "Cluster" deaktiviert/aktiviert.
Und nun frage ich: was soll es für einen Sinn machen, auch die Clusteranzeige des "Cluster.vi" zu deaktivieren, zu einem Zeitpunkt, in dem dieses VI überhaup nicht mehr im Spiel ist und es seine "Dienstleistung" längst erbracht hat?
Es machst auch keinen Sinn, das Cluster-VI überhaupt geöffent zu halten, denn bedient werden soll und kann dort gar nichts bzw. das hätte keinen Einfluss, wenn es dann als Sub-vi aufgerufen wird.
Hinweis: Die beiden Cases "2" und "3" lassen sich zu einem Case "2,3" zusammenfassen
' schrieb:Das Ganze ist recht seltsam, um nicht zu sage wirr. Du rufst das Cluster.Vi vom Subvi.vi aus auf. Das Cluster.VI ist einige µs aktiv und liefert einen Zahlenwert zurück In Anhängigkeit von Zahlenwert wird das Bedienelement "Cluster" deaktiviert/aktiviert.
Und nun frage ich: was soll es für einen Sinn machen, auch die Clusteranzeige des "Cluster.vi" zu deaktivieren, zu einem Zeitpunkt, in dem dieses VI überhaup nicht mehr im Spiel ist und es seine "Dienstleistung" längst erbracht hat?
Es machst auch keinen Sinn, das Cluster-VI überhaupt geöffent zu halten, denn bedient werden soll und kann dort gar nichts bzw. das hätte keinen Einfluss, wenn es dann als Sub-vi aufgerufen wird.
Hinweis: Die beiden Cases "2" und "3" lassen sich zu einem Case "2,3" zusammenfassen
Das Problem ist, dass ich mehrere dieser SubVIs habe, das ClusterVI wird also mehrmals (ablaufinvariant) aufgerufen. Das ClusterVI stellt also eine Art Bedienungsoberfläche für mehrere verschiedene SubVIs dar. Darum rufe ich in jedem SubVI das ClusterVI auf, Verbinde die notwendigen Ausgänge des Clusters mit den Funktionen im SubVI (im realen Fall hat der Cluster ja 22 Bedienelemente, wobei ich für jedes SubVI unterschiedliche Bedienelemente benötige, insgesamt aber den gleichen Aufbau benötige) und diese SubVIs werden im MainVI aufgerufen, das ja auch normalerweise anders aussieht. Ich hab hier nur mal schnell was gebastelt, da ich das eigentliche Projekt nicht online stellen wollte. (Somit wird das Casezusammenfassen von 2 und 3 auch hinfällig, aber trotzdem danke für den Hinweis, wurde aber eh beachtet).
@monoceros84: Ich werde das gleich mal ausprobieren und melde mich wieder;)Danke schonmal für die Hilfe!
Ok, also ich schaffs nicht eine Referenz als Eingang von dem SubVI festzulegen. Liegt wahrscheinlich daran, dass ich noch nie mit Referenzen gearbeitet hab ^^
Ich hab im Forum noch was gefunden:
Da wird per Melder eine Nachricht an alle "Auf Melder warten" versendet. Allerdings kann ich da mit nem Cluster nicht in die String-Meldenachricht rein.
Kannst du mir eventuell erklären, wie ich die Referenz im SubVI als Eingang festlegen kann? (Referenz wurde mit: rechte Maustaste auf Cluster, Referenz erstellen erstellt)
Ich nehme an, dass man hier noch irgendwo sagen muss: "Öffne den Cluster über die Referenz", aber weder "Applikations-Referenz öffnen" noch "VI-Referenz öffnen" funktionieren.
23.11.2007, 15:16 (Dieser Beitrag wurde zuletzt bearbeitet: 02.12.2007 13:34 von jg.)
Also so richtig werd' ich nciht schlau, was du machst, nicht machen kannst oder was nicht geht...
Ich habe das einfach mal für dich gemacht, siehe Anhang.
Wenn du meinst, wie man Elemente auf dem Frontpanel als Eingänge eines VIs festlegen kann: Rechtsklick auf das VI-Icon rechts oben im Frontpanel -> Show Connector. Dann einfach auf den gewünschten Connector klicken und anschließend auf das Element im FP klicken. Speichern. Fertig.
Was du allerdings mit dem Melder (du meinst sicherlich Notifier - weiß nicht, ob das in Deutsch so übersetzt ist) vorhast, weiß ich nicht. Sicher kannst du mit dem Melder nachrichten aller Art verschicken - Cluster und Referenzen eingeschlossen. Aber dann musst du auch den Melder in jedem VI kontinuierlich überwachung und die entsprechenden Aktionen dorthin verlegen... Habe zwar nicht ganz verstanden, was dein Programm im Ende machen soll, aber z.Z. siehts ja nicht so aus, als ob du das willst...
' schrieb:Ich hab im Forum noch was gefunden:
Da wird per Melder eine Nachricht an alle "Auf Melder warten" versendet. Allerdings kann ich da mit nem Cluster nicht in die String-Meldenachricht rein.
An Melder und Queue hab ich auch schon gedacht.
Das HauptVI - das ist das, in dem sich die tatsächlichen Bedienelemente (also der Cluster) befinden - sendet per Melder an alle (ablaufinvarianten) SubIVs den aktuellen Zustand der Bedienelemente. Die SubVIs lesen dieses Status aus, ohne den Melder zu löschen. So hat jedes dieser SubVIs immer den aktuellen Stand. Jedes der SubVIs sendet per Queue (Melder ist für diese Richtung prinzipiell ungeeignet) einen Befehl an das HauptVI. Das HauptVI disabled bzw. enabled jetzt je nach Aufforderung den Bediencluster. Das Arbeiten mit Melder und Queue ist aufwändiger (da bedarf eine u.U. eines Polling-Codes oder eines Eventmechanismusses sowohl bei HauptVI als auch bei SubVI) als das Arbeiten mit einer Referenz. Dafür ist das mit der Queue wesentlich flexibler: Was tun, wenn ein SubVI enablen will ein anderes aber disablen? Was tun, wenn hier ein Zeitversatz besteht? Den Befehl vom SubVI zum HauptVI kann mal so anpassen, dass solche Probleme nicht auftreten.
Mit einem Merker bzw. einer Queue kannst du beliebige Daten verschicken. Lediglich der Typ muss von vorne herein feststehen.
Die Frage ist, ob die Applikation den Aufwand eines Melders und einer Queue rechtfertigt. Aber wenn du sagst, mehrere (bis viele) ablaufinvariante SubVIs und ein einziges HauptVI, dann würde ich sagen ohne die Applikation zu kennen der Aufwand lohn sich.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
' schrieb:Was tun, wenn ein SubVI enablen will ein anderes aber disablen?
Das wird sogar oft vorkommen! Aber dadurch, dass die SubVIs ja nur Klone des ClusterVIs aufrufen (da ablaufinvariant) dachte ich mir, dass sich die gegenseitig nie im Wege stehen können. Liege ich da falsch?
Ich hab mich am Anfang vielleicht auch falsch ausgedrückt: Mir is egal, was im SubVI passiert...da laufen nur Berechnungen...wichtig war mir nur, dass, falls eine Berechnung einen gewissen Wert ausgibt, das Clusterbedienelement im main-VI für den Benutzer deaktiviert wird, damit der da nicht dazwischen funkt mit einer weiteren Eingabe (bzw. kann er nicht dazwischen funken, weil sich eh nix tut...ich wollt das halt grafisch darstellen, in dem ich den Cluster deaktiviere und ausgraue).
Ich hab das von monoceros jetzt übernommen und die Deaktivierung des Clusters im SubVI rausgelöscht, da mir das ja wirklich egal sein kann (ich glaube, dass er das in seinem 1. Post meinte). Jetzt wird nur noch der Cluster im MainVI Deaktiviert und das genügt ja logischer Weise.
Funktioniert einwandfrei!
Danke nochmal an alle und an IchSelbst für die Erklärung mit den Meldern und der Queue
23.11.2007, 17:57 (Dieser Beitrag wurde zuletzt bearbeitet: 02.12.2007 13:34 von jg.)
' schrieb:Danke nochmal an alle und an IchSelbst für die Erklärung mit den Meldern und der Queue
Mit Meldern und Queues kann es so überhaupt nicht funktionieren. Denn eine Voraussetzung für einen solchen Datenaustausch ist, daß sich beide Vis im Zustand "running" befinden. Das ist hier nicht der Fall, im Cluster-VI gibt es keine Schleife zur Dauerausführung, beim Aufruf ist es nur wenige µs aktiv.
Eine Möglichkeit ohne all das: Das VI Cluster von übergeordneten VI drei mal aufrufen:[list=1]
[*]Aufruf: Übergabe Cluster, Rückgabe Zahl.<>
[*]Aufruf: Deaktivierung der Anzeige<>
[*]Aufruf: Aktivierung der Anzeige<>
[st]Funktioniert allerding nicht ohne weiteres bei reentranten Cluster-VI, da dann jedes Mal ein anderer Clon aufgerufen wird. Dagegen läßt sich aber etwas machen.