Bereichslängenüberschreitung bei Verwendung einer Schleife

marcel_

Level-1
Beiträge
65
Reaktionspunkte
6
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:confused:!?
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
 
Zuletzt bearbeitet:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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...
 
Zuletzt bearbeitet:
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
 

Anhänge

  • fb325.txt
    2,1 KB · Aufrufe: 10
Zuletzt bearbeitet:
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
 
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
 
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.
 
Zuletzt bearbeitet:
Zurück
Oben