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 möchte, dass ein Event ausgelöst wird, nachdem sich ein bestimmtes Anzeigeelement geändert hat. Wenn ich es mit "normalen" numerischen Bedienelementen programmiere funktioniert alles wunderbar.
Wenn ich aber nun boolsche Schalter benutze, die ich in ein Array schreibe wird in der Eventstruktur für den alten und den neuen Wert der gleiche Wert angezeigt (siehe Bild).
Wie kann ich dieses Problem lösen bzw. ist das überhaupt möglich?
"Gleichzeitig" auf sowohl das Anzeigeelement als auch auf das Property Val(Sig) des selben Anzeigeelementes zu schreiben widerspricht der Logik der Datanflusssteuerung. Warum schreibst du überhaupt auf beides? Eines, also das Property, ist ausreichend.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
04.08.2007, 17:46 (Dieser Beitrag wurde zuletzt bearbeitet: 04.08.2007 17:48 von Lucki.)
Im Detail passiert dieses:
a) die Wertzuweiung über die Eigenschaft ist sehr viele langsamer als die direkte Wertzuweisung an das Bedienelement. Man kann davon ausgehen, daß das Programm erst das Bedienelement abarbeitet, dann erst den Eigenschaftsknoten
b) Die Eigenschaft "Wert, signalisierend" löst auch dann ein Ereignis aus, wenn der Wert gar nicht geändert wird, wenn also der neue Wert gleich dem alten ist. Genau das ist hier der Fall, da ja die Wertzuweisung auf dem "direktem Weg" schon erfolgt war.
Danke für die Antworten. Das mit dem Eigenschaftswert ist natürlich nicht so geschickt.
Ich habe das Problem jetzt mit Shift-Registern und Lokalen Variablen gelöst.
Ob man das dennoch auch mit Events hinkriegt, würde mich trotzdem interessieren.
@IchSelbst:
Der Screenshot ist eine vereinfachte Darstellung des Programmteils. Im richtigen Programm kommt noch ein SubVI mit einigen Rechnungen davor und die Ergebnisse möchte ich eben angezeigt bekommen.
04.08.2007, 20:19 (Dieser Beitrag wurde zuletzt bearbeitet: 04.08.2007 20:23 von Lucki.)
' schrieb:Ob man das dennoch auch mit Events hinkriegt, würde mich trotzdem interessieren.
Und ich dachte schon, Ichselbst und ich selbst hätten Dir die Frage umfassend beantwortet, so daß keine Frage mehr offen ist. Also noch mal zum Mitschreiben:
a) Die Verwendung des Eigenschaftsknotens ist nicht dumm, sondern die einzige Möglichkeit das Ereignis auszulösen.
b) Dumm ist nur die parallele, gleichzeitige direkte Wertzuweisung an das Control. Also: Control vom Draht abklemmen, evtl. in Indikator umwandeln - das wars schon. Die Änderung dauert 1 sec.
04.08.2007, 21:07 (Dieser Beitrag wurde zuletzt bearbeitet: 04.08.2007 21:08 von Firpo.)
Ah, ok hab jetz glaub kapiert was ihr meint. Is Unfug was ich da gemacht habe.
Aber wenn du sagst, dass die property node auch ein Ereignis auslöst wenn der Wert nicht geändert wird, bleibt das Problem doch bestehen oder nicht.
Oder aber ich stehe grad vollkommen auf dem Schlauch
Naja, werde das morgen mal ausprobieren.
Zitat:b) Dumm ist nur die parallele, gleichzeitige direkte Wertzuweisung an das Control...
Du meinst an die Anzeige, oder?? Sonst geb ich auf...
' schrieb:Aber wenn du sagst, dass die property node auch ein Ereignis auslöst wenn der Wert nicht geändert wird, bleibt das Problem doch bestehen oder nicht.
Das "Problem", dass also Alt und Neu gleich sein können, bleibt natürlich bestehen. Nur das ist kein Problem: Eine ÄNDERUNG war dann, wenn Alt und Neu nicht gleich sind.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
04.08.2007, 22:52 (Dieser Beitrag wurde zuletzt bearbeitet: 04.08.2007 22:54 von Lucki.)
' schrieb:Du meinst an die Anzeige, oder?? Sonst geb ich auf...
Ja
Daß sich der Wert nicht wirklich geändert haben muß, ist eher von Vorteil.
Beispiel: Ein Ereignis wird normalerweise durch Wertänderung eines Bedienelementes ausgelöst. Zusätzlich aber wünsche ich, das das Ereignis auch bei der Initialisierung des Programms stattfindet. Wie mache ich das? Ganz einfach: Ich weise im Initialisierungsteil des Programms dem Eigenschaftsknoten "Wert, signalisierend" einen Wert zu, den ich vorher aus einer lokalen Variablen desselben Bedienelementes gelesen habe. Das ist natürlich nicht mit Wertänderung verbunden, wohl aber wird wie gewünscht das Ereignis ausgelöst.
Beim wirklichen Bedienen funktioniert das übrigens nicht. Wenn ich am Bedienelement herumfummele, ohne das das letztlich mit Wertänderung einhergeht, wird kein Ereignis ausgelöst.
Ok, funktioniert.
Vielen Dank euch beiden für die Hilfe.
Im Hightlight-Modus sieht man jetzt auch die Wertänderungen.
Jetz wäre da nur noch die Frage was die bessere Programmierart ist. Event oder das Shift-Register, das ich momentan verwende. Ich habe allerdings schon eine Event-Struktur an einer anderen Stellen des Programms und habe hier irgendwo gelesen, dass mehrere Event-Strukturen in einem Programm häufig Probleme verursachen können. Obwohl ich dieses Ereignis womöglich in die andere Struktur mit einbauen könnte.
' schrieb:Jetz wäre da nur noch die Frage was die bessere Programmierart ist. Event oder das Shift-Register
Da werde ich immer Events vorziehen !
Ich habe alle Events in einen Case gepackt und den in einer eigenen While-Schleife laufen. Der Datenaustausch, wenn erforderlich, mit anderen While-Schleifen erfolgt über Queue/Melder oder Variablen.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).