TIA TIA Pointerübergabe

Stefan592

Level-2
Beiträge
109
Reaktionspunkte
24
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe folgendes Problem:

Am IN Parameter eines FB's übergeben ich den Pointer "P#E300.0" und "P#A300.0". Im FB kommt allerdings was ganz anderes an. Seht selbst.
Der FB6 ist nicht optimiert. Allerdings der Baustein aus dem der Ausruf erfolgt.

Könnt Ihr euch dieses Verhalten erklären? TIA V13 SP1 UPD 4



Stefan
Pointer_TIA.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Laß Dich nicht durch das Beobachten des Bausteins verunsichern, der Code ist doch fast richtig so (*). Er funktioniert nur anders als Du erwartet hast.

Das "L P##E_Anfang" liefert nicht den außen angelegten Aktualwert (P#A300.0) sondern die Adresse (P#) des FB-INPUT-Parameters (P#DIX6.0)
Um den Aktualwert zu lesen müsste man schreiben "L #E_Anfang". Das geht aber nicht, denn man kann einen POINTER (48 Bit) nicht in einen Akku (32 Bit) laden. Deshalb wird der POINTER (indirekt adressiert) in zwei Teilstücken umkopiert.
Code:
      L     P##E_Anfang                 // Adresse des INPUT-Parameters (P#DIX6.0)
      LAR1

      L     W [AR1,P#0.0]               // DB-Nr des Aktualparameters (0, weil Bereich A)
      T     #DB_Ausgang
      L     D [AR1,P#2.0]               // Bereichsadresse des Aktualparameters (P#A300.0)
      T     #Adr_Ausgang

      LAR1                              // dies würde endlich P#A300.0 in AR1 laden


(*) Allerdings ist Dein FB durch das Referenzieren des INPUT-Parameters nicht mehr multiinstanzfähig.
Willst Du den FB auch als Multiinstanz nutzen, dann mußt Du zur Adresse P##E_Anfang noch den Multiinstanz-Offset aus AR2 addieren. Außerdem darfst Du in einem als "multiinstanzfähig" markierten FB das AR2 nicht verändern bzw. mußt es vor Zugriffen auf Instanzvariablen wiederherstellen.

So wird das ganze multiinstanzfähig:
Code:
      L     P##E_Anfang                 // relative Adresse von #E_Anfang in dieser Instanz (Kennung DI)
      TAR2                              // Offset dieser Instanz (Kennung DB) im IDB
      UD    DW#16#FFFFFF                // Bereichskennung (DB) ausblenden
      +D
      LAR1                              // AR1: absolute Adresse #E_Anfang im IDB (Kennung DI)

      L     W [AR1,P#0.0]               // DB-Nr des Aktualparameters (0, weil Bereich A)
      T     #DB_Ausgang
      L     D [AR1,P#2.0]               // Bereichsadresse des Aktualparameters (P#A300.0)
      T     #Adr_Ausgang

      LAR1                              // dies würde endlich P#A300.0 in AR1 laden

Harald
 
Zurück
Oben