LabVIEWForum.de - Timing von DAQ mit Dynamischer Event-Struktur

LabVIEWForum.de

Normale Version: Timing von DAQ mit Dynamischer Event-Struktur
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

an meinem Versuchsstand will ich Messdaten aufnehmen. Dazu werde ich ein DAQ benutzen. In dieser Frage soll es darum gehen, wie ich die Aufnahme der Messdaten zeitlich steuern kann. Um das zu erreichen, habe ich mich mit der Elapsed-Time-VI und dem Umgang mit dynamischen Event-Strukturen auseinander gesetzt. Folgendes soll die VI am Ende können:

User stellt eine Zeit ein, wie lange er Messdaten aufnehmen will --> User drückt auf Schalter, um Aufnahme von Messdaten zu starten --> Messdaten werden für die von ihm definierte Zeit aufgenommen --> Wenn die Zeit abgelaufen ist, wird die Aufnahme von Messdaten gestoppt und der Timer zurückgesetzt.

In dieser Frage soll es sich zunächst nur um den Umgang mit der Zeitsteuerung drehen. Im Anhang findet ihr ein Bild des BD sowie des VI als Datei. Folgende Fehler bestehen mit dem aktuellen Programm:

- Wenn die 10s abgelaufen sind, wird ein Fehler für das "Generate User Event" -Element angezeigt. Das macht für mich auch Sinn, der immer noch gedrückte Button [True] fordert ein Starten der Event-Struktur. Das steht jedoch im Widerspruch mit der Tatsache, dass die abgelaufene Zeit ein Stoppen der unteren While-Schleife fordert.

Die Lösung wäre hier, dass man im Zusammenhang mit dem ablaufen der Zeit den Timer zurücksetzt. Eine erste Idee, wie ich die widersprüchlichen Signale umgehen kann, wäre den Timer mit einer Case-Struktur und nicht mit dem Stopp der unteren Schleife zu verbinden. Was haltet ihr von dieser Idee? Dann wäre aber noch nicht das Problem mit dem zurücksetzen des Timers gelöst.

- Folgendes Scenario: Ich drücke den Button [True] --> Zeit startet, läuft für 5s --> Ich drücke Button wieder [False] --> Indikator zeigt stoppen der Zeit an --> Drücke Button wieder [True] --> Indikator springt zur Zeit seit dem ersten [True].

Auf jeden Fall hängen das erste und das zweite Problem zusammen. Offensichtlich bewirkt ein ausschalten Knopfes nicht, dass die Event-Struktur gestoppt wird. Warum ist das so?

Ich freue mich auf eure Antworten und vielen Dank für die Hilfe im Voraus!
Hallo lempy,

das wäre jetzt wieder was für den GerdW Dodgy

Du verwendest ja immer noch dieses Express-VI. Hast du denn verstanden, wie das funktioniert?

Ich habe eher Fragen über Fragen ...
Bin ich der einzige, der bei deinem VI nur ein leeres Diagramm sieht?
Wieso so kompliziert mit zwei Schleifen?
Wieso machst du nicht einfach bei dem Thread weiter?
Wieso die Event Struktur beim Consumer und nicht bei dem Teil mit dem User-Interface? Wenn du schon zwei Schleifen verwendest, dann wäre es doch vielleicht sinnvoll mit dem drücken des Trigger-Schalters die Datenerfassung in einer zweiten Schleife zu starten.

Zitat:- Wenn die 10s abgelaufen sind, wird ein Fehler für das "Generate User Event" -Element angezeigt. Das macht für mich auch Sinn, der immer noch gedrückte Button [True] fordert ein Starten der Event-Struktur. Das steht jedoch im Widerspruch mit der Tatsache, dass die abgelaufene Zeit ein Stoppen der unteren While-Schleife fordert.
Schön, dass du erkannt hast, dass das keine gute Idee ist.

Zitat:Die Lösung wäre hier, dass man im Zusammenhang mit dem ablaufen der Zeit den Timer zurücksetzt.
Aber auch das ist keine gute Idee. Der Timer Reset muss dann erfolgen, wenn die Zeit starten soll.

Zitat:- Folgendes Scenario: Ich drücke den Button [True] --> Zeit startet, läuft für 5s --> Ich drücke Button wieder [False] --> Indikator zeigt stoppen der Zeit an --> Drücke Button wieder [True] --> Indikator springt zur Zeit seit dem ersten [True].
Das ist nicht klar genug beschrieben. Kannst du das bitte so präzisieren, dass es eindeutig und verständlich ist und klar wird, was das bezwecken soll?

Zitat:Offensichtlich bewirkt ein ausschalten Knopfes nicht, dass die Event-Struktur gestoppt wird. Warum ist das so?
Weil du das nicht so programmiert hast? Oder anders formuliert:
Welcher Knopf und was hat ein Knopf damit zu tun? (Zitat aus Wikipedia: "Ein Knopf ist ein kleiner, fester, meist runder Gegenstand an Kleidungsstücken.")
Hallo Martin.Henz,

zunächst vielen Dank für deine Antwort! Ich werde mich einer deiner Rückfragen nach dem anderen Widmen.

