- Beiträge
- 15.414
- Reaktionspunkte
- 4.043
-> Hier kostenlos registrieren
Ich hab ja gerade für jemanden ein Stück AWL in SCL umgesetzt. Dabei tat sich eine Frag auf:
Zuerst mal den SCL-Code:
Das rote Stück Code habe ich mal durch #Quellpointer ersetzt. Dabei veränderte sich der AWL-Code so, daß er nicht mehr das gewünschte Ergebnis lieferte. Ich meinte immer, die Sicht kann man genauso verwenden, wie die Ursprungsdaten. Das scheint zumindest bei Any-Pointern nicht so zu sein.
Hier mal die übersetzten AWL-Bausteine als Gegenüberstellung:
Erklärungsversuche würden mich mal interessieren .
Zuerst mal den SCL-Code:
Code:
FUNCTION FC100 : INT
VAR_INPUT
Data_DB: Block_DB;
Adresse_Drive: WORD; //Adresse des Antriebes (Z.Bsp. W#16#12C für 300)
// Record: ANY;
END_VAR
VAR_TEMP
Quelle: ANY;
QuellPointer AT Quelle : STRUCT
bySyntaxID : BYTE;
byDatentyp : BYTE;
iLaenge : INT;
idb_Nummer : INT;
dwPointer : DWORD;
END_STRUCT;
PPO_TYP: INT;
Laenge: INT;
ErrorNr: INT;
RET_VAL_SFC_14: INT;
DBNr: INT;
END_VAR
// Anweisungsteil
// Quelle := Record;
DBNr := WORD_TO_INT(BLOCK_DB_TO_WORD(Data_DB));
PPO_Typ := WORD_TO_INT(Data_DB.DW60);
//oder so: PPO_Typ := WORD_TO_INT(WORD_TO_BLOCK_DB(BLOCK_DB_TO_WORD(Data_DB)).DW60);
ErrorNr := 0;
CASE PPO_Typ OF
2 : Laenge := 12; // Laenge (Wiederholfaktor) 20 Bytes
4 : Laenge := 12; // Laenge (Wiederholfaktor) 12 Bytes
5 : Laenge := 20; // Laenge (Wiederholfaktor) 28 Bytes
ELSE:
ErrorNr := 1;
Laenge := 0;
END_CASE;
QuellPointer.bySyntaxID := b#16#10;
QuellPointer.byDatentyp := b#16#4;
QuellPointer.iLaenge := Laenge;
QuellPointer.idb_Nummer := DBNr;
QuellPointer.dwPointer := SHL (IN := INT_TO_DWORD(38), N := 3);
IF ErrorNr = 0 THEN
RET_VAL_SFC_14 := DPRD_DAT(LADDR := Adresse_Drive, // IN: WORD
[COLOR=Red]RECORD := Quelle[/COLOR] // OUT:
); // INT
ErrorNr := RET_VAL_SFC_14;
END_IF;
FC100 := ErrorNr;
END_FUNCTION
Hier mal die übersetzten AWL-Bausteine als Gegenüberstellung:
Code:
Variante mit #Quelle als Any Variante mit #Quellpointer
Diese ist ok Diese ist nicht ok
SET SET
SAVE SAVE
= L 20.1 = L 20.1
L P##Data_DB L P##Data_DB
PO_TYP T #DBNr
L 0 AUF #Data_DB
T #ErrorNr L DBW 60
L #PPO_ T #DBNr T #PPO_TYP
AUF #Data_DB L 0
L DBW 60 T #ErrorNr
T #PTYP L #PPO_TYP
L 2 L 2
TAK TAK
==I ==I
T LW 22 T LW 22
SPB A7d1 SPB A7d1
SPA A7d2 SPA A7d2
A7d1: L 12 A7d1: L 12
T #Laenge T #Laenge
SPA A7d0 SPA A7d0
A7d2: L 4 A7d2: L 4
L LW 22 L LW 22
==I ==I
SPB A7d3 SPB A7d3
SPA A7d4 SPA A7d4
A7d3: L 12 A7d3: L 12
T #Laenge T #Laenge
SPA A7d0 SPA A7d0
A7d4: L 5 A7d4: L 5
L LW 22 L LW 22
==I ==I
SPB A7d5 SPB A7d5
SPA A7d6 SPA A7d6
A7d5: L 20 A7d5: L 20
T #Laenge T #Laenge
SPA A7d0 SPA A7d0
A7d6: L 1 A7d6: L 1
T #ErrorNr T #ErrorNr
L 0 L 0
T #Laenge T #Laenge
A7d0: L B#16#10 A7d0: L B#16#10
T LB 0 T LB 0
L B#16#4 L B#16#4
T LB 1 T LB 1
L #Laenge L #Laenge
T LW 2 T LW 2
L #DBNr L #DBNr
T LW 4 T LW 4
L DW#16#130 L DW#16#130
T LD 6 T LD 6
L #ErrorNr L #ErrorNr
L 0 L 0
==I ==I
SPBN A7d7 SPBN A7d7
L #Adresse_Drive L #Adresse_Drive
T LW 22 T LW 22
[COLOR=Red]L LD 0 L DW#16#1002000A[/COLOR]
T LD 24 T LD 24
[COLOR=Red]L LD 4 L W#16#0[/COLOR]
T LD 28 T LW 28
[COLOR=Red]L LW 8 L DW#16#87000000[/COLOR]
T LW 32 T LD 30
UC "DPRD_DAT" UC "DPRD_DAT"
P#L 22.0 P#L 22.0
P#L 16.0 P#L 16.0
P#L 24.0 P#L 24.0
L #RET_VAL_SFC_14 L #RET_VAL_SFC_14
L #RET_VAL_SFC_14 L #RET_VAL_SFC_14
T #ErrorNr T #ErrorNr
A7d7: L #ErrorNr A7d7: L #ErrorNr
T #RET_VAL T #RET_VAL
CLR CLR
U L 20.1 U L 20.1
SAVE SAVE
BE BE