Any-Zeiger für Datentypen

volker

Supermoderator
Teammitglied
Beiträge
5.805
Reaktionspunkte
1.027
Zuviel Werbung?
-> 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:
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
Datentyp [in HEX]:
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
Speicherbereich [in HEX]:
Code:
81 Eingänge        82 Ausgänge     83 Merker
84 Datenbaustein   85 Instanz-DB   86 Lokal daten (L-Stack)
87 Vorherige Lokal daten
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.
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
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.
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
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.
Code:
      CALL  SFC   20
       SRCBLK :=#myZeiger
       RET_VAL:=MW200
       DSTBLK :=P#DB10.DBX 4.0 BYTE 8
Wir haben jetzt MB20-27 in den DB10 DBB4-11 kopiert.
-------------------------------------------------------------------
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
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.

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:
Zurück
Oben