Echtzeit

Entsprechend der Norm DIN 44300 ist die Echtzeit bzw. vielmehr der Echtzeitbetrieb definiert als:
„Echtzeitbetrieb ist ein Betrieb eines Rechensystems, bei dem Programme zur Verarbeitung anfallender Daten ständig betriebsbereit sind, derart, dass die Verarbeitungsergebnisse innerhalb einer vorgegebenen Zeitspanne verfügbar sind.“.
Mit anderen Worten bedeutet dies, dass die Ausgabewerte eines Anwenderprogramms, berechnet basierend auf dem inneren Zustand und den Eingabewerten, innerhalb einer definierten und garantierten Zeit zur Verfügung stehen. Diese definierte Zeit wird auch Zykluszeit genannt.

Das Anwendungsprogramm selbst kann aus mehreren Programmbausteinen bestehen, die wiederum andere Programme, Funktionsbausteine etc. aufrufen (siehe auch Norm IEC 61131-3). Die Programmbausteine können Echtzeit-Tasks zugeordnet werden, welche diese wiederum mit einer zu definierenden Zykluszeit und einer definierten Priorität aufrufen.

Die TwinCAT 3 Echtzeit ist eine Echtzeiterweiterung, welche in der aktuellen TwinCAT 3.1 Version unter den Microsoft Windows Betriebssystemen ab Windows 7 sowie unter TwinCAT/BSD verwendet werden kann. Um den beschriebenen Anforderungen an eine Steuerung von industriellen Prozessen gerecht zu werden, unterstützt die TwinCAT 3 Echtzeit die folgenden Eigenschaften:

Darüber hinausgehend bietet die TwinCAT 3 Echtzeit auch Multicore-Support, um den immer weiter steigenden Anforderungen an eine performante und flexible/erweiterbare Steuerungsplattform gerecht zu werden. Die verfügbaren Rechenkerne können dabei entweder exklusiv für TwinCAT genutzt werden oder sie werden mit Windows geteilt. Im Folgenden werden die Kerne daher als "isolated" oder "shared" bezeichnet.

Echtzeitfähiges Scheduling

Die TwinCAT 3 Echtzeit arbeitet mit dem Doppeltick-Verfahren. Das bedeutet, dass das Umschalten in den Echtzeitmodus und wieder zurück jeweils von einem Interrupt ausgelöst wird. Der Interrupt beim Umschalten in den Echtzeitmodus startet gleichzeitig auch das Scheduling. Nach einer einstellbaren Zeitdauer, spätestens aber nach 90% der eingestellten Zykluszeit, schaltet TwinCAT auf „shared“-Kernen in den Nicht-Echtzeitmodus zurück, damit das Gastbetriebssystem genügend Rechenzeit erhält, um seinerseits die notwenigen Antwortzeiten für Hardware-Funktionen etc. einzuhalten. Eine Ausnahme bilden hier die isolierten Kerne.

Als Scheduling wird der (System-)Prozess bezeichnet, welcher die Abarbeitungsreihenfolge und den Abarbeitungszeitpunkt der einzelnen Tasks, basierend auf der definierten Zykluszeit und der definierten Priorität bestimmt. Die strenge Einhaltung des Abarbeitungszeitpunkts sorgt dafür, dass die oben beschriebene Einhaltung der Echtzeit gewährleistet wird.

Angestoßen durch einen synchronen Basis-Tick auf allen Echtzeitkernen, wird in der TwinCAT 3 Echtzeit das Scheduling für jeden Echtzeitkern unabhängig berechnet. Damit ist garantiert, dass Echtzeit-Tasks, welche auf verschiedenen Kernen laufen, sich nicht beeinflussen. Sofern dies nicht durch die Verwendung von Verriegelungen explizit im Anwenderprogramm programmiert wurde.

Ein Scheduling, bei dem die Priorität eines Tasks anhand seiner Zykluszeit abgeleitet wird, bezeichnet man auch als Ratenmonotones Scheduling. Die TwinCAT 3 Echtzeit aktiviert automatisch die Option „Automatic Priority Management“. Da dies nicht für jeden Anwendungsfall die beste Lösung ist, können Sie die Prioritäten manuell anpassen.

Beispielhafte Darstellung des Aufrufs einer SPS-Task

Echtzeit 1:

