LabVIEWForum.de - Übersichtliche Struktur und das Problem mit Events

LabVIEWForum.de

Normale Version: Übersichtliche Struktur und das Problem mit Events
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo liebe Community,

ich bin an einem Projekt beschäftig, welches als Grundlage ein sehr komplexe LabVIEW Ansteuerung benötigt. Da das Programm sehr umfangreich ist / wird lege ich sehr viel Wert auf eine übersichtliche und klare Struktur. Vorallem da meine Arbeit von anderen auch nachvollzogen werden soll und eventl. eigene Änderungen dran vornehmen können.

Mein komplettes Programm besteht aus einer großen While-Loop, die solange durchlaufen wird - bis das Programm beendet wird. In der While-Loop habe ich eine Case, die die verschiedenen Programm Teile wiedergibt. Jede Case kann somit als einzelner Schritt eins Ablaufdiagramms gesehen werden - die je nach "programmierter Caseauswahl" zum nächsten Schritt springt.

Es gibt im Moment die folgenden Programmschritte:
- Initialisierung von Variablen und Daten
- Initialisierung des Frontpanels
- Verbindungsaufbau
- Hauptprogramm
- Programm beenden

Mein Programm läuft zu Beginn die oben genannten Punkte der Reihe nach durch bis "Verbindungsaufbau". Dort ist eine Event-Case die darauf wartet, dass der User entweder den Button "Connect" wählt, oder im Menü "Connect" oder je nach dem eine der anderen Optionen wie Hilfe, Programm beenden, etc.

Wurde Connect gewählt und die Verbindung wurde erfolgreich aufgebaut wird ins Hauptprogramm gesprungen. Wenn er das Programm beenden will, wird zum "Programm beenden" gesprungen.

Mein Problem dabei ist, dass ich jetzt im Haupprogramm aber wieder eine Event-Case brauche. Aber die Event-Case im Verbindungsaufbau kann ich auf Grund der ganzen Optionen auch nicht weglassen.

Und das zusammenfügen zu einem Case ist auch schwer - da ich die internen Schleifenabbrüche mit Semaphore Error verknüpft habe, der dann initialisiert ist wenn die Verbindung bereits besteht. Tritt eben dort ein Fehler auf, springt er wieder zur "Verbindung aufbauen"-Case...


Dadurch dass ich zwei Cases habe, die auch einige Events gleich haben, füllt sich zugleich bei einigen Aktionen der Event-Puffer beider Schleifen. Wenn ich dann in den Programmteil der nächsten Case komme - arbeitet er mir alle Aktionen in dem Puffer ab...

Gibts dafür eine Möglichkeit, den Event-Puffer zurückzusetzen?
Oder nach welcher Struktur arbeitet ihr - Ein Verbindungsaufbau muss bei euch ja auch immer der Fall sein. Wie handhabt ihr das auftauchen eines Fehlers und die damit verbundene Neu-Initialisierung etc..


Ich weiß viel Text, eventl ließt es wer und kann mir weiterhelfen - Vielen Dank!

MFG
Ragdar
' schrieb:Da das Programm sehr umfangreich ist / wird lege ich sehr viel Wert auf eine übersichtliche und klare Struktur. Vorallem da meine Arbeit von anderen auch nachvollzogen werden soll und eventl. eigene Änderungen dran vornehmen können.
Das ist schonmal löblichWink

' schrieb:Mein komplettes Programm besteht aus einer großen While-Loop, die solange durchlaufen wird - bis das Programm beendet wird. In der While-Loop habe ich eine Case, die die verschiedenen Programm Teile wiedergibt. Jede Case kann somit als einzelner Schritt eins Ablaufdiagramms gesehen werden - die je nach "programmierter Caseauswahl" zum nächsten Schritt springt.

Es gibt im Moment die folgenden Programmschritte:
- Initialisierung von Variablen und Daten
- Initialisierung des Frontpanels
- Verbindungsaufbau
- Hauptprogramm
- Programm beenden

Gibts dafür eine Möglichkeit, den Event-Puffer zurückzusetzen?
Oder nach welcher Struktur arbeitet ihr - Ein Verbindungsaufbau muss bei euch ja auch immer der Fall sein.
Toplevel VI (ist das VI dessen Frontpanel der User zu Gesicht bekommt) --> Producer-Consumer-Architektur
Sub VI's --> Statemachines
Damit hast du eine übersichtliche, gut lesbare und leicht zu erweiternde Anwendung. Allerdings hast du das nicht von heute auf morgen drauf. Es bedarf einer gewissen einarbeitungszeit, die sich aber allemal auszahlen wird.

' schrieb:Wie handhabt ihr das auftauchen eines Fehlers und die damit verbundene Neu-Initialisierung etc..
Ganz einfach mit einem Errorhandler. Das musst du schon selbst machen. LV ist Datenfluss orientiert d.h. am Ende des Datenstroms kannst du schön nach Fehelern ausschau halten. Wie du welchen Fehler behandelst bleibt dir überlassen. Bei mir geht das von einer einfachen Warnmeldung bis hin zum Beenden der Applikation.

Gruß, abrissbirne
' schrieb:...
Wie du welchen Fehler behandelst bleibt dir überlassen. Bei mir geht das von einer einfachen Warnmeldung bis hin zum Beenden der Applikation.
...

Ich lösche manche Fehler auch einfach ohne Warnmeldung (der User muss nicht jeden Scheiß mitbekommen!!). Grundsätzlich habe ich in meinen Programmen eine Errorline die von Anfang bis Ende durchgezogen ist. An kritischen Punkten baue ich ein SubVI (Errorhandler) ein. Falls ein Fehler auftritt, und er bekannt ist, wird er entsprechend behandelt. Ist er unbekannt, wird er bis zum nächsten Errorhandler durchgereicht. das Programm ist dann so ausgelegt, dass nichts mehr getan wird, wenn ein unbekannter fehler auftritt.

LG
Torsten
Will nur noch anmerken, daß NI ausdrücklich vor der Verwendung mehrerer Eventstrukturen innerhalb einer While-Schleife warnt.
Ob man den Event-Puiffer zurücksetzen kann, weiß ich jetzt nicht, aber auf jeden Fall kann man Ereignisse auch dynamisch konfigurieren. Sie lassen sich dann an-und abmelden, so daß Ereignisse, die im Moment nicht gewünscht sind, gar nicht erst auftreten.

Aber untersuche doch mal diese Konfiguration mit nur einer State-Machine und nur einer Event-Struktur:

Große While-Schleife
Darin ebenso große. dh. fast die ganze Fläche beanspruchende Event-Struktur.
Das gesamte Programm mit State-machine befindet sich im Timeout der Eventstruktur mit den Zuständen
- Initialisierung von Variablen und Daten
- Initialisierung des Frontpanels
- Verbindungsaufbau
- Hauptprogramm Case A
- Hauptprogramm Case B
- Hauptprogramm Case C
- Hauptprogramm Case D
- Hauptprogramm Case E
- Programm beenden
Referenz-URLs