Distributed Clocks & TwinCAT PLC
Gültigkeit der nachstehenden Einstellungen Nachfolgende Ausführungen basieren auf TwinCAT 2.11 build 1539. Neuere Ausgaben können eine abweichende Oberflächengestaltung aufweisen, die Verwendung bleibt aber sinngemäß die gleiche. Teilfunktionen können schon in Vorgängerversionen enthalten sein, es ist jedoch zu beachten, dass ggf. auf dem Ziel- wie auch dem Programmiersystem die gleiche TwinCAT Version (z. B. 2.11) vorliegen muss, um die aktuellsten Funktionen zu unterstützen. |
Aus der Sicht der PLC ist TwinCAT 2.11 eine stetige Weiterentwicklung von TwinCAT 2.10. Die PLC-Bibliotheken wurden um weitere Features ergänzt. Für die Verwendung mit Distributed Clocks-Funktionen sind insbesondere folgende Bibliotheken von Interesse:
- TcUtilities.lib
- Funktionen zur Behandlung von 64-Bit-Werten: UINT64 und INT64
- Funktionen zum Auslesen versch. Zeitquellen
- TcEtherCAT.lib
- Funktionen zur Manipulation von EtherCAT Geräten
- Funktionen zum Auslesen der DC-Zeiten
Diese Bibliotheken sind in jeder TwinCAT-Installation enthalten.
Arbeiten mit DC-Zeiten in der Steuerung
Die Distributed-Clock-Zeit hat aus der Sicht der Steuerung folgenden Eigenschaften:
- Einheit 1 ns
- universaler Nullpunkt 1.1.2000 00:00 , d.h. bei Auswertungen der Variable ist ein Offset von 2000 Jahren zu addieren
- Umfang bis zu 64 Bit (ausreichend für 584 Jahre); manche EtherCAT-Slaves unterstützen jedoch nur einen Umfang von 32 Bit, d.h. nach ca. 4,2 Sekunden läuft das Register lokal über und beginnt wieder bei 0.
Zur Bearbeitung von DC-Zeiten werden folgende 3 Datentypen empfohlen
- T_DCTIME aus TcEtherCAT.lib
Basiert auf T_ULARGE_INTEGER und ist damit vorzeichenlos. Kann zur Verlinkung mit entsprechenden Hardware-Variablen verwendet werden - T_ULARGE_INTEGER aus der TcUtilities.lib
Vorzeichenloser 64-Bit-Datentyp - T_LARGE_INTEGER aus der TcUtilities.lib
Vorzeichenbehafteter 64-Bit-Datentyp, negative Zahlen werden im 2er-Komplement dargestellt (Unterlauf unter 0 --> 0xFFFF FFFF FFFF FFFF usw.)
Dazu stehen in der TcUtilities.lib im Kapitel INT64 viele Funktionen zur Verfügung, wichtig insbesondere die cast-Funktionen LARGE_TO_ULARGE und umgekehrt.
Sobald mit Zeitdifferenzen gearbeitet wird, bei denen negative Zeiten auftreten können, ist dieser Typ zu verwenden.
Wird TwinCAT externe Synchronisierung eingesetzt, treten zwangsläufig negative Zeiten in den Offset-Werten auf.
64- vs. 32-Bit-Darstellung Manche EtherCAT-Slaves können die DC-Zeit nur als 32-Bit-Wert darstellen bzw. als Prozessdatum verarbeiten. Um durch Überlauf verursachten Problemen (alle 4.2 Sekunden) entgegenzuwirken wird jedoch dringend empfohlen, in der Steuerung generell nur mit 64-Bit-Zeiten zu rechnen.
|
In diesem Beispielprojekt
(Download) ist ein Funktionsblock enthalten, der zyklisch eine 32-Bit-DC-Zeit um den High-Part zu 64 Bit ergänzt.
Auslesen der DC-Zeit
Wie beschrieben, gibt es auf einem TwinCAT-PC mehrere Zeitquellen, deren maßgebliche für das EtherCAT-System die Distributed Clock Zeit ist. Üblicherweise ist der erste DC-fähige Slave die EtherCAT Masterclock, die Steuerung mit Ihrer Software-Ausprägung der DC-Clock wird dieser Masterclock nachsynchronisiert. Damit steht in der Steuerung die aktuelle DC-Zeit zur Verfügung.
In der PLC gibt es 4 Möglichkeiten, zur Laufzeit der Task an die aktuelle DC-Zeit, die "Jetzt"-Zeit zu gelangen.
- Auslesen der Eingangsvariable DcSysTime in den Eingangsdaten des EtherCAT-Device (siehe Beschreibung System Manager, nicht empfohlen)
- TcEtherCAT.lib: F_GetActualDcTime
- TcEtherCAT.lib: F_GetCurDcTickTime
- TcEtherCAT.lib: F_GetCurDcTaskTime
Kompatibilität Die Funktionen F_GetActualDcTime und F_GetCurDcTaskTime können erst ab der TwinCAT Version 2.11 (auf Programmier- und Zielsystem) benutzt werden. |
Beispiel:
Konfiguriert wird eine PLC-Task im System Manager mit 500 µs Zykluszeit und 100 µs Basistick (Base Time).
Die Bewertung der o.a. Beschaffungswege ermöglicht Abb. Wege zum Auslesen der DC-Zeit:
Zur Laufzeit des PLC-Programms werden nun die 3 Funktionen F_Get... an beliebiger Stelle aufgerufen, dann liefern sie ab TwinCAT 2.11 zurück:
- F_GetActualDcTime: die tatsächliche aktuelle DC-Zeit. Bei einem mehrmaligen Aufruf innerhalb einer Task liefert F_GetActualDcTime also auch unterschiedliche Werte zurück.
- F_GetCurDcTickTime: Zeitpunkt des letzten Basisticks. Ein mehrmaliger Aufruf liefert also nur dann unterschiedliche Werte zurück, wenn mind. 1x Basetime dazwischen liegt.
Wenn BaseTime = Zykluszeit oder am Anfang einer Task aufgerufen, dann liefert diese Funktion das gleiche Ergebnis wie - F_GetCurDcTaskTime: "Jetzt"-Zeit dieser Task, auf die sich die Slave-Shift-Zeiten beziehen.
Die Verwendung dieser Funktion als Grundlage von DC-Operationen wird empfohlen.
Der Inhalt von DcSysTime kommt aus der feldseitigen Masterclock - dieser Kopiervorgang unterliegt zeitlichen Schwankungen und schreitet daher nicht exakt mit cycle time fort. Dies gilt ebenfalls für andere lokale DcSystem-Zeiten, die als Prozessdatum aus der HW übertragen werden.