Beckhoff "indirekte Adressierung"

merlin

Level-1
Beiträge
184
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich habe einige globale Arrays wie zB
S010_MP_KALIB_001 :ARRAY[1..35] OF REAL;
S010_MP_KALIB_002 :ARRAY[1..35] OF REAL;
S010_MP_KALIB_003 :ARRAY[1..35] OF REAL;

Gibt es eine Möglichkeit, die Arrays in einer Schleife durchzuarbeiten?
Ich müsste das 001 bis 099 in der Variable durch einen Schleifenzähler verändern. Gibts da was?

Danke
Tom
 
Code:
VAR
   S010_MP_KALIB_001    :ARRAY[iStartArr ..iEndArr] OF REAL; 
   idx : INT; 
END_VAR
VAR CONSTANT
   iStartArr : INT := 1;
   iEndArr: INT := 35;
END_VAR
--------------------------
FOR idx := iStartArr TO iEndArr DO
   S010_MP_KALIB_001[idx] := (* do something *)
END_FOR
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das 001 bis 099 kannst du nicht ändern da es teil deines Variablennamens ist. Was du aber machen kannst ist ein zweidimensionales Array wobei die erste Dimmension deiner 001-099 entspricht. Diese kannst du dann in einer Schleife durchlaufen lassen.

Also anstatt Var_001: ARRAY[1..35] of Real
einfach Varname: ARRAY[1..99,1..35] of Real

Aufrufen tust du die Variable dann einfach mit Varname[x,y], wobei du x und y variabel gestalten kannst.

Hoffe dir geholfen zu haben.
 
Das geht mit POINTER und ^ (Inhaltsoperator)
Code:
VAR_GLOBAL
    S010_MP_KALIB_001 :ARRAY[1..35] OF REAL;
    S010_MP_KALIB_002 :ARRAY[1..35] OF REAL;
    S010_MP_KALIB_003 :ARRAY[1..35] OF REAL;

END_VAR
VAR
    pArrKalib: ARRAY[1..99] OF POINTER TO ARRAY[1..35] OF REAL;
    step: INT;
    i, j: INT;
END_VAR
CASE step OF
0: (* init *)
    pArrKalib[1]:= ADR(S010_MP_KALIB_001);
    pArrKalib[2]:= ADR(S010_MP_KALIB_002);
    pArrKalib[3]:= ADR(S010_MP_KALIB_003);
    step:= step + 1;

1:
    FOR i:= 1 TO 99 DO
        IF (pArrKalib[i] <> 0) THEN
            FOR j:= 1 TO 35 DO
                 pArrKalib[i]^[j]:= i * j; (*do something*)
            END_FOR
        END_IF
    END_FOR

END_CASE
Gruß,
witkatz
 
Hallo,

noch ne Variante

ich gehe mal von einer Beckhoff Steuerung aus:

über die Bausteine PLC_ReadSymInfoByName und ADSREAD bekommst du informationen zu einer Variablen deren Namen du kennst.

Das ganze ist dann allerdings nicht zyklisch, da die Bausteine 2 Zyklen brauchen fürs einlesen und ausgeben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
S010_MP_KALIB_001 :ARRAY[1..35] OF REAL;
S010_MP_KALIB_002 :ARRAY[1..35] OF REAL;
S010_MP_KALIB_003 :ARRAY[1..35] OF REAL;

Code:
VAR
    S010_MP_KALIB : ARRAY[1..99, 1..35] OF REAL;
    i: USINT;
    j: USINT;
END_VAR

FOR i := 1 TO 99 DO

    FOR j := 1 TO 35 DO

        S010_MP_KALIB[i, j] := i * j;

    END_FOR

END_FOR
 
Zurück
Oben