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!
23.05.2012, 11:29 (Dieser Beitrag wurde zuletzt bearbeitet: 23.05.2012 11:30 von Soean.)
ich bin bestimmt nicht der Erste mit diesem Problem, aber die Suchfunktion bringt mich nicht weiter.
Ich habe ein _MAIN-vi mit einer Main-Loop und 5 dazu parallelen Schleifen (DIO-Signalerfassung/Erzeugung, RS232-Kommunikationen...). In meiner Main-Loop gibt es eine State-Machine, in einem Case dieser State-Machine eine Event-Structure mit derzeit 25 Cases.
Einer dieser Cases wird von 2 bool'schen Schaltern, welche in einer der parallelen Schleifen über die Property Value(Signaling) gesetzt werden, ausgelöst. Das Funktioniert auch. Die Main-State-Machine springt, sobald einer dieser Schalter gesetzt wurde, in den nächsten Case, die State-Machine wird nicht mehr aufgerufen. Trotzdem bleibt von diesem Zeitpunkt an mein FP gesperrt.
Dies bedeutet doch, dass irgendwo noch ein Bedienelement, welches auf die Event-Structure registriert wurde, seinen Wert ändert und dementsprechend ein Event auslöst, welches nicht verarbeitet werden kann, weil die Event-Structure nicht mehr aufgerufen wird, oder?
Leider kann ich keinen Punkt im Programmablauf finden, bei dem noch ein Bedienelemt verändert wird, erst recht nicht über value(signl).
Kann es noch eine andere Ursache geben? Wie würdet ihr vorgehen, um den Fehler weiter einzugrenzen?
Highlight-Mode usw. fallen raus, da ich das Programm nur als Applikation auf dem Rechner testen kann, an dem die Peripherie angeschlossen ist, und auf welchem kein LabView installiert ist.
Vielen Dank für eure Hilfe!!
23.05.2012, 11:47 (Dieser Beitrag wurde zuletzt bearbeitet: 23.05.2012 11:49 von GerdW.)
Zitat:in einem Case dieser State-Machine eine Event-Structure mit derzeit 25 Cases.
Zwei Punkte:
- Wenn das FP nicht auf Eingaben reagiert, ist ein Event noch nicht abgearbeitet. Dies ist nämlich die Standardeinstellung bei der Eventstruktur.
- Es ist m.M.n. äußerst schlechtes Design, die Eventstruktur in einem Case einer Statemachine zu verstecken... Wenn man Events für sich reklamiert, sollte man sie auch (jederzeit) abarbeiten können!
Es gibt diese zwei Möglichkeiten:
Entweder eine parallele Schleife nur zur Ereignisbehandlung - dann kann/soll Timout unendlich sein (-1).
Oder Ereignsistruktur in der Hauptschleife. Dann kein Timeout von unendlich, sonst blockiert die Struktur!
Es ist doch leicht feszustellen, wo es hängt. In den Ereigniscases sollte es nichts geben, was wartet. Bei Dir sieht man so komische Sachen wie das Ikon mit der Uhr, oder den Text "Auf Heizpatrone warten". Vielleicht hat sie sich verlaufen und kommt überhaupt nicht...
nene...Die HP (HeizPatrone) lege ich in dem Fall selbst in den Prüfautomaten. Dieser fängt darauf hin auch wie gewollt automatisch an zu prüfen. Die Main-State-Machine verlässt also den "Idle"-Case mit der Event-Structure und geht über den Case "Automatic-Start" in den Case "Automatic-Run". Nur das FP bleibt blockiert.
Wie GerdW schon gesagt hat, eindeutig schlechter Programmierstil. Eine Eventstruktur in einen Case einer State-Machine zu stecken, der dann nicht regelmäßig aufgerufen wird, da muss so was passieren.
Also: Eventstruktur in eine eigene "GUI-Loop" stecken, und dann die State-Machine per Queue oder Notifier steuern!
Gruß, Jen
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Hmm...diesen "schlechten Programmierstil" habe ich auch in früheren Programmen angewandt - hat einwandfrei funktioniert.
Aber ok. Die Event-Structure in eine eigene Loop. Da stoße ich als Autodidakt jedoch gerade an meine Grenzen. Wie arbeite ich am Besten in verschiedenen Schleifen mit ein und der selben Klasse? Aber das ist vllt auch "Off-Topic"...
Danke für eure Hilfe!
23.05.2012, 14:11 (Dieser Beitrag wurde zuletzt bearbeitet: 23.05.2012 14:21 von jg.)
Alternativ musst du halt dafür sorgen, dass der "Idle"-Case immer wieder aufgerufen wird, so dass auch wirklich Events abgearbeitet werden!
Andere Idee, wie sieht es mit dem Schaltverhalten deiner "Booleans" aus. Nicht dass die 2 Events pro "Value-Signaling" auslösen.
Ich kann mich da an einen Fehler bei Farbfeldern erinnern, die lös(t)en pro Benutzeränderung 2x das Event Value-Change aus.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!