' schrieb:Hier Beispiel
Das Sub-Vi läßt sich nicht ohne weiteres mitten im Prozess stoppen, das geht nur über eine globale Variable oder mit anderen Methoden. Beispiel, wie es auch geht:
Das Sub-Vi erfasst kontinuierlich Daten und sendet diese über einen Melder an das Haup-VI. Wenn ich zu gegebener Zeit im Haupt.VI den Melder zerstörend beende, dann funktioniert der Melder im Sub-Vi nicht mehr und erzeugt einen Fehler. Diesen benutzte ich als Abbruchbedingung für das SU-VI.
Im Übrigen ist das einzig Denkbare und Richtige, daß in einer Schleife bei Abbruch noch alles ausgeführt wird. Wer soll anderenfalls wissen, was in der Schleife noch gemacht wurde und was nicht. Es bleibt Dir aber unbenommen, den Programmablauf entsprechend zu steuern, wenn Du irgendetwas bei Abbruch in der Schleife nicht mehr ausgeführt haben willst. Du brauchst dann in der Schleife einen Case und legst die Abbruchbedingung ran. Bei Abbruch wird dann für den Teil der Schleife, den Du bei Abbruch nicht ausgeführt haben möchtest, eine leeres Case ausgeführt. Aber das ist nicht unbedingt die feinste Art des Pogrammierens.
Ok ich glaube das funtioniert. Danke! Dann werde ich mal ne runde die Subvis umbasteln. ^^
Aber darauf muss man auch erstmal kommen!
MfG,
Chris
Das hat mich noch auf folgende Idee gebracht......ist nicht so umständlich:
Die Subvis überprüfen einfach alle 5 sec welcher String in der Datei ......Stopp.txt steht.
Wenn das Hauptvi da "Stopp" reinschreibt, ist also nach 5 sec der Schleifendurchlauf quasi abgebrochen.
Gleichzeitig wird dann von einem speziellen Subvi, jede Motorenbewegung usw. gestoppt.
Bei meinem Programm würde ein voller durchlauf bis zu 10min dauern. - Da habe ich dann etwas Zeit und Nerven gespart ^^
Danke nochmal für die Hilfe!
MfG,
Chris
Dateien öffnen/schließen/lesen braucht allerdings recht viel Speicher und Arbeitsleistung.
Warum verwendest du nicht einfach einen Melder?
<div align="left">
' schrieb:Das hat mich noch auf folgende Idee gebracht......ist nicht so umständlich:
Die Subvis überprüfen einfach alle 5 sec welcher String in der Datei ......Stopp.txt steht.
Mit der Idee liegst Du im Prinzip goldrichtig - allerdings nur im Prinzip, denn der Umweg über eine
Datei und einen
String ist 1000 mal zu umständlich.
Das Zauberwort, um Werte für alle VIs zwischenzuspeichern, heißt nicht
Datei, sondern "
nichtinitialisiertes Shift-Register". Ein solches VI wird "
Global Variable VI" genannt, die entsprechende Variable ist eine
"Funktionale Globale Variable". Sie ist einer echten globalen Variablen durchweg vorzuziehen. (Nicht aber einem Melder, da hat Kvasir schon recht)
Das Bild zeigt das Grundmuster eines solchen VIs. In Deinem Falle würde die Numerische Variable durch die Boolesche Variable "Abbruch" ersetzt werden, und auf die Gültigkeitsanzeige könnte auch verzichtet werden.
In der Hauptschleife wird das VI aufgerufen und gesetzt, in den Nebenschleifen aufgerufen und gelesen - fertig.</div>.
Da hatte ich wohl ein Brett vorm Kopf! Das ist ja total einfach mit den Meldern!
Ok, dann mach ich das natürlich so.
Das it dem "nichtinitialisiertes Shift-Register" habe ich noch nicht so ganz verstanden....da machts aber bestimmt auch noch Klick.
Danke nochmal.
MfG,
Chris
Das mit dem "nichtinitialisierten Shiftregister" ist eigentlich ganz einfach. (Obwohl ich sagen muss, dass ich den Trick noch nicht kannte. Man lernt hier immer wieder was).
Normalerweise setzt man eine Konstante an den Eingang des Shiftregisters, außerhalb der Schleife. Dadurch nimmt das Register diesen Wert an beim ersten Durchlauf.
Tut man dies nicht, so steht im Shiftregister, der Wert den das Register bei der letzten Ausführung hatte.
Erstellst du nun so ein SubVi, wie Lucki gezeigt hat und führst es einmal aus, mit SetValue auf true, so nimmt dein Shiftregister diesen Wert auf und das SubVi schließt wieder (Die Schleife läuft ja immer nur 1x).
Rufst du das SubVi erneut auf, dann hat das Shiftregister (da ja keine Konstante vorgeschalten ist) den Wert, den du vorher hineingeschrieben hast.
Damit erfüllt dieses kleine SubVi die Funktion einer globalen Variable.
<div align="left">
' schrieb:Das mit dem "nichtinitialisierten Shiftregister" ist eigentlich ganz einfach. (Obwohl ich sagen muss, dass ich den Trick noch nicht kannte. Man lernt hier immer wieder was).
Ich weiß das auch noch nicht sehr lange. Das Beispiel ist nicht auf meinem Mist gewachsen, es ist aus dem Buch Johnson/Jennings "LV graphical Proramming". Am Textrand dieses Beispiels steht sogar "CLAD", d.h es gehört zum Wissensstoff, wenn man ein "Certified LabVIEW Associated Developer" werden möchte.
Es gibt auch eine Labviev-Hilfe "Funktionale globale Variablen", aber das darin verwendete Beispiel ist so blöd, weil zu speziell, daß man von der Verwendung nur abgeschreckt werden kann.
</div>
Sehe ich das richtig, dass dann aber zwischendurch keine weiteren Shiftregister initialisiert werden dürfen?
Dann müsste ich ja alle Shiftregister mit Rückkopplungsknoten ersetzen.
MfG,
Chris
Doch du kannst natürlich weitere Shiftregister verwenden.
Der Wert bleibt nur erhalten, weil es ja immer genau das gleiche Shiftregister ist, das aufgerufen wird (selbes SubVi wird wiederholt aufgerufen).
Wenn du z.B.: eine Whileschleife mit einem uninitialiserten Shiftregister in einer Case Struktur hast, dann hat dieses Shiftregister, bei jedem neuen Durchlaufen der Case Struktur den letzten Wert. Dies kann zu unerwünschten Wirkungen führen, wenn z.B.: das Shiftregister als Abbruchbedingung für die Schleife gilt. Deswegen sollte man Shiftregister immer initialisieren um soetwas zu vermeiden, außer eben, man verwendet es als funktionale globale Variable.
Schau dir mal das Beispiel an, ich hoffe das erklärt was ich meine.