Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 4 von 4

Thema: TIA Pointerübergabe

  1. #1
    Registriert seit
    15.10.2014
    Beiträge
    91
    Danke
    15
    Erhielt 18 Danke für 15 Beiträge

    Standard


    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
    Zitieren Zitieren TIA Pointerübergabe  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Der Input und Output wird ja im IDB gespeichert, also verweist P##A_Anfang nicht auf den Wert am Input oder den Pointer, sondern die Adresse der Variablen im IDB.
    Du müßtest genauso verfahren wie bei der Übergabe einer Any im FB.

    Sieh mal dazu hier: ANY Pointer als In Parameter...
    und hier: Probleme mit Any-Pointer (Beitrag 10, sehr schönes Beispiel in SCL mit AT)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. #3
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.197
    Danke
    926
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Stefan592 (23.03.2016)

  5. #4
    Registriert seit
    15.10.2014
    Beiträge
    91
    Danke
    15
    Erhielt 18 Danke für 15 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Problem gelöst. Nun Steht die richtige Adresse in der Variable.


    Stefan

Ähnliche Themen

  1. Antworten: 22
    Letzter Beitrag: 10.08.2017, 09:48
  2. TP1500 - TIA V12 und jetzt TIA V13 SP1
    Von duMMbatz im Forum HMI
    Antworten: 3
    Letzter Beitrag: 10.07.2015, 08:49
  3. Antworten: 0
    Letzter Beitrag: 31.03.2015, 11:40
  4. Antworten: 2
    Letzter Beitrag: 25.03.2015, 08:00
  5. Pointerübergabe an FC
    Von NeuSim im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 03.01.2011, 17:12

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •