-> Hier kostenlos registrieren
FB_Weihnachtszeit
Bei mir zu Hause steuert bisher eine kleine CControl neben ein paar weiteren Dingen die „Weihnachtsbeleuchtung“.
Am Samstag vor dem 1.Advent 16Uhr muss sie „rituell“ das erste Mal einschalten. An Samstagen und Weihnachtsfeiertagen schaltet sie spät aus. An den Advents- Sonntagen schaltet sie sehr zeitig ein usw.
Wie auch immer- ich benötige die Information ob und welcher Advent/ Adventswoche aktuell ist. Zum errechnen dieser Informationen habe ich nun den folgenden S7- SCL- Baustein geschrieben (habe auch einige Simulationen durchgeführt – funktioniert soweit prima).
Freut mich falls jemand Verwendung für diesen Baustein hat ;-) …
Gruß Holger
Bei mir zu Hause steuert bisher eine kleine CControl neben ein paar weiteren Dingen die „Weihnachtsbeleuchtung“.
Am Samstag vor dem 1.Advent 16Uhr muss sie „rituell“ das erste Mal einschalten. An Samstagen und Weihnachtsfeiertagen schaltet sie spät aus. An den Advents- Sonntagen schaltet sie sehr zeitig ein usw.
Wie auch immer- ich benötige die Information ob und welcher Advent/ Adventswoche aktuell ist. Zum errechnen dieser Informationen habe ich nun den folgenden S7- SCL- Baustein geschrieben (habe auch einige Simulationen durchgeführt – funktioniert soweit prima).
Code:
FUNCTION_BLOCK FB_Weihnachtszeit
TITLE = 'Weihnachtszeit'
// Weihnachtszeit V01.01P Freeware
// (c) 04.11.2013..17.11.2013 Holger Reither
// ( holger.reither@web.de
// http://reither.ohost.de/sps.htm )
//
// Wichtig !!!!!
// =============
// Der Einsatzt dieses Bausteines erfolgt auf eigene
// Gefahr!
//
// Wer Änderungen vornimmt, wird gebeeten, diese
// in der History (siehe unten) zu vermerken.
//
// Fehlermeldungen, Änderungswünsche, können Sie gerne
// an oben genannte Mail-Adresse senden.
//
// Viel Erfolg mit diesem Programm!
//
// ===================================================
//
// Erforderliche S7-Bausteine:
// FC7 DT_DAY
//
// ===================================================
// History:
//
// Änderung: ...............................
// Geändert durch: ...............................
// Datum: ..........
// Kurzbeschreibung: ...............................
// ...............................
// ...............................
// ...............................
// ...............................
//
// ===================================================
AUTHOR: HReither // max. 8 Zeichen
FAMILY: DateTime // max. 8 Zeichen
NAME: WZeit // max. 8 Zeichen
VERSION: '01.01' // max. 15.15
VAR_INPUT
DatumZeit: DATE_AND_TIME; ArrayDatumZeit AT DatumZeit: ARRAY[0..7] OF BYTE;
END_VAR
VAR_OUTPUT
SaVorErsterAdvent: BOOL; // Sa vor erstem Advent
ErsterAdvent: BOOL; // 1.Advent
ZweiterAdvent: BOOL; // 2.Advent
DritterAdvent: BOOL; // 3.Advent
VierterAdvent: BOOL; // 4.Advent
AdventsWoche1: BOOL; // So..Sa
AdventsWoche2: BOOL; // So..Sa
AdventsWoche3: BOOL; // So..Sa
AdventsWoche4: BOOL; // So..Sa oder 24.12.
Advent: BOOL; // 1.Advent bis 24.12.
Weihnachtswoche: BOOL; // 24.12. bis 31.12.
NeujahrBisHochneujahr: BOOL; // 1.1. bis 6.1.
Weihnachtszeit: BOOL; // 1.Advent bis 6.1.
Monat,
Tag,
Wochentag,
Stunde,
Minute:INT;
END_VAR
VAR_TEMP
ISaVor1AdvDay,ISaVor1AdvMonth,
TageBisWeihnachten,
Wochentag24ster,
TageBis4erAdvent,
tmp:INT;
IOffset: TIME;
END_VAR
// Begin ---------------------------------------------------------------------------------------------------------------
// Zerlegen von DatumZeit
Monat:=BCD_TO_INT(BYTE_TO_WORD(ArrayDatumZeit[1]));
Tag:=BCD_TO_INT(BYTE_TO_WORD(ArrayDatumZeit[2]));
Stunde:=BCD_TO_INT(BYTE_TO_WORD(ArrayDatumZeit[3]));
Minute:=BCD_TO_INT(BYTE_TO_WORD(ArrayDatumZeit[4]));
Wochentag:=DT_DAY (IN := DatumZeit // IN: DATE_AND_TIME
); // INT
// 1=Sonntag / 2=Montag / 3=Dienstag / 4=Mittwoch / 5=Donnerstag / 6=Freitag / 7=Samstag
SaVorErsterAdvent:=false; ErsterAdvent :=false; ZweiterAdvent :=false; DritterAdvent :=false; VierterAdvent :=false;
AdventsWoche1 :=false; AdventsWoche2 :=false; AdventsWoche3 :=false; AdventsWoche4 :=false;
// ermittle Wochentag des 24.Dezember
IF (Monat>=11) THEN
IF Monat=11 THEN
TageBisWeihnachten:=24+30-Tag;
ELSE
TageBisWeihnachten:=24-Tag;
END_IF;
IF TageBisWeihnachten>=0 THEN
tmp:=TageBisWeihnachten MOD 7;
Wochentag24ster:=Wochentag+tmp;
IF Wochentag24ster>7 THEN
Wochentag24ster:=Wochentag24ster-7;
END_IF;
tmp:=(Wochentag24ster-1);// Differenz zwischen 24stem und 4. Advent
TageBis4erAdvent:=TageBisWeihnachten-tmp;
CASE TageBis4erAdvent OF
-7..-1: AdventsWoche4 :=true;
0 : AdventsWoche4 :=true; VierterAdvent:=true;
1..6 : AdventsWoche3 :=true;
7 : AdventsWoche3 :=true; DritterAdvent:=true;
8..13 : AdventsWoche2 :=true;
14 : AdventsWoche2 :=true; ZweiterAdvent:=true;
15..20: AdventsWoche1 :=true;
21 : AdventsWoche1 :=true; ErsterAdvent :=true;
22 : SaVorErsterAdvent:=true;
END_CASE;
END_IF;
END_IF;
Advent:=(AdventsWoche1=true) OR (AdventsWoche2=true) OR (AdventsWoche3=true) OR (AdventsWoche4=true);
Weihnachtswoche:=(Monat=12) AND (Tag>=24) AND (Tag<=31);
NeujahrBisHochneujahr:= (Monat=1) AND (Tag<=6);
Weihnachtszeit:= Advent OR Weihnachtswoche OR NeujahrBisHochneujahr;
END_FUNCTION_BLOCK
// --------------------------------------------------------------------------------------------------------
Gruß Holger