Tach zusammen!
Habe ein Problem mit dem Beenden von meinen while-Schleifen. Das beigefügte Bild zweigt schematisch, was ich realisiert habe.
[
attachment=12217]
Also, außen hab ich meine eigentliche Endlosschleife. Diese wird durch das Betätigen des Stop Buttons beendet. Nun gibt es in dieser noch zwei while Schleifen, wo es passieren kann, dass diese sich "aufhängen" (das ist so gewollt). Nun möchte ich diese ebenfalls beenden können indem ich den Stop-Button betätige.
Wenn ich das mit lokalen Variablen löse, habe ich das Problem, dass der Stop-Button beim nächsten Neustart des Programmes noch immer gedrückt erscheint. Kann den ja nicht auf "Latch" setzen.
Kann mir wer helfen?
' schrieb:Wenn ich das mit lokalen Variablen löse, habe ich das Problem, dass der Stop-Button beim nächsten Neustart des Programmes noch immer gedrückt erscheint. Kann den ja nicht auf "Latch" setzen.
Dann resette den Button halt per lokaler Variablen VOR der äußeren While-Schleife. Beachte, dass eine Sequenzierung zwischen Resetten und Abfragen vorhanden sein muss.
Jawohl, klappt. Danke!
Jetzt noch eine Frage. In meiner "flachen Sequenzstruktur" hab ich ja ne while-Schleife. Wenn ich diese beende, will ich, dass der Rest des Programms nicht mehr abgearbeitet wird sondern das Programm komplett beendet wird. Zurzeit löse ich das mit Hilfe von "Stop" was ja die gleiche Auswirkung hat wie "Ausführung abbrechen". Zur Zeit macht das noch nichts, da keine Hardware angeschlossen ist. Irgendwann soll das aber (in einer folgenden Diplomarbeit) noch realisiert werden. Wenn ich dann mein Programm so beende, hab ich im schlechtesten Fall die Hardware in einem undefinierten Zustand. Wie kann ich es also realisieren, dass egal zu welchem Zeitpunkt ich den Stop-Button drücke "alles" beendet wird.
' schrieb:Wenn ich dann mein Programm so beende, hab ich im schlechtesten Fall die Hardware in einem undefinierten Zustand.
Hm. Das ist ein Denkfehler. Du hast die Hardware nie in einem undefinierten Zustand.
Wenn du jetzt schon genau weißt, dass du demnächst das Programm beenden wirst - sei es per "normalem" Weg oder per Stop-VI - dann kann du doch die Hardware entsprechend bearbeiten. Da du als guter Programmierer sowieso alles in SubVIs (also Klassen etc.) vorliegen hast, rufst du einfach beim Beenden das entsprechende "Hardware-VI" auf und lässt z.B. die Tasks schließen und freigeben.
So, jetzt habe ich einiges Probiert und komme einfach nicht auf ein vernünftiges Ergbnis.
Habe mir das folgendermaßen gedacht. Ich packe meine Endlosschleife in eine Flache Sequenzstruktur welche aus zwei Rahmen besteht. In den linken Rahmen pack ich meine while Schleife und im rechte Rahmen rufe ich das SubVI für das beenden meiner Hardware auf. Wenn ich allerdings jetzt meinen Stop-Button drücke, dann wird der rechte Rahmen der Sequenzstruktur abgearbeitet, der linke allerdings nicht. Egal was ich mache, so funktioniert das nicht. Woran liegt das? Mein Wissensstand ist, dass bei einer Flachen Sequenzstruktur die Rahmen von links nach rechts abgearbeitet werden.
Ich habe versucht dem Geheimnis mit hilfe der Highlight-Funktion auf den Grund zu kommen, aber dabei sehe ich nur, dass der rechte Rahmen nicht erreicht wird, sondern vorher schon alles beendet ist.
' schrieb:Wenn ich allerdings jetzt meinen Stop-Button drücke, dann wird der rechte Rahmen der Sequenzstruktur abgearbeitet, der linke allerdings nicht.
Ist das jetzt alles richtig beschrieben - so mit rechts und links?
Zitat:Mein Wissensstand ist, dass bei einer Flachen Sequenzstruktur die Rahmen von links nach rechts abgearbeitet werden.
Genau soll es ja sein. Eine Sequenz ist ja eben dazu da, den Ablauf zu sequenzieren - also von links nach rechts ( offtopic: Wie ist das eigenlich bei der chinesichen Version von LV?).
Zitat:dass der rechte Rahmen nicht erreicht wird
Ja ich würde mal sagen, da musst du mal etwas Sourcecode zeigen.
Zitat:Ist das jetzt alles richtig beschrieben - so mit rechts und links?
Nee, ist falsch beschrieben. Der LINKE Teil wird abgearbeitet und der rechte nicht.
Hab hier mal ein Beispiel eingefügt.
[
attachment=12315]
Das läuft so natürlich nicht, soll nur schematisch darstellen, was ich fabriziert habe.
Der linke Teil wird abgearbeitet und wenn ich dann den STOP Button drücke, wird alles beendet und der rechte Teil der Sequenz nicht mehr abgearbeitet.
Da fällt mir gerade was auf.
Liegt das daran, dass ich diese Funktion für Stop noch drin habe, was die gleiche Auswikung wie "ausführung abbrechen" hat? Wenn ich das rausschmeiße, müsste es ja eigentlich klappen. *grübel*
Werde das gleich mal ausprobieren. Jetzt hab ich erstmal nen Meeting.
Also meines Wissens nach beendet die Stop Funktion das Vi sofort. Da wird absolut nichts mehr abgearbeitet.
Ist im Allgemeinen nicht zu empfehlen, da da (gegebenenfalls) auch deinitialisierungen nicht ausgeführt werden.
Warum probierst du nicht einfach mal eine State Maschine statt deiner Flatsequenz. Da tust du dir vermutlich leichter Abbruchbedingungen zu implementieren.
Gruß