Array-Felder in SCL von Links nach Rechts schieben.

Bosga

Level-1
Beiträge
21
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Sps´ler,

hab hier leider ein Problem in SCL.

Ich habe ein Array mit 10 Felder.
Gerne würde ich das Array in einem FB bei einer Pos_Flanke mit Werten nacheinander füllen lassen.

Also Flanke -> 1. Feld wird beschrieben.
nächste Flanke -> 1. Feld in 2. Feld. 1. Feld bekommt neuen Wert!
usw...Also einen Ringpuffer. Hierbei muss ich aber später alle Felder beobachten können.Aber das wollte ich dann noch später ausbauen.
Hier erstmal die Grundfunktion zum schieben der Felder im FB. :



FUNCTION_BLOCK FB1

VAR_INPUT
LS_Pos : BOOL;
END_VAR

VAR
Restrecke : ARRAY[1..10] OF REAL;
Packetlaenge : ARRAY[1..10] OF INT;
ctu : INT;
ctu_hm : INT;
i : INT;
input : REAL;
END_VAR
VAR_Output
out : INT;
END_VAR

BEGIN

IF (LS_POS) THEN //Bei Pos_Flanke wird Zähler bis zum Wert 10 erhöht
ctu := ctu + 1;
END_IF;

IF (CTU > 10) THEN //Zähler wird resettet
ctu := 1;
END_IF;

IF ctu <> (ctu_hm) THEN

For i:= 1 to 9 BY 1 do
Restrecke[i+1] := Restrecke;
END_FOR;

Restrecke[1] := input;
ctu_hm := ctu;

END_IF;
END_FUNCTION_BLOCK

Der Fehler liegt natürlich in der schleife da immer alle Felder gleichzeitig überschrieben werden. Denke muss noch irgendwie die Länge des Arrays mit in der Kopfzeile der Forschleife mitreinbekommen.
For i:= (1+-n) to (9+-n) BY 1(x) do....
Wäre über eure Hilfe sehr dankbar!!!! :-D
 
Hallo Bosga,

Ich denke du hast schon richtig erkannt das du dir mit der Schleife das ganze überschreibst.


Du musst das ganze von hinten aufziehen. Ich bin nicht sicher ober man solche spielerein wie zB

"For i:= 9 to 1 BY -1 do"

machen kann.

Was aber in jedem fall gehen sollte ist.


For i:= 1 to 9 BY 1 do
Restrecke[9 - i] := Restrecke[10 - i];
END_FOR;

(Leider bin ich zur Zeit unterwegs und kann es daher nicht selber testen)

Bestimmt gibt es noch elegantere Lösungen.. auf die musst du dann aber selber kommen ;)

Gruß
Wiggi
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die schnelle Antwort.

Leider stimmt deine Lösung auch nicht ganz.
Bei jedem erneuten ctu soll ein Feld verschoben werden,
erstmal egal ob von links<-->rechts
Also:
2 , 0 , 0 , 0 , 0
3 , 2 , 0 , 0 , 0
6 , 3 , 2 , 0 , 0 usw...

////////////////////////////////////////////////////////////////////
ctu := ctu + 1;

If ctu>10 then
ctu :=1;
END_IF


IF ctu <> (ctu_hm) THEN

For i:= 1 to 9 BY 1 do
Restrecke[10-i] := Restrecke[11-i];
END_FOR;

Restrecke[10] := input; // neu eingelesener Wert von rechts nach links
ctu_hm := ctu;

END_IF;

Bei deinem Beispiel wird der Wert jedesmal in alle folgende Felder mitgeschoben bzw kopiert.

Hat noch jemand eine Idee?
Dankeschön ;)
 
Zurück
Oben