ich habe mal wieder eine frage zu twincat.
wo/wie kann ich die zykluszeit feststellen?
folgender hintergrund: twincat kann ja mehrere tasks mit unterschiedlichen intervallzeiten handhaben. ich kann also zb vorgeben, dass ein task ein bestimmtes programm aller 10ms (standard) durchläuft.
doch was passiert, wenn mein programmzyklus noch nicht vollständig durchlaufen wurde???
ich möchte etwas zeitkritisches programmieren und möchte die intervallzeit auf 1ms festlegen. das geht soweit auch, doch wie merke ich, ob mein programm für einen zyklus mehr als diese eine ms benötigt (hat) und wie äußert sich so eine überschreitung?
mfg speed
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
wenn du einen Task mit fester Zeitvorgabe erstellst kannst du diese "Zeitverletzungen" abfangen, falls es deine Steuerung unterstützt.
Im Taskmanager kannst du unter System-Ereignisse die Ereignisse anwählen und mit Programmaufrufen versehen die du magst.
Klaus
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo,
die Vorgabe der Zykluszeit im TaskManager ist nur die halbe Wahrheit, das ist richtig. Es läuft núr der Task mit Priorität 0 in absoluter Echtzeit (deshalb solltest Du auch nur EINEN Task mit dieser Priorität haben).
Wenn ein Task mit einer höheren Priorität als der momentan laufende "dran" ist (Aufrufzyklus ist abgelaufen), unterbricht TwinCAT das laufende Programm und schiebt den Task mit der höheren Priorität ein. Wenn der fertig ist, wird an der Unterbrechungsstelle fortgesetzt.
Man kann den (Aufruf-)Zyklus eines Task von Zyklus zu Zyklus direkt messen. CoDeSys hat dazu dankenswerterweise die Funktion TIME(); sie liefert den CPU-Zeitstempel zurück. Die aktuelle Zykluszeit ergibt sich dann durch Subtrahieren des Zeitstempels aus dem letzten Aufruf :
bist du dir sicher dass das die tatsächliche Zykluszeit ist. Ich bin der Meinung das CoDeSys auf die Windows Uhrzeit zugreift und die wird glaube ich über Interrupt angefragt, der ja selber im Windows keine absolute hohe Priorität hat.
Ich denke nicht dass das die CMOS Uhrzeit ist die dort über Time() ermittelt wird oder bezieht sich die Time() immer auf die CPU des Zielsystem. ???
MacToolz
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
@KlOis:bei mir sieht das fenster dort leider etwas anders aus. ich finde die stelle nicht, wo ich diese häkchen setzen könnte (bild hängt dran)
@Rolf_Geisler: danke, ich wer das mal probieren!
merkwürdig: im twincat system manager unter "sps-konfiguration" kann man für jeden task unter "online" ein diagram sehen mit irgendwelchen zeiten, was hat es damit auf sich? bei mir steht dort zb total: 20µs cpu: 12µs . wie ist das zu verstehen? mein programm ist zwar nicht riesig, aber als zykluszeit kommt mir das iwie sehr kurz vorher....ok, ich hab nen relativ flotten rechner, aber kann das sein?
mfg speed
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
SpeedFreak hat geschrieben:
@KlOis:bei mir sieht das fenster dort leider etwas anders aus. ich finde die stelle nicht, wo ich diese häkchen setzen könnte (bild hängt dran)
CoDeSys Hilfe hat geschrieben:
System-Ereignisse
Anstelle einer Task kann auch ein Systemereignis (Event) einen Projektbaustein zur Abarbeitung aufrufen. Die dazu verwendbaren Systemereignisse sind zielsystemabhängig (Definition erfolgt über eine Beschreibungsdatei im XML-Format, die in der Target-Datei referenziert wird). Sie setzen sich zusammen aus der Liste der unterstützten Standardsystemereignisse der Steuerung und eventuell hinzugefügten herstellerspezifischen Ereignissen. Mögliche Ereignisse sind z.B. Stop, Start, Online Change.
Also so wie ich schon sagte, es ist Steuerungsabhängig und bei dir scheint es nicht unterstützt zu werden.
Gruß
KlOis
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
ich habe noch kein IPC von Beckhoff genutzt, deshalb weiß ich leider nicht ob es auf diesen Geräten unterstützt wird. Aber es ist ja von deiner Laufzeitumgebung abhängig, die installiert ist.
hast du mal die Variante von Rolf getestet?
(also auch bewusst Operationen ausgeführt die länger als ein Zyklus dauern [z.B. lange Schleife])
Gruß
Klaus
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
nein habe ich noch nicht, also doch habe ich, aber ich komme immer auf die 1ms, weil genauer geht es ja nicht mit TIME(). spontan fällt mir garnix ein, womit ich den rechner länger als 1ms beschäftigen könnte...wie schon gesagt der rechner is dermaßen schnell... da kann ich den größten stuss zusammenschreiben und der zuckt überhaupt nicht... macht aber nix...
ich weiß jetz erstmal, wo mein eigentliches problem her kommt. ich wollte praktisch folgendes realisieren. ich nehme einen task mit 1ms und höchster prio her. in diesem task wollte ich einen takt/frequenzgenerator basteln. das programm wollte ich mit input-variablen "von außen" aufrufen können und so für verschiedene funktionen mir definierte takte von zb 8ms oder so geben lassen. als "taktquelle" habe ich zwei TON-FBs so miteinander verschaltet, dass sie sich gegenseitig ein und ausknipsen. das hat soweit auch funktioniert....mit einem haken... wenn ich zeiten kleiner 100ms (!!!) fahren wollte...zb 10ms hatte ich "verluste" es kamen dann halt nicht mehr zb 6000 takte pro minute sondern zb 5500 oder irgendsowas. bei 100 ms war das noch kein problem da kamen 600/min --> stimmte also, hab ich dann kleinere zeiten versucht war feierabend. ein kollege wies mich auf den "fehler" hin. die Bausteine TON und TOF ...also ein- bzw ausschaltverzögerungen... können diese kurzen verzögerungen nicht sicher schalten...warum auch immer, laut seiner aussage sei das so in der iec 61131 festgehalten.
andererseits brauche ich diese teile auch nich mehr, da mein task selber ja schön regelmäßig aller 1ms durchläuft und ich einfach "mitzählen" und mir einfach die nötigen ausgabe-variablen bauen kann.
ich weiß, dass das für viele hier sehr trivial sein dürfte...ich fang halt grad erst an.
mfg speed
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
also jeden Rechner bekommst du zu arbeiten. Ganz einfach
for udCount := 0 to 4294967295 do
mach irgendwas auch wenn wenig aber die Schleife läuft seeeehr lange, definitiv auch mit dem iCore7 und wenn nicht dann sooo....
end_for
for udCount := 0 to 4294967295 do
for udCount := 0 to 4294967295 do
und mach hier irgendwas .... egal ...
end_for
end_for
oder ....
MacToolz
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
hi. for-schleifen müssen als zählvar eine int16 haben, also geht bis 32767 ...weiß der geier warum, ist aber so.
eine einzelne for-next in etwa so
FOR n := 1 TO 32767 DO
m := m + 1;
END_FOR
verballert ca 150µs
...reicht also noch nicht
wenn man zwei davon verschachtelt:
FOR n := 1 TO 32767 DO
FOR p := 1 TO 32767 DO
m := m + 1;
END_FOR
END_FOR
geht der twincat system manager fest und verabschiedet sich ohne rettung, der prozess bleibt aber am laufen und man bekommt ihm im win tastmanager auch nicht abgeschossen...nach ner weile bekommt man vom plc control ne nette meldung: kommunikationsfehler(#1): es wird ausgeloggt. danach kann man nur noch neustarten, da man nix mehr zum laufen bekommt.
für die, die es vielleicht interessiert, der hochpriorisierten task mit 1ms als taktgeber funzt inzwischen prima.
mfg speed
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo Gemeinde,
bin auch wieder da. War einige Zeit offline und konnte mich daher an Eurer Diskussion nicht beteiligen. Jetzt habe ich aber Zeit, auch meinen Senf noch dazuzugeben.
Da gab es von mactoolz die Frage ob ich mir sicher bin mit der Zykluszeit. Bin ich. TwinCAT wird sich - wie jedes ordentliche Echtzeitsystem - nicht auf die Systemzeit verlassen. Echtzeiterweiterungen, z.B. RTkernel (habe ich vor Urzeiten benutzt, um MS-DOS echtzeitfähig zu machen und Maschinensteuerungen darauf laufen zu lassen), bringen ihre eigene Zeitverwaltung mit. Die ist weit präziser als die Rechner-Systemzeit, sonst wäre das Zeug ja keine Echtzeit ... TwinCAT setzt mit hoher Wahrscheinlichkeit auch auf einer solchen Echtzeiterweiterung auf.
Habe mit der beschriebenen Zeitmessung auch noch keine Genauigkeitsprobleme feststellen können.
Beckhoff-IPCs sind in der Tat sauschnell. Wenn Ihr der Kiste eine merkliche Reaktion entlocken wollt, müßt Ihr in den Schleifen schon etwas mehr machen als nur eine Festpunktaddition. Gleitkommaarithmetik sollte es schon sein, am besten eine Multiplikation oder Division (früher brauchte die Gleitkommadivision mehr Zeit als die Multipklikation, aber ob das bei den heutigen Prozessorarchitekturen noch so ist, weiss ich nicht).
Schön zu lesen, dass speed der Lösung seines Ursprungsproblems näherkommt.
Gruss Rolf
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
ok stimmt mit den Zeiten, wäre ja auch fatal sich auf die Windowszeit zu stützen, logisch. Ich hatte aber mal den Fall das ich mit den Zeiten auch gespielt habe
und mit ist aufgefallen das mal mein Zyklus 0ms und auch mal 16ms ergab. Obwohl das Programm nichts gemacht hat.
Vielleicht lag es daran, oder es lag genau daran, dass ich mit der PlcWinNt auf meinem PC rumgespielt habe und kein Echtzeit Zielsystem hatte. Ja wenn man drüber nachdenkt
kann das nur so sein.
SpeedFreak hat geschrieben:
hi. for-schleifen müssen als zählvar eine int16 haben, also geht bis 32767 ...weiß der geier warum, ist aber so.
eine einzelne for-next in etwa so
Stimmt habe ich vergessen, Integer gehen nur bei For-Schleifen, dann muss man halt die While-Schleife nehmen und selber für den Abbruch der Schleife selber sorgen.
MacToolz
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Bei TwinCAT werden diese Werte bereits intern berechnet. Abrufen kann man diese über die TcSystem.lib.
Durch das Einbinden der Library wird in den globalen Variablen ein Array vom Typ SystemTaskInfoType angelegt, aus der man Informationen wie CycleTime, LastCycleTime, CycleTimeExceeded auslesen kann.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
hallo
ich habe mal wieder eine frage zu twincat.
wo/wie kann ich die zykluszeit feststellen?
folgender hintergrund: twincat kann ja mehrere tasks mit unterschiedlichen intervallzeiten handhaben. ich kann also zb vorgeben, dass ein task ein bestimmtes programm aller 10ms (standard) durchläuft.
doch was passiert, wenn mein programmzyklus noch nicht vollständig durchlaufen wurde???
ich möchte etwas zeitkritisches programmieren und möchte die intervallzeit auf 1ms festlegen. das geht soweit auch, doch wie merke ich, ob mein programm für einen zyklus mehr als diese eine ms benötigt (hat) und wie äußert sich so eine überschreitung?
mfg speed
Hallo,
wenn du einen Task mit fester Zeitvorgabe erstellst kannst du diese "Zeitverletzungen" abfangen, falls es deine Steuerung unterstützt.
Im Taskmanager kannst du unter System-Ereignisse die Ereignisse anwählen und mit Programmaufrufen versehen die du magst.
Klaus
Hallo,
die Vorgabe der Zykluszeit im TaskManager ist nur die halbe Wahrheit, das ist richtig. Es läuft núr der Task mit Priorität 0 in absoluter Echtzeit (deshalb solltest Du auch nur EINEN Task mit dieser Priorität haben).
Wenn ein Task mit einer höheren Priorität als der momentan laufende "dran" ist (Aufrufzyklus ist abgelaufen), unterbricht TwinCAT das laufende Programm und schiebt den Task mit der höheren Priorität ein. Wenn der fertig ist, wird an der Unterbrechungsstelle fortgesetzt.
Man kann den (Aufruf-)Zyklus eines Task von Zyklus zu Zyklus direkt messen. CoDeSys hat dazu dankenswerterweise die Funktion TIME(); sie liefert den CPU-Zeitstempel zurück. Die aktuelle Zykluszeit ergibt sich dann durch Subtrahieren des Zeitstempels aus dem letzten Aufruf :
Braucht TwinCAT also mehrere Taskaufrufe, um den Task komplett abzuarbeiten, wird Zykluszeit größer als im Taskmanager eingestellt.
Gruss Rolf
Hi,
bist du dir sicher dass das die tatsächliche Zykluszeit ist. Ich bin der Meinung das CoDeSys auf die Windows Uhrzeit zugreift und die wird glaube ich über Interrupt angefragt, der ja selber im Windows keine absolute hohe Priorität hat.
Ich denke nicht dass das die CMOS Uhrzeit ist die dort über Time() ermittelt wird oder bezieht sich die Time() immer auf die CPU des Zielsystem. ???
MacToolz
@KlOis:bei mir sieht das fenster dort leider etwas anders aus. ich finde die stelle nicht, wo ich diese häkchen setzen könnte (bild hängt dran)
@Rolf_Geisler: danke, ich wer das mal probieren!
merkwürdig: im twincat system manager unter "sps-konfiguration" kann man für jeden task unter "online" ein diagram sehen mit irgendwelchen zeiten, was hat es damit auf sich? bei mir steht dort zb total: 20µs cpu: 12µs . wie ist das zu verstehen? mein programm ist zwar nicht riesig, aber als zykluszeit kommt mir das iwie sehr kurz vorher....ok, ich hab nen relativ flotten rechner, aber kann das sein?
mfg speed
Hallo SpeedFreak,
Also so wie ich schon sagte, es ist Steuerungsabhängig und bei dir scheint es nicht unterstützt zu werden.
Gruß
KlOis
nicht unterstützt... mh keine ahnung, wenn ich dir mein system nenne, greift sich warscheinlich jeder hier an den kopf
ich entwickle auf nem laptop mit core i7 und ner intel-netzwerkkarte... hatte gehofft, dass das nich so weit weg is von einem beckhoff-ipc.
mfg speed
Hey SpeedFreak,
ich habe noch kein IPC von Beckhoff genutzt, deshalb weiß ich leider nicht ob es auf diesen Geräten unterstützt wird. Aber es ist ja von deiner Laufzeitumgebung abhängig, die installiert ist.
hast du mal die Variante von Rolf getestet?
(also auch bewusst Operationen ausgeführt die länger als ein Zyklus dauern [z.B. lange Schleife])
Gruß
Klaus
nein habe ich noch nicht, also doch habe ich, aber ich komme immer auf die 1ms, weil genauer geht es ja nicht mit TIME(). spontan fällt mir garnix ein, womit ich den rechner länger als 1ms beschäftigen könnte...wie schon gesagt der rechner is dermaßen schnell... da kann ich den größten stuss zusammenschreiben und der zuckt überhaupt nicht... macht aber nix...
ich weiß jetz erstmal, wo mein eigentliches problem her kommt. ich wollte praktisch folgendes realisieren. ich nehme einen task mit 1ms und höchster prio her. in diesem task wollte ich einen takt/frequenzgenerator basteln. das programm wollte ich mit input-variablen "von außen" aufrufen können und so für verschiedene funktionen mir definierte takte von zb 8ms oder so geben lassen. als "taktquelle" habe ich zwei TON-FBs so miteinander verschaltet, dass sie sich gegenseitig ein und ausknipsen. das hat soweit auch funktioniert....mit einem haken... wenn ich zeiten kleiner 100ms (!!!) fahren wollte...zb 10ms hatte ich "verluste" es kamen dann halt nicht mehr zb 6000 takte pro minute sondern zb 5500 oder irgendsowas. bei 100 ms war das noch kein problem da kamen 600/min --> stimmte also, hab ich dann kleinere zeiten versucht war feierabend. ein kollege wies mich auf den "fehler" hin. die Bausteine TON und TOF ...also ein- bzw ausschaltverzögerungen... können diese kurzen verzögerungen nicht sicher schalten...warum auch immer, laut seiner aussage sei das so in der iec 61131 festgehalten.
andererseits brauche ich diese teile auch nich mehr, da mein task selber ja schön regelmäßig aller 1ms durchläuft und ich einfach "mitzählen" und mir einfach die nötigen ausgabe-variablen bauen kann.
ich weiß, dass das für viele hier sehr trivial sein dürfte...ich fang halt grad erst an.
mfg speed
Hallo,
also jeden Rechner bekommst du zu arbeiten. Ganz einfach
for udCount := 0 to 4294967295 do
mach irgendwas auch wenn wenig aber die Schleife läuft seeeehr lange, definitiv auch mit dem iCore7 und wenn nicht dann sooo....
end_for
for udCount := 0 to 4294967295 do
for udCount := 0 to 4294967295 do
und mach hier irgendwas .... egal ...
end_for
end_for
oder ....
MacToolz
hi. for-schleifen müssen als zählvar eine int16 haben, also geht bis 32767 ...weiß der geier warum, ist aber so.
eine einzelne for-next in etwa so
FOR n := 1 TO 32767 DO
m := m + 1;
END_FOR
verballert ca 150µs
...reicht also noch nicht
wenn man zwei davon verschachtelt:
FOR n := 1 TO 32767 DO
FOR p := 1 TO 32767 DO
m := m + 1;
END_FOR
END_FOR
geht der twincat system manager fest und verabschiedet sich ohne rettung, der prozess bleibt aber am laufen und man bekommt ihm im win tastmanager auch nicht abgeschossen...nach ner weile bekommt man vom plc control ne nette meldung: kommunikationsfehler(#1): es wird ausgeloggt. danach kann man nur noch neustarten, da man nix mehr zum laufen bekommt.
für die, die es vielleicht interessiert, der hochpriorisierten task mit 1ms als taktgeber funzt inzwischen prima.
mfg speed
Hallo Gemeinde,
bin auch wieder da. War einige Zeit offline und konnte mich daher an Eurer Diskussion nicht beteiligen. Jetzt habe ich aber Zeit, auch meinen Senf noch dazuzugeben.
Da gab es von mactoolz die Frage ob ich mir sicher bin mit der Zykluszeit. Bin ich. TwinCAT wird sich - wie jedes ordentliche Echtzeitsystem - nicht auf die Systemzeit verlassen. Echtzeiterweiterungen, z.B. RTkernel (habe ich vor Urzeiten benutzt, um MS-DOS echtzeitfähig zu machen und Maschinensteuerungen darauf laufen zu lassen), bringen ihre eigene Zeitverwaltung mit. Die ist weit präziser als die Rechner-Systemzeit, sonst wäre das Zeug ja keine Echtzeit ... TwinCAT setzt mit hoher Wahrscheinlichkeit auch auf einer solchen Echtzeiterweiterung auf.
Habe mit der beschriebenen Zeitmessung auch noch keine Genauigkeitsprobleme feststellen können.
Beckhoff-IPCs sind in der Tat sauschnell. Wenn Ihr der Kiste eine merkliche Reaktion entlocken wollt, müßt Ihr in den Schleifen schon etwas mehr machen als nur eine Festpunktaddition. Gleitkommaarithmetik sollte es schon sein, am besten eine Multiplikation oder Division (früher brauchte die Gleitkommadivision mehr Zeit als die Multipklikation, aber ob das bei den heutigen Prozessorarchitekturen noch so ist, weiss ich nicht).
Schön zu lesen, dass speed der Lösung seines Ursprungsproblems näherkommt.
Gruss Rolf
Hi,
ok stimmt mit den Zeiten, wäre ja auch fatal sich auf die Windowszeit zu stützen, logisch. Ich hatte aber mal den Fall das ich mit den Zeiten auch gespielt habe
und mit ist aufgefallen das mal mein Zyklus 0ms und auch mal 16ms ergab. Obwohl das Programm nichts gemacht hat.
Vielleicht lag es daran, oder es lag genau daran, dass ich mit der PlcWinNt auf meinem PC rumgespielt habe und kein Echtzeit Zielsystem hatte. Ja wenn man drüber nachdenkt
kann das nur so sein.
Stimmt habe ich vergessen, Integer gehen nur bei For-Schleifen, dann muss man halt die While-Schleife nehmen und selber für den Abbruch der Schleife selber sorgen.
MacToolz
Bei TwinCAT werden diese Werte bereits intern berechnet. Abrufen kann man diese über die TcSystem.lib.
Durch das Einbinden der Library wird in den globalen Variablen ein Array vom Typ SystemTaskInfoType angelegt, aus der man Informationen wie CycleTime, LastCycleTime, CycleTimeExceeded auslesen kann.