Moin Byte0815,
eigentlich brauchst Du ja nur Datum/Uhrzeit. Das die Eintragung von der Grenzwertüberschreitung herrührt ist ja klar.
Du könntest den DB entsprechend benennen (z.B. "Limit_OF" (Limit Overflow).
Ließt Du irgendwo schon Datum und Uhrzeit aus? Es gibt die Systemzeit der CPU (bezieht sich auf die UTC) und die Lokalzeit (UTC+1 (für Deutschland (Berlin, etc.)) und Sommer-/Winterzeitumstellung). Zur Sommer-/Winterzeitumstellung gibt es einen entsprechenden Baustein (SET_TIMEZONE) in der CPU.
Ansonsten für das Auslesen der Uhrzeiten:
RD_LOC_T für die Lokalzeit (also mit UTC+1 und Sommer-/Winterzeit)
RD_SYS_T für Systemzeit (also UTC)
für weitere Anwendungen usw. würde ich die Uhrzeiten immer zyklisch lesen und in einem DB (den Du z.B. "CLOCK" nennst ablegen).
Uhrzeit dann mit dem Datentyp DT (Date_and_Time) deklarieren.
So. Jetzt immer wenn Dein Grenzwert überschritten wurde eine positive Flanke erzeugen. Damit kannst Du dann die Eintragung in Deinem Ringpuffer vornehmen.
Empfehlung: mache Dir eine Anwenderkonstante (z.B. LimitCnt). Die kannst Du dann sinnvoll so einsetzen:
DB "Limit:OF":
Lfd_Nr int
TimeStamp Array[0.."LimitCnt"] of DT
Programm:
if "Triggerflanke" then
TimeStamp[Lfd_Nr] := "CLOCK".LocalTime;
Lfd_Nr := Lfd_Nr + 1;
Lfd_Nr := Lfd_Nr MOD (LimitCnt + 1);
end_if;
Dann enthält der Ringpuffer so viel Einträge wie LimitCnt + 1. Damit hast Du ja auch dein Array deklariert, also musst Du nichts weiter beachten, wenn Du die Ringpuffergröße änderst (das geht NICHT zur Laufzeit. UND: wenn du die Ringpuffergröße änderst, muss der DB neu initialisiert werden!).
Zu MOD (Modulo):
Das ist ja die Restdivision. Also bei 5 Einträgen:
5 MOD 0 = 0
5 MOD 1 = 1
5 MOD 2 = 2
5 MOD 3 = 3
5 MOD 4 = 4
5 MOD 5 = 0 > hier geht es also wieder (automatisch) von vorne los
Deshalb auch LimitCnt +1, da das Array bei 0 anfängt bzw. anfangen muss.
VG
MFreiberger