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

Ergebnis 1 bis 9 von 9

Thema: Bereichslängenüberschreitung bei Verwendung einer Schleife

  1. #1
    Registriert seit
    02.02.2012
    Beiträge
    65
    Danke
    6
    Erhielt 8 Danke für 8 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten Abend,

    ich versuche mich grad mal ein wenig in indirekter Addressierung und Teste damit auch ein bisschen rum. Habe mir jetzt mal eine Schleife zum Auslesen von mehreren Werten gebaut.Insgesamt sollen 8 Worte kopiert werden, leider geht die CPU immer in Stop mit der Meldung Bereichslängen überschreitung Schreiben.

    Anbei mal die Diagnosemeldung. Aus irgendeinem Grund will die CPU auf die Addresse die im AR2 steht im IDB zugreifen und schreiben!?
    Code:
    Diagnosepuffer:
    Ereignis 7 von 216:  Ereignis-ID 16# 2523
    Bereichslängenfehler beim Schreiben 
    Instanz-DB, Wortzugriff, Zugriffsadresse:    258
    Angeforderter OB: Programmierfehler-OB (OB 121)
    Prioritätsklasse:  1
    interner Fehler, kommendes Ereignis
    19:42:05.211  03.02.2012
    Code:
    // Startardresse des Structs ermitteln (Ziel)
          LAR1  P##IN                       // L 10.0
          TAR1  
          T     #LOOP_IN.TAR_ADDR
          
    // Startaddresse der Quelle an AR2 weitergeben 
          L     #LADDR                      // 256
          T     #LOOP_IN.SOURCE_ADDR
          SLD   3
          LAR2  
    
    // Schleife initialisieren
          L     #VAR_IN                     // 8 (Anzahl der Werte)
    INLP: T     #LOOP_IN.LOOP_CNT
          L     1                           // Schleifenzähler dekrementieren
          -I    
          T     #LOOP_IN.LOOP_CNT
    
    // Werte übernehmen
          L     PEW [AR2,P#0.0]
          T     LW [AR1,P#0.0]
    
    // Zieladdresse erhöhen
          L     #LOOP_IN.TAR_ADDR
          L     2
          +I    
          SLD   3
          LAR1  
    
    // Quelladdresse erhöhen
          L     #LOOP_IN.SOURCE_ADDR
          L     2
          +I    
          SLD   3
          LAR2  
    
    // Prüfe ob Schleife zuende
          L     #LOOP_IN.LOOP_CNT
          L     0
          <>I   
          SPB   INLP

    Gruß Marcel
    Geändert von marcel_ (03.02.2012 um 21:05 Uhr) Grund: was vergessen
    Zitieren Zitieren Bereichslängenüberschreitung bei Verwendung einer Schleife  

  2. #2
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.732
    Danke
    314
    Erhielt 1.520 Danke für 1.282 Beiträge

    Standard

    Das ist nicht "irgendein Grund" sondern ein eher gravierender.

    In einem (multiinstanzfähigen) FB werden alle Zugriffe innerhalb des FB auf die Schnittstelle,
    sprich IN/OUT/IN-OUT/STAT über das AR2 gehändelt.
    Beim Aufruf des FB wird der Offset ins AR2 geschrieben, also der Start der Instanz im übergeordneten FB.

    Insofern, müsste man jetzt mal deine Schnittstelle des FB noch sehen ...

    Mfg
    Manuel
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

  3. #3
    Registriert seit
    14.10.2010
    Ort
    Telgte
    Beiträge
    654
    Danke
    97
    Erhielt 129 Danke für 99 Beiträge

    Standard

    Nabend Marcel,

    deine Loop-Schleife solltest du auch noch mal überarbeiten.
    Die dekrementiert normalerweise automatisch und beendet bei "Null" auch automatisch.
    Gruß
    Toki

    Nachtrag: Ich sehe gerade du hast deine Loop Funktion komplett selbst nachprogrammiert, sorry...
    Geändert von Toki0604 (03.02.2012 um 21:28 Uhr)
    Programmierumgebung: Step7 V5.5, WinCCflex2008-SP3, TIA-PortalV13, MicroWinV4.0

  4. #4
    Registriert seit
    02.02.2012
    Beiträge
    65
    Danke
    6
    Erhielt 8 Danke für 8 Beiträge

    Standard

    Zitat Zitat von MSB Beitrag anzeigen
    Das ist nicht "irgendein Grund" sondern ein eher gravierender.

    In einem (multiinstanzfähigen) FB werden alle Zugriffe innerhalb des FB auf die Schnittstelle,
    sprich IN/OUT/IN-OUT/STAT über das AR2 gehändelt.
    Beim Aufruf des FB wird der Offset ins AR2 geschrieben, also der Start der Instanz im übergeordneten FB.

    Insofern, müsste man jetzt mal deine Schnittstelle des FB noch sehen ...

    Mfg
    Manuel
    Der Baustein ist Multiinstanzfähig. Hab aber nicht vor ihn als Multiinstanz zu verwenden.
    Zum testen habe ich ihn einfach im OB1 aufgerufen.

    Wenn ich dass jetzt richtig verstanden habe, sollte also nur ein FB der als Multiinstanz aufgerufen wird das AR2 benötigen!?

    Habe jetzt nocheinmal den FB als AWL Quelle angehängt.

    Gruß Marcel
    Angehängte Dateien Angehängte Dateien
    Geändert von marcel_ (03.02.2012 um 22:12 Uhr) Grund: awl-quelle hinzugefügt

  5. #5
    Registriert seit
    14.10.2010
    Ort
    Telgte
    Beiträge
    654
    Danke
    97
    Erhielt 129 Danke für 99 Beiträge

    Standard

    Code:
          
          L     #anzahl_Input      //dein Eingangswert
    anz:  T     #anzahl_temp       //eine Temp-Variable
    
    // hier deine Kopierfunktionen
    
          L     #anzahl_temp
          LOOP  anz
    Weil ich es gerade zu spät verstanden habe, hier noch mal was ich meinte
    Gruß
    Toki
    Programmierumgebung: Step7 V5.5, WinCCflex2008-SP3, TIA-PortalV13, MicroWinV4.0

  6. Folgender Benutzer sagt Danke zu Toki0604 für den nützlichen Beitrag:

    marcel_ (04.02.2012)

  7. #6
    Registriert seit
    02.02.2012
    Beiträge
    65
    Danke
    6
    Erhielt 8 Danke für 8 Beiträge

    Standard

    Danke für den Tipp
    Immerhin ein paar Zeilen gespart^^.

  8. #7
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.732
    Danke
    314
    Erhielt 1.520 Danke für 1.282 Beiträge

    Standard

    Zitat Zitat von marcel_ Beitrag anzeigen
    Der Baustein ist Multiinstanzfähig. Hab aber nicht vor ihn als Multiinstanz zu verwenden.
    Zum testen habe ich ihn einfach im OB1 aufgerufen.

    Wenn ich dass jetzt richtig verstanden habe, sollte also nur ein FB der als Multiinstanz aufgerufen wird das AR2 benötigen!?
    Du hast das nur teilrichtig verstanden, Multiinstanzfähigkeit ist eine Option, die du beim erstellen des Bausteins festlegst.
    Wenn du ihn mit einem normalen IDB aufrufst, dann wird als AR2 Offset halt 0 übergeben, aber die Schnittstellenadressen werden
    intern immer noch als Offset zum AR2 verwendet.

    Wenn der FB hingegen nicht multiinstanzfähig ist, dann wird intern direkt auf DIB, DIW und Co. zugegriffen.

    Also spielt die Tatsache, wo und wie du den FB aufrufst nicht die geringste Rolle.

    Mfg
    Manuel
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

  9. Folgender Benutzer sagt Danke zu MSB für den nützlichen Beitrag:

    marcel_ (04.02.2012)

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

    Standard

    Nur mal auf die Schnelle nachgeschaut, da sind noch einige Fehlerchen drin.

    1. Du lädst P##IN (Pointer) nach #LOOP_IN.TAR_ADDR, behandelst das aber später wie eine normale Int!


    // Zieladdresse erhöhen
    L #LOOP_IN.TAR_ADDR
    L 2
    +I
    SLD 3
    LAR1

    sollte dann eigentlich

    // Zieladdresse erhöhen
    L #LOOP_IN.TAR_ADDR
    L 2
    SLD 3
    +D
    T #LOOP_IN.TAR_ADDR
    LAR1

    heißen.


    // Quelladdresse erhöhen
    L #LOOP_IN.SOURCE_ADDR
    L 2
    +I
    SLD 3
    LAR2

    da fehlt auch etwas:

    // Quelladdresse erhöhen
    L #LOOP_IN.SOURCE_ADDR
    L 2
    +I
    T #LOOP_IN.SOURCE_ADDR
    SLD 3
    LAR2


    PS: zusätzlich gelten natürlich die Ausführungen von MSB.
    Daher sollte vor Verwendung des AR2 dieses gesichert und nach Nutzung wieder hergestellt werden.
    Geändert von Ralle (03.02.2012 um 22:39 Uhr)
    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

  11. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    marcel_ (04.02.2012)

  12. #9
    Registriert seit
    02.02.2012
    Beiträge
    65
    Danke
    6
    Erhielt 8 Danke für 8 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Soo... FB als nicht Multiinstanzfähig gekennzeichnet sowie eure Änderungen durchgeführt und Funktioniert

    Danke an euch

Ähnliche Themen

  1. Problem bei einer Such-Schleife
    Von Imker im Forum Simatic
    Antworten: 37
    Letzter Beitrag: 26.01.2012, 19:40
  2. Realisierung einer Schleife
    Von simon-brl im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 05.07.2011, 20:56
  3. Zyklisch bei Verwendung
    Von Earny im Forum HMI
    Antworten: 5
    Letzter Beitrag: 13.01.2010, 08:22
  4. Antworten: 5
    Letzter Beitrag: 11.06.2008, 16:08
  5. Antworten: 6
    Letzter Beitrag: 21.11.2005, 18:27

Lesezeichen

Berechtigungen

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