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 habe eine LabVIEW Programm, bei dem 2 While Schleifen parallel laufen.
In der 1. Schleife befinden sich nur die lokalen Variablen, Enums und boolschen Variablen. als Anzeige oder Bedienobjekt. Die While Schleife ist als Endlos-Schleife geschaltet.
In der 2. Schleife, ebenfalls eine Endlosschleife, rufe ich verschiedene VI auf und führe Sie aus.
Ich habe mir vorgestellt, dass die 1. Schleife ausschließlich zur Aktualisierung der lokalen Variablen dient. Doch leider musste ich feststellen, das nach einer Aktualisierung in eines Anzeigeelementes in der 1. Schleife, die 2. Schleife unmittelbar nach der Aktualisierung den alten Wert noch drin hat.
Kann mir jemand erklären, warum die lokale Variable nicht aktualisert wird bzw. was kann ich machen um die Aktualisierung zu erreichen.
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
Lokale Variablen und Enums
Wenn Du eine lokale Variable in der ersten Schleife aktualisierst muss die zweite Schleife zuerst fertig laufen. Beim nächsten Durchgang der zweiten Schleife ist dann der Wert der ersten Schleife drin.
Was hast Du denn vor, dass es so genau sein muss?
Vielleicht helfen Dir Queues, Notifier, Semaphoren, Rendezvous,.....
Gruß Markus
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
' schrieb:In der 1. Schleife befinden sich nur die lokalen Variablen, Enums und boolschen Variablen. als Anzeige oder Bedienobjekt. Die While Schleife ist als Endlos-Schleife geschaltet.
Zitat:Ich habe mir vorgestellt, dass die 1. Schleife ausschließlich zur Aktualisierung der lokalen Variablen dient.
"Lokale Variablen" sind weder Anzeige- noch Bedienelemente. Lokale Variablen sind "mangelhafte Elemente, um den Datenfluß zu stören". Will sagen: aktualisiert wird nicht die lokale Variable, sondern das Anzeigeelement am Bildschirm (FP). Mit einer lokalen Variablen kann man Daten austauschen zwischen parallel laufenden While-Schleifen. Lokale Variablen sind also lediglich das Mittel zum Zweck des Datenaustausches. Allerdings hat dieses Verfahren einen Nachteil: RaceConditions (= "mangelhafte Elemente ...") !
Wenn man zwei parallele While-Schleifen verwendet mit der selben Variablen (Variable = Bedien/Anzeigeelement + Lokale Variable), dann sollte man in der einen Schleife tatsächlich nur lesend auf die Variable zugreifen. In der anderen Schleife kann man lesend und schreibend darauf zugreifen.
Je nach dem, wie der Code in jeder deiner While-Schleifen aussieht, kommt es eben zu dem von dir erwähnten Ungereimtheiten: RaceConditions.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
ich wollte mit der 1. Schleife die Anzeige- und Bedienelemente steuern bzw. veränderbar machen. In der 2. Schleife sollten die Werte dann übernommen werden.
In der 2. Schleifen habe ich noch eine Eventsteuerung drin. Das heißt, ich drücke immer erst einen Button damit sich in der 2. Schleife ein aufgewähltes VI öffnet und angewendet wird. Die 2. Schleife hält an, und wartet auf eine Aktion von mir. Ich dachte mir, während der Wartezeit werden die Aktualisierungen übernommen und dann auch angewendet. Doch leider passiert, dass schon von mir beschriebene.
Kann ich dieses Problem irgendwie leichter handhaben.
klingt nach einer klassischen RaceCondition:
Du liest die localen Variablen, dann wird auf ein Event gewartet - und dann wunderst du dich, dass keine neuen Werte gelesen werden...
Also:
-(Beispiel-)VIs hier mal anhängen
-lernen, was RaceConditions sind und wie man sie vermeidet
-auf locale Variablen verzichten und verlässlichere Strukturen verwenden (zu den schon genannten würde ich noch die FGV aka AE aka LV2style-Global hinzufügen!)
' schrieb:Ich dachte mir, während der Wartezeit werden die Aktualisierungen übernommen und dann auch angewendet. Doch leider passiert, dass schon von mir beschriebene.
Ich denke, du meinst folgendes:
Es öffnet sich z.B. in der 2. While-Schleife ein SubVI, in dem Werte angezeigt werden sollen, die in der 1. While-Schleife vom Programmbediener eingegeben werden. Nur alleine, weil ein FP (Frontpanel vom SubVI) angezeigt wird, heißt das noch nicht, dass die Werte auf diesem FP refresht werden, wenn der Anwender in While-Schleife Eins was ändert.
LabVIEW arbeitet nach den Prinzip des Datenflusses. Macht der Anwender eine Eingabe in While-Schleife Eins, so kommt der Wert nur dann in das SubVI, wenn da ein Datenfluss besteht! Ein Datenfluss ist, wenn du eine Leitung siehst (von Queues, Melder etc. sehe ich vorerst mal ab). Da die beiden While-Schleifen getrennt sind, gibt es da keinen Datenfluss => Kein Anzeigenrefresh. So einfach ist das.
Ich glaube, du musst dir das Prinzip des Datenflusses mal verinnerlichen.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Ich habe hier mal kurz versucht die Thematik per LabVIEW darzustellen. Wenn ich in der 2. Schleife den Wert im Bedienfeld ändere ändert er sich erst nach einem Durchlauf der 1. Schleife. Die gleiche Prozedur bei einer Veränderung des Enums.
' schrieb:Wenn ich in der 2. Schleife den Wert im Bedienfeld ändere ändert er sich erst nach einem Durchlauf der 1. Schleife. Die gleiche Prozedur bei einer Veränderung des Enums.
Genau so ist das.
In der unteren Schleife kannst du den DBL oder den ENUM ändern. Nur alleine das Ändern dieser Werte bewirkt noch nicht, dass in der oberen Schleife der geänderte Wert angezeigt wird. Die obere Schleife arbeitet nämlich erst dann, wenn du den OK-Button drückst. So ist es ja auch programmiert: Erst wenn dieser Button gedrückt wird, wird der Event-Case ausgeführt und ENUM und DBL werden bearbeitet.
Wenn du haben willst, dass alleine eine Änderung von ENUM und DBL oben eine Aktion auslösen sollen, dann musst du von ENUM und DBL das Property "Wert(signalisierend)" verwenden. Dieses Property löst nämlich in einer Event-Struktur (wenn so programmiert) einen Event aus - und dann kann ENUM und DBL ober verwendet werden, wenn es unten geändert wird.
Ich sag jetzt einfach mal so:
Dein Problem scheint im Verständnis zu liegen, wie Datenfluß respektive dein Programmablauf funktioniert. Dieses - grundlegende - Verständnis fehlt dir noch. Dumm ist nur, dass dieses Verständnis per Postings in einem Forum nicht vermittelbar ist. So grundlegende Fragen sind nur face-to-face vermittelbar (dafür gibt es Kurse bei NI). Oder per Selbststudium mit einem Tutorial.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Wenn ich unten die numerische Variable oder den Enum änder, und anschließend auf den Button drücke, wird im ersten Durchlauf der oberen Schleife die Wert anfangs nicht übernommen. Erst wenn ich ein zweites mal auf den Button drücke und die 1. Schleife durchlaufen wird, werden auch die Werte übernehmen.
Mich interessiert genau diese Verhalten. Warum übernimmt er die Werte erst im 2. Durchlauf der 1. Schleifen?
' schrieb:Wenn ich unten die numerische Variable oder den Enum änder, und anschließend auf den Button drücke, wird im ersten Durchlauf der oberen Schleife die Wert anfangs nicht übernommen. Erst wenn ich ein zweites mal auf den Button drücke und die 1. Schleife durchlaufen wird, werden auch die Werte übernehmen.
Mich interessiert genau diese Verhalten. Warum übernimmt er die Werte erst im 2. Durchlauf der 1. Schleifen?
Ich kann nicht nachvollziehen, dass die Werte erst beim zweiten Mal Drücken übernommen werden.
Kannst du mal ein funktionierendes VI posten, bei dem dieser Effekt auftritt?
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).