Todes-Schleife...

Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, findest du aber nicht auch das eine Schleife von 100 Zyklen eine CPU nicht zum Stop bringen sollte?!

Ich mein, es sind im Endeffekt 100x das gleiche... L L +I T... also... würde mich stutzig machen.

Kommunikation steht bei uns auf 20 oder 10 Prozent.

Ich will doch eigentlich nur ne Plausible erklärung wieso ich gugn darf und die anderen net....
Fühl mich ja geehrt aber Toll isses net unbedingt....
 
Sorry... habs grad nochma durchgelesen deinen Text...

Hast du den FC7 nun mal unbeobachtet gelassen oder nicht? Versuch das mal ohne den FC7 zu beobachten. Einfach auf Run und gugn obs Run bleibt STRG + D :)

Bei Stop -> STRG + I und Neustart :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nachtrag: habe die HW-Konfig aufgeräumt, alle Profibus-Teilnehmer (waren nicht angeschlossen raus. CPU Einstellungen auf Standard.
Den OB1 aufgeräumt, da steht jetzt nur noch der Aufruf des FC7 drin.
100 geht nicht, 50 geht.
Konstante für Schleifenende durch MW ersetzt. So kann ich die Schleifendurchläufe vom OB1 aus steuern.
Ohne den FC7 zu beobachten gehen auch 16000. Zykluszeit 121H. Allerdings geht die CPU bei der Funktion "erreichbare Teilnehmer" auf STOP. (Wollte das tun, weil in der CPU noch andere Baustein, z.B. der OB80 sind. Die wollte ich aus "erreichbare Teilnehmer/Baustein löschen".
OB80 und (OB35 der kostet ja eventuell auch Rechenzeit) rausgschmissen.
Ohne OB80: 8000 Schleifen geht, bei 9000 geht die CPU auf Stop. max.Zykluszeit bei 8000 92h=146, Grenze in HW-Konfig 150, das paßt schon.
Weitere Erkenntnis: Die Anwesenheit des OB80 reichte aus. Allerdings darf er ja nicht ohne weiteres mehrmals pro Zyklus aufgerufen werden.
Zielsystem Urgelöscht, nur OB1 und FC7 geladen.
8000 Schleifen geht, bei 9000 geht die CPU auf Stop.
OB80 hinzugefügt.
16000 Schleifen geht, bei 20000 geht die CPU auf Stop.
Im OB80 den SFC43 aufgerufen.
20000 Schleifen geht. max. Zykluszeit 163h
32760 Schleifen geht. max. Zykluszeit 23eh
100 Schleifen mit Beobachten des FC7 geht nun auch.
Wenn die Schleife mit beobachtet wird, ist das Beobachten enorm langsam (subjektiv, Fortschritt des grünen Balkens).
Max.Zykluszeit für 100 Durchläufe wenn der FC7 beobachtet wird: 163h.
Die CPU ist 6ES7-2AF03-0AB0, Hardware 1, Firmware 1.2.0.
Max.Zykluszeit für 1000 Durchläufe wenn der FC7 beobachtet wird: df0h, das sind 3.5 Sekunden.
20000 Durchläufe mit beobachten: Die CPU bleibt in RUN. Das Beobachten funktioniert eigentlich nicht mehr, da Step7 meldet, die Anweisungen würden nicht bearbeitet. Der Diagnosepuffer meldet alle 150ms Zykluszeitübeschreitung und addiert die gesamte Zeit auf. Das geht bis in die 42 Sekunden.
Fazit: Mit einem OB80 der SFC43 aufruft, kannst du das Aussteigen der CPU verhindern. Ob du aber etwas steuerst, was wegen der Zykluszeiterhöhung durch beobachten schiefgeht, mußt du selbst wissen.
Am Ende könnte es sinnvoll sein, diesen Baustein zu "schützen", damit ihn niemand aus versehen beobachtet...
 
Ändert sich denn etwas wenn die CPU auf Prozessbetrieb steht und der Parameter für die max. Zykluszeitverlängerung entsprechend gesetzt ist?

Auf der Siemens Seite (Beitrag 23836167) steht dass bei Schleifen vor jedem Schleifendurchlauf der Status beim Beobachten aktualisiert wird.
 
@Zottel:
Danke, endich einer wo es mal probiert, also ist die Baustelle nicht verflucht sondern es scheint ansatzweise "normal" zu sein.
Nun ist halt die Frage "was ist an meinem Rechner 'unnormal'?" Ich bin bisher der einzige wo es beobachten kann, was ich ja nicht verstehe.

Desweiteren habe ich dieses "Schleife-Aussteig-Problem" noch nie erlebt... weil ich oft gezwungenermaßen Schleifen verwenden muss um bestimmte Problemchen zu lösen. Und diese Schleifenvorgänge sind bedeutend komplexer und bringen die CPU auch nicht ins Schwitzen (ob beobachtet oder nicht (also bei meinem Rechner jedenfalls)).
Das was ich da oben geschrieben habe an Schleife ist ein Witz...

Hier mal ein Auszug von einem Teilprogramm (jaaaa, da sind die U( ) drin :P):

[Siehe Folge-Post]

Hmm... sollte ich mal bei Siemens anrufen und nach einer Erklärung/Begründung anfragen. Weil es mir ja doch sorgen macht das ich Bausteine schreibe wo 99% der Restlichen SPS-Bevölkerung nicht Anschauen darf da sonst die CPU in Stop geht

Mit freundlichen Grüßen,
Hawkster
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
      NOP   0
//#############################################################
//### Wenn Stage 6 aktiv
//###  -> Netzwerk aktiviern
//#############################################################        
      U     #Stage_6.Stage_Start
      SPB   SST6
      SPA   EST6

SST6: NOP   0

      L     1
      T     #Schleife.Zaehler

L150: NOP   0
//#############################################################
//### START:  Loetpunkte aufsplitten
//#############################################################        

//#############################################################
//### QUELLE: Errechnen der Stelle im Stage 5-Block für Datensatz
//#############################################################        
      L     #Schleife.Zaehler
      L     1                           //=> Zähler wird bei 1 Initailisert, deswegen 0 für Multiplikator
      -I    
      L     "DB_Sold_Mgr_1".Parameter.Loetpunkt_Groesse    //==> Speichergröße (100 Byte pro Datensatz)
      *I    
      L     "DB_Sold_Mgr_1".Parameter.Stage_5_Startbyte    //==> Startbyte (Byte 332)
      +I    
      T     #Stage_6.src_Addresse_Offset

//#############################################################
//### QUELLE: Aufbau des Ziel-Any-Pointers
//#############################################################        
      L     P##src_Any_Pointer
      LAR1  

      L     W#16#1002                   //Typ BYTE
      T     LW [AR1,P#0.0]

      L     "DB_Sold_Mgr_1".Parameter.Loetpunkt_Groesse    //Anzahl Bytes
      T     LW [AR1,P#2.0]

      L     "DB_Sold_Mgr_1".Parameter.Temp_Job_DB    //Ziel-DB
      T     LW [AR1,P#4.0]

      L     #Stage_6.src_Addresse_Offset    //Anfang der Quelle
      SLD   3
      OD    DW#16#84000000
      T     LD [AR1,P#6.0]

//#############################################################
//### ZIEL: Errechnen der Stelle im Stage 6-Block für Datensatz
//#############################################################        
      L     50                          //<== Größe eines auftrags
      L     2
      *I    
      T     #Stage_6.dest_Data_Size     //<== Loetpunkt stellt 2 Aufträge das

      L     #Schleife.Zaehler
      L     1                           //=> Zähler wird bei 1 Initailisert, deswegen 0 für Multiplikator
      -I    
      L     #Stage_6.dest_Data_Size     //==> Speichergröße (100 Byte für 2 Aufträge)
      *I    
      L     "DB_Sold_Mgr_1".Parameter.Stage_6_Startbyte    //==> Startbyte (Byte 6832)
      +I    
      T     #Stage_6.dest_Addresse_Offset

//#############################################################
//### ZIEL: Aufbau des Ziel-Any-Pointers
//#############################################################        
      L     P##dest_Any_Pointer
      LAR1  

      L     W#16#1002                   //Typ BYTE
      T     LW [AR1,P#0.0]

      L     #Stage_6.dest_Data_Size     //Anzahl Bytes
      T     LW [AR1,P#2.0]

      L     "DB_Sold_Mgr_1".Parameter.Temp_Job_DB    //Ziel-DB
      T     LW [AR1,P#4.0]

      L     #Stage_6.dest_Addresse_Offset    //Anfang der Quelle
      SLD   3
      OD    DW#16#84000000
      T     LD [AR1,P#6.0]



//#############################################################
//### Daten temp. Zwischenspeichern
//#############################################################        
      CALL  "BLKMOV"
       SRCBLK :=#src_Any_Pointer
       RET_VAL:=#Stage_6.BLKMOV_Return
       DSTBLK :="DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Original

//#############################################################
//### Orignal-Daten aufsplitten und speichern in Auftrags-Daten
//#############################################################        
      L     0
      T     #Clear_Int

      CALL  "FILL"
       BVAL   :=#Clear_Int
       RET_VAL:=#iDummy
       BLK    :="DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Kamera

      CALL  "FILL"
       BVAL   :=#Clear_Int
       RET_VAL:=#iDummy
       BLK    :="DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Laser

//#############################################################
//### Kamera-Daten
//#############################################################        
      SET  
      S     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Kamera.Kamera.Kamera_Punkt

      L     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Original.Kamera.Roboter_Index_Nummer
      T     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Kamera.Kamera.Roboter_Index_Nummer

      L     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Original.Kamera.Kamera_Prog
      T     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Kamera.Kamera.Kamera_Prog

//#############################################################
//### Laser-Daten
//#############################################################        
      SET  
      S     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Laser.Laser.Laser_Punkt

      L     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Original.Laser.Roboter_Index_Nummer
      T     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Laser.Laser.Roboter_Index_Nummer

      L     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Original.Laser.Laser_Dummy_Nr
      T     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Laser.Laser.Laser_Dummy_Nr

      U     "DB_Sold_Mgr_1".Berechnung.Nachloeten
      SPB   NL_1
      UN    "DB_Sold_Mgr_1".Berechnung.Nachloeten
      SPB   NL_0
      SPA   NL_E

NL_1: NOP   0                           //<== Nachloeten ist aktiv!

      L     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Original.Laser.Laser_Nachloeten_Nr
      T     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Laser.Laser.Laser_Scharf_Nr

      SPA   NL_E

NL_0: NOP   0                           //<== Nachloeten ist Inaktiv!

      L     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Original.Laser.Laser_Scharf_Nr
      T     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Laser.Laser.Laser_Scharf_Nr

      SPA   NL_E

NL_E: NOP   0

//#############################################################
//### Auftragsmuster beschreiben
//###   -> Auftragsmuster wird Anhand der Daten von Stage_1_Stage_2 errechnet
//#############################################################  

      L     #Schleife.Zaehler
      L     1
      -I    
      L     2                           //==> Speichergröße (2 Byte)
      *I    
      L     4                           //==> Startbyte (Byte 4)
      +I    
      L     P#1.0                       //==> Ins Pointer-Format bringen
      *D    
      T     #Stage_6.Offset_Auftrag_Pointer    //<== Pointer vom Ziel der Addresse

      AUF   "DB_Sold_Mgr_1_Job_1"
      L     DBW [#Stage_6.Offset_Auftrag_Pointer]
      L     #Daten_Allgemein.Arbeitsbereich_Startbyte
      -I    
      T     #Stage_6.Offset_Auftrag

      L     #Stage_6.Offset_Auftrag
      L     100
      /I    
      L     1
      -I    
      T     #Stage_6.Schiebewert_Muster

//#############################################################
//### ENTSCHEIDUNG: Schiebewert größer als ein DW
//###   -> Auftragsmuster 1_2 löschen und mit 2_2 fortsetzen
//#############################################################  
      U(    
      L     #Stage_6.Schiebewert_Muster
      L     31
      <=I  
      )    
      SPB   A1_2
      SPB   A2_2

A1_2: NOP   0

      L     #Stage_6.Schiebewert_Muster
      L     "DB_Sold_Mgr_1".Berechnung.Auftragsmuster_1_2
      SRD  
      SLD  
      T     #Stage_6.Auftragsmuster_1_2

      L     #Stage_6.Auftragsmuster_1_2
      T     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Kamera.Auftragsmuster_1_2
      T     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Laser.Auftragsmuster_1_2

      L     "DB_Sold_Mgr_1".Berechnung.Auftragsmuster_2_2
      T     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Kamera.Auftragsmuster_2_2
      T     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Laser.Auftragsmuster_2_2


      SPA   AEND

A2_2: NOP   0

      L     #Stage_6.Schiebewert_Muster
      L     32
      -I    
      L     "DB_Sold_Mgr_1".Berechnung.Auftragsmuster_2_2
      SRD  
      SLD  
      T     #Stage_6.Auftragsmuster_2_2

      L     0
      T     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Kamera.Auftragsmuster_1_2
      T     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Laser.Auftragsmuster_1_2

      L     #Stage_6.Auftragsmuster_2_2
      T     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Kamera.Auftragsmuster_2_2
      T     "DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert.Laser.Auftragsmuster_2_2


      SPA   AEND


AEND: NOP   0


//#############################################################
//### Daten temp. Zwischenspeichern
//#############################################################        
      CALL  "BLKMOV"
       SRCBLK :="DB_Sold_Mgr_1_Job_1".Stage_6_Temp.Modifiziert
       RET_VAL:=#Stage_6.BLKMOV_Return
       DSTBLK :=#dest_Any_Pointer


//#############################################################
//### Ende:   Umkopieren der Loetpunkte
//#############################################################        
      U(    
      O(    
      L     #Schleife.Zaehler
      L     64
      >=I  
      )    
      O(    
      L     #Schleife.Zaehler
      L     "DB_Sold_Mgr_1_Job_1".Stage_1_Stage_2.Letzter_Datensatz
      >=I  
      )    
      )    
      SPB   E150

      L     #Schleife.Zaehler
      L     1
      +I    
      T     #Schleife.Zaehler

      SPA   L150

E150: NOP   0

      SET  
      S     "DB_Sold_Mgr_1".Status.Stage_6_Fertig

      U     "DB_Sold_Mgr_1".Parameter.Stage_6_BEA
      BEB  


EST6: NOP   0
 
@Zottel:
Nun ist halt die Frage "was ist an meinem Rechner 'unnormal'?" Ich bin bisher der einzige wo es beobachten kann, was ich ja nicht verstehe.
Das Beobachten funktioniert ungefähr so:
- Das PG teilt der CPU die Adresse mit, ab der beobachtet werden soll.
- Die CPU speichert die Registerinhalte, die sich beim Ausführen jeder Anweisung ergeben. Das tut sie im Normalbetrieb nicht.
- Das PG fordert periodisch so einen Auszug an
Was ich nicht weiß, ist:
Was macht die CPU
- In Schleifen. Normalerweise beschränkt sich die Anzahl der "beobachteten" Anweisungen mehr oder weniger auf den Code im sichtbare Fenster. Weiß nicht, woher die kommt, ob das PG eine Endadresse, eine Anzahl von Anweisungen vorgibt, oder die CPU ein Limit hat oder was auch immer.
Reine Spekulation: In Schleifen könnte es wohl sein, daß die CPU pro Ausführung speichert. Möglicherweise wird für ein "langsames" PG die Liste sehr lang und die CPU muß irgendwelchen Aufwand zum Speichermanagement betreiben.
Hier mal ein Auszug von einem Teilprogramm (jaaaa, da sind die U( ) drin :P):
Nützt nicht ganz viel: Wegen der ganzen symbolischen Namen & UDTs läßt sich das nicht ohne Kontext übersetzen...
Hmm... sollte ich mal bei Siemens anrufen und nach einer Erklärung/Begründung anfragen. Weil es mir ja doch sorgen macht das ich Bausteine schreibe wo 99% der Restlichen SPS-Bevölkerung nicht Anschauen darf da sonst die CPU in Stop geht
Ja wäre interessant. Zum Abschluß: Ich habe mit IBH-Link und MPI-Baudrate 187,5k getestet. Man könnte die MPI Baudrate reduzieren, um ein "langsameres" PG zu simulieren.
 
Ändert sich denn etwas wenn die CPU auf Prozessbetrieb steht und der Parameter für die max. Zykluszeitverlängerung entsprechend gesetzt ist?
Ich habe mal Prozessbetrieb eingestellt.
Mit "zulässige Verlängerung"
5 ms kann ich aus "Beobachten" keine Variable mehr steuern, Meldung "D0AA, Zeitlimit aus Prozessbetrieb überschritten"
15ms: dasselbe.
40ms: Ich kann steuern, beobachten, 8000 Durchläufe gehen, 9000 bringen den STOP.
 
Zurück
Oben