Diverse Fragen zur PLC Zykluszeit und TC Basiszeit - TC2

O'Gigis

Level-2
Beiträge
97
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe da ein paar Verständnisschwierigkeiten u.A. bezüglich einiger Zeiteinstellungen und in TC2 und hoffe meine verschiedenen Anliegen irgendwie verständlich machen zu können.


In der PLC kann ich in der Taskkonfiguration eine Zykluszeit einstellen, bis zu 1ms klein. Das ist die Zeit in der meine Anweisungen im MAIN zyklisch abgearbeitet werden. Also Prozessabbild der Eingänge lesen, Anweisungen der PLC abbarbeiten und nach 1ms das Prozessabbild der Ausgänge beschreiben.

Die Zeit die benötigt wird um alle Anweisungen abzuarbeiten hängt vom Umfang des Programms ab, muss aber insgesamt unter 1ms liegen (was passiert wenn das Programm so umfangreich ist, dass die Zykluszeit nicht ausreicht?)

Nachfolgender Code erläutert mein Verständnisproblem:

Code:
PROGRAM MAIN

...

i := i+1;
Flanke.IN := TRUE;
FLanke.PT := T#10ms;

IF Flanke.Q THEN
   Flanke.IN := FALSE;
   Text :=CONCAT(INT_TO_STRING(i),' Hallo');
   F_Trace(Text);
END_IF

Flanke();

...

Code:
FUNCTION F_Trace 

...

ADSLOGSTR( msgCtrlMask := ADSLOG_MSGTYPE_HINT OR ADSLOG_MSGTYPE_LOG, msgFmtStr := '%s', strArg := Trace_Msg);

...

Zyklisch nach Ablauf des 10 ms Timers soll über die Funktion F_Trace ein Ausgabe in der Loggeransicht des TC System Managers erfolgen, parallel dazu wird ein Zähler i hochgezählt.


Die Ausgabe erfolgt allerdings alle 12ms:

...
Hint TCPLC.PlcAuxTask (801) 05.02.2018 14:36:09 859 ms 72 Hallo
Hint TCPLC.PlcAuxTask (801) 05.02.2018 14:36:09 847 ms 60 Hallo
Hint TCPLC.PlcAuxTask (801) 05.02.2018 14:36:09 835 ms 48 Hallo
Hint TCPLC.PlcAuxTask (801) 05.02.2018 14:36:09 823 ms 36 Hallo
Hint TCPLC.PlcAuxTask (801) 05.02.2018 14:36:09 811 ms 24 Hallo
Hint TCPLC.PlcAuxTask (801) 05.02.2018 14:36:09 799 ms 12 Hallo
...

Jetzt dachte ich, dass das eventuell etwas damit zu tun haben könnte, dass der ADSLOGSTR Befehl über eine Funktion aufgerufen wurde aber selbst wenn ich den Befehl direkt im MAIN aufrufe dauert es 12 ms. Wo kommen die 2ms, also noch die 2 zusätzlichen Zyklen her? Das würde zudem bedeuten, dass die Befehle nicht alle im selben Zyklus ausgeführt werden, da der i Zähler ja weiter hochzählt wird während die Ausgabe noch nicht erfolgt ist :confused:

Die Wandlungszeit einer el3164 Klemme beträgt laut Datenblatt 100µs. Mit einer minimalen PLC Zykluszeit von 1ms kann ich nur jeden 10. Wert einlesen, wozu der Aufwand bei der Schaltungsentwicklung bei den Klemmen wenn die PLC nur im 1ms Zyklus die Eingänge einlesen kann:confused:


Vielleicht hat das ja was mit der Basiszeit von bis zu 50µs im TC System-Manger zu tun? Auf die PLC Zykluszeit besitzt diese keinen Einfluss, wird damit die Zykluszeit eingestellt mit der die Beckhoff Serverprogramme für z.B. NC etc. die im TC System-Manger miteinander verknüpft werden untereinander kommunizieren?


Was nütz mir eine Basiszeit von 50µs im TC System Manager sonst wenn meine Zykluszeit der PLC wiederum 1ms beträgt:confused:


Das ganze ist vielleicht etwas sprunghaft und verworren aber so sieht es leider gerade in meinem Kopf aus :confused::confused::confused:

Ich hoffe auf hilfreiche Antworten, gerne auch weiterführende Links!
 