In der Abbildung dargestellt sehen Sie den Aufruf einer SPS-Task. Nachdem der Echtzeit-Tick erfolgt ist, wird vom Scheduler die SPS-Task aufgerufen. Diese stellt der SPS-Anwendung die aktuellen Eingangswerte zur Verfügung (Input-Update), danach erfolgt die Abarbeitung des Anwendungsprogramms (Cycle-Update) und abschließend das Schreiben der Ergebnisse auf die Ausgänge (Output-Update). Ist dieses beendet, erfolgt das Umschalten in den Nicht-Echtzeit-Mode (Doppeltick). Wie in der Abbildung zu sehen ist, kann die Ausführungsdauer des Anwenderprogramms variieren, je nachdem welcher Code basierend auf dem inneren Zustand des Programms durchlaufen wird. Somit variiert auch der Zeitpunkt, wann die Ausgänge geschrieben werden. Je nachdem welche Task unter Umständen ein Bussystem treibt, kann dies dazu führen, dass das Absenden der Bustelegramme in gleichem Maße variiert.

Beispielhafter Aufruf einer Task mit „IO am Task-Beginn“

Echtzeit 2:

Durch die Verwendung der Option „IO am Task-Beginn“ kann die Abarbeitungsreihenfolge innerhalb einer Task dahingehend geändert werden, dass nach dem Lesen der Eingänge direkt die Ausgänge (des vorhergehenden Zyklus) geschrieben werden, bevor die Abarbeitung des Anwendungsprogramms erfolgt. Obwohl das Schreiben der Ausgänge erst einen Zyklus später erfolgt, hat diese Einstellung den Vorteil, dass der Zeitpunkt, wann die Ausgänge auf den Prozess / den Bus geschrieben werden, in jedem Zyklus exakt derselbe ist.

Präemptives Multitasking

Präemptives Multitasking bedeutet, dass der aktuelle Zustand eines Prozesses (die CPU- und Floatingpoint-Register), bei einer Unterbrechung durch einen Interrupt (z. B. durch höher priore Prozesse), gesichert und der aktuelle Prozess „schlafen gelegt“ wird. Ist dies passiert, bestimmt der Scheduler, anhand der Prioritäten der Tasks, den (neuen) abzuarbeitenden Prozess. Nachdem der zu unterbrechende Prozess beendet wurde, wird der Prozesskontext wiederhergestellt und der „alte“ Prozess fortgesetzt.

Direkter Hardwarezugriff

Um ein deterministisches (reproduzierbares) Echtzeit-Verhalten zu erreichen, benötigt die TwinCAT 3 Echtzeit einen direkten Hardwarezugriff. Damit dies möglich ist, muss die TwinCAT 3 Echtzeit im sogenannten Kernel-Mode von Windows ausgeführt werden. Dadurch ist es u.a. möglich, dass die TwinCAT-Echtzeit direkt auf die Netzwerk-Ports zugreift und Echtzeit-Ethernet-Telegramme (z. B. EtherCAT) versenden und empfangen kann.

Schematische Darstellung der TwinCAT 3-Laufzeitumgebung

Das folgende Bild stellt den Aufbau der TwinCAT 3.1 Laufzeitumgebung (Runtime), bezogen auf das Scheduling, schematisch dar. Die TwinCAT 3 Laufzeitumgebung ermöglicht das Ausführen von Anwendermodulen in Echtzeit. Ein wesentlicher Teil der TwinCAT 3 Laufzeitumgebung ist somit der Echtzeit-Treiber, welcher auf den für TwinCAT aktivierten Kernen ausgeführt wird und dort das Scheduling übernimmt. Letzteres erfolgt auf den einzelnen Kernen unabhängig voneinander.

Echtzeit 3:

Isolierte Kerne

