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;