Für meine Beleuchtung im Vorgarten versuche ich gerade eine Funktion herauszufinden, die mir den Freitag vor dem ersten Advent als Starttermin für die täglichen Schaltphasen ermittelt. Abschalten ist ja kein Thema, nachdem die heiligen Drei Könige als letzter Beleuchtungstag kalendarisch feststehen. Kniffliger wirds da mit dem ersten Advent... Über die Erläuterungen des Kirchenkalenders bei Wikipedia habe ich jetzt folgende Definition herausgefunden:
"Die Adventszeit beginnt am Sonntag, der auf den 30. November fällt oder diesem Datum am nächsten kommt."
Weitergerechnet müsste das doch bedeuten, daß der frühestmögliche 1. Adventssonntag auf den 27.11. fallen kann. Ich frage also über die Holiday-Funktion den Freitag ab und prüfe auf das Datum 25.11. oder größer. Oder hab ich einen Denkfehler?
Hallo
Hier mal eine etwas andere Erklärung für Adventszeit.
Die Adventszeit beginnt mit dem 1. Sonntag nach dem 26. November, oder anders erklärt:
Es ist der 4. Sonntag vor dem 25. Dezember.
Die Adventzeit endet immer mit dem 25. Dezember und enthält somit die 4 Sonntage vor Weihnachten.
Gruß NetFritz
hallo
ich habe mal eure gedanken in code geformt
man könnte es auch so ändern, das der baustein aufgrund des aktuellen datums ausgibt welcher advent-sonntag ist
FUNCTION ADVENT_DAYS : DATE
VAR_INPUT
YEAR : INT;
X : INT; (* Advent 1-4 *)
END_VAR
VAR
d : DATE;
END_VAR
d := SET_DATE(YEAR, 12, 25);
ADVENT_DAYS := DATE_ADD(d, - DAY_OF_WEEK(d), - (4-X), 0, 0);
Hallo,
ich hänge mal meine Lösung an....
Ist seit einigen Wochen im Einsatz und funktioniert -bis jetzt :-)
Gruß
good_mike
PROGRAM Weihnachtsbeleuchtung
VAR
Einschaltdatum:BOOL;
Date_ein: DATE;
Date_aus: DATE;
x2512JJ:SDT;
x0601JJ: SDT;
Ein_abend: BOOL;
Ein_morgen: BOOL;
Ausschaltzeit_abend: TOD;
R_TRIG_Ein_abend: R_TRIG;
Weihnachstbeleuchtung_Ein: BOOL;
ErsterEinSamstag: BOOL;
END_VAR
(*
Funktionsbeschreibung:
Die Weihnachstbeleuchtung wird in der Zeit vom Samstag abend vor dem 1. Advent bis zum Sonntag nach dem 06. Januar betrieben.
Sie wird 20 Minunten nach Sonnenuntergang eingeschaltet, um 22:00 Uhr ausgeschaltet und um 06:00 Uhr eingeschaltet und 20Minuten vor
Sonnenaufgang ausgeschaltet.
Besonderheiten: Am 24.12, 25.12 und 31.12. brennt die Beleuchtung die ganze Nacht durch.
*)
(* Füllen der SDT-Struktur mit dem 25.12.[aktuelles Jahr]*)
x2512JJ.DAY:=25;
x2512JJ.MONTH:=12;
x2512JJ.YEAR:=TimeSTD.YEAR;
(* Füllen der SDT-Struktur mit dem 06.01.[aktuelles Jahr]*)
x0601JJ.DAY:=06;
x0601JJ.MONTH:=01;
x0601JJ.YEAR:=TimeSTD.YEAR;
(*Berechnung des Samstag's vor dem 1. Advent : Berechnung des Wochentages des 25.12 (1-7). *)
Date_ein:=DATE_ADD(SDT_TO_DATE(x2512JJ),-(DAY_OF_WEEK(SDT_TO_DATE(x2512JJ))+22),0,0,0);
(*Berechung des 1. Sonntag's nach dem 6. Januar: *)
Date_aus:=DATE_ADD(SDT_TO_DATE(x0601JJ),+7-(DAY_OF_WEEK(SDT_TO_DATE(x0601JJ))),0,0,0);
(* Datum Periode in der die Beleuchtung ein sein soll*)
Einschaltdatum:=PERIOD(Date_ein, DatumDATE, Date_aus);
(* Generierung einer BOOL Variable um festzustellen ob es sich momentan um des Samstag vor dem 1. Advendt handelt.
An diesemTag soll die Beleuchtung nur abends und nicht morgens eingeschaltet werden*)
IF DatumDATE = Date_ein THEN
ErsterEinSamstag:= TRUE;
ELSE
ErsterEinSamstag:= FALSE;
END_IF;
(* Im Moment des Einschaltens am Abend die Ausschaltzeit für die folgende Nacht festlegen: an besonderen Tagen (24. /25.12. u. 01.01.) wird die Ausschaltzeit auf 20 min
vor Sonnenaufgang am nächsten Morgen festgelegt. Ansonsten wir zu einer fixen Zeit (22:00 Uhr) ausgeschaltet*)
R_TRIG_Ein_abend(CLK:=Ein_abend , Q=> );
IF R_TRIG_Ein_abend.Q = TRUE THEN
IF TimeSTD.MONTH = 12 AND (TimeSTD.DAY = 24 OR TimeSTD.DAY=25 OR TimeSTD.DAY = 31) THEN
Ausschaltzeit_abend:=DT_TO_TOD(MAIN.SUN_RISE_FLIEDEN-t#20m);
ELSE
Ausschaltzeit_abend:=TOD#22:00;
END_IF;
END_IF;
(* Ein-Zeit morgens: 6:00 Uhr bis 20minute vor Sonnenaufgang*)
Ein_morgen:=TIMECHECK(TimeTOD, TOD#06:00, DT_TO_TOD(MAIN.SUN_RISE_FLIEDEN-t#20m));
(* Ein-Zeit abend: 20min nach Sonnenuntergang bis berechnete Ausschaltzeit*)
Ein_abend:=TIMECHECK(TimeTOD, DT_TO_TOD(MAIN.SUN_SET_FLIEDEN+t#20m),Ausschaltzeit_abend);
Weihnachstbeleuchtung_Ein:= Einschaltdatum AND ((Ein_morgen AND NOT ErsterEinSamstag) OR Ein_abend);
DO_Weihnachtsbeleuchtung:=Weihnachstbeleuchtung_Ein;
in der nächsten release von oscat gibt es einen neuen baustein events, dieser baustein wird solche sachen unterstützen