Step 7 Pointer als Integer Input Variable

tommylik

Level-2
Beiträge
115
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend,

Habe folgenden Code aus einem laufendem FC und die rot markierte Stelle würde ich gerne als Input Variable
umbauen damit ich nicht jedes mal einen neuen Baustein brauche wenn ich den Wert ändern muss.
(weil anderer Bereich im DB)

L P#248.0 // Byte 248 von der Datenstruktur

Code:
      L     P##AnyPointer               // IN, ANY
      LAR1                                  // in AR1 laden

      L     W [AR1,P#4.0]
      T     #QuellDB                    // TEMP, WORD, Datenbaustein-Nr

      L     D [AR1,P#6.0]               // TEMP, DWORD, Bereichsadresse mit Bereichskennung P#DBXxxxx.0
      SLD   13                           // Bereichskennung löschen --> P#xxxx.0
      SRD   13
      L     P#248.0                     // Byte 248 von der Datenstruktur
      +D
      T     #StartAdr                 // Temp, INT, 1. Adresse

      L     P#32.0
      UN    #Roboter
      SPB   m001

      L     P#36.0

m001: L     #StartAdr           // 1. Adresse
      +D
      T     #Vergl                  // TEMP, DWORD, Hilfs-DW

Ich habe aber leider keine Ahnung wie aus der Input Variable (ich denke Integer) einen Pointer mache der die besagte Byte Adresse ausliest.
Geht mein Vorhaben überhaupt?

Kann mir einer von Euch bitte sagen wie?

LG Tommylik
 
Eigentlich musst du nur statt L P#248 Eine Variable schreiben und diese im Baustein wandeln am besten ganz oben Zeilen.
L 248
SLD 3 // Zahl ins Byte Format wandeln
T Adresse
....
Code:
L 248 // oder Input Variable
SLD3
T Adresse

      L     P##AnyPointer               // IN, ANY
      LAR1                                  // in AR1 laden

      L     W [AR1,P#4.0]
      T     #QuellDB                    // TEMP, WORD, Datenbaustein-Nr

      L     D [AR1,P#6.0]               // TEMP, DWORD, Bereichsadresse mit Bereichskennung P#DBXxxxx.0
      SLD   13                           // Bereichskennung löschen --> P#xxxx.0
      SRD   13
    L Adresse // alt  L     P#248.0                     // Byte 248 von der Datenstruktur
      +D
      T     #StartAdr                 // Temp, INT, 1. Adresse

      L     P#32.0
      UN    #Roboter
      SPB   m001

      L     P#36.0

m001: L     #StartAdr           // 1. Adresse
      +D
      T     #Vergl                  // TEMP, DWORD, Hilfs-DW
Ansonsten mal F1 drücken da ist eigentlich auch alles beschrieben.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPS-Bitschubser,

Vielen Dank für deine Antwort und Hilfe.

Funktioniert bestens. Aber ich würde es gerne auch verstehen.

SLD 3 // Zahl ins Byte Format wandeln

Könntest du mir bitte erklären, warum SLD 3 die Zahl ins Byte Format wandelt?
SLD verschiebt nach links. Warum wird da aus einem Integer ein Byte
Vielleicht kennst du ein Buch oder Link womit das auch dumme verstehen.
Ich bin leider jemand der die Sachen anfassen muss um zu lernen wenigstens optisch.
Die Nullen und Einsen kann man nicht anfassen und wenn man ich mir den Status
von AWL Code anschaue, ärgere ich mich das ich es nicht verstehe.

z. B.
L W [AR1,P#4.0]
T #QuellDB // TEMP, WORD, Datenbaustein-Nr

Im Status sehe ich die Datenbaustein-Nr aber wie kommt sie darein?

Nochmals vielen Dank für deine Hilfe.

LG Tommylik
 
Wenn man mittels Anypointer adressiert, so hat jede Adresse im DB eine gleichwertige "Bitnummer". Also beispielsweise Bit 0.0 ist die Bitnummer 0. Bit 0.1 ist Bitnummer 1, ... Bit 1.0 ist Bitnummer 8...

Wenn man jetzt nicht Bitnummer 8 (also 1.0) Ansprechen will, sondern Byte 8 (8.0) muss man die Adresse dafür berechnen. SLD 3 ist dafür ein gebräuchlicher Weg, da durch das Schieben des Bitmusters mit dem Faktor 8 multipliziert wird. So wird aus dem 8. Bit dann das 8. Byte, was adressiert wird, bzw. in deinem Fall Byte 248. Ohne SLD3 würdest du auf den Bereich 30.0 im DB zeigen.

Dafür am besten mal schauen, wie Int oder DINT Zahlen aufgebaut sind, jede 0 bzw. 1 in der Zahlenfolge entspricht ja einem 2^x an der Stelle und diese werden dann aufaddiert. Von 2^0 = 1 bis 2^15 (bzw. 2^31). So wird aus 0000 0000 0000 0001 (Int 1, 2^0=1) dann 0000 0000 0000 1000 (2^3=8). Das Beispiel kann man beliebig fortführen, ich hoffe das System ist erkennbar.


Bezüglich
Code:
L     P##AnyPointer               // IN, ANY
LAR1                                  // in AR1 laden
L W [AR1,P#4.0]
T #QuellDB // TEMP, WORD, Datenbaustein-Nr

Schau doch mal wie dein Anypointer weiter oben in deinem Programm zusammengebaut wird und welche Informationen er hat. Die Hilfe zum Anypointer ist meiner Meinung nach sehr auschlussreich. (F1 drücken)
 
Zurück
Oben