Step 7 Problem mit Loop

Babu

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

warum funktioniert diese Schleife nicht ? Die Schleife wird nicht beendet... Bereichslängenfehler beim Lesen und beim Schreiben

Benutzt wird eine 315-2 DP CPU

[
U #Lesen.NDR
FP #neueDatenPuls
S #neueDatenEmpfangen


U #neueDatenEmpfangen
SPBN n1
L #Lesen.LEN
L 0
<>I
SPBN n2
L #Lesen.LEN
L 2
-I
T #Laenge
n2: NOP 0

LAR1 P##Stringout
L #Laenge
T DBB [AR1,P#1.0]
LAR2 P##daten
n: T #AnzahlLoops
L DBB [AR2,P#0.0]
T DBB [AR1,P#2.0]
+AR1 P#1.0
+AR2 P#1.0
L #AnzahlLoops
LOOP n


R #neueDatenEmpfangen

n1: NOP 0

U #Lesen.ERROR
= #Lesen.R
]
 
Zuletzt bearbeitet:
Code:
      U     #Lesen.NDR
      FP    #neueDatenPuls
      S     #neueDatenEmpfangen


      U     #neueDatenEmpfangen
      SPBN  n1
      L     #Lesen.LEN
      L     0
      <>I   
      SPBN  n2
      L     #Lesen.LEN
      L     2
      -I    
      T     #Laenge
n2:   NOP   0

      LAR1  P##Stringout
      L     #Laenge
      T     DBB [AR1,P#1.0]
      LAR2  P##daten
n:    T     #AnzahlLoops
      L     DBB [AR2,P#0.0]
      T     DBB [AR1,P#2.0]
      +AR1  P#1.0
      +AR2  P#1.0
      L     #AnzahlLoops
      LOOP  n


      R     #neueDatenEmpfangen

n1:   NOP   0

      U     #Lesen.ERROR
      =     #Lesen.R

- Mit welchem DB soll die Schleife arbeiten? - da ist nirgends ein "AUF DB ..."
- wenn #Lesen.LEN = 0 ist, dann wird #Laenge nicht initialisiert, aber trotzdem die Schleife in zufälliger Länge ausgeführt
- wenn #Lesen.LEN = 1 ist, dann wird #Laenge auf -1 gesetzt und die Schleife würde ca. 65535 mal ausgeführt werden

- Ist der Code in einem FC oder einem FB?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Schleife soll mit zugehörigem Instanz DB200 arbeiten.
Der Code steht in einem FB.
Davor steht ein P_RCV Baustein zum einlesen eines Arrays of Char über RS232.
Danke für die schnelle Antwort
 
Wenn die Schleife auf den Instanz-DB zugreifen soll, dann muß anstatt "DBB [...]" mit "DIB [...]" zugegriffen werden, oder alternativ der IDB als DB geöffnet werden.

Wenn ein FB als "multiinstanzfähig" markiert ist, dann darf da das AR2 nicht verändert werden (Suchbegriffe: multiinstanz Offset AR2) bzw. muß vor einer Veränderung (in TEMP) gesichert werden, ab da kann nicht mehr auf Instanzvariablen zugegriffen werden!, und vor Zugriffen auf Instanzvariablen muß AR2 wiederhergestellt werden.
Sicherer: speicherindirekte Adressierung anstatt registerindirekter Adressierung benutzen, dann braucht AR2 nicht verändert werden.
Außerdem: bei der indirekten Adressierung muß man zur Instanz-Adresse noch den Multiinstanz-Offset aus AR2 addieren

Harald
 
Hallo,
ich konnte mich noch nicht weiter mit dem Thema beschäftigen.
Werde aber Rückmeldung geben wenn ich Erfolg hatte.
Danke für die Hilfe :cool:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier ein ein paar anderungen in Ihre code.
Code:
[COLOR=#333333][FONT=Verdana]U #Lesen.NDR[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]FP #neueDatenPuls[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]S #neueDatenEmpfangen[/FONT][/COLOR]

U #neueDatenEmpfangen
SPBN n1
L #Lesen.LEN
L 0
<>I 
SPBN n2
L #Lesen.LEN
L 2
-I 
T #Laenge
[COLOR=#ff0000]//n2: NOP 0         // Bei lange 0 sprung zu R #neueDatenEmpfangen[/COLOR]
[COLOR=#0000ff]TAR2  #Ret_AR2     //Inhalt AR2 Retten  Ret_AR2 = Temp DWORD[/COLOR]
LAR2 P##daten       //Diese instruction nach oben geschoben 
LAR1 P##Stringout
L #Laenge
T DBB [AR1,P#1.0]
[COLOR=#ff0000]//LAR2 P##daten       // Wenn diese instuktion hier aktiv ist komt #AnzahlLoops dass adresse von #daten und nicht die inhalt von #Laenge[/COLOR]
n: T #AnzahlLoops
L DBB [AR2,P#0.0]
T DBB [AR1,P#2.0]
+AR1 P#1.0
+AR2 P#1.0
L #AnzahlLoops
LOOP n


[COLOR=#0000ff]LAR2 #Ret_AR2     //AR2 zuruck setzen[/COLOR]
n2:R #neueDatenEmpfangen     


n1: NOP 0


U #Lesen.ERROR
= #Lesen.R

Gruss,
Joop
 
Zurück
Oben