Step 7 FB_Weihnachtszeit

holgero

Level-1
Beiträge
255
Reaktionspunkte
30
Zuviel Werbung?
-> 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).
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
// --------------------------------------------------------------------------------------------------------
Freut mich falls jemand Verwendung für diesen Baustein hat ;-) …
Gruß Holger
 
Zurück
Oben