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!
01.08.2009, 08:45 (Dieser Beitrag wurde zuletzt bearbeitet: 01.08.2009 09:45 von Lucki.)
Falls Du aber dafür nur 2 Minuten Zeit zur Verfügung hast, dann bleibt nur es so zu machen (Aber kein anständiger Programmierer macht das. Die Stop-Taste drückt den roten Knopf)
' schrieb:Wie wär es mit folgendem VI. Da eh nur gewartet wird kann man eine Ereignisstruktur mit Timeout einsetzen. Stoppt sofort wenn man Stop drückt.
Dieser Vorschlag ist schlichtweg optimal, und die Umstellung dürfte auch schnell gehen. Ein Anfänger würde sich vielleicht etwas mehr Text wünschen. Also hier ist er:
In den Timeout-Case kommt der Inhalt der bisherigen Haupschleife hinein. (Der Boolsche alternierende Schalter dient nur als Platzhalter) Natürlich abzüglich der Uhren.
Dies Struktur wird man in der Regel noch erweitern. Denn wenn einmal diese schöne Struktur da ist, wird man auch weitere Bedienvorgänge oder sogar alle als Ereignisse behandeln.
' schrieb:Ich habe das Problem mit langsamem Stop genauer angeschaut:
Stellvertretend für das große Programm habe ich eine Blinkschaltung gebastelt. Blinkfrequenz 10 sec..
In beiden Fällen blinkt das Licht mit der gleichen Frequenz. Drücke ich STOP, ist die Reaktion aber unterschiedlich. Wenn das zeitglied in der gleichen Schleife wie die Stop-Funktion ist, wird der Zeitablauf nochmals gestartet, wenn Stop gegeben ist. Mit dem Zeitglied im Case wird nach Zeitablauf sofort beendet bei Stop.
Für eine schnelle Reaktion auf Stop empfiehlt sich also, das zeitbegrenzende Glied nicht in höchter Ebene einzusetzen.
Das ist doch logisch. Im ersten Fall wird "Stopp" ausgwertet und anschließend gewartet. Wenn du dann auf Stopp drückst wird dies erst in der nächsten Iteration ausgwertet. Mit definiertem Datenfluss könntest du das aber umgehen.
Ich bevorzuge für so etwas eine stinknormale whileschleife, die alle 50 ms ausgeführt wird. Bei einer Ereignisstruktur brauch ich dynamische Ereignisse, wenn ichs als SubVI einsetzen will.
Mit einigem Rumprobieren fand ich, daß mir bei meiner LabVIEW-Version (Base) die Ereignis-Struktur nicht zur Verfügung steht. Da fallen einige Vorschläge für mich von Vorn herein flach. Der Vorschlag in Beitrag 11 stoppt auch nicht langsamer, als meine Basteleien, es schien nur so, weil der Timer im Case auf 100ms stand.
Ich habe nochmal rumgebastelt, und die funktion "Auf Frontpanel Aktivität warten" gefunden. Da kann der Timeout als Zeitfunktion verwendung finden, Stop als Eingabe über das Frontpanel bricht diese "Zeitfunktion" ab. Leider läßt sich keine zur Systemuhr synchrone Steuerung damit aufbauen.
Ich habe schließlich einen Timer selbst gebastelt, der alle Bedingungen erfüllt, wie Synchron zur Systemuhr, und Schnellstop: Auslesen der Systemuhr, String in Zahl verwandeln, und nur die Sekunden herausführen. Diesen Wert für die Zeitsteuerung anschließend aufarbeiten, um 2 While-Iterationen pro Minute zu erhalten. Der angesteuerte Case muß nur eine Verzögerung von mindestens einer Sekunde enthalten, damit keine zwei Events innerhalb der Triggerzeit vorkommen (Ist eigentlich nur bei einem so einfachen Programm, wie Blinklicht relevant).
Nichts desto trotz solltest Du in der While-Schleife ein kleines Wait spendieren, z. B. 50 ms. Das ändert nichts an der Reaktionszeit beim Drücken des Stopp-Knopfes. Es reduziert aber die Prozessorauslastung der anderenfalls volle Kraft voraus die While-Schleife abarbeitet.