B&R Zykluszeit ermitteln

Ar0aX

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,

ich hatte noch nicht viel mit B&R zu tun und kenne bisher nur SIMATIC, also korrigiert mich bitte, wenn ich etwas falsch sehe.
Ich habe eine X20CP3484-1 und AS V3.0.90.21 und ein Programm geschrieben. Nun möchte ich gern die Zykluszeit erfahren, die es tatsächlich hat. Meine Teilprogramme sind im Cyclic #4 [100 ms], daher wird diese Zeit schon mal eingehalten.
In dem Trainingsmodul TM223 S.27ff verstehe ich es so, dass man die Zykluszeit über den Profiler herausbekommt. Dafür muss man z.B. ein Programm in den Cyclic #1 [10 ms] schieben, welches die Zykluszeit überschreitet. Dann soll man nach einem Neustart in den Service Mode kommen, wo man dann die Daten aus dem Zielsystem laden kann. Aber genau das klappt bei mir nicht. Ich schaffe es die Zykluszeit nicht einzuhalten und den Fehler zu erzeugen, aber ich weiß nicht wie ich in den Service Mode komme um Daten in den Profiler zu bekommen.

Gibt es eine andere Möglichkeit die Zykluszeit herauszubekommen oder kann jemand beschreiben wie das mit dem Service Mode und dem Profiler funktioniert? Ich probiere schon eine Weile aber ich bekomme es mit der nicht so gut geschrieben Anleitung im TM223 nicht hin :-/

Danke schon einmal :)
 
Hallo,
wieso wird "diese Zeit schon einmal eingehalten" nur weil dein Prg in der 100ms Task läuft?!
Auch da kannst du eine Zykluszeitverletzung bekommen!
Ausserdem willst du doch zur Laufzeit messen und nicht wenn's schon zu spät ist...
Erstelle in einem Task mal einen Loop mit variablem Endwert und messe dann mal die Laufzeit mit diversen Endwerten.
Gruß
Gaiskasimir
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich kenne Deine SPS nicht, weiß auch nicht ob die die Dauer des letzten Zyklus da irgendwo direkt lesbar anbietet, doch ich hätte da folgenden Uralt-Algorithmus anzubieten, der auf jeder SPS mit genügend auflösender Uhr funktioniert:

Zykluszeit = Uhrzeit_jetzt - Uhrzeit_zyklus_vorher

Auf diese Weise kann man sogar die Dauer nur des eigenen Anwenderprogramms ermitteln, indem man die Uhrzeiten am Beginn des Programms und am Ende erfasst.

Falls die SPS keine Uhr hat oder die Auflösung nicht reicht: manche SPS haben auch einen abfragbaren Zeitzähler, der die ms oder µs seit Einschalten zählt.

Harald
 
Hallo,

diese Messung Zykluszeit = Uhrzeit_jetzt - Uhrzeit_zyklus_vorher
macht doch (kaum ) Sinn, da der letzte Zyklus immer so lang ist wie der nächste oder übernachste.
Und wie ist der Durchlauf des Anwenderprogramms definiert ?
Manche Teile werden in 100ms, 100 x durchlaufen, andere 10 x und Taskklasse 4 vielleicht nur 1x.
Der Profiler, läuft meines Wissens nur, wenn die Steuerung in RUN steht.

Grüsse
 
Hallo,
wieso wird "diese Zeit schon einmal eingehalten" nur weil dein Prg in der 100ms Task läuft?!
Auch da kannst du eine Zykluszeitverletzung bekommen!
Ausserdem willst du doch zur Laufzeit messen und nicht wenn's schon zu spät ist...
Erstelle in einem Task mal einen Loop mit variablem Endwert und messe dann mal die Laufzeit mit diversen Endwerten.
Gruß
Gaiskasimir

Ja das war mein erster Gedanke, da mein Programm nur stumpfe Rechnungen sind und von keinem Eingang abhängig. Deshalb dachte ich, es wird da kaum Schwankungen geben und man kann davon ausgehen die 100 ms werden eingehalten, wenn die Zyklusverletzung nicht kommt.

Ich möchte einfach die benötigte Zykluszeit wissen, wie wenn ich im TIA Portal auf "Online & Diagnose" dann "Diagnose" gehe. Dort wird die Zykluszeit "live" angezeigt.

Mein Loop sieht so aus:
PROGRAM _CYCLIC

FOR iCnt := udStartValue TO udEndValue DO
value := value + 1;
END_FOR

(* TODO : Code hier einfügen *)

END_PROGRAM

Du meinst den udEndValue verändern? Ich kenn mich leider noch gar nicht weiter aus mit AS und weiß leider nicht was du mit messen meinst. Wo und wie kann man denn messen? Wenn ich das wüsste, dann hätte ich den Thread gar nicht geöffnet :confused: Die Hilfe sagt mir auch nichts hilfreiches xD
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