Zuletzt bearbeitet:
Naja, im ersten Durchlauf wird der Zähler ja erst gestartet, da bist du dann schon bei 1. Der Zähler läuft jetzt 10ms, 1+ 10 = 11. Außerdem rufst Du den Timer am Ende auf, dadurch werden Änderungen des Ausgangs auch erst im nächsten Zyklus bemerkt, womit wir bei 12 wären.
Die Zykluszeit ergibt sich aus der Basiszeit und ist ein vielfaches davon. Wenn Du als Basiszeit z.B. 500µs einstellst beträgt die kleinste Zykluszeit 500µs. Du musst im Systemmanager bei der Task die Anzahl der Zyklusticks anpassen, dann ändert sich auch Deine Zykluszeit.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Noch eine Anmerkung:
Bitte prüfe genau, ob das gesamte Programm mit einem so schnellen Zyklus laufen muss. Falls Du schnelle Meßwerterfassung wünscht, könnte man genau diese in einem schnellen Zyklus laufen lassen und in ein Array einordnen. Dabei dann nur die benötigten Variablen der schnellen Task zuordnen.
Deine Frage oben ist ganz richtig: Hast Du einen schnellen Zyklus, muss auch das Programm in diesem Zyklus abgearbeitet werden können. Sonst gibt es Zykluszeitüberschreitungen. Bei einem älteren CX9010 habe ich mich auf diese Art auch schon klassisch bei einem Test ausgesperrt, weil die Systemlast zu hoch wurde. Also auf die Hardware achten.
 
Hallo,

ich hab jetzt auf die schnelle nix eindeutiges bei Beckhoff gefunden, aber die Wandlungszeit könnte auch meinen, wie lange die Klemme für die Verarbeitung "Signaländerung umgesetzt in Zahlenwert" benötigt. Das würde bedeuten, das die Klemme nicht im 100µs-Zyklus Werte an die CPU schreibt sondern z.B. alle 500µs. Die Wandlungszeit bei den Beckhoff-Klemmen schwankt je nach Typ stark und teilweise in ungewöhnliche Werte: eine Staffelung in 50µs-Schritten o.ä. hätte ich sofort verstanden, aber z.B. EL3101 wird mit ~40µs angegeben, EL3062-0030 dagegen mit 0,625ms.
Daher die Idee, das das evtl. nicht die Abtastrate der Klemme sein soll.
 
Und von mir auch noch ein Nachtrag. Die von Dir angeführte Zeit für die EL3164 bezieht sich aller Voraussicht nach auf die Wandlungszeit des A/D-Wandlers, aber damit ist die Bearbeitung ja noch nicht abgeschlossen, so das die Karte deutlich länger als diese Zeit braucht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich zitiere mal aus der BA:

1. Minimale Wandlungszeit [ms, μs]
= der Kehrwert der maximalen Samplingrate [Sps, Samples per second]:
Gibt an, wie oft der analoge Kanal einen neu festgestellten Prozessdatenwert zur Abholung durch den
Feldbus bereitstellt
. Ob der Feldbus (EtherCAT, K-Bus) diesen dann auch genauso schnell (also im
Gleichtakt), schneller (weil der AI Kanal im langsame FreeRun läuft) oder langsamer (z.B. bei Oversampling)
abholt, ist dann eine Frage der Einstellung des Feldbusses und welche Betriebsmodi das AI Gerät
unterstützt.
Bei EtherCAT Geräten zeigt das sog. ToggleBit bei den Diagnose-PDO an (indem es toggelt), dass ein neu
ermittelter AnalogWert vorliegt.

Diese "minimale Wandlungszeit" bezieht sich aber immer auf eine ganz bestimmte Filtereinstellung. Hier: 50 Hz-Notch-Filter.
Bei Anwahl eines anderen Filters ändert sich die Wandlungszeit.
Was hier nicht ganz klar hervorgeht: Bezieht sich die Zeit auf den Kanal oder das Gerät (also 4 Kanäle). Ich tendiere zu letzterem, da die einkanalige Variante deutlich schneller ist.

https://infosys.beckhoff.com/conten...gr_configrt_intro2.htm?id=9051431826139174494
 
Zuletzt bearbeitet:
Hallo,

eine PLC Task kann auch mit 50us laufen. Dann muss natürlich auch die Basiszeit so klein sein.

Der Baustein ADSLOGSTR verwendet ADS, spricht du bist da nicht mehr in der Echtzeit sondern im User-Mode. Das kann wenn der PC mehr ausgelastet ist auch auf einmal 50ms gehen.

Grüße,
Stefan
 
