TIA Fehlermeldung OB80 "Cycle Time" überschritten

Zuviel Werbung?
-> Hier kostenlos registrieren
bist du eigentlich sicher, dass der geschickte String ein S7-String ist und kein nullterminierter?
+1.
Beobachte #StringActuallLength.
Du kannst auch #StringActuallLength mit IN_RANGE testen.
Wenn IN_RANGE (innerhalb von 0 .. 40) dann die FOR Schleife durchführen. Wenn nicht, dann mit ein Alarm abbrechen.
 
Um das Ganze etwas les- und wartbarer zu gestalten, vor allem wenn es sich noch in der Entwicklungsphase befindet, würde ich mir ein paar Hilfsfunktionen schreiben, die Daten des gewünschten Datentyps aus einem Bytearray lesen und den Array-Index entsprechend weitersetzen. Bei dir dann Funktionen wie DataGetUsint oder DataGetString. Mal angenommen diese Funktion bekommt als Parameter IN das Array, und als IN_OUT die aktuelle Position im Array, dann könnte die Auswertung so aussehen:

Code:
#AnzBewegungen := DataGetUsint(data := #data, pos := #pos);
#BewegungLength := DataGetUsint(data := #data, pos := #pos);
#BewegungID := DataGetUsint(data := #data, pos := #pos);
#BewegungName := DataGetString(data := #data, len := #BewegungLength, pos := #pos);

In den Funktionen wird pos entsprechend der Länge weiterpositioniert. Ggf. kannst du noch einen error Parameter einfügen der signalisiert wenn etwas nicht korrekt verarbeitet werden kann, oder die Array-Grenzen überschritten werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bevor man den Code immer weiter verschlimmbessert schlage ich vor den Großteil auszukommentieren und nur die äußere Schleife aktiv lassen. Wenn die schon nicht durchläuft... So ein Zeitfehler ist doch ein deutliches Zeichen für eine Todesschleife.
Wenn Sie durchläuft arbeite Dich nach Innen vor und aktiviere nach und nach die inneren Schleifen.
 
Zurück
Oben