FUNCTION "Popup_Verwaltung_SCL" : Void
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
//------------------------------------------------------------------------------------------------------
//
// Beispiel FC: zeigt wie man ein ANY Pointer dynamisiert bevor man ihn als // Parameter dem SFC20 übergibt.
//
//------------------------------------------------------------------------------------------------------
VAR_INPUT
DB_Nummer_Quell : Int;
DB_Nummer_Ziel : Int;
Anzahl_Bytes : Int;
END_VAR
VAR_TEMP
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
BEGIN
// Befehle
//__________________________
#ORIG := 0; // Beispiel: man will bei DBX0.0 anfangen
// Aufbauen des ANY Pointers der Quelle (VON)
#VON.ID := 16#1002; // ID 10 et 02 um mit Bytes zu arbeiten
#VON.NBR := #Anzahl_Bytes; // entspricht BYTE 100. Könnte eine Variable sein.
#VON.DBN := #DB_Nummer_Quell; // 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)
#NACH.ID := 16#1002;
#NACH.NBR := #Anzahl_Bytes;
#NACH.DBN := #DB_Nummer_Ziel;
#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