Advent Advent, ein Lichtlein brennt... HOLIDAY-Modul

Begonnen von Heimbastler, 19. Dezember 2010, 15:30:02

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

Heimbastler

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?

NetFritz

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

peewit

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);

good_mike

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;


hugo

in der nächsten release von oscat gibt es einen neuen baustein events, dieser baustein wird solche sachen unterstützen