Naja, im ersten Durchlauf wird der Zähler ja erst gestartet, da bist du dann schon bei 1. Der Zähler läuft jetzt 10ms, 1+ 10 = 11. Außerdem rufst Du den Timer am Ende auf, dadurch werden Änderungen des Ausgangs auch erst im nächsten Zyklus bemerkt, womit wir bei 12 wären.
Die Zykluszeit ergibt sich aus der Basiszeit und ist ein vielfaches davon. Wenn Du als Basiszeit z.B. 500µs einstellst beträgt die kleinste Zykluszeit 500µs. Du musst im Systemmanager bei der Task die Anzahl der Zyklusticks anpassen, dann ändert sich auch Deine Zykluszeit.

Wenn ich nachfolgenden Code benutze

Code:
PROGRAM MAIN

...

FLANKE();


Flanke.IN := TRUE;
FLanke.PT := T#10ms;
IF Flanke.Q THEN
Flanke.IN := FALSE;
Text :=CONCAT(INT_TO_STRING(i),' Hallo');


ADSLOGSTR( msgCtrlMask := ADSLOG_MSGTYPE_HINT OR ADSLOG_MSGTYPE_LOG, msgFmtStr := '%s', strArg := Text);
(*F_Trace(Text);*)
END_IF
i := i+1;
IF i = 1000 THEN
    i := 0;
END_IF

...

erhalte ich folgende Ausgabe

...

Hint TCPLC.PlcAuxTask (801) 06.02.2018 08:43:20 59 ms 95 Hallo
Hint TCPLC.PlcAuxTask (801) 06.02.2018 08:43:20 47 ms 83 Hallo
Hint TCPLC.PlcAuxTask (801) 06.02.2018 08:43:20 35 ms 71 Hallo
Hint TCPLC.PlcAuxTask (801) 06.02.2018 08:43:20 23 ms 59 Hallo
Hint TCPLC.PlcAuxTask (801) 06.02.2018 08:43:20 11 ms 47 Hallo
Hint TCPLC.PlcAuxTask (801) 06.02.2018 08:43:19 999 ms 35 Hallo
Hint TCPLC.PlcAuxTask (801) 06.02.2018 08:43:19 987 ms 23 Hallo
Hint TCPLC.PlcAuxTask (801) 06.02.2018 08:43:19 975 ms 11 Hallo


...

Es wird lediglich um 1 Zyklus später angefangen zu zählen. Ich habe den CODE unverändert gelassen und die Zykluszeit in der PLC auf 100µs verringert, dann erhalte ich folgende Ausgabe:

...

Hint TCPLC.PlcAuxTask (801) 06.02.2018 08:46:22 800 ms 697 Hallo
Hint TCPLC.PlcAuxTask (801) 06.02.2018 08:46:22 790 ms 597 Hallo
Hint TCPLC.PlcAuxTask (801) 06.02.2018 08:46:22 780 ms 497 Hallo
Hint TCPLC.PlcAuxTask (801) 06.02.2018 08:46:22 770 ms 397 Hallo
Hint TCPLC.PlcAuxTask (801) 06.02.2018 08:46:22 760 ms 297 Hallo
Hint TCPLC.PlcAuxTask (801) 06.02.2018 08:46:22 750 ms 197 Hallo
Hint TCPLC.PlcAuxTask (801) 06.02.2018 08:46:22 740 ms 97 Hallo

Es scheint so als ob die 12ms doch etwas mit der 1ms Zykluszeit der PLC zu tun haben :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Noch eine Anmerkung:
Bitte prüfe genau, ob das gesamte Programm mit einem so schnellen Zyklus laufen muss. Falls Du schnelle Meßwerterfassung wünscht, könnte man genau diese in einem schnellen Zyklus laufen lassen und in ein Array einordnen. Dabei dann nur die benötigten Variablen der schnellen Task zuordnen.
Deine Frage oben ist ganz richtig: Hast Du einen schnellen Zyklus, muss auch das Programm in diesem Zyklus abgearbeitet werden können. Sonst gibt es Zykluszeitüberschreitungen. Bei einem älteren CX9010 habe ich mich auf diese Art auch schon klassisch bei einem Test ausgesperrt, weil die Systemlast zu hoch wurde. Also auf die Hardware achten.

Meinst du damit in der PLC eine weitere schnellere Task aufmachen in der ich dann meine Messwerte in einem Array speicher und dann über die langsamere Task das gesamte Array auslese und auswerte? Damit ich die Zykluszeit besser einbehalten kann?
 
