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 hab einen Knopf (beim Loslassen schalten) in einer Ereignisstruktur. Diese wird ausgeführt wenn der Benutzer den Knopf drückt, weil das Ereignis "Wertänderung" ist. In der Ereignisstruktur hab ich eine While-Schliefe, die gestoppt wird, wenn der Benutzer den Knopf wieder auf False stellt. Das funktioniert auch allerdings ist das ja schon wieder eine Wertänderung. Da um die Ereignisstruktur eine weitere While-Schleife ist, wird das Ereignis "Wertänderung des Knopfs" gleich nochmal ausgeführt. Zwar nur einmal, weil dann der Knopf ja False ist, aber das ist trotzdem unerwümscht.
Lösen ließe sich das Problem, wenn es ein Ereignis "Wertänderung des Knopfs auf True" gäbe. Das kann ich aber nicht finden. Hat mir da jemand nen Tipp?
RE: Ereignis "Wertänderung auf True", gibt es das?
Nein, das gibt es nicht.
Lösungen:
1) Du liest beim Event den "New Value" aus, nur wenn der True ist, machst du was.
2) Sauberer: Wenn du schon die Event-Struktur verwendest, dann nicht innerhalb des Events langwierige While-Schleifen ausführen. Kein guter Stil.
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!
RE: Ereignis "Wertänderung auf True", gibt es das?
(05.09.2012 10:17 )jg schrieb: 2) Sauberer: Wenn du schon die Event-Struktur verwendest, dann nicht innerhalb des Events langwierige While-Schleifen ausführen. Kein guter Stil.
Wie macht man das denn sonst? Der Benutzer soll sagen können "Ich möchte den Massenstrom an der Anlage einstellen". Das entspricht Knopf=True. Jetzt wird alle 10 Sekunden ein neuer Wert gemessen und dem Benutzer angezeigt. Irgendwann hat er lang genug am Ventil rumgedreht und der Massenstrom hat den Sollwert erreicht. Jetzt setzt er Knopf=False. Der aktuelle Schleifendurchgang wird noch durchgeführt, dann ist das Ereignis abgearbeitet. Jetzt kann er einen zweiten Knopf drücken, womit die Haupmessung gestartet wird (zweites Ereignis der Struktur).
RE: Ereignis "Wertänderung auf True", gibt es das?
(05.09.2012 10:11 )DrHoas schrieb: "Wertänderung des Knopfs auf True" gäbe. Das kann ich aber nicht finden. Hat mir da jemand nen Tipp?
Hab ich: Das Problem ist vollständig mit der Umstellung des Schaltverhaltens auf "Latch" gelöst. Dabei wird der Knopf automatisch rückgesetzt, wenn er gelesen wird, hier also: das Ereignis behandelt wird. Da Letzteres nicht durch Bedienung, sondern programmatisch geschieht, löst das auch kein zweites Ereignis aus. Das Ereignis "false" lässt sich manuell gar nicht auslösen, da der Knopf vor jeder Bedienung false ist.
Beim Latch-Verhalten gibt es zwei Varianten: Latch beim Drücken und Latch bei Loslassen. Beide funktionieren gleich gut, aber ich bevorzuge "Latch beim Loslassen". Bei "Latch beim Drücken" fehlt nämlich das "Bedienerlebnis", d.h der Knopf wird nach Drücken so schnell wieder zurückgesetzt, das man gar nicht das Gefühl hat, dass er auf das Drücken reagiert hat.
Aber was tun, wenn man lokale Variable braucht? In dem Fall geht latch-Verhalten nicht, man muß den Taster gleich in der Struktur per lokale Variable wieder auf false stellen. Dann hat man das gleiche Verhalten wie bei Latch. Wenn man aber nur eine lokale Variable braucht, dann geht es auch anders: Man nimmt in der Event-Struktur den Anschluß "Neuer Wert", und kann das Element selbst irgendwo im Programm (allerdings nur zum Lesen) verwenden.
RE: Ereignis "Wertänderung auf True", gibt es das?
Hallo,
@Jens: Ich hab ein deutsches LV. Kannst Du mir sagen, wie es da heißt (siehe Anhang). Danke.
@Lucki: Das Umstellen auf Latch hab ich mir auch schon überlegt. Allerdings sieht der Benutzer dann nicht, ob das Ereignis gerade abgearbeitet wird (innere Schleife) oder ob auf eine Eingabe gewartet wird (äußere Schleife). Außerdem brauche ich dann ja einen weiteren Knopf um das Ereignis zu beenden.
RE: Ereignis "Wertänderung auf True", gibt es das?
Ein Möglichkeit wär auch, dass wenn der Knopf gedrückt wurde, ein weiteres VI geöffnet wird, in dem nur der Massenstrom geregt und angezeigt wird, bis der Benutzer zufrieden ist. Dann schließt sich das VI wieder und es geht im Hauptprogramm weiter.
Um das sauber und wartbar zu Programmieren bietet sich auch eine Statemachine an.
RE: Ereignis "Wertänderung auf True", gibt es das?
(05.09.2012 11:42 )DrHoas schrieb: Kannst Du mir sagen, wie es da heißt (siehe Anhang). Danke.
Producer/Consumer auf Deutsch
(05.09.2012 11:42 )DrHoas schrieb: @Lucki: Das Umstellen auf Latch hab ich mir auch schon überlegt. Allerdings sieht der Benutzer dann nicht, ob das Ereignis gerade abgearbeitet wird (innere Schleife) oder ob auf eine Eingabe gewartet wird (äußere Schleife). Außerdem brauche ich dann ja einen weiteren Knopf um das Ereignis zu beenden.
Könntest du mal dein VI hochladen? Dann sieht man gleich, was du wie programmiert hast.
Beste Grüße,
NWO
9 von 10 Stimmen in meinem Kopf sagen: Ich bin nicht verrückt,
die andere summt die Melodie von Tetris.
NI schrieb:To use the abort button is like using a tree to stop a car!
RE: Ereignis "Wertänderung auf True", gibt es das?
Zitat:Könntest du mal dein VI hochladen? Dann sieht man gleich, was du wie programmiert hast.
Hier Beispiel:
Schaltverhalten = Latch beim Loslassen
Beim Drücken von Test passiert ers mal nichts. Beim Loslassen geschieht die Wertänderung auf true, das Ereignis wird ausgelöst und bearbeitet. Damit mögliche andere Ereignisse nicht warten, sollte die Abarbeitung im Case möglichst schnell erfolgen, also unnötige Waits vermieden werden. Das Wait hier habe ich nur aus didaktischen Gründen eingefügt.
Wann der Knopf wieder zurückspringt, hängt davon ab, wo er gelesen wird.
Will man, dass er sofort wieder herausspringt, dann im Ereigniscase platzieren. Will man, das er erst herausspringt, wenn der Ereigniscase beendet ist, dann wie im Beispiel außerhalb platzieren. Allerdings wir er hier bei jedem anderen Ereignis oder bei jedem Timeout auch gelesen. Sauberer wäre es, im Ereigniscase eine Sequenz mit 2 Cases zu haben, und im zweiten Teil den Schalter zu platzieren. (Wenn, wie meist der Fall, die Abarbeitung kein Zeit beansprucht, dann ist die Platzierung egal, also dann am einfachsten mit in den Case legen)
Falsch wäre es hingegen, den Schalter außerhab der Hauptschleife zu platzieren, denn dann würde er, außer bei Programmstart, nie mehr gelesen, also auch nie von selbt wieder herausspringen.
Es sei eines nicht verschwiegen: Wenn man, während der Schalter gedrückt bleibt, am Schalter mit der Maus herumfummelt, passiert scheinbar erst mal nichts. In Wirklichkeit werden aber weitere Ereignisse registriert, die danach alle abgearbeitet werden. Will man das verhindern, sollte man den Schalter in dieser Zeit deaktivieren.
RE: Ereignis "Wertänderung auf True", gibt es das?
Hallo,
anbei mein VI als Minimalbeispiel. Die Bools "Pumpe und Trafos wurden gestoppt" sind eigentlich Ausgänge eines SubVIs (wenn Druck zu hoch, dann stoppen).