FUNCTION FC225 : BOOL
// Beschreibung: FC_ANY_TO_STRUCT
// Baustein zerlegt den Datentyp ANY in einzelne Variablen. Unter "Hilfe zu Step 7" ==> "Suchen" ==> "Format des Datentyps ANY"
// ist der Aufbau des ANY zeigers beschrieben. Mit Hilfe dieser Angaben wurde dieser Baustein hier erstellt. Je nachdem welchen
// Datentyp (Elementar/Zusammengesetzt oder Parametertyp) der Eingangszeiger hat, werden die Daten unterschiedlich interpretiert
// und entsprechend ausgegeben. Die Datentyp Art gibt der Baustein ebenfalls aus damit die weitere Bearbeitung vereinfacht wird.
// Als Rückgabewert der Funktion wird das OK Flag übergeben. Sollte der angegebene Datentyp unbekannt sein wird 0 übergeben, wird
// die Funktion fehlerfrei ausgefüht wir eine 1 übergeben.
// Ersteller: Uze/LOFT
// Erstelldatum: 25.03.2009
// Änderungen:
TITLE= 'Konvertierung des ANY Pointers in einzelne Variablen';
NAME: ANY_TO_STRUCT;
Family: SCL;
Version: '1.0';
AUTHOR: VU;
// KNOW_HOW_PROTECT
{SCL_SetOKFlag:='TRUE'}
VAR_INPUT
AnyZeiger :ANY; // Eingangszeiger der zerlegt werden soll
END_VAR
VAR_OUTPUT
bySyntaxID :BYTE; // Bei Step7 immer 10h
byDatentyp :BYTE; // b#16# 00=NIL;01=BOOL;02=BYTE;03=CHAR;04=WORD;05=INT;06=DWORD;07=DINT;08=REAL;09=DATE;
// 0A=TOD;0B=TIME;0C=S5TIME;0E=DT;13=STRING;
// 17=BLOCK_FB;18=BLOCK_FC;19=BLOCK_DB;1A=BLOCK_SDB;1C=COUNTER;1D=TIMER
wWiederholfaktor :WORD; // Anzahl der Datentypen
wDBNummer :WORD; // Nummer des DB's falls vorhanden ansonsten 0
bySpeicherbereich :BYTE; // b#16# 80=P;81=E;82=A;83=M;84=DB;85=DI;86=L;87=V
nByteadr :INT; // Byteadresse des Speicherbereichs
nBitadr :INT; // Bitadresse des Speicherbereichs
wNummer :WORD; // Nummer der Zeit, des Zählers bzw. des Bausteins
bDatentyp_Art :BOOL; // 0=Daten von elementaren zusammengesetzten Datentypen; 1= Daten von Parametertypen
END_VAR
VAR
sAny :STRUCT
bySyntaxID :BYTE; // Bei Step7 immer 10h
byDatentyp :BYTE; // b#16# 00=NIL;01=BOOL;02=BYTE;03=CHAR;04=WORD;05=INT;06=DWORD;07=DINT;08=REAL;09=DATE;
// 0A=TOD;0B=TIME;0C=S5TIME;0E=DT;13=STRING;
// 17=BLOCK_FB;18=BLOCK_FC;19=BLOCK_DB;1A=BLOCK_SDB;1C=COUNTER;1D=TIMER
wWiederholfaktor :WORD; // Anzahl der Datentypen
wDBNummer :WORD; // Nummer des DB's falls vorhanden ansonsten 0
bySpeicherbereich :BYTE; // Speicherbereich, in dem die Informationen gespeichert werden
by7 :BYTE; // Byteadresse 00000bbb
by8 :BYTE; // Byteadresse bbbbbbbb
by9 :BYTE; // Byte/Bitadresse bbbbbxxx
END_STRUCT;
Anytmp_Zeiger AT sAny :ANY; // Temporärer Eingangszeiger der zerlegt werden soll
wWord :WORD; // Hilfsvariable
sWord AT wWord :STRUCT // Hilfsstruktur
by0 :BYTE;
by1 :BYTE;
END_STRUCT;
END_VAR
BEGIN
// Den Einganszeiger mal temporär übergeben
Anytmp_Zeiger:= AnyZeiger;
// Variablen übergeben
bySyntaxID := sAny.bySyntaxID;
byDatentyp := sAny.byDatentyp;
wWiederholfaktor := sAny.wWiederholfaktor;
wDBNummer := sAny.wDBNummer;
sWord.by0 := sAny.by8; // Byte ins Word kopieren
sWord.by1 := sAny.by9;
(* Je nach Datentyp Art müssen die Daten unterschiedlich behandelt werden *)
IF byDatentyp = b#16#00 OR byDatentyp = b#16#01 OR byDatentyp = b#16#02 OR byDatentyp = b#16#03 OR byDatentyp = b#16#04 OR byDatentyp = b#16#05 OR
byDatentyp = b#16#06 OR byDatentyp = b#16#07 OR byDatentyp = b#16#08 OR byDatentyp = b#16#09 OR byDatentyp = b#16#0A OR byDatentyp = b#16#0B OR
byDatentyp = b#16#0C OR byDatentyp = b#16#0E OR byDatentyp = b#16#13 THEN
bySpeicherbereich := sAny.bySpeicherbereich; // Speicherbereich zuweisen
nByteadr := WORD_TO_INT(ROR (IN:= BYTE_TO_WORD(sAny.by7 AND BYTE#0000_0111) OR (wWord AND WORD#2#1111_1111_1111_1000),
N := 3)); // Zuerst in ein gemeinsames Word bringen und dann 3 stellen nach rechts rotieren
nBitadr := BYTE_TO_INT(sAny.by9 AND BYTE#2#0000_0111); // Das gleiche nur maskiert
wNummer := 0; // hier unrelevant
bDatentyp_Art := FALSE; // Elementaren bzw. zusammengesetzten Datentyp setzen
ELSIF byDatentyp = b#16#17 OR byDatentyp = b#16#18 OR byDatentyp = b#16#19 OR byDatentyp = b#16#1A OR byDatentyp = b#16#1C OR byDatentyp = b#16#1D THEN
bySpeicherbereich := 0; // hier unrelevant
nByteadr := 0; // hier unrelevant
nBitadr := 0; // hier unrelevant
wNummer := wWord; // und hier übergeben wirs über die AT Deklaration
bDatentyp_Art := TRUE; // Parametertyp setzen
ELSE
OK:= FALSE;
END_IF;
FC225:= OK;
END_FUNCTION