Ich bin hier ein bisschen mit meinem Latein am Ende. Für mich klang meine Erklärung eigentlich recht logisch, aber das Ergebnis von O'Gigis Versuchen widerspricht dem. Kann mir mal bitte einer erklären wo bei mir der Fehler lag?
 
@ Morrymus, oliver.tonn, weißnix_

Das mit der Wandlungszeit hat sich dann denke ich etwas geklärt, wenn ich die PLC Zykluszeit auf bis zu 50µs herab setzen kann ergibt eine Wandlungszeit von 100µs bei einer el3164 Klemme durchaus Sinn. Es ist dann eine Frage meines verwendeten Feldbusses und Betriebsmodi ob ich diese Wandlungszeit ausreizen kann oder nicht. Die ~40µs bei der EL3101 liegen aber wieder unter der minimal einzustellenden 50µs :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Meinst du damit in der PLC eine weitere schnellere Task aufmachen
Genau das meine ich.
PLC's steuern ja üblicherweise irgendwas und dieses muss seltener so schnell erfolgen. Deshalb würde ich die reine Datenerfassung in eine schnelle Task auslagern.
Um Datenverfälschungen durch Doubletten auszuschließen solltest Du aber das Toggle-Bit auswerten, welches neue Daten anzeigt.

Die ~40µs bei der EL3101 liegen aber wieder unter der minimal einzustellenden 50µs :confused:

Eine PLC ist üblicherweise kein reines Datenerfassungs- und Analysesystem. Die Daten zeigen jeweils, wie schnell der AD-Wandler ivm. dem PIC-Controller in der Klemme die Daten theoretisch an den Feldbus durchreichen kann. Das bedeutet keineswegs, das die Daten auch so schnell abgeholt werden können müssen.
Was hast Du jetzt eigentlich konkret für ein Problem? Deutung von Datenblättern?
 
Zuletzt bearbeitet:
@ oliver.tonn

Mit dem ersten Durchlauf hattest du Recht, das wird der Zähler schon direkt auf 1 gesetzt, dass ist aber im 2. Durchlauf hinfällig. Die 1 ist dann quasi ein Offset, also bei 20 Zyklen beträgt dann der Zähler i = 21. Den Offset kannst du bei der Version mit dem 100µs Zklus der PLC ja auch sehen, da erfolgt ab 11ms alle 10ms die Ausgabe, so wie man das erwarten würde ... bei dem 1ms Zyklus kommt zu dem 1ms Offset noch jeweils 1ms dazu, woher genau ist da jetzt die Frage ?
 
Hm, das sehe ich ein wenig anders. Wenn der Zähler abgelaufen ist wird er ja mit FALSE ausgeführt und erst im nächsten Zyklus wieder mit TRUE, so das man immer die Zeit plus einen Zyklus haben müsste.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau das meine ich.
PLC's steuern ja üblicherweise irgendwas und dieses muss seltener so schnell erfolgen. Deshalb würde ich die reine Datenerfassung in eine schnelle Task auslagern.
Um Datenverfälschungen durch Doubletten auszuschließen solltest Du aber das Toggle-Bit auswerten, welches neue Daten anzeigt.

Eine PLC ist üblicherweise kein reines Datenerfassungs- und Analysesystem. Die Daten zeigen jeweils, wie schnell der AD-Wandler ivm. dem PIC-Controller in der Klemme die Daten theoretisch an den Feldbus durchreichen kann. Das bedeutet keineswegs, das die Daten auch so schnell abgeholt werden können müssen.
Was hast Du jetzt eigentlich konkret für ein Problem? Deutung von Datenblättern?

O.K also über das Toggle-Bit auswerten ob neue Daten anliegen damit ich nicht den selben Messwert mehrfach auswerte, diese in ein Array schreiben und anschließend über die langsamere Task im Block abholen und auswerten. Habe ich so noch nicht in der PLC gemacht, klingt aber einleuchtend. Schöne Aufgabe ;)

Ich habe mehrere Probleme aber die Poste ich lieber nicht alle auf einmal in einem Thread :ROFLMAO: Worum es mit hier geht war herauszufinden wodurch der zusätzliche Zyklus bei der Loggerausgabe entsteht. Hintergrund ist der, ich lese in der PLC einen Bitstream ein und habe mich gewundert warum ich diesen mit einem Versatz von 1ms abtasten muss (bei einem PLC Zyklus von 1ms) um den korrekt auszuwerten. Jetzt wo ich die Zykluszeit auf 100µs verringert habe muss ich wieder testen ob mein eingefügter Versatz von 1ms in der PLC nicht wieder rückgängig gemacht werden muss.

