UN #shift
SPB End
// lenght of Shift Register
L 8 // 8 Doppelword =8x32Bit
T #lg
L 0
LAR1
LP1: NOP 0
AUF %DB800 // soll variabel werden
U DBX [ AR1 , P#3.7 ]
= #Pos_32
L DBD [ AR1 , P#0.0 ]
TAD
SLD 1
TAD
T DBD [ AR1 , P#0.0 ]
// Overflow next Word
U #Pos_32
= #Pos_0
+AR1 P#4.0
L #lg
L 1
-I
T #lg
SPP LP1
End: NOP 0
Ich bin gerade dabei ein Shift register mit vaiabler Länge welches in AWL existiert in SCL umzusetzen damit ich es in allen SPS Typen einsetzen kann.
Kann ich alles so umsetzen.
VAR_INPUT
Ix_nextFlag : Bool;
END_VAR
VAR_IN_OUT
IO_slideRegister : Array
[*] of DWord;
IOx_auxFlag31 : Bool;
IOx_auxFlag0 : Bool;
END_VAR
VAR_TEMP
i : int;
Ti_lowerBound : int;
Ti_upperBound : int;
END_VAR
BEGIN
#Ti_lowerBound := DINT_TO_INT(LOWER_BOUND(ARR := #IO_slideRegister, DIM := 1));
#Ti_upperBound := DINT_TO_INT(UPPER_BOUND(ARR := #IO_slideRegister, DIM := 1));
FOR
#i := #Ti_lowerBound TO #Ti_upperBound
DO
#IOx_auxFlag31 := #IO_slideRegister[#i].%x31;
#IO_slideRegister[#i].%x31 := #IO_slideRegister[#i].%x30;
#IO_slideRegister[#i].%x30 := #IO_slideRegister[#i].%x29;
#IO_slideRegister[#i].%x29 := #IO_slideRegister[#i].%x28;
#IO_slideRegister[#i].%x28 := #IO_slideRegister[#i].%x27;
#IO_slideRegister[#i].%x27 := #IO_slideRegister[#i].%x26;
#IO_slideRegister[#i].%x26 := #IO_slideRegister[#i].%x25;
#IO_slideRegister[#i].%x25 := #IO_slideRegister[#i].%x24;
#IO_slideRegister[#i].%x24 := #IO_slideRegister[#i].%x23;
#IO_slideRegister[#i].%x23 := #IO_slideRegister[#i].%x22;
#IO_slideRegister[#i].%x22 := #IO_slideRegister[#i].%x21;
#IO_slideRegister[#i].%x21 := #IO_slideRegister[#i].%x20;
#IO_slideRegister[#i].%x20 := #IO_slideRegister[#i].%x19;
#IO_slideRegister[#i].%x19 := #IO_slideRegister[#i].%x18;
#IO_slideRegister[#i].%x18 := #IO_slideRegister[#i].%x17;
#IO_slideRegister[#i].%x17 := #IO_slideRegister[#i].%x16;
#IO_slideRegister[#i].%x16 := #IO_slideRegister[#i].%x15;
#IO_slideRegister[#i].%x15 := #IO_slideRegister[#i].%x14;
#IO_slideRegister[#i].%x14 := #IO_slideRegister[#i].%x13;
#IO_slideRegister[#i].%x13 := #IO_slideRegister[#i].%x12;
#IO_slideRegister[#i].%x12 := #IO_slideRegister[#i].%x11;
#IO_slideRegister[#i].%x11 := #IO_slideRegister[#i].%x10;
#IO_slideRegister[#i].%x10 := #IO_slideRegister[#i].%x9;
#IO_slideRegister[#i].%x9 := #IO_slideRegister[#i].%x8;
#IO_slideRegister[#i].%x8 := #IO_slideRegister[#i].%x7;
#IO_slideRegister[#i].%x7 := #IO_slideRegister[#i].%x6;
#IO_slideRegister[#i].%x6 := #IO_slideRegister[#i].%x5;
#IO_slideRegister[#i].%x5 := #IO_slideRegister[#i].%x4;
#IO_slideRegister[#i].%x4 := #IO_slideRegister[#i].%x3;
#IO_slideRegister[#i].%x3 := #IO_slideRegister[#i].%x2;
#IO_slideRegister[#i].%x2 := #IO_slideRegister[#i].%x1;
#IO_slideRegister[#i].%x1 := #IO_slideRegister[#i].%x0;
IF
#i = 0
THEN
#IO_slideRegister[#i].%x0 := #Ix_nextFlag;
END_IF;
IF
#i <= #Ti_upperBound
THEN
#IO_slideRegister[#i + 1].%x0 := IOx_auxFlag31;
END_IF;
END_FOR;
END_FUNCTION
Damit Du den Code für das Bit-Schieberegister ohne große Änderungen in allen S7-Typen einsetzen kannst und auch mit "optimiertem" Speicher, solltest Du es als ARRAY OF BOOL in SCL vollsymbolisch ohne Slice-Zugriffe programmieren. Auf Effizienz darfst Du dann nicht achten.Ich bin gerade dabei ein Shift register mit vaiabler Länge welches in AWL existiert in SCL umzusetzen damit ich es in allen SPS Typen einsetzen kann.
Ganz allgemein funktioniert ein Schieberegister für beliebige Datentypen (z.B. auch Bits) so:Wie sieht den der Befehl aus für array of bool schieben.
come_out_value := Array[lowerBound];
FOR i := lowerBound TO upperBound - 1 DO
Array[i] := Array[i + 1];
END_FOR;
Array[upperBound] := new_value;
come_out_value := Array[upperBound];
FOR i := upperBound - 1 TO lowerBound BY -1 DO
Array[i + 1] := Array[i];
END_FOR;
Array[lowerBound] := new_value;
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?