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

Ergebnis 1 bis 7 von 7

Thema: IN:Pointer in Multiinstanz

  1. #1
    Registriert seit
    05.11.2008
    Beiträge
    31
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo erstmal,

    kurze Beschreibung meines Vorhabens:
    Ich habe einen FB den ich in einem anderen FB aufrufen möchte und zwar als Multiinstanz.

    Problem ist das der FB der als Multiinstanz aufgerufen wird nicht mehr richtig funkioniert.
    Sobald ich ihn aber normal mit eigenem Instanz-DB aufrufe geht wieder alles.

    Mittlerweile habe ich herausgefunden dass es an folgenden Zeilen liegt:
    Code:
    L     P##Host_Exchange
          LAR1  
          L     B [AR1,P#2.0]
    #Host_Exchange ist ebenfalls ein DB der als Pointer an den FB übergeben wird.

    Wenn ich den FB mit eigenem IDB aufrufe kommt am Ende der Zeilen wie erwartet der Datentyp 84 also DB raus.
    Wenn ich ihn nun aber als Multiinstanz aufrufen aber nach wie vor exakt den selben Pointer übergebe kommt irgendein quatsch raus (nichts im Bereich der Datentypen).


    Ich hoffe jemand kann mir da die Augen öffnen.

    P.S.: Falls mit jemand nicht glaubt ich kann auch gerne besagtes Programm anhängen

    MfG
    Robin
    Geändert von mrdoc (06.02.2013 um 03:16 Uhr)
    Zitieren Zitieren IN:Pointer in Multiinstanz  

  2. #2
    mrdoc ist offline Benutzer
    Themenstarter
    Registriert seit
    05.11.2008
    Beiträge
    31
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Ok jetzt habe ich doch noch was in den tiefen des Siemens Supports gefunden:

    Code:
          TAR2  
          L     P##Host_Exchange
          UD    DW#16#FFFFFF
          +D    
          LAR1
    Dadurch wird der Datentyp (84) auch wunderbar ausgelesen (yeah!).
    Leider hackt es nun wenige Zeilen weiter nämlich beim auslesen der DB-Nummer.

    Code:
    L     W [AR1,P#0.0]               // 'Host_Exchange' DataBlock
          T     #AuxDb
    Dort wird nun der Wert 24833 ausgelesen...
    ...statt 1 wie ich erwartet hätte.

  3. #3
    Registriert seit
    30.10.2009
    Ort
    10 km vom Herzen der Natur
    Beiträge
    1.639
    Danke
    120
    Erhielt 343 Danke für 258 Beiträge

    Standard

    Bei indirekter Adressierung in Multiinstanzen musst Du zwingend das AR2 zum AR1 addieren, da das AR2 den Offset des Beginns des Speicherbereich des FB im übergeordneten IDB angibt.
    Gruß
    Michael

  4. #4
    Registriert seit
    28.01.2013
    Beiträge
    29
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Soweit ich das sehe wird doch das AR2 zu AR1 addiert. Zumindest bei seiner zweiten Antwort.
    Andere Frage an Mr. Doc: Wann arbeitest du eigentlich?????

  5. #5
    Registriert seit
    11.05.2005
    Ort
    Baden-Württemberg
    Beiträge
    673
    Danke
    113
    Erhielt 153 Danke für 124 Beiträge

    Standard

    Zitat Zitat von mrdoc Beitrag anzeigen
    Ok jetzt habe ich doch noch was in den tiefen des Siemens Supports gefunden:

    Code:
          TAR2  
          L     P##Host_Exchange
          UD    DW#16#FFFFFF
          +D    
          LAR1
    Dadurch wird der Datentyp (84) auch wunderbar ausgelesen (yeah!).
    Leider hackt es nun wenige Zeilen weiter nämlich beim auslesen der DB-Nummer.

    Code:
    L     W [AR1,P#0.0]               // 'Host_Exchange' DataBlock
          T     #AuxDb
    Dort wird nun der Wert 24833 ausgelesen...
    ...statt 1 wie ich erwartet hätte.
    Schau mal in der AWL Ansicht online, ob sich AR1 oder DB1/2 zwischen den Ladeoperationen ändern.
    "arbeite klug, nicht hart" - deutsches Sprichwort

  6. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.514
    Danke
    934
    Erhielt 3.385 Danke für 2.738 Beiträge

    Standard

    Zitat Zitat von mrdoc Beitrag anzeigen
    Ok jetzt habe ich doch noch was in den tiefen des Siemens Supports gefunden:

    Code:
          TAR2  
          L     P##Host_Exchange
          UD    DW#16#FFFFFF
          +D    
          LAR1
    Dadurch wird der Datentyp (84) auch wunderbar ausgelesen (yeah!).
    Das ist leider nicht ganz richtig.
    Der offizielle Siemens Support und die Step7-Hilfe sagen, daß beim Addieren des Multiinstanz-Offset aus dem AR2 die Bereichskennung aus AR2 ausgeblendet werden muß und NICHT aus der Parameteradresse P##inparameter - dann stimmt auch die errechnete Adresse mit der Bereichskennung 16#85 = DI !

    Zugriff auf eine Multiinstanz
    [QUOTE]
    Code:
          TAR2                      // Lade Adressregister in den AKKU 1 (Offset)
          UD    DW#16#FFFFFF        // Ausblenden der Bereichskennung
          L     P##variable         // Lade Adresse der Variablen
          +D                        // Addiere Offset und Variablenadresse
          LAR1                      // Speichere das Ergebnis im Adressregister AR1
    So herum ist sichergestellt, daß AR1 eine Adresse erhält, die sich auf den Instanz-DB bezieht (Bereichskennung 16#85).
    Eine nachfolgende bereichsübergreifende registerindirekte Operation L W [AR1,P#0.0] greift dann auf den IDB zu.

    Beachte:
    Das AR2 enthält eine Adresse mit der Bereichskennung 16#84 = DB
    P##inparameter ist eine Adresse mit der Bereichskennung 16#85 = DI

    Die Übergabeparameter liegen im Instanz-DB, also sollte ein registerindirekter Zugriff über das DI-Register adressieren oder das DB-Register muß die Nummer des IDB enthalten.
    Ganz sicher geht man mit einem bereichsinternen registerindirekten Zugriff (der Inhalt des DB-Registers in dann beliebig): L DIW [AR1,P#0.0]


    So wird Dein Code funktionieren:
    Code:
          LAR1  P##Host_Exchange    // Lade Adresse des Parameters in dieser Instanz 85... (DI)
          TAR2                      // Lade den Offset dieser Instanz im IDB aus dem AR2 in den AKKU1
          +AR1                      // Addiere Variablenadresse und Offset --> 85... (DI)
    
    //bereichsübergreifend registerindirekt - AR1 muß eine DI-Adresse 85... enthalten!
          L     W [AR1,P#0.0]       // 'Host_Exchange' DataBlock
          T     #AuxDb
    
    //bereichsintern registerindirekt - die Bereichskennung in AR1 wird ignoriert, es wird DI verwendet
          L     DIW [AR1,P#0.0]     // 'Host_Exchange' DataBlock
          T     #AuxDb
    siehe auch: Bei welchen Operationen überschreibt STEP 7 den Akku-Inhalt bzw. den Inhalt von Registern?

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. Folgende 5 Benutzer sagen Danke zu PN/DP für den nützlichen Beitrag:

    drmicha (07.02.2013),MM_TTE3 (24.06.2015),RONIN (31.03.2015),rostiger Nagel (06.02.2013),vollmi (07.02.2013)

  8. #7
    mrdoc ist offline Benutzer
    Themenstarter
    Registriert seit
    05.11.2008
    Beiträge
    31
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Vielen Dank für die Lösungsvorschläge bin leider erst jetzt zum Antworten gekommen.

    Mit der Methode von PN/DP funktioniert alles so wie es soll und was noch viel wichtiger ist... ich verstehe sogar warum

    Zitat Zitat von Freki Beitrag anzeigen
    Andere Frage an Mr. Doc: Wann arbeitest du eigentlich?????
    Bin aus der Nachtschicht gekommen und mit so einem Problem kann ich nicht einschlafen.

Ähnliche Themen

  1. Pointer als IN (FC/FB) wieder übergeben als Pointer
    Von saarlaender im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 18.06.2012, 11:47
  2. S7 LAR P##... --- pointer auf pointer
    Von milmu im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 22.11.2010, 17:39
  3. Pointer
    Von Mathias im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 19.06.2009, 17:02
  4. Pointer?!
    Von tuneit im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 23.09.2008, 09:43
  5. Pointer
    Von Dotzi im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 16.09.2008, 18:32

Lesezeichen

Berechtigungen

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