LabVIEWForum.de - Mehrere while Schleifen über globale Variable beenden

LabVIEWForum.de

Normale Version: Mehrere while Schleifen über globale Variable beenden
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
' schrieb:ich hab mal ein analoges beispiel programmiert und beigefügt, gestartet wird es über die Hauptwhileschleife. außerdem wäre es schön, wenn es eine möglichkeit gäbe dass sie gleichzeitig loslaufen. wäre tolle wenn mir jemand weiterhelfen könnte..

Habe den Thread hier gelesen, der so gelaufen ist: Du hast eine kompliziert aussehende Antwort erhalten, da hat Dich der Mut verlassen, so daß sich Deine weitern Fragen dann nur noch darauf richten, wie man LabVIEW lernt.

Deine Frage bezieht sich nicht nur auf das Stoppen, sondern auch auf die Synchronisierung der 3 Programme, und hierzu möchte ich etwas sagen.
Wenn man die in den Sub-Vi erzeugten Daten nicht mit globalen Veriablen, sondern mit Meldern zum Haupt-VI überträgt, dann synchronisieren sich die beiden Vis von selbst. Der Meldeempfänger (Im Haup-VI) wartet bei jedem Schleifendurchlauf, bis neue Daten vorliegen. Man braucht dort keine Waits.
Allerdings ist es dann immer so, daß der Datenerzeuger den Datenempfänger synchronisiert, also in Deinem Fall die Sub-Vis das Haup-VI bzw. die entsprechenden while-Schleifen im Haup-VI.
In umgekehrter Richtung, oder wenn wie in Deinem Fall alle freilaufenden SUB-VIs mit dem Haupt-VI synchronisiert werden solle, wirds schwieriger. (Stichwort: Rendezvous). Das möchte ich Dir erst mal ersparen.
Gewissermassen als Abfallprodukt eines solchen Erzeuger-Verbraucher-Konstruktion, also ohne jeden zusätzlichen Programmaufwand, funktioniert der Stopp aller VIs: Beim Stop im Haup-Vi zerstört man einfach den Melder. Das wird in den anderen VIs bemerkt, es kommt zu Fehlermeldung, die man dort an die Stoppknöpfe in den while-Schleifen anschließt.
Tipp: Hier im Forum suchen nach Erzeuger-Verbraucher-Struktur, es gibt da einfache Beispiele.
Hier Deine VIs ein bisschen geändert:
ja stimmt schon, hatte vor dass jetzt zu lernen und dann entsprechend zu verwenden. will auch nichts übernehmen dass ich eh nicht kapier.
danke für die ausführliche beschreibung, komm erst morgen wieder an mein programm, werd das dann ausprobieren und wieder meldung machen.
' schrieb:ja stimmt schon, hatte vor dass jetzt zu lernen und dann entsprechend zu verwenden. will auch nichts übernehmen dass ich eh nicht kapier.
danke für die ausführliche beschreibung, komm erst morgen wieder an mein programm, werd das dann ausprobieren und wieder meldung machen.

Mir ist da noch eine einfache Methode zu Synchronisation eingefallen, so wie Du es haben wolltest.
Edit: Version geändert
Ok, die Beispiele sind super, damit wäre mein Problem abgedeckt.
Ein paar Sachen sind mir aber noch nicht klar:

- Was bewirkt der ReInit des Stop Button der in Bsp.1 direkt als Knotenpunkt auf die while Schleife geführt ist?

- Die wait Anweisung in Bsp.2 am ersten Sequenzrahmen ist für den gemeinsamen Beginn oder??
Und der Sequenzrahmen in der while Schleife für das gleichzeitige Auslesen?

Fürs Verständnis, wenn ich wie in Bsp.2, mehrere Warteblöcke in einer while schleife eingebaut habe,
bestimmt der mit der längsten Wartezeit die Durchlaufzeit??
' schrieb:Ok, die Beispiele sind super, damit wäre mein Problem abgedeckt.
Ein paar Sachen sind mir aber noch nicht klar:

