LabVIEWForum.de
While Loop Case überspringen - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: While Loop Case überspringen (/Thread-While-Loop-Case-ueberspringen)

Seiten: 1 2


While Loop Case überspringen - PaulC - 29.12.2014 10:27

Hallo liebe Gemeinde,

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?


Beste Grüße
Paul


RE: While Loop Case überspringen - GerdW - 29.12.2014 13:01

Hallo Paul,

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…

Glas1
Dummerweise hast du kein VI angehangen. Wie soll man da helfen?
Glas2


RE: While Loop Case überspringen - PaulC - 29.12.2014 16:38

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.


RE: While Loop Case überspringen - GerdW - 29.12.2014 17:10

Hallo Paul,

was für eine Logik…

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…


RE: While Loop Case überspringen - PaulC - 29.12.2014 18:42

Hallo Gerd,

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?


RE: While Loop Case überspringen - GerdW - 30.12.2014 09:47

Hallo Paul,

Zitat:oder gibt es auch hier einen besseren Weg?
Über bessere Wege kann man reden, wenn man alle Bedingungen kennt.

Kannst du mal alle deine Bedingungen aufzählen? Bisher wolltest du nur zum nächsten "Index" weitergehen, wenn ein Button gedrückt wurde…


RE: While Loop Case überspringen - PaulC - 30.12.2014 12:52

Hallo,

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


RE: While Loop Case überspringen - Lucki - 30.12.2014 16:41

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.
[attachment=51684]


RE: While Loop Case überspringen - GerdW - 30.12.2014 20:09

Hallo Paul,

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?
Hmm
Ich liebe klare Programmbeschreibungen…

Ansonsten: Guten Rutsch!


RE: While Loop Case überspringen - PaulC - 01.01.2015 16:09

Hallo,

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:

counter_1 = 0;
counter_2 = 0;
Zeit_Versuchsstart = now;

for i = 0:Array(end)
Zeit_Teilversuch = Array(i);
counter_1 = counter_1 + 1;
pause(Zeit_Teilversuch);

% Zählen Counter
if counter_1 = 5
counter_1 = 0;
counter_2 = counter_2 + 1;
end

% Berücksichtigung der veränderten Startzeiten, nachdem ein Versuch/Teilversuch abgebrochen wurde
if überspringen_counter_1 == true or überspringen_counter_2 == true
Zeit_Versuch = now;
% Ermittlung delta_Zeit_keypressed
delta_Zeit_keypressed = Array(counter_2*5 +counter_1) - Zeit_Versuch;
Array = Array - delta_Zeit_keypressed; % elementweise;
end

% Warten-Funktion
if stop_fkt = true
Wartezeit_Anfang = now;

while stop_fkt = true
Wartezeit_Ende = now;
end

delta_Zeit = Wartezeit_Ende - Wartezeit_Anfang;
Array = Array + delta_Zeit % elementweise;
end

end

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.

Euch wünsche ich ein frohes neues Jahr!