Eigentlich brauchst Du nur die "Hochsprache"-SCL-Anweisung:
#EinStruct := #ArrayStruct[#Index];
In TIA kann man das so als SCL-Netzwerk in ein KOP-Programm einfügen (
das müsste sogar auch direkt als KOP-Anweisung gehen?). In Step7 classic geht das aber nicht.
In Step7 classic kann man das Kopieren in einen FC auslagern, der in SCL programmiert ist:
Code:
+---------------+
| "FC_Kopier" |
--------------|EN ENO|--------------
| |
#Index--|Index |
#ArrayStruct--|IN |
#EinStruct--|OUT |
+---------------+
Code:
FUNCTION "FC_Kopier" : VOID
VAR_INPUT
Index : INT;
END_VAR
VAR_IN_OUT
IN : ARRAY [1..8] OF "MeinTyp";
OUT : "MeinTyp";
END_VAR
OUT := IN[Index];
END_FUNCTION
Man kann auch das Kopieren direkt im FB in AWL programmieren. Entweder mit ganz vielen "elementaren" AWL-Anweisungen als Kopierschleife mit indirekter Adressierung, oder lediglich die Adresse
#ArrayStruct[#Index] als ANY-Pointer zusammenbasteln und an den SFC20 BLKMOV übergeben. (zu ANY-Pointer siehe Hilfe zu Step7 > Format des Parametertyps ANY)
Code:
VAR_TEMP
pSrcStruct : ANY; //variabler ANY-Pointer
tempInt : INT;
END_VAR
//ANY-Pointer #pSrcStruct auf #ArrayStruct[#Index] basteln
LAR1 P##pSrcStruct //Pointer auf die ANY-Variable in TEMP
L W#16#1002 //ANY-Kennung + Datentyp Byte
T LW [AR1,P#0.0] //ANY: ANY-Kennung + Datentyp
L 8 //SizeOf der Struktur in Bytes
T LW [AR1,P#2.0] //ANY: Wiederholfaktor
L DINO //IDB-Nummer dieser FB-Instanz
T LW [AR1,P#4.0] //ANY: DB-Nummer
// Adresse #ArrayStruct[#Index] im IDB berechnen
L #Index //Index 1..8
+ -1 //--> 0..7
L 8 //SizeOf der Struktur in Bytes
*I //--> Anzahl Bytes #ArrayStruct[#Index] zu Anfangsadresse #ArrayStruct[]
SLD 3 //--> Offset als P#Byteadresse.0
L P##ArrayStruct //Anfangsadresse #ArrayStruct[] in dieser Instanz (P#DIXn.0)
+D //--> Adresse von #ArrayStruct[#Index] in dieser Instanz
TAR2 //Multiinstanz-Offset dieser Instanz aus AR2 holen
UD DW#16#FFFFFF //Bereichskennung (DB) ausblenden
+D //--> Adresse von #ArrayStruct[#Index] im IDB
T LD [AR1,P#6.0] //ANY: Bereichsadresse
//Kopieren #ArrayStruct[#Index] nach #EinStruct
CALL "BLKMOV" //SFC20
SRCBLK :=#pSrcStruct
RET_VAL:=#tempInt
DSTBLK :=#EinStruct
Harald