TIA 1500er CPUs interne Realisierung von Timer

Fluffi

Level-2
Beiträge
449
Reaktionspunkte
69
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich stelle mir schon lange die Frage wie Timer, genauer gesagt die guten alten Legacy-Timer (nicht IEC, wobei die Unterscheidung hier wohl keine Rolle spielen dürfte) auf einer Siemens CPU eigentlich genau realisiert werden. Da ich aktuell nur noch 1500er CPUs einsetze (mit TIA V15.1) bezieht sich die Frage eher auf diese CPU-Generation. Auf microControllern laufen spezielle Timer bzw. Zeitfunktionen ja gerne direkt in Hardware-Registern ab (ich meine jetzt keine Interrupts), sprich die CPU koppelt diese mit dem CPU Takt und es besteht nur ein sehr geringer oder eigentlich gar kein Overhead für Berechnung. Ist das bei Siemens auch ein (größtenteils) hardwarebasierender Vorgang auf der CPU, oder laufen diese auf dem OS der CPU in reiner Software ab, wo die Berechnungszeit sich in Abhängigkeit der Anzahl der verwendeten Timer erhöht. Ich stelle deshalb diese Frage, da ich gerne sehr viele Timer einsetze und mich immer frage, ob das nicht irgendwann "zuviele" sind, auch wenn ich deswegen noch keine direkten Probleme mit der Zykluszeit hatte, sofern ich das abschätzen kann. Ist das eher schlecht für die Zykluszeit und Performance, oder ist im großen und ganzen die Anzahl vernachlässigbar. Es könnte ja sein, dass die Timer vom System aus alle sowieso reserviert sind und schlussendlich es egal ist ob man einen oder 500 benutzt, da immer alle pro kleinster Zeiteinheit intern durchgenudelt werden.
 
Also wenn ich es richtig verstanden habe, laufen die "alten" Timer im OS der CPU und verwenden dort speziell reservierte Speicherplätze während die IEC-Timer reine Softwarefunktionen sind, weswegen sie auch entsprechende Instanzen (DB, Multiinstanz) brauchen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ohne genau zu kennen, wie die interne Verarbeitung der Legcy-Timer genau läuft, aber mit viel Erfahrung im Bereich Coden und Kompilieren stelle ich einfach mal eine Hypothese auf:
(gesützt auf 2 Zitate aus der TIA-Hilfe)
S_IMPULS
In der Zeitzelle vermindert das Betriebssystem den Zeitwert in einem, von der Zeitbasis festgelegten, Intervall um jeweils eine Einheit, bis der Zeitwert gleich "0" ist. Die Verminderung erfolgt asynchron zum Anwenderprogramm. Dadurch ist die resultierende Zeit maximal bis zu einem Zeitintervall der Zeitbasis kürzer als der gewünschte Zeitwert.

TON
Die Aktualisierung der Anweisungsdaten geschieht in den folgenden Fällen:
  • Bei einem Aufruf der Anweisung, wenn die Ausgänge ET oder Q verschaltet sind. Wenn die Ausgänge nicht verschaltet sind, dann wird der aktuelle Zeitwert am Ausgang ET nicht aktualisiert.
  • Bei einem Zugriff auf die Ausgänge Q oder ET.

Ich ziehe daraus folgende Schlüsse:
  1. Für die Legacy-Timer ist ein eigener Speicherbereich vorgesehen, der vom Betriebssystem im Hintergrund bearbeitet wird. Es ist sicherlich keine spezialisierte Hardware verbaut. Realistischerweise wird er Compiler, sobald Legacy-Timer vorhanden sind, einen oder mehrere Interrupts (nennen wir sie OBs) anlegen welche die aktiven Timer im Hintergrund je nach Zeitbasis durchiteriert. Es wird also Rechenzeit verbraten.
  2. Die IEC-Timer sind ganz normale Instruktionen (in Alt-Sprache: FB-Aufrufe), zu denen der Compiler Code baut und die schätzungsweise auf einem System-Tick-Zähler aufsetzen. Immer dann, wenn auf die Ausgänge ET oder Q zugegriffen wird, ruft der Compiler die gleiche Instruktion implizit auf, um die Ausgänge der Instruktion neu ausrechnen zu lassen (um so das eigentlich sinnlose asynchrone Verhalten der Legacy-Timer auch in der neuen Welt zu übernehmen).

Aus Sicht der Effizienz sehe also 2 Dinge:
  1. Legacy-Timer = Pfui, da sie zusätzliche Interrupt-Last erzeugen.
  2. IEC-Timer ja, aber nur in kompakter Form, wo beim Aufruf alle Ausgänge direkt beschaltet werden. Nachfolgender Code (aus der Siemens Hilfe) sollte das veranschaulichen

Code:
// gut:
"TON_DB".TON(IN := "Tag_Start", PT := "Tag_PresetTime", Q => "Tag_Status", ET => "Tag_ElapsedTime");

// böse:
"TON_DB".TON(IN := "Tag_Start", PT := "Tag_PresetTime");
"Tag_Status" := "TON_DB".Q;
"Tag_ElapsedTime" := "TON_DB".ET;
 
Zurück
Oben