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!
Ich habe eine kleine Steuerung, die mehrere Geräte ansteuert bzw. ausließt. Je Gerät habe ich ein SubVI. ZB eins für mein Arduino Borad, eins für mein Messdatenerfassungssystem,...
Jetzt möchte ich in einem Fehlerfall eine Funktion einbauen, dass zuerst alle Geräte ausgeschaltet werden und dann das Programm beendet wird. Ein Fehlerfall kann in jedem SubVI auftreten. Ich brauche also irgendetwas, was was auf die Fehlermeldung reagiert und dann auch alle anderen SubVI beendet.
Was Du machen willst ist weiter nichts als eine ordentliche Fehlerbehandlung. Man bricht bei einem Fehler ein Programm nicht einfach ab, sondern schaltet die Gerätes aus, schließt Dateien usw.
Das Prozedere ist: Die Fehler werden an eine zentrale Stelle gemeldet, wo dann entschieden wird, wie weiter im Programm verfahren werden soll. Google auch mal nach QSM ("Queue Driven State Machine"), mit dieser Struktur hat man beste Voraussetzugnen für eine professionelle Fehlerbehandlung.
Die Ereignsistruktur ist primär zum Abfangen von Bedienereignissen vewendet und hier nicht unbedingt das Allheilmittel. Sie ist auch nicht identisch mit einem Interrupt. Wenn z.B. das Bedienereignis eintritt, passiert erst mal weiter nichts, als dass das (per echtem Interrupt) in einer Warteschlange registriert wird. Erst dann, wenn die Ereignsistruktur im ganz normalen Programmablauf aufgerufen wird, wird das Ereignis verarbeitet. Im Forum kommt es bei Anfängern immer wieder zu Missverständnissen, wenn sie glauben, dass das Event ein unmittelbarer Interrupt ist, dass das Programm bei einem Event sofort zur Eventruktur springt und es sofort behandelt.
Das ist vielleicht nicht alles zu verstehen, aber damit wenigstens eine Ahnung aufkommt, wie Fehlerbehandlung funktioniert, hänge ich mal eine Seite aus einem Lehrbuch an.
(05.09.2012 10:16 )Lucki schrieb: Was Du machen willst ist weiter nichts als eine ordentliche Fehlerbehandlung. Man bricht bei einem Fehler ein Programm nicht einfach ab, sondern schaltet die Gerätes aus, schließt Dateien usw.
Das Prozedere ist: Die Fehler werden an eine zentrale Stelle gemeldet, wo dann entschieden wird, wie weiter im Programm verfahren werden soll. Google auch mal nach QSM ("Queue Driven State Machine"), mit dieser Struktur hat man beste Voraussetzugnen für eine professionelle Fehlerbehandlung.
Das klingt nach dem, was ich gesucht habe! Vielen Dank!
(05.09.2012 10:16 )Lucki schrieb: Wenn z.B. das Bedienereignis eintritt, passiert erst mal weiter nichts, als dass das (per echtem Interrupt) in einer Warteschlange registriert wird. Erst dann, wenn die Ereignsistruktur im ganz normalen Programmablauf aufgerufen wird, wird das Ereignis verarbeitet.
Wenn die Ereignisstruktur korrekt benutzt wird, d.h. wenn in einem Eventcase keine "länger dauernden" Codeabschnitte (Schleifen etc.) platziert sind, sondern nur eine kurze Event-Behandlung (z.B. Übergeben eines neuen Zustands für die parallele State Machine), passiert doch sofort was...nämlich eben wie genannt der Wechsel in einen neuen State, z.B. "Fehler Gerät XYZ".
Die Ereignisstruktur sollte nie in einem abhängigen Code-Abschnitt platziert werden, sondern immer "oben drauf" bzw. parallel. Dann klappts auch mit dem Eventhandling...und wenn man da (zusätzlich zu den SW-Tastenbetätigugnen etc.) ein User Event am Strukurrand registriert, kann man wie bei nem echten Interrupt z.B. auch auf externe HW-Signale reagieren!
A.
"Is there some mightier sage, of whom we have yet to learn?"
"Opportunity is missed by most people because it is dressed in overalls and looks like work." (Thomas Edison)
@achim
Gut dass Du das ergänzt: Man kann und sollte das Programm so machen, dass ein Event, nachdem es registriert ist, sofort behandelt wird.
Leider machen das mache Anfänger nicht so, weil sie denken, das Ereignis funktioniert exakt wie ein Interrupt. Sie denken, wenn das Ereignis eintritt, lässt das Programm alles andere stehen und liegen und behandelt automatisch den Code im entprechenden Ereigniscase, und zwar unabhängig davon, wo im Programm sich die Ereignisstruktur befindet.
DerSchwerpunkt meines Postings war, auf diesen Unterschied zum Interupt hinzuweisen.