LabVIEWForum.de - Phasenverschiebung mehrerer Schleifen

LabVIEWForum.de

Normale Version: Phasenverschiebung mehrerer Schleifen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

vielleicht hat einer ein Vorschlag zu dieser Problemstellung:

Wie kann man 2 oder noch mehr parallel ablaufende Schleifen genau (millisek. genau) phasenverschieben und auch wieder synchron laufen lassen?
(siehe beigefügtes Labview 2009 VI)
Für DAQ gibt es schöne Möglichkeiten dazu, jedoch wie sieht es hiermit aus?
Dazu sei gesagt, daß der Wert-Input der Phasenverschiebung nicht nur über Buttons sondern auch über aus einem array eingelesene Werte stattfindet.
Man braucht zu einem bestimmten Zeitpunkt einen gemeinsamen Anfangspunkt. Also habe ich es mit einer Flankenabfrage versucht, doch die Wartenfunktion
macht daraus wieder einen statischen Zustand.

Mit freundlichen Grüßen
Erik
Hallo Erik,

man kann TimedWhileLoops sowohl synchronisieren als auch phasenverschieben…

Wobei zu deinem VI anzumerken ist:
- heavy local variable abuse…
- Nichtbeachtung der CoercionDots und deren Konsequenzen
- Nichtbeachtung der Windows-Einflüsse bzgl. Schleifentiming
So "richtig exakt" wird das sowieso nur unter Real-Time funktionieren, unter Windows ist das nur "mehr oder weniger" genau.

Gruß, Jens
Z.B so:
[attachment=49329]

Zitat:So "richtig exakt" wird das sowieso nur unter Real-Time funktionieren, unter Windows ist das nur "mehr oder weniger" genau.
Der Einwand ist nicht falsch, nur trifft er hier nicht. Denn: Entweder will man, so wie hier, nur LEDs auf dem VI blinken lassen - dann spielt die exakte Zeit (im ms-Bereich) keine Rolle. Oder aber man will reale LEDs (oder etwas anderes Binäres) schalten. Dann braucht man eine Messkarte, und in der Regel hat man dann auf eben dieser Karte ein Echtzeitsystem. Man sollte dann natürlich die Timer auf der Karte verwenden (- mit DAQmx ist das so gut wie automatisch der Fall -), und das VI sieht dann ganz anders aus. Die Frage bezog sich aber ausdrücklich auf "virtuelle" LEDs.
Danke für die Vorschläge und berechtigten Tadel.

@GerdW: ich arbeite mich gerade in die TimedWhileLoops ein, dessen Möglichkeiten mir zuvor nicht bekannt waren. Ich habe zuvor halt meist nur mit den "gewöhnlichen" Schleifen gearbeitet.
Hier sieht man mal wieder ein Vorteil von Labview.

@Lucki: das VI ist hervorragend. Jedoch wie sieht es mit aus einem array eingelesene Werte aus (wie in der Anfangsfrage beschrieben)? Hat man die Möglichkeit nicht nur über Buttons
und Eingabefelder auf dem Frontpanel den Ablauf zu ändern? (Deshalb habe ich die Ereignisstruktur nicht genommen)

Danke nochmals.

Mit freundlichen Grüßen
Erik
@Lucki:
die VI hat doch noch einen Fehler ... und zwar ab und zu beim beenden. Hier zeigt sich, daß Theorie und Praxis nicht immer übereinstimmen Smile
Denn ab und zu wird die linke untere Schleife zuerst gestoppt ... dann wartet die rechte untere Schleife zuerst auf occurrence bevor sie stoppt, doch
da kommt nix mehr. Ich habe es halt so gelöst (siehe Anhang (in Labview 2009)).

Zu meiner Frage mit Werteingabe über arrays bei Ereignissteuerung: Da bin ich auf dynamische Events gestoßen. Doch ist es dann nicht besser doch die
TimedWhileLoops zu nehmen? Gibt es irgendwo noch mehr Beispiele und Erläuterungen dafür, ausser in den Beispielen in Labview selbst?

Mit freundlichen Grüßen
Erik
Hallo Erik,

das WaitOnOccurance hat einen TimeOut-Eingang - damit kann man die Wartezeit dieser Funktion (auf sinnvolle Werte) begrenzen…
Zu Deiner Frage wegen Werteingabe über Arrays:
Wenn die Verzögerungswerte in einem Array sein sollen, denn sollte es skalierbar sein. D.H ich mache den Array vor dem Start oder sogar während der Laufzeit unterschiedlich groß, so wie ich es gerade brauche.
Machbar ist alles, aber hier beginnt die professionelle Programmierung, da kann ich nicht so auf die Schnelle ein Beispiel bringen. Das könnte ja z.B. mal ein junger Spund machen, der hier unbedingt etwas beweisen will Big Grin

Mein Beispiel ist jetzt nur in dem Sinn skalierbar, dass man es mit minimalen Programmeingriffen auf eine bestimmte Arraygröße justieren kann.
(Es wäre sinnvoll, aus dem immer gleichen Code in der Casestruktur ein reentrantes SubVI zu machen)
[attachment=49381]
Referenz-URLs