- Beiträge
- 5.883
- Reaktionspunkte
- 1.063
-> Hier kostenlos registrieren
von Volker
Bevor ihr euch mit dem Any-Zeiger beschäftigt, solltet ihr über den Pointer Bescheid wissen.
Schaut euch dazu vorher dieses Thema an. Pointer Zeiger FIFO LIFO
Der Aufbau des ANY-Zeigers:
Datentyp [in HEX]:
Speicherbereich [in HEX]:
B = Byteadresse , b = Bitadresse
------------------------------------------------------
So. Nun wollen wir das ganze mal anwenden.
Aufgabe:
Kopieren sie Mithilfe der SFC20 einen variablen Merkerbereich (im Beispiel ab MB 20) mit 8 Byte Länge in den DB10 ab DBB4.
Zuallererst definieren wir uns im Deklarationsbereich eine Variable (myZeiger) im TEMP-Bereich vom Typ ANY. (diese Variable ist die erste Variable dort und beginnt ab Adresse 0.0, belegt also den Bereich 0.0-9.7)
Nun bauen wir uns den Zeiger, um auf den Merkerbereich zugreifen zu können.
Mit diesen Anweisungen haben wir nun folgenden Any-Zeiger gebaut.
P#M 20.0 BYTE 8
*1 Es wäre nicht wirklich tragisch, wenn an der DB-Adresse ein anderer Wert als 0 stehen würde, da dies ignoriert wird, wenn nicht auf einen DB zugegriffen wird.
Der Korrektheit halber sollte hier aber trotzdem eine 0 eingetragen werden.
Vom Prinzip das gleiche Ergebnis würden wir erziehlen, wenn wir den Zeiger so bauen.
Mit diesen Anweisungen haben wir nun folgenden Any-Zeiger gebaut.
P#M 20.0 WORD 4
Jetzt transferieren wir den, durch den Zeiger adressierten Bereich, in den DB10.
Wir haben jetzt MB20-27 in den DB10 DBB4-11 kopiert.
-------------------------------------------------------------------
Zum Abschluss bauen wir noch einen Zeiger auf einen Bereich in einem Datenbaustein.
Mit diesen Anweisungen haben wir nun folgenden Any-Zeiger gebaut.
P#DB33.DBX 14.0 BYTE 8
-------------------------------------------------------------------
Der Any-Zeiger lässt sich nun auch noch mit dem Pointer kombinieren um noch unabhängiger zu sein.
Nehmen wir an, der Anyzeiger liegt im Lokalbereich ab LB10
LAR1 P##myZeiger
Mit dieser Anweisung laden wir die Anfangsadresse unseres ANY-Zeigers in das Adressregister 1.
Die folgenden Transferbefehle, in Verbindung mit dem Adressregister, beziehen sich nun auf dieses Adresse.
Bevor ihr euch mit dem Any-Zeiger beschäftigt, solltet ihr über den Pointer Bescheid wissen.
Schaut euch dazu vorher dieses Thema an. Pointer Zeiger FIFO LIFO
Der Aufbau des ANY-Zeigers:
Code:
Bit |15.. ..8 | 7.. ..0 |
Byte 0 | 10h für S7 | Datentyp | Byte 1
Byte 2 | Wiederholungsfaktor | Byte 3
Byte 4 | DB-Nummer (oder 0) | Byte 5
Byte 6 | Speicherbereich | 0 0 0 0 0 B B B | Byte 7
Byte 8 | B B B B B B B B | B B B B B b b b | Byte 9
Code:
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
Code:
81 Eingänge 82 Ausgänge 83 Merker
84 Datenbaustein 85 Instanz-DB 86 Lokal daten (L-Stack)
87 Vorherige Lokal daten
------------------------------------------------------
So. Nun wollen wir das ganze mal anwenden.
Aufgabe:
Kopieren sie Mithilfe der SFC20 einen variablen Merkerbereich (im Beispiel ab MB 20) mit 8 Byte Länge in den DB10 ab DBB4.
Zuallererst definieren wir uns im Deklarationsbereich eine Variable (myZeiger) im TEMP-Bereich vom Typ ANY. (diese Variable ist die erste Variable dort und beginnt ab Adresse 0.0, belegt also den Bereich 0.0-9.7)
Nun bauen wir uns den Zeiger, um auf den Merkerbereich zugreifen zu können.
Code:
L B#16#10 //10h für s7
T LB 0
L B#16#02 //Typ BYTE
T LB 1
L 8 //Anzahl (Wiederholungsfaktor)
T LW 2
L 0 //*1 Datenbaustein (hier 0 da wir ja auf
T LW 4 // einen Merkerbereich zugreifen wollen)
L 20 //Anfangsadresse
SLD 3 //Pointer bauen
T LD 6
L B#16#83 //Speicherbereich (hier Merker)
T LB 6
P#M 20.0 BYTE 8
*1 Es wäre nicht wirklich tragisch, wenn an der DB-Adresse ein anderer Wert als 0 stehen würde, da dies ignoriert wird, wenn nicht auf einen DB zugegriffen wird.
Der Korrektheit halber sollte hier aber trotzdem eine 0 eingetragen werden.
Vom Prinzip das gleiche Ergebnis würden wir erziehlen, wenn wir den Zeiger so bauen.
Code:
L B#16#10 //10h für s7
T LB 0
L B#16#04 //Typ WORD
T LB 1
L 4 //Anzahl (Wiederholungsfaktor)
T LW 2
L 0 //Datenbaustein
T LW 4
L 20 //Anfangsadresse
SLD 3 //Pointer bauen
T LD 6
L B#16#83 //Speicherbereich (hier Merker)
T LB 6
P#M 20.0 WORD 4
Jetzt transferieren wir den, durch den Zeiger adressierten Bereich, in den DB10.
Code:
CALL SFC 20
SRCBLK :=#myZeiger
RET_VAL:=MW200
DSTBLK :=P#DB10.DBX 4.0 BYTE 8
-------------------------------------------------------------------
Zum Abschluss bauen wir noch einen Zeiger auf einen Bereich in einem Datenbaustein.
Code:
L B#16#10 //10h für s7
T LB 0
L B#16#02 //Typ BYTE
T LB 1
L 8 //Anzahl (Wiederholungsfaktor)
T LW 2
L 33 //Datenbaustein
T LW 4
L 14 //Anfangsadresse
SLD 3 //Pointer bauen
T LD 6
L B#16#84 //Speicherbereich (hier DB)
T LB 6
P#DB33.DBX 14.0 BYTE 8
-------------------------------------------------------------------
Der Any-Zeiger lässt sich nun auch noch mit dem Pointer kombinieren um noch unabhängiger zu sein.
Nehmen wir an, der Anyzeiger liegt im Lokalbereich ab LB10
LAR1 P##myZeiger
Mit dieser Anweisung laden wir die Anfangsadresse unseres ANY-Zeigers in das Adressregister 1.
Die folgenden Transferbefehle, in Verbindung mit dem Adressregister, beziehen sich nun auf dieses Adresse.
Code:
LAR1 P##QANY //zeiger ins adressregister laden
L W#16#10 //SyntaxID. bei S7 immer 10
T LB [AR1,P#0.0]
L W#16#2 //Typ BYTE
T LB [AR1,P#1.0]
L #Anzahl_Bytes //Anzahl Bytes
T LW [AR1,P#2.0]
L #Quell_DB //Quell-DB
T LW [AR1,P#4.0]
L #QAnfang //Anfang der Quelle
SLD 3
T LD [AR1,P#6.0]
L B#16#84 //Speicherbereich (hier DB)
T LB [AR1,P#6.0]
Zuletzt bearbeitet: