Zeitdifferenz im ms Bereich bilden in CoDeSys 2.3

buzzer

Level-1
Beiträge
17
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Für Statistikdaten möchte ich gerne Zeitdifferenzen bilden und je nach Zustand auf bestimmte Variablen aufaddieren. Die Differenzen bewegen sich dabei im zwei bis dreistelligen Millisekundenbereich. Zielsteuerung ist eine Wago 750-880. Zwar kann die Differenz einfach mit tDiff := TIME()-tLast bestimmt werden, jedoch können TIME Variablen keine 50 Tage groß sein.
Nun ist meine Frage : Wird der Rückgabewert von TIME() bei einem Überlauf wieder auf t#0ms zurückgesetzt?
Dann könnte der Sonderfall dieses Wechsels mit einer einfachen Abfrage behandelt werden.
 
Hallo,
du hast hier m.E. einen Widerspruch drin : zum Einen geht es dir um Millisekunden - zum Anderen um Tage.
Wie auch immer. In dem Falle würde ich mit DATE und TimeOfDay arbeiten und mir daraus entsprechende Differenzen bilden. Der TIME-Wert selbst mag einen Überlauf zulassen/bilden können - aber kann es auch der IEC-Timer ? M.E. wahrscheinlich nicht.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das habe ich ungünstig formuliert. TIME() gibt soweit ich das sehe die verstrichene Zeit seit einem bestimmten Ereignis zurück (~Start des Controllers?). Läuft mein Controller nun 50 Tage oder länger erwarte ich, dass TIME() an seine Grenzen stößt.
Es kommen auch größere zu messende Zeitdifferenzen vor und für diese verwende ich auch DATE_AND_TIME. Nur löst dies eben nur bis zu den Sekunden auf, weshalb ich nach einer Lösung im ms Bereich suche.
Einen IEC-Timer wie z.B. TON verwende ich an dieser Stelle nicht.
 
Also, die definition von TIME():
Handbuch schrieb:
TIME()-Funktion
Diese Funktion liefert die Zeit auf Millisekunden-Basis, die seit Systemstart vergangen ist.
Der Datentyp ist TIME.

Naja, ich hab die bei mir mal ausgelesen, ich bin bei 47.5 Tagen. Wenn du dich noch 1.6 Tage gedulden kannst (der Datentyp TIME geht bis maximal 49 Tage 17 Stunden 2 Minuten 47 Sekunden und 295 Millisekunden) kann ich dir sagen was passiert. ;)

Damit du die Gefahr eines Überlaufen ausschliessen kannst (ich denke mal TIME() wird beim überlaufen zurückgesetzt) einfach den Wert in eine Variable schreiben und mit dieser weiterarbeiten. Dann nach jeder Differenzauswertung den Wert der Variable neu von TIME() übernehmen. Wäre das eine Lösung?
 
Time wird beim Überlauf einfach wieder 0, folglich ist es aufgrund des wohl definierten Max-Wertes ein leichtes dieses Mathematisch in diesem Sonderfall zu berücksichtigen.
IF ELSE und so halt.

Mfg
Manuel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das war was ich wissen wollte, nur hatte ich keine Aussagen diesbezüglich gefunden. Bilde die Gesamtdifferenz in diesem Sonderfall jetzt als tDiff := TIME() + tMax - tOld
Mal sehen ob der praktische Versuch die Aussagen bestätigt. :)
 
Bilde die Gesamtdifferenz in diesem Sonderfall jetzt als tDiff := TIME() + tMax - tOld
Da wird Dir eine Millisekunde fehlen.
Wenn schon, dann tDiff:=TIME()+tMax+1-tOld.
Eine besondere Behandlung des Überlaufs ist aber bei DWORD-Subtraktionen gar nicht notwendig.
Beispiel: TIME=0, tOld=tMax, also ist eine Millisekunde vergangen, und 0-tMax ergibt auch 1.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe das jetzt mal getestet indem ich TIME Variablen mit festen Werten versehe und 16#FFFFFFFF in TIME umwandle. Die DWORD Subtraktion benötigt tatsächlich keine Sonderfallbehandlung. Auch die direkte Differenz aus zwei TIME Variablen liefert den Betrag der Differenz zurück. Damit ist mein Problem gelöst, bzw. hat eigentlich nie existiert. :rolleyes:

Danke für euer Feedback. Die Millisekunde beim Wechsel habe ich tatsächlich übersehen.
 
Zurück
Oben