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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 29

Thema: Lokalvariablen in Multiinstanzen

  1. #11
    Registriert seit
    19.07.2010
    Beiträge
    1.288
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Das ist nicht ganz so schwer:

    Code:
          L     P##COMMUNITY   // Hier wrid ein Pointer geladen den du im Deklarationsteil bei deiner Variable ablesen kannst. beispielsweise P#DI10.0
          LAR1  
          L     D [AR1,P#0.0]               //Und hier wird dann das DID 10 geladen
          T     LD     0
          L     D [AR1,P#4.0]
          T     LD     4
          L     W [AR1,P#8.0]
          T     LW     8
    Wenn du jetzt deinen FB als Multiinstanz aufrufst beginnt die Instanz des FB aber meist nicht im Instanz-DB auf der Adresse 0.0 sondern irgendwo. Und genau der Anfang deiner Instanz steht im AR2.

    also sollte es so besser funktionieren:
    Code:
          L     P##COMMUNITY   // Hier wrid ein Pointer geladen den du im Deklarationsteil bei deiner Variable ablesen kannst. beispielsweise P#DI10.0
          +AR2                          // Beispielsweise beginnt deine Instanz bei 100.0
          LAR1  
          L     D [AR1,P#0.0]               //Und hier wird dann das DID 110 geladen
          T     LD     0
          L     D [AR1,P#4.0]
          T     LD     4
          L     W [AR1,P#8.0]
          T     LW     8
    Geändert von Aventinus (10.01.2013 um 10:25 Uhr) Grund: Kommentar im Code korrigiert
    mfG Aventinus

  2. #12
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von Grisu88 Beitrag anzeigen
    Ganz verstanden hab ich das noch nicht mit dem AR2 :-p
    Du willst auf die absolute Adresse Deines IN-Parameters zugreifen, "L P##DATENABLAGE" liefert Dir aber nur die relative Adresse zum Anfang der aktuellen Multiinstanz. Du mußt noch die Anfangsadresse der aktuellen Multiinstanz aus dem AR2 dazurechnen.

    Code:
          TAR2                     // Anfangsadresse der aktuellen Instanz
          UD    DW#16#00FF_FFFF    // Ausblenden der Bereichskennung
          L     P##DATENABLAGE
          +D                       // Addiere Offset und Variablenadresse
          LAR1
          L     D [AR1,P#0.0]
          T     LD    70
          L     D [AR1,P#4.0]
          T     LD    74
          L     W [AR1,P#8.0]
          T     LW    78
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #13
    Registriert seit
    24.10.2012
    Beiträge
    61
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Achso,

    reicht es denn einmal das ich am Anfang des Funktionsbaustein Aufrufs die relative Adresse herrausfinde?

    irgendwie so?
    Code:
    L P#0.0
    +AR2
    LAR1
    Geändert von Grisu88 (10.01.2013 um 10:42 Uhr) Grund: Verschrieben im Programmcode

  4. #14
    Registriert seit
    24.10.2012
    Beiträge
    61
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Ne ich glaub das macht keinen Sinn

    man muss jeden LAR1

    erstetzen durch
    Code:
    +AR2
    LAR1
    oder?

  5. #15
    Registriert seit
    24.10.2012
    Beiträge
    61
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard



    also sollte es so besser funktionieren:
    Code:
    L     P##COMMUNITY   // Hier wrid ein Pointer geladen den du im Deklarationsteil bei deiner Variable ablesen kannst. beispielsweise 
    P#DI10.0      
    +AR2                          // Beispielsweise beginnt deine Instanz bei 100.0      
    LAR1       
    L     D [AR1,P#0.0]               //Und hier wird dann das DID 110 geladen      
    T     LD     0      
    L     D [AR1,P#4.0]      
    T     LD     4      
    L     W [AR1,P#8.0]      
    T     LW     8
    ich glaube so geht das noch nicht ganz

    der Befehl +AR2 addiert doch zum Adressregister 2, muss nicht die Adresse vom Adressregister 2 zum Adressregister 1 addiert werden?

    mit der Methode von Harald geht das besser

    oder hab ich da wieder was flasch verstanden
    Geändert von Grisu88 (10.01.2013 um 11:07 Uhr)

  6. #16
    Registriert seit
    24.10.2012
    Beiträge
    61
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Harald?

    es müsste doch auch ohne

    Code:
    UD    DW#16#FFFFFF
    gehen oder?

  7. #17
    Registriert seit
    24.05.2006
    Beiträge
    234
    Danke
    14
    Erhielt 77 Danke für 57 Beiträge

    Standard

    Das Maskieren mit dem UD sollte drinbleiben, da hiermit eine evtl. im AR2 mit enthaltene Bereichskennung (M, L, LV, DB, DI) entfernt wird - man weiß ja nie.

  8. #18
    Registriert seit
    19.07.2010
    Beiträge
    1.288
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard

    Zitat Zitat von Grisu88 Beitrag anzeigen
    ich glaube so geht das noch nicht ganz

    der Befehl +AR2 addiert doch zum Adressregister 2, muss nicht die Adresse vom Adressregister 2 zum Adressregister 1 addiert werden?

    mit der Methode von Harald geht das besser

    oder hab ich da wieder was flasch verstanden
    Stimmt. Sorry, da hatte ich den Befehl falsch rum im Kopf.
    mfG Aventinus

  9. #19
    Registriert seit
    24.10.2012
    Beiträge
    61
    Danke
    3
    Erhielt 1 Danke für 1 Beitrag

    Standard

    ich habe jetzt jedes LAR1 durch den nahcfolgenden Code ersetzt


    Code:
          TAR2                              // Anfangsadresse der aktuellen Instanz
          UD    DW#16#FFFFFF                // Ausblenden der Bereichskennung
          +D                                // Addiere Offset und Variablenadresse
          LAR1
    jedoch bekomme ich nun einen Systemfehler wenn ich mehr als einen FB benutze muss ich noch mehr beachten?

  10. #20
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Grisu88 Beitrag anzeigen
    es müsste doch auch ohne

    Code:
    UD    DW#16#FFFFFF
    gehen oder?
    Beim Addieren von Adressen darf nur eine der beiden Adressen eine Bereichskennung enthalten (bereichsübergreifende Adresse), die andere Adresse darf nur einen relativen Offset ohne Bereichskennung enthalten (bereichsinterne Adresse) - sonst würde ja beim Addieren die Bereichskennung "verdoppelt".

    - "L P##INSTANZVAR" lädt eine Adresse inklusive Bereichskennung
    - in AR2 ist die Anfangsadresse der aktuellen Instanz inklusive Bereichskennung

    Beim Addieren mit +D muß bei einer der beiden Adressen die Bereichskennung ausgeblendet/gelöscht werden - am einfachsten mit "UD DW#16#FFFFFF". Oder man addiert mit +AR1 - diese Operation berücksichtigt das Ausblenden der Bereichskennung. Es gibt viele Möglichkeiten, das AR2 korrekt zur Adresse der Instanzvariable zu addieren:
    Code:
    // von Siemens empfohlener Code:
          TAR2
          UD    DW#16#00FF_FFFF
          L     P##INSTANZVAR
          +D
          LAR1
    
    // oder:
          L     P##INSTANZVAR
          UD    DW#16#00FF_FFFF
          TAR2
          +D
          LAR1
    
    // oder:
          L     P##INSTANZVAR
          LAR1
          TAR2
          +AR1
    
    // oder:
          LAR1  P##INSTANZVAR
          TAR2
          +AR1
    Noch ein Hinweis:
    Das AR2 muß bei einem symbolischen Zugriff auf Instanz-Variablen in multiinstanzfähigen FB den vom System eingetragenen Inhalt vom Bausteinaufruf haben - falls AR2 verändert wird, dann muß vor einem solchen Zugriff das AR2 wiederhergestellt werden.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

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

    Grisu88 (10.01.2013)

Ähnliche Themen

  1. Lokalvariablen in Organisationsbausteinen
    Von Blueglasstalisman im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 23.08.2011, 14:33
  2. Lokalvariablen im DB weg
    Von Wassermann im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 28.04.2010, 19:35
  3. temporäre Lokalvariablen
    Von Earny im Forum Simatic
    Antworten: 21
    Letzter Beitrag: 08.12.2009, 08:48
  4. keine Lokalvariablen im Datenbaustein
    Von Hans.S im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 02.10.2009, 12:52
  5. Problem mit S7 Lokalvariablen
    Von mrcmm300 im Forum Simatic
    Antworten: 23
    Letzter Beitrag: 26.11.2007, 23:12

Lesezeichen

Berechtigungen

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