# Berechnung der Zykluszeit, aber wie?



## Paul_007 (5 Oktober 2008)

Hallo zusammen!

Weiss jemand von euch wie ich die Zykluszeit per Hand berechne? Ich möchte die Zykluszeit, die ich gemessen habe nachrechnen.

Hab auch schon in einem Siemens Ahndbuch bei Berechnung der Zykluszeit nachgesehen, da müssen auch noch ein CPU spezifischer Faktor, je nach dem welche CPU usw. mit reingerechnet werden.

Ich stelle mir das so vor: Ein Baustein, den ich gemessen habe hat beispielsweise bei einem Aufruf von 300 x eine Zykluszeit von 20ms. Wenn ich nun weiss, dass der Baustein aus 20 reinen Bitoperation besteht, müsste dies ja nachrechnen gehen oder? Die CPU 315 benötigt z.B. für eine Bitoperation 0,1 Mikrosekunden.

Ich hoffe ihr habt verstanden wie ich das meine, wenn nicht einfach schreiben.

Vielen Dank schonmal im voraus!

Gruss
Paul


----------



## Deltal (5 Oktober 2008)

http://support.automation.siemens.com/WW/skm/pdfviewer.asp?HitsPerSite=10&ehbid=html_00%2Fehb%2F13206730%2Ehtm〈=de&nodeid=13206930&query=operandenliste&page=1&view=new


----------



## Paul_007 (7 Oktober 2008)

Ich habe mal was zusammen geschrieben! Ist das so richtig?

Ich habe 22 Bit Operationen                                Schleifendurchläufe:  300
bei CPU 315 pro Bit-Operationen 0,1μs
CPU 315 spezifischer Faktor = 1,10
--> 22* 0,1μs *1,10* 300 =0,726*ms
*
*Zykluszeit *= 0,726ms + 0,4ms + 0,4ms + 0,5ms = 2,026ms

*Berechnung der tatsächlichen Zykluszeit*

2,026ms*100 / (100-40) = *3,376ms* *<--- ????kann das sein????*

Denn gemessen habe ich mit der CPU bei 300 Schleifendurchgänge zwischen 17/26ms


ps: Ich habe noch 1 Digitaleeingabebaugruppe und 1 Digitaleausgabebaugruppe 
     vielleicht macht das ja auch noch was aus....hab aber nichts darüber gefunden!!!!


----------



## marlob (7 Oktober 2008)

Zur Zykluszeit gehört ja auch noch das einlesen des PAE und schreiben des PAA usw. Das musst du auch noch dabeirechnen


----------



## vierlagig (7 Oktober 2008)

und den bausteinaufruf nicht vergessen


----------



## marlob (7 Oktober 2008)

Hast du auch noch Kommunikationslast durch HMI oder Profibus oder so?
Setze doch mal deinen Code hier rein, vielleicht passt deine Berechnung ja auch nicht


----------



## Paul_007 (7 Oktober 2008)

Den direkten Code darf ich leider nicht hier reinstellen, aber es sind sicher 22 Bitoperationen.

Also eine Kommunikationslast hab ich nicht dort. 

Das mit den Bausteinaufrufen klingt logisch, nur woher bekomme ich die Bausteinaufrufzeiten? Ich habe einen OB1 indem ich die Zykluzeit messe und einen FB1 mit DB1 aufrufe und in dem FB1 ist mein zu messender Baustein mit 22 Bitoperationen.

Es geht mir nicht um eine super genaue Rechnung, ich will bzw. muss nur sehen, dass die durch die SPS gemessene Zykluszeit annähernd stimmt ab ca. 3ms und ca. 20ms sind halt ein riesen Unterschied.


----------



## vierlagig (7 Oktober 2008)

Paul_007 schrieb:


> Das mit den Bausteinaufrufen klingt logisch, nur woher bekomme ich die Bausteinaufrufzeiten?



guckst du anhänge

übrigens mußt du die zykluszeitberechnung auch mit in deine betrachtungen einfließen lassen


----------



## vierlagig (7 Oktober 2008)

übrigens kommt es auch auf die sprache an - in K*U*P wirst du Bild- und Nulloperationen finden, die auch Zeit brauchen und auch öfter mal einen sprung, wo du ihn nicht vermutest ... also am besten die zykluszeit anhand von AWL berechnen


----------



## Paul_007 (7 Oktober 2008)

Ich seh schon, dass ist gar nicht so einfach, weil doch sehr viele Faktoren mit einbezogen werden müssen.

Vielen Dank für eure zahlreichen Tipps!

Werd das ganze jetzt nochmal durchrechnen.


----------



## Longbow (8 Oktober 2008)

