-> Hier kostenlos registrieren
Vielleicht nützt es dem einen oder anderem. Hatte das mal kodiert um mit SCL zu arbeiten.
Code:
//------------------------------------------------------------------------------------------------------
//
// Beispiel FC: zeigt wie man ein ANY Pointer dynamisiert bevor man ihn als // Parameter dem SFC20 übergibt.
//
//------------------------------------------------------------------------------------------------------
FUNCTION FC200 :VOID
VAR_TEMP
// Temporäre variable
SOURCE:ANY; // Symbolischer Name des ANY Pointers
VON AT SOURCE: STRUCT // Mit dem AT Befehl wird der gleiche Bereich in einer anderen Form définiert
ID : WORD; // ID für ANY (1002 hex = es wird mit Bytes gearbeitet)
NBR :INT; // Anzahl Daten
DBN : INT; // DB der im ANY Pointer benutzt wird ANY
PTR : DWORD; // Pointer Doppelwort um den Angfang des Datenbereichs und den Datentyp zu definieren (84hex = DB Datentyp)
END_STRUCT;
DESTIN:ANY;
NACH AT DESTIN: STRUCT
ID : WORD;
NBR : INT;
DBN : INT;
PTR : DWORD;
END_STRUCT;
ORIG : INT;
SFC_Err:INT; // RETVAL des SFC
END_VAR
// Befehle
//__________________________
ORIG := 10; // Beispiel: man will bei DBX10.0 anfangen
// Aufbauen des ANY Pointers der Quelle (VON) (z.B. P#DB150.DBX10.0 BYTE 100)
VON.ID := 16#1002; // ID 10 et 02 um mit Bytes zu arbeiten
VON.NBR := 100; // entspricht BYTE 100. Könnte eine Variable sein.
VON.DBN := 150; // DB 150
VON.PTR := INT_TO_DWORD (8*ORIG) OR 16#8400_0000; // Pointer zeigt zuf Bit, deshalb 8*Byte Nummer
// Aufbauen des ANY Pointers des Ziels (NACH)(P#DB200.DBX10.0 BYTE 100)
NACH.ID := 16#1002;
NACH.NBR := 100;
NACH.DBN := 200;
NACH.PTR:= INT_TO_DWORD (8*ORIG) OR 16#8400_0000;
// Aufruf des SFC 20
SFC_Err := BLKMOV(SRCBLK := SOURCE // IN: ANY
,DSTBLK := DESTIN // OUT: ANY
); // INT
END_FUNCTION