LabVIEWForum.de - 2 Ereignisse nacheinander auslösen

LabVIEWForum.de

Normale Version: 2 Ereignisse nacheinander auslösen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3 4
Moin zusammen,
eine Kleinigkeit habe ich noch:

Ich möchte durch einen Klick zwei Ereignisse auslösen. Es geht dabei um einen Schrittmotor mit integriertem Antrieb, bei dem ich zunächst die Endstufe ausschalte und dann nach kurzer Verzögerung ein Register des Antriebs beschreibe. Vorraussetzung für das erfolgreiche Schreiben ist, dass die Endstufe ausgeschaltet ist.

Jetzt habe ich ein Ereigniss erstellt und mir gedacht, dass ich da eine Sequenz reinpacke, bei der zunächst die Endstufe ausgeschaltet wird, in der nächsten Sequenz eine 2000ms Vergögerung ist und in der dritten Sequenz das Schreiben des Registers.
Nun habe ich aber festgestellt, dass die Endstufe erst nach der Verzögerung ausgeschaltet wird, so dass das Schreiben des Registers fehlschlägt. Es scheint wohl alles abgearbeitet zu werden, aber die tatsächliche Ausführung ist erst nach dem Abarbeiten der kompletten Sequenz (oder sehe ich da was falsch?).

Zwei Ereignisse durch einen Klick auszulösen, bei dem das erste direkt die Endstufe ausschaltet und das zweite nach kurzer Verzögerung das Register beschreibt, funktioniert auch nicht, weil man einer Wertänderung nur ein Ereigniss zuordnen kann.

Dann habe ich mir überlegt, im ersten Ereignis die Endstufe auszuschalten und dabei ein zweites Ereignis zu starten, bei dem dann das Register beschrieben wird. Leider kriege ich das auch nicht hin.

Kurzum: Ich möchte mit einem Klick zwei Befehle nacheinander mit einer Verzögerung ausführen und ich habe keine Ahnung wie. Smile

Ich hoffe, dass ihr mir helfen könnt.

Beste Grüße
Jan
Hallo Jan,
Bilder sind oft hilfreich er als Worte.

Normal kannst Du eine Sequenzstruktur verwenden
1. Befehl 1 abarbeiten
2. Timer
3. Befehl 2 abarbeiten
Gruß
Freddy
Hallo Jan,

wenn man so etwas "sauber" lösen will, dann nimmt ein ein Konstrukt wie eine QueueDrivenStateMachine!
Du hast 3 States: "Endstufe schalten", "warten", "Register schreiben" - sowas kann man in einer Statemachine wunderbar hintereinander abarbeiten. Dein Event muss dann nur die 3 "Befehle" (aka States) in die Queue schreiben…

Quick & dirty: einfach eine Sequenz verwenden…

Zitat:Nun habe ich aber festgestellt, dass die Endstufe erst nach der Verzögerung ausgeschaltet wird, so dass das Schreiben des Registers fehlschlägt. Es scheint wohl alles abgearbeitet zu werden, aber die tatsächliche Ausführung ist erst nach dem Abarbeiten der kompletten Sequenz (oder sehe ich da was falsch?).
Wir wissen nicht, was du da siehst - wir sehen mangels VI überhaupt nichts…
Genau das habe ich gemacht, aber Befehl 1 wird erst nach der Verzögerung ausgeführt. Anbei ein Bild davon.
Hallo Jan,

Zitat:Genau das habe ich gemacht, aber Befehl 1 wird erst nach der Verzögerung ausgeführt.
FALSCH!
"Befehl 1" bzw. das "Setzen der lokalen Variable" wird VOR der Wartezeit ausgeführt!
Wie sich diese Änderung des Wertes auswirkt, ist aber im Bild nicht zu erkennen…

Vermutung: du greifst auf dieses Control irgendwo anders noch zu, aber aus irgendeinem Grund (THINK DATAFLOW!?) wird der eigentliche Ausgabebefehl noch nicht ausgeführt!?
Also ich schalte die Endstufe ebenfalls mithilfe eines Ereignisses an und über "Quit" schalte ich sie aus, sie wird also nur beim Einschalten "berührt" und wenn ich auf Quit klicke. Sonst greife ich nirgends auf die Endstufe oder das Register, um das es geht, zu.
Hallo Jan,

Zitat:Also ich schalte die Endstufe ebenfalls mithilfe eines Ereignisses an und über "Quit" schalte ich sie aus, sie wird also nur beim Einschalten "berührt" und wenn ich auf Quit klicke. Sonst greife ich nirgends auf die Endstufe oder das Register, um das es geht, zu.
Leider ist dein Bild oben unvollständig, ich kann also nur vermuten, dass das Event "Quit:Wertänderung" gezeigt wird…
Alles was man dort sieht ist:
- lokale Variable auf FALSE setzen
- 2s warten
- Modbus-Register schreiben

Du willst aber haben:
- Endstufe abschalten
- warten
- Modbus-Register schreiben

Siehst du den Unterschied zwischen den beiden Aufzählungen?
So funktioniert das nicht.
Mach es so wie GerdW beschrieben hat.
Zitat:wenn man so etwas "sauber" lösen will, dann nimmt ein ein Konstrukt wie eine QueueDrivenStateMachine!
Du hast 3 States: "Endstufe schalten", "warten", "Register schreiben" - sowas kann man in einer Statemachine wunderbar hintereinander abarbeiten. Dein Event muss dann nur die 3 "Befehle" (aka States) in die Queue schreiben…
Funktioniert und ist problemlos erweiterbar.

Es gibt auch Beispielprojekte.

Gruß
Freddy
Dass das nicht anderes geht als mit der Wait-Funktion, kann ich mir nicht vorstellen.
Geht es wirklich nicht so:
1. Endstufe schalten.
2 in einer Schleife den Status des Motors abfragen.
3. Wenn der Status meldet: "Schaltbefehl ausgeführt", Schleife verlassen und weiter im Programm.

Anmerkung: Den Eigenschaftsknoten "Wert, signalisiernd" kennst Du doch hoffentlich? Damit kann man u.a. innerhalb eines Ereigniscases ein anderes Ereignis auslösen. Damit will ich aber nicht gegen die vorgeschlagene QSM als vermutlich beste Lösung argumentieren.
Hallo,

Zitat:Anmerkung: Den Eigenschaftsknoten "Wert, signalisiernd" kennst Du doch hoffentlich? Damit kann man u.a. innerhalb eines Ereigniscases ein anderes Ereignis auslösen.
Dann aber immer "THINK DATAFLOW!" im Hinterkopf haben: der zweite Eventcase muss dann in einer anderen Eventstruktur in einer anderen Schleife abgearbeitet werden…
Seiten: 1 2 3 4
Referenz-URLs