Any-Zeiger für Datentypen

volker

Supermoderator
Teammitglied
Beiträge
5.484
Punkte Reaktionen
940
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    |    [COLOR=skyblue]Datentyp[/COLOR]     | Byte 1
Byte 2 |        [COLOR=purple]Wiederholungsfaktor[/COLOR]        | Byte 3
Byte 4 |         [COLOR=deeppink]DB-Nummer (oder 0)[/COLOR]        | Byte 5
Byte 6 | [COLOR=royalblue]Speicherbereich[/COLOR] | 0 0 0 0 0 [COLOR=orange]B B B[/COLOR] | Byte 7
Byte 8 | [COLOR=orange]B B B B B B B B[/COLOR] | [COLOR=orange]B B B B B[/COLOR] [COLOR=orangered]b b b[/COLOR] | Byte 9
Datentyp [in HEX]:
Code:
[COLOR=skyblue]00[/COLOR] NIL     [COLOR=skyblue]01[/COLOR] BOOL     [COLOR=skyblue]02[/COLOR] BYTE
[COLOR=skyblue]03[/COLOR] CHAR    [COLOR=skyblue]04[/COLOR] WORD     [COLOR=skyblue]05[/COLOR] INT
[COLOR=skyblue]06[/COLOR] DWORD   [COLOR=skyblue]07[/COLOR] DINT     [COLOR=skyblue]08[/COLOR] REAL
[COLOR=skyblue]09[/COLOR] DATE    [COLOR=skyblue]0A[/COLOR] TOD      [COLOR=skyblue]0B[/COLOR] TIME
[COLOR=skyblue]0C[/COLOR] S5TIME  [COLOR=skyblue]0E[/COLOR] DT       [COLOR=skyblue]13 [/COLOR]STRING
Speicherbereich [in HEX]:
Code:
[COLOR=royalblue]81[/COLOR] Eingänge        [COLOR=royalblue]82[/COLOR] Ausgänge     [COLOR=royalblue]83[/COLOR] Merker
[COLOR=royalblue]84[/COLOR] Datenbaustein   [COLOR=royalblue]85[/COLOR] Instanz-DB   [COLOR=royalblue]86[/COLOR] Lokal daten (L-Stack)
[COLOR=royalblue]87[/COLOR] 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
      [COLOR=skyblue]L     B#16#02                   //Typ BYTE[/COLOR]
[COLOR=skyblue]     T     LB     1[/COLOR] 
      [COLOR=purple]L     8                         //Anzahl (Wiederholungsfaktor)[/COLOR]
[COLOR=purple]     T     LW     2[/COLOR] 
      [COLOR=deeppink]L     0                         //[COLOR=red][B]*1[/B] [/COLOR]Datenbaustein (hier 0 da wir ja auf
      T     LW     4                  //   einen Merkerbereich zugreifen wollen)[/COLOR] 
      [COLOR=orange]L     20                        //Anfangsadresse[/COLOR]
[COLOR=orange]     SLD   3                         //Pointer bauen[/COLOR]
[COLOR=orange]     T     LD     6[/COLOR] 
      [COLOR=royalblue]L     B#16#83                   //Speicherbereich (hier Merker)[/COLOR]
[COLOR=royalblue]     T     LB     6[/COLOR]
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#[COLOR=red]04                   //Typ WORD[/COLOR] 
      T     LB     1
      L     [COLOR=red]4                         //Anzahl [/COLOR](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:
Oben