Ich habe ein großes Programm geschrieben, mit einer While-Schleife. Die Zeitdauer der Schleife ist 30 Sekunden.
Gebe ich einen Stop über das Frontpanel ein, dauert es immer recht lange, bis das Programm endlich stehen bleibt. Ich habe den Eindruck, es erfolgen noch zwei Schleifen-Durchläufe, bis der Stop das Programm endlich zum Stillstand bringt.
Durch das Stop-Signal habe ich die Anzahl der Iterationen in einer enthaltenen For-Schleife geändert, sowie die Laufzeit der While-Schleife verkürzt. Doch richtig glücklich bin ich damit nicht.
Gibt es eine Möglichkeit?
Moinsen!
Ich würde das Ganze anders herum aufziehen. Lasse doch die Schleife im Sekunden-Takt laufen und führe deine Aktion bei jedem 30ten Schleifdurchlauf aus. Dann greift das Stop und damit der Schleifenabbruch halt nach 1 Sekunde.
Schöne Grüße
Falk
Aha!
Das ist mir aber jetzt ein zu großer Aufwand, das ganze Programm dahingehend umzumodeln, damit die Reaktion auf die Stop-Taste schneller geht.
Ich habe inzwischen noch einen anderen Beitrag gefunden, der auch über dieses problem handelte. Auch hier war nur die Rede davon, kürzere Iterations-Zeiten zu verwenden. Offensichtlich muß man schon beim Design das Anhalten des Programmes genauer ins Auge fassen, insbesondere bei langsamen Anwendungen.
Eventuell wäre da Handlungsbedarf seitens National Instruments.
Es gehört allgemein zum guten Programmierstil sich VORHER gedanken zu machen, welche Funktion das Programm haben soll. Was kann NI dafür, wenn man erst später merkt, dass man das Programm auch zwischendurch beenden möchte?
Das es dir so vorkommt als würde die Schleife noch zweimal durchlaufen ist auch nur natürlich:
In jedem Schleifendurchlauf werden alle Funktionen innerhalb der Schleife in beliebiger Reihenfolge abgearbeitet. Es sei denn, sie sind durch den Datenfluss sequenziert. Eine Aufgabe die innerhalb der Schleife erledigt werden muss, ist zum Beispiel den aktuellen Wert des Stopp-Buttons an deine ODER-Verknüpfung zu übergeben. Wenn du erst danach den Stoppbutton drückst, hat das auf den aktuellen Schleifendurchlauf ekine Auswirkungen. LabVIEW arbeitet also zunächst den aktuellen Schleifendurchlauf ab und beginnt dann den nächsten. Diesesmal ist der Button gedrückt worden, trotzdem muss der Schleifendurchlauf vollständig abgearbeitet werden. Dadurch können fast zwei vollständige Durchläufe nach dem Drücken von Stopp entstehen.
LG
Torsten
Sag ich ja: Beim nächten Mal mache ich es besser!
Aber Dein erstes Programm war sicher auch nicht perfekt!
Aber mein Programm (While-Schleife) durchläuft offensichtlich eine zweite Schleife!
Ich denke, ich werde noch einen großen Case einsetzen, in dem mein ganzes Programm sitzt, und der ist durch die Stop-Funktion gesteuert.
' schrieb:Sag ich ja: Beim nächten Mal mache ich es besser!
Sehr löblich!
Zitat:Aber Dein erstes Programm war sicher auch nicht perfekt!
Natürlich war es das. Mein erstes Programm hieß HelloWorld und wurde damals in Basic programmiert. Und es läuft heute noch einwandfrei ohne jegliche Fehler.
Zitat:Ich denke, ich werde noch einen großen Case einsetzen, in dem mein ganzes Programm sitzt, und der ist durch die Stop-Funktion gesteuert.
Du kannst auch einfach sicherstellen, dass der Stoppbutton erst am Ende der Schleife ausgelesen wird. Dann hast du eine maximale Reaktionszeit von einem Schleifendurchlauf. und den bekommst du auch nicht mit der umfassenden Casestruktur weg.
Ansonsten wäre es eben eine gute Alternative, die große Schleife in viele kleine parallele aufzuteilen. Aber das bedeutet Arbeit und ist nicht immer möglich.
Viel Spaß noch mit deinem Programm,
Torsten
' schrieb:Sag ich ja: Beim nächten Mal mache ich es besser!
Ich denke, ich werde noch einen großen Case einsetzen, in dem mein ganzes Programm sitzt, und der ist durch die Stop-Funktion gesteuert.
Wenn du dich verbessern willst solltest du dir einige Programmarchitekturen ansehen. LV ist im Gegensatz zu textbasierten Programmiersprachen datenflussorientiert. D.h. du musst dafür sorgen das der Datenfluß erstens überhaupt existiert und zweitens auch so wie du es dir vorstellst. Sprich macht die Applikation das Richtige zur richtigen Zeit? Schau dir für den Anfang mal Zustandsautomaten (Statemachine) an. Diese Art der Programmierung ermöglicht dir einfach Datenflussorientiert zu programmieren, ist beliebeig erweiterbar und schnell umgesetzt.
Quick & Dirty: Whileschleife durch zeitgesteuerte Schleife ersetzen, die kannst du einfach mit der Funktione "Zeitgesteuerte Schleife stoppen" beenden.
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.
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.