Step 7 SPS Stopp nach Bereichslängenfehler

Nordischerjung

Well-known member
Beiträge
804
Punkte Reaktionen
107
Zuviel Werbung?
->Hier kostenlos registrieren
Moin,

mein Kunde hat ne ältere Anlage, mit der er ab und an Probleme hat bzw. die SPS geht in den Stopp.

Es komt dann der folgender Fehler im Diagnosepuffer.

Code:
Ereignis 1 von 100:  Ereignis-ID 16# 4562
STOP durch  Programmierfehler (OB nicht geladen oder nicht möglich, bzw. kein FRB vorhanden ) 
Unterbrechungstelle im Anwenderprogramm:  Zyklisches Programm (OB 1)  
Prioritätsklasse:    1
FB-Nummer:    11
Bausteinadresse:    186 
Bisheriger Betriebszustand: RUN
Angeforderter Betriebszustand: STOP (intern)
interner Fehler, kommendes Ereignis
16:24:03.890  16.02.2021
(Kodierung: 16# 4562  FF84  8E70  0101  000B  00BA)


Ereignis 2 von 100:  Ereignis-ID 16# 2523
Bereichslängenfehler beim Schreiben 
###0   Zugriffsadresse:      0
Angeforderter OB: Programmierfehler-OB (OB 121)
Prioritätsklasse:  1
interner Fehler, kommendes Ereignis
16:24:03.880  16.02.2021
(Kodierung: 16# 2523  0179  0000  0000  0000  0000)

Bei Gehe zu.. komme ich an die rot makierte Stelle

NW1

Code:
      AUF   #DB_zum_Speichern           //Positionsspeicher DB öffnen

      LAR1  P#0.0                       //Pointer auf Anfangsadresse im DB


      L     20                          //Anzahl Schleifen übergeben max 20 Werte im DB
M000: T     #Loop_Zaehler

      L     L#0                         //zu schreibender Wert
      T     DBD [AR1,P#0.0]             //in das entsprechende DBD schreiben

      +AR1  P#4.0                       //+ 4.0, da DINT

      L     #Loop_Zaehler               //Zähler wieder Laden und incrementieren

      LOOP  M000

NW2

Code:
      L     #Abstand
      T     #Temp_Abstand


      AUF   #DB_zum_Speichern           //Positionsspeicher DB öffnen

      LAR1  P#4.0                       //Pointer auf Anfangsadresse im DB hier erst das 2.DBD,da das 1.DBD 0 ist


      L     #Formnester_ohne_erstes     //Anzahl Schleifen übergeben
M001: T     #Loop_Zaehler

      L     #Temp_Abstand               //zu schreibender Wert
      T     DBD [AR1,P#0.0]             //in das entsprechende DBD schreiben

 [COLOR=#ff0000]     +AR1  P#4.0                       //+ 4.0, da DINT[/COLOR]

      L     #Abstand
      L     #Temp_Abstand               //Temp_Abstand um eine Position erhöhen
      +D    
      T     #Temp_Abstand

      L     #Loop_Zaehler               //Zähler wieder Laden und incrementieren

      LOOP  M001

NW3

Code:
      AUF   #DB_zum_Speichern           //Positionsspeicher DB öffnen

      LAR1  P#80.0                      //Pointer auf Anfangsadresse Offset im DB 



      L     20                          //Anzahl Schleifen übergeben max 20 Werte im DB
M002: T     #Loop_Zaehler

      L     L#0                         //zu schreibender Wert
      T     DBD [AR1,P#0.0]             //in das entsprechende DBD schreiben

      +AR1  P#4.0                       //+ 4.0, da DINT


      L     #Loop_Zaehler               //Zähler wieder Laden und incrementieren

      LOOP  M002

NW4

Code:
      AUF   #DB_zum_Speichern           //Positionsspeicher DB öffnen

      LAR1  P#160.0                     //Pointer auf Anfangsadresse Offset im DB 



      L     20                          //Anzahl Schleifen übergeben max 20 Werte im DB
M005: T     #Loop_Zaehler

      L     L#0                         //zu schreibender Wert
      T     DBD [AR1,P#0.0]             //in das entsprechende DBD schreiben

      +AR1  P#4.0                       //+ 4.0, da DINT


      L     #Loop_Zaehler               //Zähler wieder Laden und incrementieren

      LOOP  M005


Kann man das iwie abfangen?

Kann es sein das die Var "#Formnester_ohne_erstes" negativ ist und es dashalb zu diesem Überlauf kommt?
Diese Var wird hier berechnet

Code:
      L     #Anzahl_Formnester (DINT)
      L     L#1
      -D    
      T     #Formnester_ohne_erstes (DINT)

und wenn da nun mal eine 0 drin steht würde sie ja negativ werden.
Oder wovon kann das sonst kommen? Es ist nicht oft, vielleicht 1-2 x im Jahr oder so
 

funkey

Well-known member
Beiträge
253
Punkte Reaktionen
65
Als erstes würde ich den OB121 anlegen, dann geht die CPU nicht mehr in Stopp.

Der LOOP-Befehl macht folgendes: Dekrementiere AKKU1-L und springe, wenn AKKU1-L <> 0, also auch bei -1.
Somit spring er solange bis der Integer überläuft --> möglicherweise Zykluszeit-Problem, oder der DB zu klein wird --> CPU-Stopp ohne OB121

Am besten einfach #Anzahl_Formnester auf 0 prüfen und gegebenenfalls über die Schleife springen.

 
OP
Nordischerjung

Nordischerjung

Well-known member
Beiträge
804
Punkte Reaktionen
107
Zuviel Werbung?
->Hier kostenlos registrieren
Als erstes würde ich den OB121 anlegen, dann geht die CPU nicht mehr in Stopp.

Der LOOP-Befehl macht folgendes: Dekrementiere AKKU1-L und springe, wenn AKKU1-L <> 0, also auch bei -1.
Somit spring er solange bis der Integer überläuft --> möglicherweise Zykluszeit-Problem, oder der DB zu klein wird --> CPU-Stopp ohne OB121

Am besten einfach #Anzahl_Formnester auf 0 prüfen und gegebenenfalls über die Schleife springen.


Der OB121 war drin und ist trotzdem nach etlichen Meldungen in den Stopp gegangen, den habe ich jetzt erst einmal rausgenommen um zu gucken welche Fehlerstelle es ist.

Du meinst wenn <0 dann Spurng über die Schleife?
 

Onkel Dagobert

Well-known member
Beiträge
4.948
Punkte Reaktionen
946
.. Du meinst wenn <0 dann Spurng über die Schleife?
Es wäre besser wenn du die Ursache findest, wegen der ein nicht gewünschter Wert in der Variable steht. Möglicherweise hat ein sinnvoller Wert ja eine fundamentale Bedeutung für die weitere Bearbeitung. So etwas soll es ja in ganz seltenen Fällen geben.
 
Oben