Mein angepasstes Programm hat einwandfrei funktioniert, aber ich wüsste gerne woher der zusätzlichen Zyklus kommt. Kann an anderer Stelle ja wichtig sein und bei meinen Überlegungen sind die anderen Fragen On Top dazu gekommen ...
 
Beim 100us Zyklus ist die Loggerausgabe garnicht mehr genau genug für die ein oder zwei zusätzlichen Zyklen die vermutlich durch Deine Programmstruktur erforderlich werden.
Deshalb ist bei 100us-Zyklus auch scheinbar alles so, wie Du es erwartest.
Wie Oliver oben schon anmerkte: Schon die Lage des instanzierten Timers im Programm kann entsceidend sein.
 
Zuletzt bearbeitet:
Hallo weißnix,
er führt die Funktion für den Loggereintrag ja aus, sobald der Timerausgang TRUE wurde und fügt da einen Zählerwert zu. Der Eintrag wird zwar verzögert sichtbar, aber das dürfte ja keinen Einfluss auf den Zählerstand haben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo weißnix,
er führt die Funktion für den Loggereintrag ja aus, sobald der Timerausgang TRUE wurde und fügt da einen Zählerwert zu. Der Eintrag wird zwar verzögert sichtbar, aber das dürfte ja keinen Einfluss auf den Zählerstand haben.

Ich habe mir das Ganze jetzt mal unter dem TC Scope angeguckt. Es wird jeweils ein Zyklus für das True setzen und ein Zyklus für das False setzen des Timers benötigt. Das bedeutet bei einer Zykluszeit von 1ms insgesamt 2ms die ich zusätzlich auf meine eingestellten 10ms des Timers hinzu addieren muss. Dadurch ergeben sich die 12ms Ausgabezeit in der Loggerausgabe.

Jetzt dachte ich alles gut ... Habe das bei einem 100µs Zyklus wiederholt .... Da wird INKLUSIVE der beiden Zyklen für True und False 10ms benötigt. Gerade Ratlos :shock:

Scope PLC Zyklus 1ms
Scope 1ms.jpg

Scope PLC Zyklus 100us
Scope 1us.jpg

Code:
PROGRAM MAIN 

...

FLANKE();


Flanke.IN := TRUE;
FLanke.PT := T#10ms;
IF Flanke.Q THEN
   Flanke.IN := FALSE;
   Text :=CONCAT(INT_TO_STRING(i),' Hallo');
  ADSLOGSTR( msgCtrlMask := ADSLOG_MSGTYPE_HINT OR ADSLOG_MSGTYPE_LOG, msgFmtStr := '%s', strArg := Text);
END_IF
i := i+1;
IF i = 12 THEN
    i := 0;
END_IF

...
 
Zuletzt bearbeitet:
Ich hatte mir vorhin nochmal die Loggerausgaben angesehen. Da ist sehr schön zu sehen, das die Zyklenzahl bei der kurzen Zykluszeit exakt stimmt.
Bei den 1ms Tasks hingegen werden auch 12 Zyklen von Deinem Zykluszähler gezählt. Da ist irgendwas sehr mysteriös.
 
Hallo,


vielleicht wird es damit etwas klarer (hier jetzt für 1ms Zykluszeit):


Unbenannt.jpg


Ihr müßt beachten, wann sich was ändert. Gelb zeigt den Zustand der Variablen zu Beginn des Zyklus. Darunter dann, wenn sich die Variable wechselt. Flanke.in ist der Zustand des Eingangs, Flanke.et die bereits abgelaufene Zeit (in ms) und Flanke.q der Ausgang.


So benötigt das Programm schon einen zusätzlichen Zyklus, um den Zustandswechsel Flanke.in = 0 auszuwerten, siehe Zyklen 11-13. Dadurch, daß Flanke.in in Zyklus 11 auf false gesetzt wird, wird er noch lange nicht in diesem Zyklus durch den Timer ausgewertet. Das passiert erst im nächsten Zyklus. Sonst müßte man den Timer noch einmal in diesem Zyklus aufrufen.


Ein weiterer Zyklus kommt durch die Auswertung der abgelaufenen Zeit dazu, erst wenn Flanke.et >= der Sollzeit ist wird Flanke.q gesetzt, und das ist erst im 11. Zyklus nach dem Start des Timers.


Bei der Zykluszeit von 0,1ms müßte die Gesamtzeit dann eigentlich 10,2ms sein. Auch dort kommen die beiden zusätzlichen Zyklen vor.


Gruß
 
Zurück
Oben