Paul_007 schrieb:


> Ich seh schon, dass ist gar nicht so einfach, weil doch sehr viele Faktoren mit einbezogen werden müssen.
> 
> Vielen Dank für eure zahlreichen Tipps!
> 
> Werd das ganze jetzt nochmal durchrechnen.




Mit welcher Adressierungsart arbeiten die Bit-Operationen?

Die 300 reagieren allergisch auf indirekte Adressierung!


----------



## derwestermann (8 Oktober 2008)

Und wofür? Das braucht in der Praxis kein Mensch.


----------



## Longbow (8 Oktober 2008)

derwestermann schrieb:


> Und wofür? Das braucht in der Praxis kein Mensch.



SCL benutzt indirekte Adressierung massiv,
Parameterübergabe zählt auch dazu
und für schleifen ist die indirekte Adressierung prädestiniert!

In größeren Programmen sehr häufig anzutreffen.


----------



## vierlagig (8 Oktober 2008)

derwestermann schrieb:


> Und wofür? Das braucht in der Praxis kein Mensch.



manchmal sind theoretische betrachtungen notwendig, z.b. bei der einsatzplanung einer bestimmten CPU. außerdem ist es auch immer gut zu wissen, wo eine hohe zykluszeit begraben sein könnte.

insgesamt finde ich, macht das einlesen und arbeiten mit dem thema, das arbeiten in der praxis um einiges einfacher - man wundert sich weniger.

darüber hinaus gibt es auch immer theoretische betrachtungen, die zur erlangung eines bestimmten abschlusses angestrengt werden müssen - zwar nicht praxis aber praktisch, wenn man eine fundierte arbeit abliefern kann


----------



## Paul_007 (8 Oktober 2008)

vierlagig schrieb:


> manchmal sind theoretische betrachtungen notwendig, z.b. bei der einsatzplanung einer bestimmten CPU. außerdem ist es auch immer gut zu wissen, wo eine hohe zykluszeit begraben sein könnte.



Genau darum geht es mir bei der Berechnung...

Der Baustein der gemessen wir ist in SCL programmiert.


----------



## vierlagig (8 Oktober 2008)

Paul_007 schrieb:


> Der Baustein der gemessen wir ist in SCL programmiert.



das ist natürlich tricky, da kommste eigentlich nur sinnvoll voran, wenn du den baustein übersetzt, die quelle löschst (aus dem testprojekt, natürlich nicht von deinem rechner  ) und dir dann an hand des AWL-codes, der nun beim öffnen des bausteins erscheint eine zykluszeit herleitest


----------



## Longbow (8 Oktober 2008)

vierlagig schrieb:


> das ist natürlich tricky, da kommste eigentlich nur sinnvoll voran, wenn du den baustein übersetzt, die quelle löschst (aus dem testprojekt, natürlich nicht von deinem rechner  ) und dir dann an hand des AWL-codes, der nun beim öffnen des bausteins erscheint eine zykluszeit herleitest



Noch etwas mehr info bekommt man, wenn man den Baustein in eine MemoryCardDatei (*.wld) schiebt (nur den einen Baustein) und in daraus öffnet (dann muss man die Quelle nicht löschen).
Dann sieht man auch gleich, was so an Code generiert wird für Bausteinaufrufe und Parameterübergabe. (es wird dabei eine Fehlermeldung ausgegeben, kann man aber ignorieren).

Und mal schön auf die Adressierungsarten achten und mal ins Handbuch schauen, ist bei den kompilierenden CPUs echt heftig wie die Ausführungszeiten ansteigen.


----------



## derwestermann (8 Oktober 2008)

Longbow schrieb:


> Noch etwas mehr info bekommt man, wenn man den Baustein in eine MemoryCardDatei (*.wld) schiebt (nur den einen Baustein) und in daraus öffnet (dann muss man die Quelle nicht löschen).
> Dann sieht man auch gleich, was so an Code generiert wird für Bausteinaufrufe und Parameterübergabe. (es wird dabei eine Fehlermeldung ausgegeben, kann man aber ignorieren).
> 
> Und mal schön auf die Adressierungsarten achten und mal ins Handbuch schauen, ist bei den kompilierenden CPUs echt heftig wie die Ausführungszeiten ansteigen.



Wie wäre es, das Kompilat einfach direkt aus dem AWL-Editor zu öffnen? Geht auch. 
Wenn ich wissen will, wie lange ein Baustein braucht, mache ich vor dem Aufruf ein sfc64, speichere das Ergebnis und nach dem fraglichen Baustein wieder und subtrahiere die Zeiten.


----------



## Longbow (8 Oktober 2008)