- Was bewirkt der ReInit des Stop Button der in Bsp.1 direkt als Knotenpunkt auf die while Schleife geführt ist?
Da der Stop-Button als "Switch when pressed" und nicht als "Latch" definiert ist, setzt dieser Methodenknoten den Button vor Neustart des VIs wieder auf seinen Defaultzustand (in diesem Fall FALSE) zurück.
' schrieb:- Die wait Anweisung in Bsp.2 am ersten Sequenzrahmen ist für den gemeinsamen Beginn oder??
Eigentlich nicht direkt, ist aus meiner Sicht nur eine kosmetische Wartezeit... Hundertprozentig gleichzeitig werden die SubVIs nicht starten.
' schrieb:Und der Sequenzrahmen in der while Schleife für das gleichzeitige Auslesen?
Ja und Nein. Sorgt dafür, dass diese Schleife solange wartet, bis von jedem Notifier eine Meldung vorliegt, auch beim ersten Durchlauf. Schau dir einfach mal den Unterschied an ohne Sequenz.
' schrieb:Fürs Verständnis, wenn ich wie in Bsp.2, mehrere Warteblöcke in einer while schleife eingebaut habe,
bestimmt der mit der längsten Wartezeit die Durchlaufzeit??
Ja.

Gruß, Jens
sehr cool, hab mein programm nun wie oben beschrieben umgesetzt und jetzt läuft alles sauber wie ich es wollte. vielen dank, ihr habt mir echt weitergeholfen. vorallem ist mein verständnis für LabVIEW jetzt wieder um einiges besser!!
sehr seltsam, ich hab heute mittag schon eine antwort geschrieben, und die ist jetzt plötzlich verschwunden.

auf jeden fall hab ich mein programm wie oben besprochen, abgeändert. jetzt läuft alles genau wie ich es wollte.
nachmal danke an alle für die hilfe !!
' schrieb:sehr seltsam, ich hab heute mittag schon eine antwort geschrieben, und die ist jetzt plötzlich verschwunden.

auf jeden fall hab ich mein programm wie oben besprochen, abgeändert. jetzt läuft alles genau wie ich es wollte.
nachmal danke an alle für die hilfe !!
Ist doch noch da..., vielleicht hättest du mal auf Seite 2 des Threads klicken sollen?

Gruß, Jens
' schrieb:Eigentlich nicht direkt, ist aus meiner Sicht nur eine kosmetische Wartezeit... Hundertprozentig gleichzeitig werden die SubVIs nicht starten.
Gruß, Jens

Danke, Jens, daß Du schon geantwortet hast, war heute nicht am PC. Hier meine Erklärung, warum ich das so komisch gemacht habe.

Zuerst die einleitenden Beispile A,B,C , damits jeder versteht.
[attachment=16390]
Im Beispiel A die normale Wartefunktion. Eigenschaften: Es wird ca. 1000 ms gewartet. Nachteil: zwei Freilaufendes VIs mit der gleichen Waretezeit laufen weder in Phase, noch laufen sie über längere Zeit synchron.
Im Beipiel B Warten mit Metronom. Der Tick kommt hier in jeder vollen Sekunde entsprechend der PC-Uhrzeit.
Eigenschaften: 2 Vis mit der gleichen Wartezeit laufen sowohl synchron als auch in Phase, d.h. die Ticks kommen in beiden VIs immer gleichzeitig. Nachteil: Da die Vis bzw. die Schleifen darin zufälltig in bezug auf die Uhrzeit gestartet werden, beträgt die Wartezeit bis zur vollen Sekunde beim ersten Schleifendurchlauf nicht 1000ms, sondern es ist irgendeine Zufallszeit zwischen 1 und 999ms.
Beispiel C: Dem kann man abhelfen, indem man die Schleife erst bei einem Tick, d.h bei der vollen Sekunde startet.

Und jetzt kommt die eigentliche Erklärung:
Wenn ich zwei freilaufende Sub-Vis im Haup-VI gleichzeitig starte, dann werden sie in Wirklichkeit kurz hintereinader gestartet, sagen wir mal im Abstand von 2ms. Wenn der Zufall es will, wird das eine in der 998sten ms aufgerufen, das zweite in der 1000sten ms. Das erste erhält dann in der 1000sten ms schon einen Tick, während das zweite noch geladen wird. Die beiden VIs laufen dann zwar trotzdem immer synchron, aber das erste ist immer einen vollen Tick voraus.
Um dieses Risiko auszuschalten, habe ich den Aufruf der beiden Sub-Vis so gemacht:
[attachment=16391]
Die Sub-Vis werden umittelbar nach einen Sekundentick gestartet. Es ist dann eine volle Sekunde Zeit bis zum nächsten Tick, und der obige Effekt kann dann nach menschlichen Ermessen nicht mehr auftreten.

Das habe ich mir nur so ausgedacht, keine Ahnung, ob das eine Lösung ist, die einer Kritik von Profis standhält.
' schrieb:Das habe ich mir nur so ausgedacht, keine Ahnung, ob das eine Lösung ist, die einer Kritik von Profis standhält.

ich dachte du bist selbst profi?Big Grin
und ich find das sehr gut erklärt ....
Seiten: 1 2 3
Referenz-URLs