diese Messung Zykluszeit = Uhrzeit_jetzt - Uhrzeit_zyklus_vorher
macht doch (kaum ) Sinn, da der letzte Zyklus immer so lang ist wie der nächste oder übernachste.
Und wie ist der Durchlauf des Anwenderprogramms definiert ?
Manche Teile werden in 100ms, 100 x durchlaufen, andere 10 x und Taskklasse 4 vielleicht nur 1x.
Der Profiler, läuft meines Wissens nur, wenn die Steuerung in RUN steht.

Grüsse


Ja hast du recht, da entsteht keine differenz. Glaube sein gedanke war die zeit beim bzw vorm start des programms zu erfassen und dann nachdem durchlauf wieder zu erfassen und dann die differenz bilden. ich vermute das wird zu ungenau und einen timer im ms oder mikrosek. bereich hab ich noch nicht entdeckt, wie ich das machen könnte. bei mehrfachen versuch an einen GetTime FB eine variable einzubinden stürzt das AS ab bzw reagiert nicht mehr und muss geschlossen werden.

Was meinst du mit Durchlauf im Anwenderprogramm?

also im RUN ist die auf jeden fall, aber ich sehe nichts beim geöffnet Profiler, da sind keine Daten.
 
Zuletzt bearbeitet:
Nun möchte ich gern die Zykluszeit erfahren, die es tatsächlich hat. Meine Teilprogramme sind im Cyclic #4 [100 ms], daher wird diese Zeit schon mal eingehalten.
[...]
Gibt es eine andere Möglichkeit die Zykluszeit herauszubekommen
Definiere doch mal was Du unter "Zykluszeit" verstehst.

Ich verstehe darunter die Zeitdauer die vergeht bis die selbe Programmstelle wieder ausgeführt wird.
Wenn das in einer Task passiert, welche konstant alle 100ms aufgerufen wird, dann ist es wenig sinnvoll die Zeit zu messen - die Messung wird 100ms ergeben.

Harald
 
Ich verstehe auf was du hinaus möchtest...
Ich dachte, dass die 100ms die maximale Zeit ist und es trotzdem sein kann, dass die eigentliche Zykluszeit 80ms beträgt, wenn das Programm dementsprechend schneller ist.
SO klingt das jetzt, als wären die 100ms immer fest, egal wie schnell das Programm ist. Okay das macht grad Sinn für mich :ROFLMAO:

Das heißt ich kann bei der kleinsten Zeit im Cyclic #1 [10ms] anfangen und wenn nicht die Zyklusverletzung kommt, arbeit das Programm innerhalb der Zeit.

Klar wenn das Prog von vielen Eingängen abhängig ist, dann geht das sicher nicht so einfach...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich Dich richtig verstehe, dann ist die gefragte "Zykluszeit" keine Zykluszeit sondern die Programmbearbeitungszeit je Zyklus, also eher sowas wie eine Prozessor-Auslastung?
Was ist eine TK? (wie gesagt ich kenne B&R nicht)
Und "Cyclic #4 [100 ms]" ist eine Task die alle 100ms aufgerufen wird?

Harald
 
"Cyclic #4 [100 ms]" ist eine sogenannte Taskklasse in der verschiedene Tasken laufen können. Die werden dann alle in dieser "Zeitscheibe" abgearbeitet
 
Die aktuelle Zykluszeit einer Task kann wie folgt ausgelesen werden :
Im Init - Teil :
Code:
FBRtInfo FUB RTInfo()
Zykluszeit = REAL(FBRtInfo.cycle_time) / 1000.0
Somit hast du ein lokale variable, die dir die zykluszeit in ms anzeigt.
Die kann man dan z.b. Für timer usw benutzen.
 
Das ist die TK-Zeit und nicht die "aktuelle Zykluszeit"
Wie soll eine Funktion im InitUP heute wissen wie lange mein Task morgen braucht?:confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich hab inzwischen nach anleitung aus dem TM223 hinbekommen etwas im Profiler zu sehen. fragt mich nicht woran es lag, nach weiterem probieren gehts jetzt einfach...
neues problem, die Interrupt Handlers sind mit anderen systemtasks, das einzige was man sieht. also der Cyclic #X wird gar nicht angezeigt, worin man erkennt wie lange das Prog gedauert hat :(
 
  1. Ist die Steuerung im Run?
  2. Ist in der Konfiguration das Aufzeichnen der Tasks eingeschaltet? Ansonsten Konfiguration neu installieren(alles im Profilerdialog)
 
Zurück
Oben