Pointer für lokale Variablen erstellen

neuer_user

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
möchte einen Zeiger wie in dem nachfolgenden Muster für den Zugriff auf lokale (temp) Variablen erstellen. Das Beispiel ist für den Zugriff für einen DB.

Code:
 AUF   DB [#SchnittstellenDB]
      LAR1  P##Source
      L     B#16#10                     //  10h für S7
      T     LB [AR1,P#0.0]
      L     B#16#2                      //  Datentyp
      T     LB [AR1,P#1.0]
      L     1                           // Wiederholungsfaktor
      T     LW [AR1,P#2.0]
      L     DBNO                        // DB-Nummer
      T     LW [AR1,P#4.0]
      L     B#16#84                     // Codierung der Speicher bereiche  (DB)
      T     LB [AR1,P#6.0]
 
      L     0
      SRW   13                          // Schiebe rechts Wort um nur auf die Byteadresse zu schreiben
      T     LB [AR1,P#7.0]
      L     0
      SLW   3                           // Schiebe links Wort wegen Bit Adresse
      T     LW [AR1,P#8.0]

Dieses ist der Zeiger wenn ich ihn selber erstelle.

Code:
P#L 22.0 BYTE 1

Da sich die Werte aber ändern möchte ich das so wie in dem oberen Beispiel machen.
Was muß dafür in dem oberen Beispiel geändert werden?
 
Hier mal aus der Siemens-Hilfe kopiert:

Format des Parametertyps POINTER

STEP 7 speichert den Parametertyp POINTER in 6 Bytes (48 Bits). Nachfolgendes Bild zeigt die Art der Daten, die in jedem Byte gespeichert werden.

image\1_a30typ_21_a_vec.gif

Der Parametertyp POINTER speichert die folgenden Informationen:
  • <LI style="FONT-SIZE: 10pt">DB-Nummer (bzw. 0, wenn die Daten nicht in einem DB gespeichert werden)
  • Speicherbereich in der CPU (Nachfolgende Tabelle zeigt die Hexadezimalcodes der Speicherbereiche für den Parametertyp POINTER)
Hexa dezimal code
Speicher bereich
Beschrei bung
b#16#81
E​
Speicher bereich der Eingänge
b#16#82
A​
Speicher bereich der Ausgänge
b#16#83
M​
Speicher bereich der Merker
b#16#84
DB​
Daten baustein
b#16#85
DI​
Instanz-Daten baustein
b#16#86
L​
Lokal daten (L-Stack)
b#16#87
V​
Vorherige Lokal daten


  • Adresse der Daten (im Format Byte.Bit)
    • STEP 7 bietet das Pointer-Format: p#Speicherbereich Byte.Bit_Adresse. (Wenn der Formalparameter als Parametertyp POINTER deklariert wurde, dann brauchen Sie nur den Speicherbereich und die Adresse anzugeben. STEP 7 formatiert Ihren Eintrag dann automatisch in das Pointer-Format um.) Die folgenden Beispiele zeigen, wie Sie den Parametertyp POINTER für die Daten, die bei M50.0 beginnen, eingeben:
  • <LI style="FONT-SIZE: 10pt">P#M50.0
  • M50.0 (wenn der Formalparameter als POINTER deklariert wurde)
Mit den Hex-Werten für Speicherbereich sollte man sich dann doch den Pointer zusammenbauen können, oder?

PS: Schade, beim Einfügen sieht es noch wie im Original aus, recht aber so.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Auszug aus der Siemens AWL Hilfe:


Hinweis
Bei vielen Anwendungen können Sie sowohl die registerindirekte bereichsinterne als auch die registerindirekte bereichsübergreifende Adressierung verwenden.
Falls Sie registerindirekt auf
· den eigenen Lokaldatenbereich zugreifen wollen, so geht das nur bereichsintern.
· Variablen vom Typ "POINTER" oder "ANY" oder auf den Lokaldatenbereich des aufrufenden Bausteins zugreifen wollen, so geht das nur bereichsübergreifend.





wenn du nun wirklich nur einen Zugriff auf ein einzelnes Bytes machen willst (oder auch Wort und D-Wort) kannst du das auch anders lösen

nämlich indirekt übers AR.

Beispiel:

L variabler_Offset
sld 3
tar1

L LB[ar1,p#0.0]


ansonsten solltest du dir eine Struktur im Temporären Teil anlegen damit du einen Grundpointer bekommst bei dem du mit deinem variablen Offset den tatsächlichen Zugriff ändern kannst... dazu müsste ich jetzt aber tiefer greiffen und warte mal ob es dir auch so helfen kann.

lg
Stefan
 
@stma77

Das ist der einfache und bessere Weg, aber ich denke, er will den Pointer als Parameter an eine weiter Funktion übergeben, sonst würde das ja keinen Sinn machen.
 
Zurück
Oben