(*****************************************************************************************************************************************************)
DATA_BLOCK AKTUELLE_ZEIT
(*****************************************************************************************************************************************************)
STRUCT
Datum_und_Zeit :DT;
Datum :DATE;
Lokalzeit :TOD;
UTC :TOD;
Zeitzone :INT;
Jahr :INT;
Jahres_Tag :INT;
Monat :INT;
Monats_Tag :INT;
Wochen_Tag :INT;
Stunde :INT;
Minute :INT;
Sekunde :INT;
Umstellungs_Sommerzeit :DT;
Umstellungs_Winterzeit :DT;
Sommerzeit :BOOL;
Winterzeit :BOOL;
END_STRUCT
BEGIN
END_DATA_BLOCK
FUNCTION UHRZEITEN : VOID
VAR_TEMP
TEMP_INT :INT;
AKT_DT :DT;
DT_TIME :DT;
DT_TIME1 :DT;
Jahr_anfang_DATE :DATE;
Timer1 :TOD;
TAG_Sommerzeit :INT;
TAG_Winterzeit :INT;
AT_AKT_DT AT AKT_DT:
STRUCT
JAHR : BYTE;
MONAT : BYTE;
TAG : BYTE;
STUNDE : BYTE;
MINUTE : BYTE;
SEKUNDE : BYTE;
MS_MSD : BYTE;
MS_LSD : BYTE;
END_STRUCT;
AT_DT_TIME AT DT_TIME:
STRUCT
JAHR : BYTE;
MONAT : BYTE;
TAG : BYTE;
STUNDE : BYTE;
MINUTE : BYTE;
SEKUNDE : BYTE;
MS_MSD : BYTE;
MS_LSD : BYTE;
END_STRUCT;
AT_DT_TIME1 AT DT_TIME1:
STRUCT
JAHR : BYTE;
MONAT : BYTE;
TAG : BYTE;
STUNDE : BYTE;
MINUTE : BYTE;
SEKUNDE : BYTE;
MS_MSD : BYTE;
MS_LSD : BYTE;
END_STRUCT;
END_VAR
BEGIN
// Aktuelle Systemzeit lesen
TEMP_INT := READ_CLK(CDT := AKT_DT);
// Aktuelles Datum
AKTUELLE_ZEIT.Datum :=DT_DATE(IN :=AKT_DT);
// Datum und Zeit in DB verschieben
AKTUELLE_ZEIT.Datum_und_Zeit :=AKT_DT;
// Lokalzeit Berechnen
AKTUELLE_ZEIT.Lokalzeit:=DT_TOD(IN :=AKT_DT);
// Jahr in DB verschieben
AKTUELLE_ZEIT.Jahr:=BCD_TO_INT (AT_AKT_DT.JAHR);
// Jahrestag Berechnen und in DB verschieben
Jahr_anfang_DATE:=D#2010-01-01;
DT_TIME:=D_TOD_DT(IN1 :=Jahr_anfang_DATE,IN2 := Timer1); // Jahres anfang auslesen und in DT umwandeln T=Platzhalter
AT_DT_TIME.JAHR := AT_AKT_DT.JAHR; // Aktuelle Jahreszahl in AT Sicht Jahr schreiben
Jahr_anfang_DATE :=DT_DATE(IN :=DT_TIME);
AKTUELLE_ZEIT.Jahres_Tag:=DINT_TO_INT (DATE_TO_DINT (AKTUELLE_ZEIT.Datum) - DATE_TO_DINT (Jahr_anfang_DATE))+1;
// Monat in DB verschieben
AKTUELLE_ZEIT.Monat:=BCD_TO_INT (AT_AKT_DT.MONAT);
// Monats Tag in DB verschieben
AKTUELLE_ZEIT.Monats_Tag:=BCD_TO_INT (AT_AKT_DT.TAG);
// Wochentag in DB verschieben
AKTUELLE_ZEIT.Wochen_Tag :=DT_DAY(IN :=AKT_DT);
// Stunde in DB verschieben
AKTUELLE_ZEIT.Stunde:=BCD_TO_INT (AT_AKT_DT.STUNDE);
// Minute in DB verschieben
AKTUELLE_ZEIT.Minute:=BCD_TO_INT (AT_AKT_DT.MINUTE);
// Sekunde in DB verschieben
AKTUELLE_ZEIT.Sekunde:=BCD_TO_INT (AT_AKT_DT.SEKUNDE);
// Berechnung der UmstellungsTag Sommerzeit
DT_TIME1:=DT#2010-03-31-02:00:00.000;
AT_DT_TIME1.JAHR:=WORD_TO_BYTE(INT_TO_BCD (AKTUELLE_ZEIT.Jahr));
TAG_Sommerzeit:=31 -((AKTUELLE_ZEIT.Jahr + 5 + (AKTUELLE_ZEIT.Jahr/4)) MOD 7);
AT_DT_TIME1.TAG:=WORD_TO_BYTE(INT_TO_BCD (TAG_Sommerzeit));
AKTUELLE_ZEIT.Umstellungs_Sommerzeit:=DT_TIME1;
// Berechnung der UmstellungsTag Winterzeit
DT_TIME:=DT#2010-10-01-03:00:00.0;
AT_DT_TIME.JAHR:=WORD_TO_BYTE(INT_TO_BCD (AKTUELLE_ZEIT.Jahr));
TAG_Winterzeit:=31 -((AKTUELLE_ZEIT.Jahr + 2 + (AKTUELLE_ZEIT.Jahr/4)) MOD 7);
AT_DT_TIME.TAG:=WORD_TO_BYTE(INT_TO_BCD (TAG_Winterzeit));
AKTUELLE_ZEIT.Umstellungs_Winterzeit:=DT_TIME;
END_FUNCTION