CODESYS Zeitrechner
Berechnen Sie präzise mit Zeiten in CODESYS – für Steuerungsprogrammierung und Automatisierung
Umfassender Leitfaden: Rechnen mit Zeiten in CODESYS
CODESYS (Controller Development System) ist eine der führenden Entwicklungsumgebungen für die IEC 61131-3 Programmierung von Steuerungen in der industriellen Automatisierung. Ein zentraler Aspekt der SPS-Programmierung ist das präzise Rechnen mit Zeiten – sei es für Zeitsteuerungen, Ablaufketten oder die Verarbeitung von Prozessdaten.
1. Grundlagen der Zeitdarstellung in CODESYS
CODESYS bietet verschiedene Datentypen für die Zeitdarstellung, die jeweils spezifische Eigenschaften und Anwendungsbereiche haben:
- TIME: Der Standard-Datentyp für Zeitdauern mit einer Auflösung von 1 Millisekunde und einem Bereich von -24,9 Tagen bis +24,9 Tagen.
- LTIME: Erweitert den TIME-Datentyp auf 64 Bit mit einem Bereich von ±10.675 Tage.
- TIME_OF_DAY (TOD): Repräsentiert eine Tageszeit (Stunden:Minuten:Sekunden:Millisekunden) ohne Datumsinformation.
- DATE: Speichert nur das Datum ohne Zeitinformation.
- DATE_AND_TIME (DT): Kombiniert Datum und Uhrzeit für vollständige Zeitstempel.
Die Wahl des richtigen Datentyps hängt von der benötigten Genauigkeit und dem Wertebereich ab. Für die meisten Steuerungsanwendungen reicht der TIME-Datentyp aus, während LTIME für langlaufende Prozesse oder historische Datenanalyse verwendet wird.
2. Zeitoperationen in CODESYS
CODESYS bietet umfassende Funktionen für Zeitberechnungen, die direkt in der IEC 61131-3 Programmierung genutzt werden können:
| Operation | Funktion | Beispiel | Rückgabewert |
|---|---|---|---|
| Addition | ADD | result := time1 + time2; | TIME |
| Subtraktion | SUB | diff := time1 – time2; | TIME |
| Multiplikation | MUL | scaled := time * factor; | TIME |
| Division | DIV | ratio := time / factor; | TIME oder REAL |
| Vergleich | GT, LT, EQ | IF time1 > time2 THEN… | BOOL |
Wichtig zu beachten ist, dass bei der Multiplikation und Division von TIME-Werten mit Faktoren der Rückgabewert wieder ein TIME-Wert ist. Für präzise Berechnungen sollte man die internen Millisekunden-Werte verwenden:
PROGRAM TimeCalculations
VAR
time1, time2, result : TIME;
factor : REAL;
msValue : LINT;
END_VAR
// Umrechnung in Millisekunden für präzise Berechnungen
msValue := TIME_TO_LINT(time1); // Konvertiert TIME in Millisekunden (LINT)
result := LINT_TO_TIME(msValue * 2); // Verdoppelt die Zeit
3. Praktische Anwendungsbeispiele
In der industriellen Automatisierung gibt es zahlreiche Szenarien, in denen präzises Rechnen mit Zeiten entscheidend ist:
- Zeitgesteuerte Ablaufketten: Für sequentielle Prozessschritte mit definierten Wartezeiten zwischen den Schritten.
- Durchsatzberechnungen: Berechnung von Stückzahlen pro Zeiteinheit in Produktionslinien.
- Wartungsintervalle: Überwachung von Betriebsstunden für vorbeugende Instandhaltung.
- Ereignisprotokollierung: Zeitstempel für Prozessereignisse mit Millisekunden-Genauigkeit.
- Regelungsalgorithmen: Zeitbasierte PID-Regler oder Rampenfunktionen.
Ein typisches Beispiel ist die Implementierung einer Zeitverzögerung mit dem TON (Timer On-Delay) Baustein:
PROGRAM DelayExample
VAR
StartDelay : BOOL;
DelayActive : BOOL;
Timer : TON;
DelayTime : TIME := T#5S; // 5 Sekunden Verzögerung
END_VAR
Timer(IN := StartDelay, PT := DelayTime);
DelayActive := Timer.Q;
4. Umrechnung zwischen Zeitformaten
Für die Interoperabilität mit anderen Systemen oder zur Anzeige in HMIs ist oft eine Umrechnung zwischen verschiedenen Zeitformaten notwendig. CODESYS bietet hierfür spezielle Funktionen:
| Funktion | Beschreibung | Beispiel |
|---|---|---|
| TIME_TO_LINT | Konvertiert TIME in Millisekunden (LINT) | ms := TIME_TO_LINT(myTime); |
| LINT_TO_TIME | Konvertiert Millisekunden in TIME | myTime := LINT_TO_TIME(5000); // 5 Sekunden |
| TIME_TO_TOD | Konvertiert TIME in TIME_OF_DAY | tod := TIME_TO_TOD(myTime); |
| TOD_TO_TIME | Konvertiert TIME_OF_DAY in TIME | myTime := TOD_TO_TIME(myTOD); |
| TIME_TO_STRING | Formatiert TIME als String | str := TIME_TO_STRING(myTime); |
Für komplexere Umrechnungen, wie die Konvertierung in Kalenderdaten, können die Funktionen DATE_AND_TIME_TO_DATE und DATE_AND_TIME_TO_TOD verwendet werden.
5. Leistungsoptimierung bei Zeitberechnungen
In Echtzeit-Systemen ist die Performance von Zeitberechnungen kritisch. Folgende Praktiken helfen, die Effizienz zu steigern:
- Vermeiden Sie häufige Umrechnungen zwischen Datentypen im Hauptzyklus
- Nutzen Sie vorberechnete Zeitkonstanten statt wiederholter Berechnungen
- Für hochpräzise Zeitmessungen verwenden Sie die
SYSTEM.RTCFunktionen - Bei langlaufenden Timern bevorzugen Sie LTIME statt TIME
- Nutzen Sie die
TIME#Literale für konstante Zeiten (z.B.TIME#100MS)
Ein Beispiel für optimierte Zeitberechnung:
PROGRAM OptimizedTimeCalc
VAR CONSTANT
CYCLE_TIME : TIME := T#10MS; // Zykluszeit als Konstante
MAX_DELAY : TIME := T#1H; // Maximale Verzögerung
END_VAR
VAR
CurrentTime, LastTime : LTIME;
Elapsed : TIME;
Counter : UINT;
END_VAR
// Effiziente Zeitmessung mit LTIME
CurrentTime := SYSTEM.RTC.TOD_TO_LTIME(SYSTEM.RTC);
Elapsed := LINT_TO_TIME(TIME_TO_LINT(CurrentTime) - TIME_TO_LINT(LastTime));
LastTime := CurrentTime;
// Verwendung von Zeitkonstanten
IF Elapsed >= CYCLE_TIME THEN
Counter := Counter + 1;
END_IF
6. Häufige Fehler und Lösungen
Bei der Arbeit mit Zeiten in CODESYS treten einige typische Fehler auf, die zu unerwartetem Verhalten führen können:
- Überlauf von TIME-Werten: Bei Berechnungen, die den Bereich von ±24,9 Tagen überschreiten, kommt es zu Überläufen. Lösung: LTIME verwenden.
- Genauigkeitsverlust bei Division: Zeitdivision mit REAL-Faktoren kann Rundungsfehler verursachen. Lösung: Mit Millisekunden (LINT) arbeiten.
- Falsche Zeitbasis: Verwechslung von absoluten Zeiten (DATE_AND_TIME) mit Relativzeiten (TIME). Lösung: Klare Trennung der Datentypen.
- Timer-Reset Probleme: Nicht zurückgesetzte Timer können zu falschen Zeitmessungen führen. Lösung: Immer
TON.RoderTOF.Rverwenden. - Zeitzonen-Ignoranz: TIME_OF_DAY berücksichtigt keine Zeitzonen. Lösung: Bei globalen Anwendungen UTC verwenden.
Ein besonders tückischer Fehler ist die implizite Typumwandlung:
// Falsch: Implizite Umwandlung kann zu Genauigkeitsverlust führen
realFactor := 1.5;
scaledTime := myTime * realFactor; // Potenzieller Genauigkeitsverlust
// Richtig: Explizite Umwandlung über Millisekunden
msValue := TIME_TO_LINT(myTime) * 1.5;
scaledTime := LINT_TO_TIME(msValue);
7. Fortgeschrittene Techniken
Für komplexe Anwendungen bietet CODESYS erweiterte Möglichkeiten im Umgang mit Zeiten:
- Zeitstempel-Protokollierung: Nutzung von
DATE_AND_TIMEfür lückenlose Prozessdokumentation - Zeitsynchronisation: Abgleich mit NTP-Servern über
SYSTEM.RTC.SYNC - Zeitbasierte Arrays: Speicherung von Prozessdaten mit Zeitstempeln in ARRAY OF STRUCT
- Echtzeit-Analyse: Nutzung von
SYSTEM.RTC.HIGHRES_TIMERfür Mikrosekunden-Genauigkeit - Zeitzonen-Umrechnung: Implementierung von Zeitzonen-Offsets für globale Anwendungen
Ein Beispiel für die Implementierung eines Zeitstempel-Logs:
TYPE ProcessEvent :
STRUCT
Timestamp : DATE_AND_TIME;
EventType : (START, STOP, ERROR, WARNING);
Value : REAL;
Description : STRING(80);
END_STRUCT
END_TYPE
PROGRAM EventLogger
VAR
EventLog : ARRAY[0..99] OF ProcessEvent;
LogIndex : UINT;
CurrentEvent : ProcessEvent;
END_VAR
// Neue Ereignis protokollieren
CurrentEvent.Timestamp := SYSTEM.RTC;
CurrentEvent.EventType := ProcessEvent#START;
CurrentEvent.Value := 23.45;
CurrentEvent.Description := 'Prozess gestartet';
// Zum Log hinzufügen (mit Ringpuffer)
EventLog[LogIndex] := CurrentEvent;
LogIndex := (LogIndex + 1) MOD 100;
8. Integration mit externen Systemen
Bei der Kommunikation mit anderen Systemen (z.B. MES, ERP) ist oft eine Konvertierung der CODESYS-Zeitformate notwendig. Typische Szenarien:
- OPC UA: Zeitstempel werden als
DateTimeübertragen (UTC-basiert) - Datenbanken: TIMESTAMP-Felder erfordern oft spezielle Formatierung
- Webservices: ISO 8601 Format (YYYY-MM-DDTHH:MM:SS.ZZZ)
- Excel-Export: Umrechnung in serielle Datumswerte
Für die Konvertierung in ISO 8601 Format kann folgende Funktion verwendet werden:
FUNCTION ISO8601_From_DT : STRING
VAR_INPUT
dt : DATE_AND_TIME;
END_VAR
VAR
year, month, day, hour, minute, second : USINT;
ms : UINT;
isoString : STRING(24);
END_VAR
// Extrahiere Komponenten
year := DATE_AND_TIME_TO_DATE(dt).YEAR;
month := DATE_AND_TIME_TO_DATE(dt).MONTH;
day := DATE_AND_TIME_TO_DATE(dt).DAY;
hour := DATE_AND_TIME_TO_TOD(dt).HOUR;
minute := DATE_AND_TIME_TO_TOD(dt).MIN;
second := DATE_AND_TIME_TO_TOD(dt).SEC;
ms := DATE_AND_TIME_TO_TOD(dt).MS;
// Formatiere als ISO 8601
isoString := CONCAT('',
INT_TO_STRING(year), '-',
INT_TO_STRING(month, 2), '-',
INT_TO_STRING(day, 2), 'T',
INT_TO_STRING(hour, 2), ':',
INT_TO_STRING(minute, 2), ':',
INT_TO_STRING(second, 2), '.',
INT_TO_STRING(ms, 3));
ISO8601_From_DT := isoString;
9. Best Practices für die CODESYS-Zeitprogrammierung
Für robuste und wartbare Zeitberechnungen in CODESYS-Projekten sollten folgende Best Practices beachtet werden:
- Definieren Sie Zeitkonstanten zentral in einer globalen Bibliothek
- Dokumentieren Sie immer die verwendete Zeiteinheit (ms, s, min)
- Verwenden Sie für kritische Zeitmessungen Hardware-Timer statt Software-Timer
- Testen Sie Zeitberechnungen mit Grenzwerte (0, Maximalwerte, negative Zeiten)
- Berücksichtigen Sie bei langlaufenden Prozessen die Sommer/Winterzeit-Umstellung
- Nutzen Sie für komplexe Zeitlogik Funktionbausteine statt direkter Berechnungen
- Implementieren Sie Überlaufprüfungen bei Zeitoperationen
- Verwenden Sie für Benutzeroberflächen immer lokale Zeitzonen
10. Zukunftstrends in der industriellen Zeitverarbeitung
Die Anforderungen an Zeitberechnungen in der Automatisierungstechnik entwickeln sich ständig weiter:
- Nanosekunden-Genauigkeit: Für Hochgeschwindigkeitsprozesse in der Halbleiterfertigung
- Zeitsynchronisation über 5G: Präziser Abgleich verteilter Steuerungen
- KI-basierte Zeitanalyse: Mustererkennung in Prozesszeiten für Predictive Maintenance
- Blockchain-Zeitstempel: Unveränderliche Protokollierung von Prozessdaten
- Edge-Computing Zeitverarbeitung: Dezentrale Zeitberechnungen mit lokaler Intelligenz
CODESYS reagiert auf diese Trends mit erweiterten Bibliotheken für Hochpräzisionszeitmessung und besserer Integration mit Cloud-Diensten für Zeitdatenanalyse.
Zusammenfassung und Fazit
Das Rechnen mit Zeiten in CODESYS ist ein fundamentales Element der SPS-Programmierung, das von einfachen Timer-Anwendungen bis zu komplexen zeitgesteuerten Automatisierungslösungen reicht. Durch das Verständnis der verschiedenen Datentypen, der verfügbaren Funktionen und der Best Practices können Entwickler robuste und präzise Zeitberechnungen implementieren.
Die richtige Wahl des Datentyps (TIME, LTIME, DATE_AND_TIME), die Beachtung von Genauigkeitsanforderungen und die Berücksichtigung von Performance-Aspekten sind entscheidend für erfolgreiche Anwendungen. Mit den in diesem Leitfaden vorgestellten Techniken und Beispielen sind Sie gut gerüstet, um auch komplexe Zeitberechnungen in Ihren CODESYS-Projekten umzusetzen.
Für vertiefende Informationen zu den IEC 61131-3 Zeitfunktionen empfiehlt sich die offizielle PLCopen-Spezifikation. Weitere Details zur Implementierung von Echtzeit-Systemen finden Sie in den IEEE-Standards für industrielle Steuerungssysteme.