Schleife zum Durchsuchen eines DB bringt SPS in Stopp

Krumnix

Level-3
Beiträge
1.454
Reaktionspunkte
190
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo.

Folgender Code wurde von mir programmiert um einen DB zu durchsuchen
und in diesem festzustellen, ob ein Bit auf 1 ist oder nicht.
Nur wenn ich diesen FC in der SPS aktiviere geht diese sofort auf Stopp
und meint ein DB sei nicht geladen. Jedoch verwende ich nirgendes diesen
DB, der die CPU erwartet.
Die Parameter von extren:

START_ADR = 1 (Byte 1 soll als 1. gelesen werden, da in Byte 0 nix zum Auswerten drin steht)
SOURCE_DB = DB100 (in der SPS vorhanden mit 456 Byte Länge)
COUNT = 300

Code:
      U     #Message_Activ
      R     #Message_Activ
      L     #START_ADR
      T     #Adress_Puffer
      L     #COUNT
      +I    
      T     #LAENGE
// SCHLEIFEN DURCHLAUF
LOOP: NOP   0
      AUF   #SOURCE_DB                  // WERT AUS QUELL_DB EINLESEN
      L     LW     3
      SLW   3
      LAR1  
      L     DBB [AR1,P#0.0]
      L     0                           // WERT MIT NULL VERGLEICHEN
      ==I   
      SPB   same
      UN    #Message_Activ              //ERGEBNISBIT SETZEN
      S     #Message_Activ
      BEA   
same: NOP   0
      L     #Adress_Puffer
      INC   1
      T     #Adress_Puffer
      L     #COUNT
      <=I   
      SPB   LOOP

Da ich den AUF[DB] in der Schleife drin habe, wäre meine Vermutung vielleicht, das ich zu oft diesen Aufrufe. Ist es möglich mit dieser Konstallation, das ist den Befehl AUF[DB] vor die Schleife lege und dieser die ganze Zeit dann für alle Schleifendurchgänge offen bleibt? Könnte es daran liegen?

Danke
 
Hallo.

Folgender Code wurde von mir programmiert um einen DB zu durchsuchen
und in diesem festzustellen, ob ein Bit auf 1 ist oder nicht.
Nur wenn ich diesen FC in der SPS aktiviere geht diese sofort auf Stopp
und meint ein DB sei nicht geladen. Jedoch verwende ich nirgendes diesen
DB, der die CPU erwartet.
Die Parameter von extren:

START_ADR = 1 (Byte 1 soll als 1. gelesen werden, da in Byte 0 nix zum Auswerten drin steht)
SOURCE_DB = DB100 (in der SPS vorhanden mit 456 Byte Länge)
COUNT = 300

Code:
      U     #Message_Activ
      R     #Message_Activ
      L     #START_ADR
      T     #Adress_Puffer
      L     #COUNT
      +I    
      T     #LAENGE
// SCHLEIFEN DURCHLAUF
LOOP: NOP   0
      AUF   #SOURCE_DB                  // WERT AUS QUELL_DB EINLESEN
      L     LW     3
      SLW   3
      LAR1  
      L     DBB [AR1,P#0.0]
      L     0                           // WERT MIT NULL VERGLEICHEN
      ==I   
      SPB   same
      UN    #Message_Activ              //ERGEBNISBIT SETZEN
      S     #Message_Activ
      BEA   
same: NOP   0
      L     #Adress_Puffer
      INC   1
      T     #Adress_Puffer
      L     #COUNT
      <=I   
      SPB   LOOP

Da ich den AUF[DB] in der Schleife drin habe, wäre meine Vermutung vielleicht, das ich zu oft diesen Aufrufe. Ist es möglich mit dieser Konstallation, das ist den Befehl AUF[DB] vor die Schleife lege und dieser die ganze Zeit dann für alle Schleifendurchgänge offen bleibt? Könnte es daran liegen?

Danke

Ich würde mal sagen da hast Du eine Endlosschleife. ;)
Du zählst Deine Count Variable nicht zurück.
Am Label muss stehen:
Code:
LOOP: T #Count
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein ;)

Ich zähle meine Startadresse hoch und vergleiche sie mit Count.
Wenn sie nicht gleich sind, springt er zu loop zurück. Ansonst ist der Baustein fertig, wenn Adresse und Count gleich sind
 
Er sagt ja das er den DB nicht finden kann. Steht in der Diagnose auch nach welchem DB er sucht? Wie ist #Source_DB deklariert und was steht an deinem Eingang vom Baustein? Ich meine das es SLD und nicht SLW sein sollte.
Warum schreibst du
Code:
L LW 3
Was steht da drin?
 
Naja er lädt ja das LW3.... damit ist SLW 3 nicht falsch.
Aber das LW 3 ist etwas seltsam anmutend.

Haha, ich weiss schon, gerade eingefallen.
Der INC ist ein 8-Bit Befehl... da zählste nicht bis 300......

Probier mal:

L #Adress_Puffer
L 1
+I
T #Adress_Puffer

lG
Karl
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ...
mich würde hier auch (genau wie Marlob) interessieren, was es mit dem LW3 auf sich hat. Es wird in der Schleife nicht verändert ... Wäre es nicht sinniger für die Adressierung den Adress_Puffer her zu nehmen ?

Des weiteren : was hast du für eine CPU und bei welchem Wert steht die Zyklus-Überwachungszeit ?

Der INC-Befehl wäre mir auch unsympatisch ... siehe Borromeus.

Gruß
LL
 
CPU 319F-3PN/DP 4MB-Card.
Zykluszeit normal 3ms. Welche das System hat, wenn der Fehler kommt,
keine Ahnung. Die Anlage steht grad 8000 KM von mir weg ^^

LW3 bezieht sich auf den Bereich in der Variable #Adress_Puffer.

Der Baustein hatte bis jetzt immer funktioniert. Aber die maximale Länge,
die ich durchsucht habe war bis 30 oder 40. Mit 300 ist es das erste Mal.

Dann könnte der INC-Befehl wirklich das Problem sein.
Ich werde ads mal testen lassen.

Danke dafür
 
Zurück
Oben