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!
trotz Google und der Forum-Suche habe ich bisher noch keine Antwort zu meinem Problem gefunden.
Ich habe zwei Schleifen, die ineinander geschachtelt sind. Ich möchte dazu zwei Button erzeugen. Der eine soll die innere Schleife beenden, so dass der nächste Laufindex der Schleife gestartet wird und der zweite Button soll das gleiche für die äußere Schleife erledigen, wobei die innere Schleife wieder von 1 loszählen soll.
Da ich gelesen habe, dass mann bei For-Schleifen nicht den Index überspringen kann/sollte, habe ich dies mit zwei While-Schleifen probiert. Für die innere Schleife funktioniert dies, für die äußere Schleife nicht.
Wie geht man in einem solchen Fall vor? Kann man die Laufvariable manipulieren?
Zitat:Der eine soll die innere Schleife beenden, so dass der nächste Laufindex der Schleife gestartet wird
Was heißt das genau? soll die innere Schleife einfach die nächste Iteration ausführen - oder soll die innere Schleife beendet werden?
Zitat: und der zweite Button soll das gleiche für die äußere Schleife erledigen, wobei die innere Schleife wieder von 1 loszählen soll.
Der Schleifenindex beginnt in LabVIEW (wie in jeder vernünftigen Programmiersprache) von Null an zu zählen.
Das ist Grundlagenwissen und wird in den Links in meiner Signatur erläutert…
Zitat:Da ich gelesen habe, dass mann bei For-Schleifen nicht den Index überspringen kann/sollte, habe ich dies mit zwei While-Schleifen probiert.
FOR-Loops zählen den Index hoch, aber WHILE-Loops genauso! Der einzige (wesentliche) Unterschied zwischen beiden Konstrukten ist die Abbruchbedingung…
Zitat:Für die innere Schleife funktioniert dies, für die äußere Schleife nicht.
Dann hast du wohl etwas falsch programmiert…
Dummerweise hast du kein VI angehangen. Wie soll man da helfen?
Hallo Gerd, vielen Dank für deine Antwort. Jetzt sollte sich im Anhang ein Beispiel befinden.
Es sollen zwei Funktionen durch die zwei Button durchgeführt werden. Der Button innere Schleife überspringen soll dazu führen, dass die aktuelle Iteration abgebrochen wird und mit der nächsten (innere Laufvariable +1) Iteration begonnen wird.
Der zweite - noch nicht funktionierende - Button soll dazu führen, dass die innere Laufvariable wieder bei 0 (sorry für die 1 aus dem vorherigem Post) beginnt und die äußere Laufvariable bei i+1 weitermacht.
Die Funktion des VIs ist schon fast erfüllt, allerdings wird der äußere Schleifenindex erst erhöht, wenn sich der innere Schleifenindex verändert.
29.12.2014, 17:10 (Dieser Beitrag wurde zuletzt bearbeitet: 29.12.2014 17:11 von GerdW.)
Zitat:Der Button innere Schleife überspringen soll dazu führen, dass die aktuelle Iteration abgebrochen wird und mit der nächsten (innere Laufvariable +1) Iteration begonnen wird.
Code:
IF Button1 THEN
counter++
ELSE
do nothing
ENDIF
Zitat:Der zweite - noch nicht funktionierende - Button soll dazu führen, dass die innere Laufvariable wieder bei 0 (sorry für die 1 aus dem vorherigem Post) beginnt und die äußere Laufvariable bei i+1 weitermacht.
Code:
IF Button2 THEN
counter:=0
counter_außen++
ELSE
do nothing
ENDIF
Und wozu brauchst du da drei Schleifen? Wenn du deine Logik besser formulierst (!!!), kannst du das alles in einer Schleife unterbringen.
Merke:
Bevor man mit dem Programmieren loslegt, sollte man sich einen PAP auf Papier aufzeichnen…
vielen Dank für deine Hilfe. Ich habe sogar schon eine Art PAP erstellt, allerdings mit zwei Schleifen. Die dritte diente jediglich der Zeitsteuerung. Ich muss allerdings zugeben, dass dein Weg der elegantere ist.
Bei dem bisherigen Beispiel zählte die innere Schleife noch zeitgesteuert hoch. Würdest du in deinem Beispiel die Zeitbedingung über eine Oder-Bedingung beim Counter innere Schleife integrieren oder gibt es auch hier einen besseren Weg?
was die zeitgesteuerte Schleife betrifft, soll anhand eines Arrays die jeweilige Zeit vorgegeben werden, nach welcher Zeit die innere Laufvariable ansteigt. Eine zweite Konstante soll festlegen, wie hoch die innere LV steigt, bevor diese wieder auf 0 gesetzt und die äußere LV um eins erhöht wird. Zuletzt soll es eine Art Warten-Schalter geben, der dafür sorgt, dass die innere LV und die Zeit bis zum Erhöhen dieser konstant bleiben.
Besten Gruß
Paul
30.12.2014, 16:41 (Dieser Beitrag wurde zuletzt bearbeitet: 31.12.2014 15:45 von Lucki.)
Meinst Du es so? Den Array habe ich weggelassen.
... und auch die Schleifen im BD, denn es kommt ja wohl auf die Variablen auf dem FP an, und nicht wie man das im BD macht.
Zitat:soll anhand eines Arrays die jeweilige Zeit vorgegeben werden, nach welcher Zeit die innere Laufvariable ansteigt. … Zuletzt soll es eine Art Warten-Schalter geben, der dafür sorgt, dass die innere LV und die Zeit bis zum Erhöhen dieser konstant bleiben.
Kannst du diese beiden Angaben mal mit einem Beispiel belegen?
Einmal gibst du eine Zeit vor, nach der die innere LV inkrementiert werden soll - und dann hast du einen Schalter, der eben dieses verzögern soll? Wie soll der Schalter für "konstante Zeit bis zum Erhöhen" sorgen, wenn du über ein Array eine andere Zeit vorgibst?
nachdem Gerd mir die Idee vermittelt hat, dass ich zwei Laufvariablen/Counter auch nur mit einer Schleife erschlagen kann, gibt es nun einen counter_1 (Teilversuch) und einen counter_2 (Versuch). Bei Vorgabe von Array = kulmulierte Teilversuchszeiten, würde der gesamte Programmablauf in etwa wie folgt aussehen:
Luckis Vorschlag ist nicht schlecht, allerdings gibt es den Nachteil, dass das Abbrechen eines Teilversuchs nicht sofort erfolgt. Die einzelnen Teilversuche sollen später einige hundert Sekunden dauern, weswegen ein sofortiges Reagieren von Vorteil ist.
In der angehängten Version funktioniert bisher das Zählen der Counter unter der Randbedingung, dass das Betätigen der (Teil-)Vesuch-abbrechen-Funktion sofort erfolgt.
Unklar ist mir, wie ich in Zukunft die Warten-Funktion so modifizieren kann, dass auch bei langer Wartezeit die counter konstant gehalten werden.