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!
In der unteren Schleife kommt es während der Laufzeit nicht zur Auswertung, weil der Timeout überhaupt nicht eintritt. Also entweder den Timeout verkürzen, z.B auf 10 ms, oder dafür sorgen, dass die Auswertung immer stattfindet, also auch beim Eintreffen neuer Werte aus der Queue.
Bin gerade dabei eure Ratschläge umzusetzen. Die Melder rufe ich jetzt vor der Schleife auf und schließe sie nach Beenden der Schleife wieder. Hoffe das passt so. Habe den Eindruck dass die Schleifen im meinem richtigen Programm auch schneller laufen, wenn ich den Meldern ein Timeout gebe.
Nur bei dem anderen Problem habe ich noch das ein oder andere Verständnisproblem. Es ist doch momentan so, dass der Timeout der Queue nach Beenden der Messung einmal von wahr auf falsch wechselt. Dadurch werden die Messwerte im Case zum Speichern direkt ins Schieberegister geschoben. Anschließend gibt der Timeout der Queue wieder wahr aus und die eigentliche Auswertung beginnt. Ich habe jetzt mal in den Case ein Event eingefügt, mit dem ich die Wertänderung von zwei Eingaben innerhalb der Auswertung abfrage. Jedes Mal, wenn sich an diesen Eingaben etwas ändert, möchte ich ja neu auswerten. Wenn es mir jetzt noch gelingen würde das Event zusätzlich auszulösen, wenn der Timeout der Queue von falsch auf wahr springt (das ist ja genau der Zeitpunkt zu dem im vorherigen Schleifendurchlauf neue Messwerte ins Schieberegister geschoben wurden), dann müsste das doch eigentlich funktionieren. Leider schaffe ich es nicht diesen Wechsel von falsch auf wahr als Bedingung für das Event zu wählen. Oder sind da noch andere Denkfehler drin?^^
PS: ganz ohne Zeilenumbrüche.. muss mich aber echt konzentrieren, weil der Finger aus irgendwelchen Gründen am Ende der Zeile immer in Richtung Enter zieht
(01.11.2013 20:11 )creo_123 schrieb: ... Leider schaffe ich es nicht diesen Wechsel von falsch auf wahr als Bedingung für das Event zu wählen. ...
Nun du kannst einfach auf Wertänderung reagieren und dann in dem Event den Wert anschauen ob der Wechsel F->T oder T->F war und dann entsprechend reagieren.
Dein VI kann ich leider nicht öffnen, da ich LV2010 habe.
Das Event reagiert aber aus irgendeinem Grund nicht auf die Wertänderung. Dachte es liegt vielleicht daran, dass ich ja bei der Wertänderung gleichzeitig in den False-Case springe, in dem sich das Event gar nicht befindet. Habe deshalb jetzt die Wertänderung durch ein Schieberegister um einen Schleifendurchlauf nach hinten verschoben. So kann erst der False-Case die Messdaten speichern und anschließend wird durch die Wertänderung das Event ausgelöst, wenn sich der Case wieder auf True befindet. Aber auch das bringt nicht das erwünschte Ergebnis. Habe jetzt echt keine Ideen mehr
Habe das VI auch mal noch als 2010er hochgeladen..
Mehrere Event-Strukturen innerhalb eines VIs zu verwenden führt fast IMMER zu unvorhersehbaren Problemen. Bei entsprechender Programmierung kommt man IMMER mit einer Event-Struktur aus.
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!
Danke für der Hinweis.. hab mal versucht das zu berücksichtigen und habe dazu das obere Event, das die Messung auslöst, durch einen einfachen Case ersetzt. Ich habe also jetzt nur noch das eine Event in der Auswertung. Es funktioniert aber leider immer noch nicht. Was ich einfach nicht verstehe ist, dass der Schalter in der Auswertung das Event auslöst, der Wechsel der boolschen Timeout-Variablen aber nicht beachtet wird.
(04.11.2013 17:28 )creo_123 schrieb: Dachte es liegt vielleicht daran, dass ich ja bei der Wertänderung gleichzeitig in den False-Case springe, in dem sich das Event gar nicht befindet.
Eventstrukturen sollten auch nicht unbedingt in einer Case-Struktur 'versteckt' werden. Entweder sollte das Auslösen des Events verhindert werden (z.B. den entsprechenden Button 'disablen'), oder die Ausführung, die aufgrund des ausgelösten Events gemacht werden sollte.
(04.11.2013 20:45 )creo_123 schrieb: hab mal versucht das zu berücksichtigen und habe dazu das obere Event, das die Messung auslöst, durch einen einfachen Case ersetzt.
Kannst du uns auch bitte die Änderungen zeigen? Dein obiges Vi ist ja nun nicht mehr aktuell, womit wir auch nicht wissen, was du wie geändert 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!
Habe es jetzt mal noch einfacher gemacht, meiner Meinung nach.. es ist jetzt zwar wieder so, dass die Auswertung immer durchlaufen wird, aber im ersten Schritt muss ich es ja erstmal hinbekommen, dass das Event durch den Wechsel der Timeout-Variablen ausgelöst wird. Das funktioniert aber auch hier wieder nicht. Die Eventschleife reagiert nur auf den Stop-Schalter in der oberen Schleife. Und das obwohl das Event in keinem Case mehr versteckt ist und ich auch sonst kein weiteres Event in meinem VI verwende.
Zitat:dass das Event durch den Wechsel der Timeout-Variablen ausgelöst wird
Das Schreiben in ein Terminal oder lokale Variable löst kein Event aus.
Steht so in der Kontexthilfe ("Ereignisse der Benutzeroberfläche entstehen nur durch einen Bedienschritt seitens des Benutzers.")!
Wenn du ein Event auslösen willst, wenn der Indicator "timed out" einen Wert erhält, musst du eine PropertyNode nehmen. Welche das ist, kannst du ja mal in der Hilfe nachlesen...
das war der entscheidende Hinweis.. Danke!! und natürlich auch an alle anderen die mir geholfen haben!!
Anbei mal noch meine Lösung, die soweit ich das bis jetzt beurteilen kann, alles macht was sie soll. Wenn die Messung abgeschlossen ist, liefert mir der Timeout der Queue ein FALSE. Das nutze ich, um im Case das Cluster mit den Messwerten in das Schieberegister zu schreiben. Gleichzeitig gebe ich auch das FALSE in ein Schieberegister, um im nächsten Schleifendurchlauf, wenn der Case wieder auf True ist, das Event mittels signalisierendem Wert auszulösen. Außerdem reagiert das Event auch auf Änderungen der Bedienelemente innerhalb der Auswertung.
Ist das so halbwegs ok, oder gibts noch irgendwelche Verbesserungsvorschläge?