FUNCTION FC440 : VOID // UP Tag, Monat, Jahr etc. von Systemuhr abfragen
Title = 'UP Tag, Monat, Jahr etc. von Systemuhr abfragen' // UUP Tag, Monat, Jahr etc. von Systemuhr abfragen
AUTHOR : 'Larry'
VERSION : '1.0' // 30.09.2014
FAMILY : 'LL_Std'
KNOW_HOW_PROTECT
// --------------------------------------------------------------------------------------
// Bausteinparameter
// --------------------------------------------------------------------------------------
VAR_INPUT
END_VAR
VAR_IN_OUT
END_VAR
VAR_OUTPUT
Jahr : INT ; // Jahr des Vorgabe-Date's
Monat : INT ; // Monat des Vorgabe-Date's
Tag : INT ; // Tag des Vorgabe-Date's
Wochentag : INT ; // Wochentag des Vorgabe-Date's [1=So ... 7=Sa]
Schaltjahr : INT ; // =1: Vorgabe-Date ist ein Schaltjahr
Jahrestag : INT ; // Tag im Jahr des Vorgabe-Date's
Kalenderwoche : INT ; // Kalenderwoche des Vorgabe-Date's
SommerZeit : INT ; // =1: Vorgabe-Date ist innerhalb der Sommerzeit
END_VAR
VAR_TEMP
Date_Time : DT ; // Date_and_Time für Umwandlung
at_Date_Time AT Date_Time : ARRAY [0..7] OF BYTE ;
Error : INT ;
b_Jahr : INT ;
Anz_SJ : INT ;
Diff_J : INT ;
h_Wochentag : INT ;
h_Datum : INT ;
Tag_Wechsel_SZ : INT ; // - Jahrestag, an dem nach Sommerzeit gewechselt wird
Tag_Wechsel_WZ : INT ; // - Jahrestag, an dem nach Winterzeit gewechselt wird
Stunde : INT ;
END_VAR
// --------------------------------------------------------------------------------------
// Anweisungsteil
// --------------------------------------------------------------------------------------
BEGIN
Error := READ_CLK (CDT := Date_Time) ;
WochenTag := BCD_TO_INT (at_Date_Time [7] AND 2#0000_1111) ;
b_Jahr := BCD_TO_INT (at_Date_Time [0]) ;
IF b_Jahr < 90 THEN Jahr := 2000 + b_Jahr ; ELSE Jahr := 1900 + b_Jahr ; END_IF ;
Monat := BCD_TO_INT (at_Date_Time [1]) ;
Tag := BCD_TO_INT (at_Date_Time [2]) ;
Schaltjahr := 0 ; IF ((Jahr MOD 4) = 0) AND (NOT ((Jahr MOD 100) = 0) OR ((Jahr MOD 400) = 0)) THEN Schaltjahr := 1 ; END_IF ;
Jahrestag := Tag ;
IF Monat > 1 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
IF Monat > 2 THEN Jahrestag := Jahrestag + 28 + Schaltjahr ; END_IF ;
IF Monat > 3 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
IF Monat > 4 THEN Jahrestag := Jahrestag + 30 ; END_IF ;
IF Monat > 5 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
IF Monat > 6 THEN Jahrestag := Jahrestag + 30 ; END_IF ;
IF Monat > 7 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
IF Monat > 8 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
IF Monat > 9 THEN Jahrestag := Jahrestag + 30 ; END_IF ;
IF Monat > 10 THEN Jahrestag := Jahrestag + 31 ; END_IF ;
IF Monat > 11 THEN Jahrestag := Jahrestag + 30 ; END_IF ;
Kalenderwoche := (Jahrestag + 7 + 3 - Wochentag) / 7 ;
// Sommerzeit ?
Stunde := BCD_TO_INT (at_Date_Time [3]) ;
h_Datum := Anz_SJ + (Diff_J * 365) + 83 ; // 83 = Jahrestag vom 24.03. im nicht-Schaltjahr
h_Wochentag := 6 - (h_Datum MOD 7) ;
IF (h_Wochentag = 0) THEN h_Wochentag := 7 ; END_IF ;
Tag_Wechsel_SZ := 83 + h_Wochentag ;
h_Datum := Anz_SJ + (Diff_J * 365) + 297 ; // 297 = Jahrestag vom 24.10. im nicht-Schaltjahr
h_Wochentag := 6 - (h_Datum MOD 7) ;
IF (h_Wochentag = 0) THEN h_Wochentag := 7 ; END_IF ;
Tag_Wechsel_WZ := 297 + h_Wochentag ;
SommerZeit := 0 ;
IF (Jahrestag > Tag_Wechsel_SZ) AND (Jahrestag < Tag_Wechsel_WZ) THEN SommerZeit := 1 ;
ELSIF (Jahrestag = Tag_Wechsel_SZ) AND (Stunde >= 02) THEN SommerZeit := 1 ;
ELSIF (Jahrestag = Tag_Wechsel_WZ) AND (Stunde <= 02) THEN SommerZeit := 1 ;
END_IF ;
// --------------------------------------------------------------------------------------
END_FUNCTION
// --------------------------------------------------------------------------------------