While-Schleife im SubVi von außen beenden und Werte übergeben
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!
18.08.2006, 13:38 (Dieser Beitrag wurde zuletzt bearbeitet: 18.08.2006 13:41 von bernd1.)
While-Schleife im SubVi von außen beenden und Werte übergeben
<div align="left">Hallo,
ich habe mir ein SubVi gebastelt, daß mir Messdaten in eine Datei schreibt.
In diesem SubVi befindet sich dazu eine Whileschleife, die mir äbhängig von Benutzereingaben alle X-Sekunden einen Wert in die Datei schreibt.
Soweit so gut.
Nun habe ich aber das Problem, daß dieses SubVi nicht mit meinem Hauptprogramm zusammenarbeiten will.
Ich schaffe es einfach nicht, daß von außen der Wert des Stopp-Knopfes an das SubVi übergeben wird, damit dort ebenfalls die While-Schleife beendet wird.
Natürlich werden die aktuellen Messwerte auch nicht übergeben.
While-Schleife im SubVi von außen beenden und Werte übergeben
' schrieb:<div align="left">Hallo,
ich habe mir ein SubVi gebastelt, daß mir Messdaten in eine Datei schreibt.
In diesem SubVi befindet sich dazu eine Whileschleife, die mir äbhängig von Benutzereingaben alle X-Sekunden einen Wert in die Datei schreibt.
Soweit so gut.
Nun habe ich aber das Problem, daß dieses SubVi nicht mit meinem Hauptprogramm zusammenarbeiten will.
Ich schaffe es einfach nicht, daß von außen der Wert des Stopp-Knopfes an das SubVi übergeben wird, damit dort ebenfalls die While-Schleife beendet wird.
Natürlich werden die aktuellen Messwerte auch nicht übergeben.
während ein SubVI abgearbeitet wird regiert es nicht mehr auf Signale von außen. Die Signale werden an den Eingängen des SubVIs gesammelt. Erst dann beginnt das SubVI diese zu verarbeiten und gibt am Ende an den Ausgängen seine Werte zurück.
Du könntest es vielleicht mit einer globalen Variable versuchen. Der Stopknopf gibt seine Werte innerhalb einer Schleife im aufrufenden VI an eine globale Variable, die in diesem Fall boolscher Natur ist. Diese wird im SubVi ebenfalls innerhalb der Schleife ausgelesen und als Abbruchbedingung übergeben.
Die Messwerte musst Du in einem Array sammeln, der dann bei Abrruch des SubVIs an sein Aufrufer übergen wird. Das geht ganz einfach indem Du die Indizierung am Ausgangstunnel der Schleife mittels Rechtsklick per Kontextmenü aktivierst.
Eine andere Möglichkeit wäre die Schleife aus dem SubVI zu entfernen, sodass deren Inhalt je SubVi Aufruf nur einmal durchlaufen wird, und im Übergeordneten VI die Schleife um das SubVI drumherum zu bauen.
Übrigends glaube ich auch das Schieberegister für Werte die während des gesammten Schleifenablaufs nicht verändert werden überflüssig sind. Ich denke, die machen nur dann in einer Schleife Sinn, wenn die in der Schleife erzeugten Werte im nächsten Schleifendurchlauf wieder verwendet werden, bevor für diese Variable noch im selben Schleifendurchlauf ein neuer Wert erzeugt wird. Durch die Verbindung am Äußeren Eingang wird dann lediglich der Datentyp dieser Variable festgelegt und der allererste Wert an die Schleife übergeben. Für ersteres ist eine Konstante mit beliebigem Wert ausreichend.
viel Erfolg und
schönes Wochenende
SchwindelInside</div>
While-Schleife im SubVi von außen beenden und Werte übergeben
' schrieb:<div align="left">Hallo Bernd,
...
Schleife übergeben. Für ersteres ist eine Konstante mit beliebigem Wert ausreichend.
viel Erfolg und
schönes Wochenende
SchwindelInside</div>
<div align="left">
Hallo,
vielen Dank für die ausführliche Erklärung.
Ich habe schon fast befürchtet , daß es so nicht geht.
Aber dann verstehe ich den Sinn von SubVi´s nicht ganz. Denn dann kann ich auch ohne SubVi´s
auskommen, und alles wäre unübersichtlich auf dem Blockbild zu sehen. Dann fehlt mir aber eine Zoom-Funktion.
Zudem verstehe ich es nicht, da ich ja die Werte innherhalb der Schleife übergebe und nicht außerhalb
(siehe SubVi).
Dann muß ich Wohl oder Übel mein mühsam orginales Subvi, daß ein bißchen größer ist als das Beispiel, eben wieder anders schreiben. Aber vielelicht klappt es ja mit globale Variablen.
While-Schleife im SubVi von außen beenden und Werte übergeben
<div align="left">Hallo, Bernd,
mit etwas Rumtricksen muss eigentlich das gehen, was du machen willst.
Was du an dein SubVI übergeben musst, ist ein sogenanntes "Reference"-Objekt (Sorry, habe nur englisches LabVIEW) deines Stop/Abbruch-Buttons des übergeordneten VI's, und nicht die Variable selbst. Erstellbar ist die Reference über die rechte Maustaste, wenn du auf dem Button bist.
Mit Hilfe dieser Reference hast du dann im SubVI direkt Zugriff auf den Zustand deines Abbruch-Buttons, auch im SubVI, und auch wenn er sich ändert!
Jetzt musst du dies nur noch regelmäßig im SubVI abfragen, dann sollte es klappen.
MfG, Jens</div>
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!
While-Schleife im SubVi von außen beenden und Werte übergeben
' schrieb:<div align="left">
Hallo,
vielen Dank für die ausführliche Erklärung.
Ich habe schon fast befürchtet , daß es so nicht geht.
Aber dann verstehe ich den Sinn von SubVi´s nicht ganz. Denn dann kann ich auch ohne SubVi´s
auskommen, und alles wäre unübersichtlich auf dem Blockbild zu sehen. Dann fehlt mir aber eine Zoom-Funktion.
Zudem verstehe ich es nicht, da ich ja die Werte innherhalb der Schleife übergebe und nicht außerhalb
(siehe SubVi).
Dann muß ich Wohl oder Übel mein mühsam orginales Subvi, daß ein bißchen größer ist als das Beispiel, eben wieder anders schreiben. Aber vielelicht klappt es ja mit globale Variablen.
Ich wünsche ebenfalls ein schönes Wochenende.
Gruß
Bernd
</div>
<div align="left">Hallo Bernd,
entschuldige Bitte meine übereilten Antworten. Ich hab mir das VI noch mal genauer angeschaut. Dabei hab ich gesehen, dass Deine Schieberegeister tatsächlich Sinn machen, da die Werte in je einem der Cases ja auch verarbeitet werden. Wenn Du die Daten innerhalb der Schleife in die Datei schreibst, brauchst Du sie natürlich nicht erst in einem Array sammeln.
Das mit dem Referenz-Objekt ist natürlich noch eine viel elegantere Lösung als mit einer globalen Variable, da dafür kein zusätzlicher Speicher reserviert werden muss, sondern nur die Speicheradresse des Stop-Buttons übergeben wird, von wo dann immer der aktuelle Wert gelesen werden kann.
Danke @Jens für den Tip.