derwestermann schrieb:


> Wie wäre es, das Kompilat einfach direkt aus dem AWL-Editor zu öffnen? Geht auch.
> Wenn ich wissen will, wie lange ein Baustein braucht, mache ich vor dem Aufruf ein sfc64, speichere das Ergebnis und nach dem fraglichen Baustein wieder und subtrahiere die Zeiten.



Bei Siemens hat der SFC64 im System 300 unterschiedliche Auflösungen:
die Alten (bei 313C vor 2.6.1) haben noch 10ms, erst die Neuen haben 1ms.

Aber selbst 1ms ist aus meiner Sicht nicht wirklich ausreichend zum Messen.

Speed7 CPUs haben unter anderem den SFB 7 mit dem man auf 1µs messen kann (Laufzeit des SFB 7 auch etwa 1 µs).

In den neueren CPUs (317, 315PN/DP, 319, Speed7) kommt man um die Messung eigentlich gar nicht herum, weil die Laufzeiten für einen Befehl nicht konstant sind (Caches, Optimierungen, Speicherzugriffe).
Selbst die Messung ist nicht trivial wegen der Cacheeffekte (die 317 ist da sehr beeindruckend, abhängig von der Schleifengröße schwankt die Befehlsausführungszeit um Faktor 3!)


----------



## vipianer (9 Oktober 2008)

Longbow schrieb:


> ... Laufzeiten für einen Befehl nicht konstant sind (Caches, Optimierungen, Speicherzugriffe).
> Selbst die Messung ist nicht trivial wegen der Cacheeffekte (die 317 ist da sehr beeindruckend, abhängig von der Schleifengröße schwankt die Befehlsausführungszeit um Faktor 3!)


 
guter hinweis! mit solchen messungen kann man sich die laufzeit "schönrechnen". der code innerhalb einer schleife muss auf jeden fall lang genug sein, damit er nicht vollständig aus dem cache läuft! caches wirken sich vor allem bei den neuen Siemens CPUs (317, 319...) aus und natürlich bei allen IEC1131-Laufzeitsystemen, die auf Standard-Controllern mit Cache-Unterstützung laufen. Weiterhin sind PreFetch-Effekte zu beachten. Diese beeinflussen die Befehlslaufzeit z.b. nach Sprüngen bzw Bedingunen
Fazit: "Wer misst, misst Mist!" ...Wer an dieses Thema zu blauäugig ran geht, bekommt keine vernünftigen Ergebnisse...


----------



## Paul_007 (14 Oktober 2008)

Nochmals vielen Dank für eure Hilfestellungen und Tipps! Haben das alles nochmal nachgerechnet und alle Faktoren mit einbezogen und sind tatsächlich ziemlich genau auf unsere gemessenen Werte gekommen.

Weiss von euch vielleicht jemand wie ich die einzelnen Zyklen mit einem Zähler zählen kann? 
Ich stelle mir das folgendermaßen vor: Ich habe eine Zeit und einen Zähler und nun möchte ich, dass zum Beispiel bei einer Zeit von 5s mir der Zähler die einzelnen Zyklen zählt.

Hat jemand eine Idde wie ich das machen könnte?


----------



## vierlagig (14 Oktober 2008)

```
*
L     "Zykluszaehler"
+     1
T     "Zykluszaehler"
```

Zykluszaehler z.B. als DINT
bei jedem durchlauf wird eins addiert.

um über eine zeit von 5s zu zählen, wenn ich das richtig verstanden habe, die "routine" überspringen, wenn die zeit nicht aktiv ist.
 stichwort:ausschaltverzögerung


----------



## Paul_007 (15 Oktober 2008)

Ok, so hab ich mir das auch schon gedacht, nur was für einen Eingang gebe ich auf den Zähler, dass mir dieser bei jedem Zyklus eins hoch zählt? Oder gibt es da einen speziellen Zykluszähler?


----------



## vierlagig (15 Oktober 2008)

Paul_007 schrieb:


> Ok, so hab ich mir das auch schon gedacht, nur was für einen Eingang gebe ich auf den Zähler, dass mir dieser bei jedem Zyklus eins hoch zählt? Oder gibt es da einen speziellen Zykluszähler?



du brauchst keinen eingang!
lade- und transferbefehle sind VKE unabhängig, werden aber auch nur einmal pro zyklus abgearbeitet.

das einzige, was du realisieren mußt ist die zähldauer. allerdings mußt du dabei mit einer abweichung von bis zu 2xzykluszeit rechnen


----------



## Paul_007 (15 Oktober 2008)

Ah ok, danke! Probier das Morgen gleich mal aus


----------