[Du verwendest ja immer noch dieses Express-VI. Hast du denn verstanden, wie das funktioniert?]
Anscheinend habe ich es wohl nicht richtig verstanden. Nach meinem bisherigen Wissen ist der return dieser Express-VI ein Boolean-Value. Ist die zuvor vom Nutzer spezifizierte Zeit abgelaufen, wird ein [True] zurück gegeben. An meiner Verwendung der Express-VI ist zu erkennen, dass ich anscheinend nicht verstanden habe, wie man diesen Wert wieder auf False setzt. Wenn du mir vielleicht einen Hinweis geben könntest, wie ich das hinbekomme, wäre ich dir sehr dankbar.

[Bin ich der einzige, der bei deinem VI nur ein leeres Diagramm sieht?]
Ich habe die Datei noch einmal angehängt und werde nach dem Post dieser Antwort selber nochmal prüfen, ob die Datei diesmal vollständig ist. Keine Ahnung, was da beim letzten mal passiert ist.

[Wieso so kompliziert mit zwei Schleifen?
Wieso die Event Struktur beim Consumer und nicht bei dem Teil mit dem User-Interface? Wenn du schon zwei Schleifen verwendest, dann wäre es doch vielleicht sinnvoll mit dem drücken des Trigger-Schalters die Datenerfassung in einer zweiten Schleife zu starten.]
Dieses Vorgehen habe ich in zwei Quellen unterschiedlicher Autoren gefunden und mich deshalb daran orientiert. Folgender Link führt dich zu einem YT-Video, ein weiters Beispiel befindet sich als event.vi im Anhang. Wenn du mir vielleicht ein Beispiel senden könntest, dass mir deine Herangehensweise verständlich macht, wäre das super!

[Aber auch das ist keine gute Idee. Der Timer Reset muss dann erfolgen, wenn die Zeit starten soll.]
Ich habe dazu gefunden, dass man mit einer Feedback Node das True-Signal nach Ablauf der Zeit direkt an den Reset schicken kann, um damit einen Reset der Zeit zu erreichen. Vielleicht weißt du ja aber noch eine bessere Lösung Smile

[Weil du das nicht so programmiert hast? Oder anders formuliert:
Welcher Knopf und was hat ein Knopf damit zu tun? (Zitat aus Wikipedia: "Ein Knopf ist ein kleiner, fester, meist runder Gegenstand an Kleidungsstücken.")]
[Das ist nicht klar genug beschrieben. Kannst du das bitte so präzisieren, dass es eindeutig und verständlich ist und klar wird, was das bezwecken soll?]
Ich meinte damit den Schalter in der oberen Schleife, bitte entschuldige Smile Ich wollte testen, was passiert, wenn ich folgendes mache: Ich setze die Zeit für die Express-VI auf 10s. Ich drücke auf den Schalter um die Zeit starten. Nach z.B. 5s drücke ich den Schalter nochmal, sodass er ein False ausdrückt. Meine Theorie war: Wenn ich jetzt wieder auf den Schalter drücke, wird die Express-VI zurückgesetzt und startet wieder von 0. Was tatsächlich passiert ist: die Express-VI hat im Hintergrund weitergezählt. Wenn ich also zwischen dem "Ausschalten" des Schalters und dem "Wiedereinschalten" z.B. 10s warte, zeigt der Indikator 15s an (Was natürlich durch den Logikfehler sofort zu einem Abbruch der VI führt).[/quote]
Hallo lempy,

Zitat:Ich meinte damit den Schalter in der oberen Schleife, bitte entschuldige Smile Ich wollte testen, was passiert, wenn ich folgendes mache: Ich setze die Zeit für die Express-VI auf 10s. Ich drücke auf den Schalter um die Zeit starten. Nach z.B. 5s drücke ich den Schalter nochmal, sodass er ein False ausdrückt. Meine Theorie war: Wenn ich jetzt wieder auf den Schalter drücke, wird die Express-VI zurückgesetzt und startet wieder von 0. Was tatsächlich passiert ist: die Express-VI hat im Hintergrund weitergezählt. Wenn ich also zwischen dem "Ausschalten" des Schalters und dem "Wiedereinschalten" z.B. 10s warte, zeigt der Indikator 15s an (Was natürlich durch den Logikfehler sofort zu einem Abbruch der VI führt).
Grundproblem: das ExpressVI ist in einem Event-Case versteckt…
Das ElapsedTime ist dafür gemacht, dass es regelmäßig/oft abgefragt wird - und nicht dafür, es nur irgendwann mal, wenn ein User einen Button betätigt. Ja, es "zählt im Hintergrund weiter"…
Wieso überhaupt eine Eventstruktur und dynamisch registrierte Events???
Warum nicht erst einmal die grundlegende Logik implementieren, gern auch mit Polling und einer kleinen Wartezeit in der Schleife?

Wieso gibt es einen Button mit dem boolschen Text "Push", der aber kein Label mehr besitzt? Würdest du in textbasierter Programmierung etwa
Code:
"":=""+""
schreiben oder doch vielleicht eher
Code:
a:=b+c
???
Auch in LabVIEW sollten FP-Elemente IMMER ein Label haben!
Hallo lempy,

ich kann mich dem GerdW nur anschließen:
Zitat:Warum nicht erst einmal die grundlegende Logik implementieren, gern auch mit Polling und einer kleinen Wartezeit in der Schleife?

Fange doch erst einmal bei so etwas an:
[attachment=62052]
Referenz-URLs