Wie unter Echtzeit Scheduling beschrieben, verwendet TwinCAT ein Doppeltick-Verfahren, damit zu einem festgelegten Zeitpunkt in den Nicht-Echtzeitmodus zurückgeschaltet wird. Beim Umschalten zwischen Echtzeit-Modus und Nicht-Echtzeit-Modus erfolgt, wie unter Präemptives Multitasking beschrieben, ein Restaurieren des vorgehenden Prozesszustands. Je nachdem wie intensiv die Echtzeit- und Nicht-Echtzeit-Programme den Speicher und insbesondere den Cache auslasten, braucht das Wiederherstellen Zeit. Um diese zeitlichen Effekte zu beseitigen, erlaubt es die TwinCAT 3.1 Echtzeit, Kerne vom Gastbetriebssystem zu isolieren. Dadurch ist ein Zurückschalten nicht mehr erforderlich, was sowohl in mehr Rechenzeit für das Echtzeit-Anwenderprogramm resultiert als auch in einer besseren Echtzeit-Güte (geringerer Jitter) durch die Vermeidung von zeitlichen Effekten beim Wiederherstellen des „alten“ Prozesszustands.

Echtzeit 4:

Verhalten bei Zykluszeitüberschreitung

Wird die definierte Zykluszeit eines Tasks überschritten, wird im nächsten Zyklus die Abarbeitung des „alten“ Zyklus fortgesetzt. Zudem wird der Überschreitungszähler der Task nach oben gesetzt. Nach der fertigen Abarbeitung des alten / vorangegangenen Zyklus, wird sofort versucht die Taskabarbeitung des aktuellen Zyklus zu starten. Wird diese innerhalb dieses Zyklus fertig gestellt, erfolgt die weitere Abarbeitung wie oben gezeigt.

Echtzeit 5:

Wird auch der zweite direkt darauffolgende Zyklus überschritten (wobei es hierbei unerheblich ist, ob es sich noch um die Abarbeitung des 1. Zyklus oder bereits die Abarbeitung des 2. Zyklus handelt), wird die aktuelle Bearbeitung fertig ausgeführt und das nächste Starten der Abarbeitung der Task startet erst zum nächstmöglichen geplanten Zyklusstart. Es gehen hierbei also unter Umständen mehrere Zyklen verloren. Der Überschreitungszähler wird auch hierbei entsprechend hochgezählt.

Echtzeit 6:

Unterschiede in der Abarbeitung zwischen SPS- zu „TcCom“-Laufzeitmodulen

Die Abarbeitungsreihenfolge einer TwinCAT-Task, bezogen auf die Ausführung von Laufzeitmodulen, besteht aus der folgenden Sequenz:

  1. Umkopieren der Eingänge auf die Prozessabbilder der von ihr aufgerufenen Laufzeitmodule.
  2. Ausführen der Module entsprechend der Sort-Order (in aufsteigender Reihenfolge).
  3. Ausgangs-Update, welches die Ausgänge entsprechend bereitstellt. Treibt diese Task einen EtherCAT-Feldbus, wird der Frame während des Ausgangsprozessabbildes bereitgestellt und versendet.
  4. Post-Zyklusupdate: Wird u. a. für das Anstoßen des Zyklusupdates verwendet, wenn die Option „IO am Taskbeginn“ aktiv ist.

Werden Laufzeitmodule einer Task hinzugefügt, „melden“ diese sich an den jeweiligen Aufrufen der Task an. Die einzige Ausnahme sind SPS-Laufzeitmodule. Aus Kompatibilitätsgründen zu TwinCAT 2 erfolgt durch die SPS-Laufzeitmodule direkt das Updaten der Ein- und Ausgänge. Der Unterschied zwischen den beiden Verhaltensweisen wird in der folgenden Abbildung dargestellt:

Echtzeit 7:

Zu sehen sind jeweils 4 Laufzeitmodule. Standard-TwinCAT 3 –Laufzeitmodule melden sich bei den entsprechenden Methoden-Aufrufen der Task an. Das bedeutet, alle Ein- (gelb) und Ausgangsupdates (rot) werden von der Task angestoßen und erfolgen direkt nacheinander zu Beginn bzw. am Ende der Taskabarbeitung. Kommunizieren zwei dieser Module über ein Mapping miteinander, so erhalten diese die jeweils aktuellen Werte erst im nächsten Zyklus.

Die SPS-Laufzeitmodule führen eigenständig ein Ein- und Ausgangsupdate durch. Kommunizieren zwei SPS-Laufzeiten miteinander, so bekommt das Laufzeitmodul, welches als zweites ausgeführt wird, direkt die aktuellen Werte vom ersten Laufzeitmodul. Somit ist in der Kommunikationsrichtung 1. Laufzeitmodul -> 2. Laufzeitmodul kein Zyklusversatz, in die andere Richtung aber schon.