Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 9 von 9

Thema: Berechnung des 1. Advent mit CoDeSys 2.3.9.x

  1. #1
    Registriert seit
    03.02.2009
    Beiträge
    33
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,
    meine herzallerliebst Frau möchte pünktlich zum 1. Advent die Weihnachtsdeko-Beleutung in Gang bringen.
    Hat jemand schon mal die Berechnung des Datums des 1. Advent eines jeden Jahres programmiert und könnte es mir (für CoDeSys 2.3.9.x) zur Verfügung stellen?

    Danke euch,
    Gruß
    Guwen
    Zitieren Zitieren Berechnung des 1. Advent mit CoDeSys 2.3.9.x  

  2. #2
    Registriert seit
    07.06.2006
    Ort
    Bayern
    Beiträge
    623
    Danke
    27
    Erhielt 156 Danke für 139 Beiträge

    Standard

    hab ich zwar nicht fertig - aber einen Lösungsansatz hätte ich:

    In der Oscat-Lib gibt´s die Funktion "DAY_OF_WEEK", damit kannst du für ein beliebiges Datum den Wochentag (Mo=1, So=7) ermitteln.
    Mit dieser Funktion ermittelst du dann den Wochentag für den 24. Dezember.
    Mit dieser Info kannst du dann ja das Datum für den 1. Advent ausrechnen - du musst halt entsprechend des Wochentages die jeweilige Anzahl an Tagen zurückrechnen.

    Noch ein Tipp:
    Wenn der 24. Dezember ein Sonntag ist, dann ist dieser Tag auch gleichzeit der 4. Advent.

    Link zur Oscat-Lib http://www.oscat.de

  3. Folgende 2 Benutzer sagen Danke zu uncle_tom für den nützlichen Beitrag:

    apmIng (09.12.2013),guwen (22.11.2011)

  4. #3
    Registriert seit
    17.06.2003
    Beiträge
    1.269
    Danke
    480
    Erhielt 65 Danke für 57 Beiträge

    Standard

    Ich wundere mich immer was mancher für Zeit hat sich mit solchen Problemen rumzuschlagen.
    Möchte auch mal die grüne Langeweile haben.

  5. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.402 Danke für 2.001 Beiträge

    Standard

    @Rudi:
    Das war übrigens ein blöder Kommentar ...
    Für mich ist dieses ein Problem wie jedes andere auch - Uncle_Tom hat den Lösungsansatz ja auch schon schön erklärt.

    Gruß
    Larry

  6. #5
    Registriert seit
    17.06.2003
    Beiträge
    1.269
    Danke
    480
    Erhielt 65 Danke für 57 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    @Rudi:
    Das war übrigens ein blöder Kommentar ...
    Für mich ist dieses ein Problem wie jedes andere auch - Uncle_Tom hat den Lösungsansatz ja auch schon schön erklärt.

    Gruß
    Larry
    Ich wollte eben auch mal einen blöder Kommentar abgeben

  7. #6
    Registriert seit
    28.05.2009
    Beiträge
    38
    Danke
    4
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo,

    habe mich letzetes Jahr auch mal an das "Problem" gesetzt. Natürlich kann man das auch über manuelles Ein-/Ausschalten lösen, aber ich habe das auch zu Übungszwecken gemacht. Sicher gibt es hier auch noch Optimierungspotential.


    Code:
    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:=Kalender.YEAR;
    (* Füllen der SDT-Struktur mit dem 06.01.[aktuelles Jahr]*)
    x0601JJ.DAY:=06;
    x0601JJ.MONTH:=01;
    x0601JJ.YEAR:=L_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, Kalender.LDATE, 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 Kalender.LDATE = 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 L_TimeSTD.MONTH = 12 AND (L_TimeSTD.DAY = 24 OR L_TimeSTD.DAY=25 OR L_TimeSTD.DAY = 31) THEN
      Ausschaltzeit_abend:=Kalender.SUN_RISE;
     ELSE
      Ausschaltzeit_abend:=TOD#22:00;
     END_IF;
    END_IF;
    (* Ein-Zeit morgens: 6:00 Uhr  Sonnenaufgang*)
    Ein_morgen:=TIMECHECK(Kalender.LTOD, TOD#06:00, Kalender.SUN_RISE);
    (* Ein-Zeit abend: Sonnenuntergang  bis berechnete Ausschaltzeit*)
    Ein_abend:=TIMECHECK(Kalender.LTOD,Kalender.SUN_SET, Ausschaltzeit_abend);
    Weihnachstbeleuchtung_Ein:= Einschaltdatum AND ((Ein_morgen AND NOT ErsterEinSamstag) OR Ein_abend);
    DO_Weihnachtsbeleuchtung:=Weihnachstbeleuchtung_Ein;
    Zitieren Zitieren hab da letzes Jahr mal was programmiert....  

  8. Folgender Benutzer sagt Danke zu good_mike für den nützlichen Beitrag:

    guwen (22.11.2011)

  9. #7
    guwen ist offline Benutzer
    Themenstarter
    Registriert seit
    03.02.2009
    Beiträge
    33
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke schön an good_mike und uncle_tom,
    uncle_tom: Der Tipp mit der Oscat und dem DAY_OF_WEEK hat mich auf die entscheidende Idee gebracht.
    good_mike: So als NewBee muss ich mir das erst einmal in Ruhe zu gemüte führen. Das sieht aber toll aus.

    Die eigentliche Weihnachtsbeleuchtung hatte ich schon fertig, hier nun (dank eurer Hilfe) mein geistiger Erguss:

    FUNCTION Advent : STRING
    VAR_INPUT
    END_VAR
    VAR
    WeekDay: STRING; (* Tag der Woche, an dem Heiligabend ist *)
    XMasDate : INT; (* Tage vor Weihnachten *)
    (* Wobei YearJJJJ separat definiert ist, und einfach eine 4-Stellige Jahresangabe beinhaltet *)
    END_VAR

    WeekDay :=CONCAT (INT_TO_STRING(YearJJJJ()),'-12-24');
    XMasDate := 21 + DAY_OF_WEEK(STRING_TO_DATE(CONCAT('d#',weekday)));
    Advent := DATE_TO_STRING(DATE_ADD(STRING_TO_DATE(CONCAT('d#',weekday)),-XMasDate,1,1,-1));


    Mein einziges Problem war zum Schluss: Ich verstehe das DATE_ADD nicht:
    Eigentlich sollte es doch DATE_ADD(Datum, tag, woche, monat, jahr) sein. Wenn ich nun DATE_ADD(d#2011-12-24, -1, 0, 0, 0) genommen habe, ist da als Ergebnis der 23.11.2012 rausgekommen?!

    Danke nochmals an alle "guten Geister"

    Glückauf!
    Guwen

  10. #8
    guwen ist offline Benutzer
    Themenstarter
    Registriert seit
    03.02.2009
    Beiträge
    33
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo nochmals,
    in diesem Jahr ist die Weihnachtsbeleuchtung zum Leidwesen meiner Frau am 1. Advent nicht angegangen.
    Festgestellt habe ich, dass ich noch immer das leidige Problem mit dem DATE_ADD habe.
    DATE_ADD(D#2013-12-24, -23, 0, 0, 0) macht bei mir nicht den 1.12.2013 (also #D2013-12-01) sondern den 31.10.2014 (also D#2014-10-31).
    Woran kann das liegen? Was mache ich falsch?

    Danke schon mal für eure Antorten,
    Guwen.

  11. #9
    Registriert seit
    29.03.2004
    Beiträge
    5.739
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    In der Oscat Funktion von DATE_ADD ist ein Fehler. Wenn der Parameter D oder W negativ ist funktioniert er nicht wie gewünscht.
    Am Besten ist es wenn du den Fehler bei Oscat meldest.

    Zur Strafe muss Hugo deiner Frau dann ein Weihnachtsständchen singen...

Ähnliche Themen

  1. Berechnung im DB?
    Von motamas im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 14.06.2010, 11:43
  2. Antworten: 1
    Letzter Beitrag: 20.12.2009, 15:20
  3. Berechnung
    Von SebastianLicht im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 05.06.2009, 11:35
  4. MPI CRC Berechnung
    Von Hannes im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 20.07.2007, 13:37
  5. Antworten: 1
    Letzter Beitrag: 23.09.2005, 13:56

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •