Phoenix Contact ILC 350 PN Zykluszeit

Bernd87

Level-2
Beiträge
43
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo alle zusammen,

momentan arbeite ich an meiner BA mit dieser SPS, bei der ich die Zykluszeit herraus bekommen soll, sozusagen die Zeit für einen Durchlaf der Berechnungen... wisst ihr ja selber :)
In der Hilfe hab ich etwas interessantes gelesen. Es gibt eine Liste mit vordefinierten Systemvariablen bei der auch die Zykluszeit grundlegend erfasst und aufgezeichnet wird.
Leider war der Link zu dieser Liste "Bitte hier klicken..." tot. Quasi nicht vorhanden. Wie komme ich an diese Liste?
Ich wäre euch sehr dankbar wenn ihr mir helfen könntet.

Oder hat jemand eine andere Idee zur beschaffung dieser Zeit???

Danke im Vorraus

Bernd87
 
so.... nach reichlich Vorschung ist es mir gelungen meine Probleme selber zu lösen.

innerhalb der PC WORX-Hilfe EINFACH nach "PLC_TASK_xy" suchen und voila....is das richtig geschrieben??... erscheint eine liste solcher Variablen.

danke an mich selbst...

Aber trotzdem danke das ihr mein thema so zahlreich beachtet habt. ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

unter den Systemvariablen findest du TICK_COUNTS o.ä.

dies ist eine laufende Zahl die mit jeder ms (bei ILC3xx) hochgezählt wird.

Wenn du am Anfang sowie am Ende deiner Berechnungstask den Wert speicherst und anschließend die Differenz ermittelt, hast du somit die vergangene Zeit.

Bitte beachte das dies leider eine DINT ist und somit einen Wechsel von positiver nach negativer Zahl hat

alternativ gibt es eine Struktur über jede Task, auch hier findest du Zeitwerte über die jewelige Task
 
Hallo,

noch eine wichtige Information - wahrscheinlich kannst du anhand des Systemticks keine gute Zeit herausfinden.
Die Berechnung wird viel schneller abgearbeitet werden als ein System Tick ist.

WICHTIG: Ein SystemTick ist keine Zeiteinheit - die bekommt man nur heraus wenn man im InfoDialog nachschaut - den InfoDialog findest du wenn du den DebugDialog öffnest mit dem man START/STOP durchführt udn dort auf INFO drückst.

Solltest du herausfinden das die Berechnung innerhalb eines Systemticks stattfindet, solltest du folgendermaßen vorgehen:
Ruf den Code einfach 100 oder 1000 mal auf, berechne den System Tick (Variable: PLC_SYS_TCK_CNT) und teile die Systemticks einfach durch die Anzahl der Aufrufe. Damit könntest du ein brauchbares und messbares Ergebnis erhalten.

Bedeutet:
Systemtick ist auf 4ms eingestellt - siehe InfoDialog
Die Berechnung wurde 100 mal ausgeführt (Wichtig - innerhalb der Task als Schleife aufrufen)
PLC_SYS_TCK_CNT wurde in der Zeit der Berechnung um 4 inkrementiert.

Also 4 x 4ms = 16ms _____ 16ms/100 Berechnungen= 0,16ms/Berechnung

Ich hoffe ich konnte Dir auch ein wenig weiterhelfen.

Gruß,
Kollo.
 
Hallo,


Solltest du herausfinden das die Berechnung innerhalb eines Systemticks stattfindet, solltest du folgendermaßen vorgehen:
Ruf den Code einfach 100 oder 1000 mal auf, berechne den System Tick (Variable: PLC_SYS_TCK_CNT) und teile die Systemticks einfach durch die Anzahl der Aufrufe. Damit könntest du ein brauchbares und messbares Ergebnis erhalten.

Bedeutet:
Systemtick ist auf 4ms eingestellt - siehe InfoDialog
Die Berechnung wurde 100 mal ausgeführt (Wichtig - innerhalb der Task als Schleife aufrufen)
PLC_SYS_TCK_CNT wurde in der Zeit der Berechnung um 4 inkrementiert.

Also 4 x 4ms = 16ms _____ 16ms/100 Berechnungen= 0,16ms/Berechnung


Ist es aber nicht so dass je Berechnung/Erhöhung ein Zyklus vergeht wenn ich ein Zähler verrwende?

Das heißt:
4ms (je Systemtick) + 4ms (Inkremetierung) = 8ms (für die erhöhung des Zählers um eins)

...mal 100, um 100 Durchläufe/Zyklen zu zählen.
Macht 800ms für die Zählung, vorrausgesätzt jeder Schritt benötigt ca. 8ms??

Oder bin ich jetzt völlig falsch?
...kommt ja auch darauf an welche leistung die CPU, bzw welchen Umfang das zu bearbeitende Programm hat.

lasse mich gern eines besseren belähren!!!

MfG Bernd87
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Bernd,

ja ich glaube ich habe mich nicht deutlich genug ausgedrückt.
Du musst deine Berechnung innerhalb einer Task aufrufen - in einer Schleife.

Das heisst, du musst sicherstellen das du nicht eine Berechnung pro Zyklus machst - sondern alle 100 Berechnungen in einem Zyklus.

Wie groß die Taskzykluszeit dabei eingestellt ist - ist völlig unentscheident!
Es kommt einzig und allein darauf an wie viele PLC System Ticks für deine Berechnungen vergehen. Im Prinzip kannst du das sogar in einer Task durchführen die alle 10 Sekunden aufgerufen wird. Ich würde dir sogar eine relativ große Zeitschlagen um dem Watchdog aus dem Weg zu gehen - also irgendwas bis zu 100ms.

Am einfachsten geht das in ST wenn du eine FOR Schleife nutzt und nicht mit einer Variablen die in jedem Zyclus um eins incrementiert.

Gruß,
Kollo.
 
Vlt. hab ich mich ja auch nicht korrekt ausgedrückt.
Ich benötige die Zykluszeit eines vollständigen Durchlaufs der Berechnung aller Funktionsblöcke,
soll heißen, die Zeit zwischen des Initialisierungsschritts des "OB1" bis zur nächten Initialisierung.
 
Hallo Bernd,

du möchtest also die Dauer deines kompletten Programms wissen.
Wenn ich das richtig sehe kommst du aus der Siemens Welt. Oder?

Pronzipiell ist das beim ILC etwas anders, da du dort die Programme zyklisch aufrufst, also Beispielsweise einer 10ms Task zuweist.
Innerhalb dieser Zeit wird dann dein komplettes Programm abgearbeitet.
Die Abarbeitung ist schlichtweg anders als bei einer Siemens SPS, dort wird nach der abarbeitung eines Programms sofort wieder begonnen - bei einem ILC wird das erst wieder nach der eingestellten Taskzeit passieren.


Wie lange es wirklich dauert kann man in den TASK_INFO Strukturen sehen.
(Die Angabe erfolgt dort auch in den sogenannten SystemTicks)

Wozu benötigst du die Abarbeitunsgzeit denn?
Möchtest du wissen wie stark deine SPS Ausgelastet ist?
Das sieht man auch in dem Info Dialog - dort ist die CPU Auslastung in % angegeben.



PS: Nichts desto trotz - wenn du nur ein Programm hast, kannst du meine Methode darin anwenden - so bekommst du die Zeit am genauesten heraus die dein Programm zur abarbeitung benötigt.

Gruß,
Kollo.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Kollo

...ja ich komme sozusagen aus der Siemens-Welt. Habe das quasi daran gelernt. (deshalb dieser bezug)

Wie lange es wirklich dauert kann man in den TASK_INFO Strukturen sehen.
(Die Angabe erfolgt dort auch in den sogenannten SystemTicks)

Taskzeit = Default-Taks (in TASK_INFO)??
...oder beziehe ich diese Zeit anderweitig?

Wozu benötigst du die Abarbeitunsgzeit denn?

Ich sitze an einem Reengineeringeiner/Erweiterung einer virtuellen Biogasanlage (Simulation und Steuerung auf jeweils einer SPS) und versuche ein HITL-System zu realisieren.
Dieses läuft schon in einer ca. 60-fachen Raffung der Zeit.
Es müsste eigentlich das 100-Fache sein da für eine selbstgebaute Uhr ein Takt von 10ms vorgegeben wird.
Wenn in diesem Bezug 1000ms die Realzeit wiederspiegeln.

Das kann ja eigentlich nur passieren wenn entweder die "Taskzeit" für die 10ms Schritweite nicht ausreichen oder die Uhr eine eigene Laufzeit/Verzögerung erzeugt.


PS: Nichts desto trotz - wenn du nur ein Programm hast, kannst du meine Methode darin anwenden - so bekommst du die Zeit am genauesten heraus die dein Programm zur abarbeitung benötigt.

Ein Programm bezieht sich hier auf vollständige Programm oder nur auf einen Funktionsblock, selbsterstellt bzw. vorgegeben. Bei mir sind es doch eine ganze Menge Blöcke

Gruß,
Bernd
 
Taskzeit = Default-Taks (in TASK_INFO)??
...oder beziehe ich diese Zeit anderweitig?

Das kann ja eigentlich nur passieren wenn entweder die "Taskzeit" für die 10ms Schritweite nicht ausreichen oder die Uhr eine eigene Laufzeit/Verzögerung erzeugt.


Hi Bernd,

ne - die TASK_INFO ist die Struktur in den globalen Variablen. in der Struktur findest du MIN_DURATION_MAX_DURATION und sowas an der du die Abarbeitunsgzeiten in SystemTicks ablesen kannst.

An Deiner Stelle würde ich nicht die Defauklt Task nehmen, sondern dann eine 10ms Task Cyclic anlegen. (Der WatchDog muss dann auch 10ms oder kleiner sein).

So stellst du sicher das deine Berechnungen alle 10 ms abgearbeitet werden und der WD überprüft das genau das auch innerhalb der 10ms passiert.

Wäre das nicht deine Lösung?

Gruß,
Kollo.
 
Hi Kollo,

die TASK_INFO ist die Struktur in den globalen Variablen. in der Struktur findest du MIN_DURATION_MAX_DURATION und sowas an der du die Abarbeitunsgzeiten in SystemTicks ablesen kannst.

noch mal für doofe...
Die Struktur finde ich im Projektbaum-Fenster (PBF)-> Hardwarestruktur\STD_CNF\STD_RES\Tasks\Global_Variables
...hoffe ich...
In dieser finde ich eine Liste von Systemvariablen. Finde aber leider keine MIN_DURATION_MAX_DURATION.
Das einzige was dem näher kommt ist im PBF unter -> Datentypen\sys_flag_types.
Hier heißt es MinDuration, MaxDuration oder auch MinDuration_us, MaxDuration_us.
Diese kann ich aber leider nicht in Online-/Debbug-Modus auslesen.


An Deiner Stelle würde ich nicht die Defauklt Task nehmen, sondern dann eine 10ms Task Cyclic anlegen. (Der WatchDog muss dann auch 10ms oder kleiner sein).
So stellst du sicher das deine Berechnungen alle 10 ms abgearbeitet werden und der WD überprüft das genau das auch innerhalb der 10ms passiert.

Wie lege ich eine Task Cyclic an und wie verwende ich diesen WD? (die Hilfe ist mir keine Hilfe :cry:)
Beim Interbus wird ein loop-back-Wort(Anfangswort) un ein Control-Wort(Endwort) verwendet um die Zeitdauer herauszubekommen.
Wie komme ich denn da dran??


Gruß,
Bernd87
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Bernd,

die Struktur die du in den datentypen gesehen hast ist nur die deklaration der Struktur.
In den globalen Variablen findest du folgende Variablen, die vom Typ dieser Struktur sind:

Variable: Datentyp:
PLC_TASK_1 Extended_Task_Info
PLC_TASK_2 Extended_Task_Info
PLC_TASK_3 Extended_Task_Info
.......................... folgen noch weitere.

Wenn du Online bist, kannst du dir die Variable PLC_TASK_1 in ein Watchwindow ziehen und alle Elemente anschauen, darunter auch die Duration Variablen.


Task anlegen:
Ein Task legst du an in dem du rechte Maustaste auf den Ordner Tasks im Projektbaum machst. Dort wählst du dann Cycle Task mit der gewünschten Zykluszeit an. im selben Fenster in dem du auch das Intervall angiebst, stellst du auch den WD ein.

HILFE: Die Hilfe ist schon ganz gut beschrieben - du musst nur <F1> drücken wenn du zu einem bestimmten Fenster etwas wissen willst.
Dann wird genau die passende Hilfeseite geöffnet und du muss nix suchen!!!

Das Lopp Backword und Control Word aus dem IBS brauchst du bei dieser Aufgabe eigentlich nicht. Du kannst im interbus Konfigurator in Diag+ auch nachschauen wie lange der Bus für einen Zyklus benötigt.

Das sollte aber mit deiner Steuerungstechnischen Aufgabe nichts zu tun haben. Im ersten schritt möchtest du ja wissen wie lange dein Code einmal zum abarbeiten braucht.

Gruß,
Kollo.
 
Hallo Kollo.

Danke für deine Antwort.
Hab das alles mitlerweile auch herrausgefunden. leider funktioniert die abfrage der PLC_Task_X.MaxDuration (X = 1....16) überhaupt nicht. Hab auch schon mit den Service telefoniert. EGAL!!!

Im Endeffekt habe ich die Tasks auf CYCLIC umgestellt und Zeiten von 10ms vergeben. Passt also alles.

Das mit der Hilfe is so ne Sache. Z.B. hab ich garnix zum Thema PLC_Task_X gefunden, was bestimmt in der Hilfe (zwische Ordner 1 und Unterordner 526 ....oder so) erwähnung fand.
 
Zurück
Oben