TIA Zeitintervall / DTL Berechnung

kue325

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
Ich suche nach einer geschickten Loesung, um mit einer DTL-Variablen umzugehen.
Meine Funktion soll ein Intevallzaehler sein. Da dieser auch bei ausgeschalteter Maschine/CPU funktionieren soll, kann ich keinen einfachen Zaehler nehmen.
Meine Idee war, ich lese mir die Systemzeit (DTL-Format) aus und addiere dazu eine Variable, die mir das Intervall in Minuten angibt. Allerdings habe ich hier das Problem, dass wenn ich die Minuten in Tage, Stunden und Minuten umwandel, ich ein Problem mit der Berechnung des naechsten Faelligkeitszeitpunktes habe.
In meinem Ansatz muesste ich die umgerechneten Tage, Stunden und Minuten auf die Tage, Stunden und Minuten der Systemzeit aufaddieren und schauen ob ich bei den Minuten ueber 60 und den Stunden ueber 24 bin. Bei den Tagen wird es ein bischen schwerer, da die Monate eine unterschiedliche Anzahl von Tagen hat, was das eigentliche Problem darstellt.

Habt ihr in die Richtung schon einmal Beruehrpunkte mit dem DTL-format gehabt und/oder eine Loesung oder Ansatz, um meine gewuenschte Funktion zu realisieren?
 
Ich würde das gar nicht so kompliziert machen. Mit welcher Genauigkeit werden die Intervall gebraucht, wie größ ist das kleinste/größte Intervall?

Unsere "Standardlösung" für sowas ist das nutzen eines Taktmerkers der S7. Man lässt beispielsweise einen remanenten DINT-Zähler mit der positiven Flanke des 1Hz-Merkers endlos nach oben zählen. Mit einer Auflösung von 1 Sekunde schafft DINT 63 Jahre im positiven Bereich.

Alle Intervalle werden dann intern in Sekunden gerechnet. Wenn man Stunden angeben will muss man halt mal 3600 multiplizieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi maxder2te,

die Intervallgröße soll mit einer Auflösung von einer Minute individuell parametrierbar sein. Am Ende wird sich das in einem Breich zwischen einer Stunde und einem Jahr abspielen.

Was passiert bei eurer Lösung, wenn die Maschine ausgeschaltet ist? Hier würde der Zähler nicht mehr weiter zählen.
Wenn ich in diesem Fall, als Beispiel, ein Wartungsintervall von einem Jahr programmieren will und die Anlage übers Wochenende ausgeschalten wird, 'verzählt' sich der Zähler. und es kommt ein falscher Fälligkeitszeitpunkt heraus.
 
Wenn du die aktuelle Zeit in DTL hast und die Zeitdifferenz in Time, dann kannst du mit der Funktion T_Add den nächsten Zeitpunkt in DTL berechnen.

Sieh dir mal die Hilfe dazu an, das könnte funktionieren.

PS: T_Diff bereichnet die Differenz zwischen zwei DTL in Time.

Die Funktionen findest du rechts unter Anweisungen/Erweiterte Anweisungen/Datum und Uhrzeit
 
Tip: Wenn man mit Zeiten der Systemuhr hantiert, dann mal drüber nachdenken was passieren soll, falls in das Intervall eine Zeitumstellung (Winterzeit, Sommerzeit) fällt. Je nach benötigter Genauigkeit empfiehlt sich ggf. eine Uhrzeitsynchronisation der CPU-Uhr mit einem Zeitserver (z.B. NTP-Server) - und Achtung: dann können auch regelmäßig kleine +/- Uhrzeitsprünge auftreten (auch Zurückstell/"Rückwärts"-Sprünge!).

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Ansatz klingt gut. Dafür barauche ich einen Datentyp mit einem großen Wertebereich (LINT o.ä.) um ein Jahr in Nanosekunden (Angabe von LTime) abzudecken.
Das werde ich nächste Woche mal ausprobieren!

Danke für die Tipps.
 
Hi maxder2te,

die Intervallgröße soll mit einer Auflösung von einer Minute individuell parametrierbar sein. Am Ende wird sich das in einem Breich zwischen einer Stunde und einem Jahr abspielen.

Was passiert bei eurer Lösung, wenn die Maschine ausgeschaltet ist? Hier würde der Zähler nicht mehr weiter zählen.
Wenn ich in diesem Fall, als Beispiel, ein Wartungsintervall von einem Jahr programmieren will und die Anlage übers Wochenende ausgeschalten wird, 'verzählt' sich der Zähler. und es kommt ein falscher Fälligkeitszeitpunkt heraus.

Bei Wartungszählern gibts eigentlich nur 2 Varianten, die zum Einsatz kommen:
  1. Betriebsstundenzähler
  2. Direktangabe des Datums für die nächste Wartung

Variante 1 lässt sich mit der oben beschriebenen Methode einfach erledigen. Bei Variante 2 stellt sich die Frage eigentlich nicht.
 
Wenn du die aktuelle Zeit in DTL hast und die Zeitdifferenz in Time, dann kannst du mit der Funktion T_Add den nächsten Zeitpunkt in DTL berechnen.

Sieh dir mal die Hilfe dazu an, das könnte funktionieren.

PS: T_Diff bereichnet die Differenz zwischen zwei DTL in Time.

Die Funktionen findest du rechts unter Anweisungen/Erweiterte Anweisungen/Datum und Uhrzeit

Hi Ralle,
Datentyp Time kann ja nur bis knapp über 24 Tagen umfassen. Kennst du eine Lösung für längere Zeitabschnitte?
 
Ansonsten mit einer Schleife einen kleineren Wert öfters aufaddieren (am besten was zum Lesen schönes: 1 Tag, 10 Tage oder 20 Tage).
Den Rest, der übrig bleibt, dann halt nicht vergessen auch noch dazuzählen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ansonsten mit einer Schleife einen kleineren Wert öfters aufaddieren (am besten was zum Lesen schönes: 1 Tag, 10 Tage oder 20 Tage).
Den Rest, der übrig bleibt, dann halt nicht vergessen auch noch dazuzählen.
Aus lauter Verzweiflung hab ich jetzt auch diese Methode genommen.
Ist nicht schön, aber wenn es nichts eleganteres gibt...
 
Naja.
Womöglich gehts auch anders mit ein "paar" Konvertierungen.
1) DTL->DATE->UINT
2) Anzahl der Tage addieren.
3) UINT->DATE->DTL
4) Stunden, Minuten, Sekunden und Nanosekunden von der ursprünglichen DTL auf die neue übertragen.
5) Restlichen Teil der addiert werden soll mit T_Add dazuzählen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja.
Womöglich gehts auch anders mit ein "paar" Konvertierungen.
1) DTL->DATE->UINT
2) Anzahl der Tage addieren.
3) UINT->DATE->DTL
4) Stunden, Minuten, Sekunden und Nanosekunden von der ursprünglichen DTL auf die neue übertragen.
5) Restlichen Teil der addiert werden soll mit T_Add dazuzählen.
Das sieht schon etwas eleganter aus. Minimal )))
werde gleich ausprobieren, Danke!
 
Naja.
Womöglich gehts auch anders mit ein "paar" Konvertierungen.
1) DTL->DATE->UINT
2) Anzahl der Tage addieren.
3) UINT->DATE->DTL
4) Stunden, Minuten, Sekunden und Nanosekunden von der ursprünglichen DTL auf die neue übertragen.
5) Restlichen Teil der addiert werden soll mit T_Add dazuzählen.
Das hat funktioniert, DANKE!!!
 
Zurück
Oben