Ankündigung

Einklappen
Keine Ankündigung bisher.

Funktionen und Evaluationsschema

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Funktionen und Evaluationsschema

    Ich wäre beinahe heute morgen am Ostemontag geweckt worden und habe deshalb meine Feiertagsfunktion näher untersucht. Der EibPC wurde seit Ende 2017 nicht mehr neu gestartet. Mir kommt es bei der Frage auf die Zeile
    "DOYostern@ = GetDayOfYear(Year, Eastermonth(0s16), Easterday(0s16))" - in der ersten Zeile nach den :var Definitionen - an:

    "Year" ist eine globale Variable. Müsste sich die Variable DOYostern@ beim Jahresübergang nicht von selbst updaten, also ohne ein Konstrukt wie if change(Year) then... ? Und alle auf DOYostern@ aufbauenden Variablen wie letztendlich "result@" auch? Manchmal denk' ich mir, ich checke das Evaluationsschema immer noch nicht ganz...

    Code:
    /*_______________ IsFeiertag Anfang __________________________*/
    :begin isFeiertag(pDOY)
    :info $Gibt für einen mit "pDOY" angegebenen Tag zurück, ob ein Feiertag vorliegt$\\
        $pDOY, Nummer des Tags im Jahr (u16), der 1.1. des Folgejahres kann mit abgefragt werden, daher max. 367 im Schaltjahr$
    
    :var DOYostern@
    :var DOYneuja1@
    :var DOYhlg3Kg@
    :var DOYkarfre@
    :var DOYostmon@
    :var DOYmaifei@
    :var DOYchrhim@
    :var DOYpfison@
    :var DOYpfimon@
    :var DOYfronle@
    :var DOYmarhim@
    :var DOYeinhei@
    //Einmaliger Feiertag, kann nach 2017 wieder entfernt werden:
    :var DOYreform@
    :var DOYallerh@
    :var DOYhlgabd@
    :var DOYweif01@
    :var DOYweif02@
    :var DOYsilves@
    // und um immer einen Tag voraus schauen zu können (Radiowecker):
    :var DOYneuja2@
    
    [COLOR=#FF0000]DOYostern@ = GetDayOfYear([B]Year,[/B] Eastermonth(0s16), Easterday(0s16))[/COLOR]
    DOYneuja1@ = GetDayOfYear(Year, 1, 1)
    DOYhlg3Kg@ = GetDayOfYear(Year, 1, 6)
    DOYkarfre@ = DOYostern@ - 2u16
    DOYostmon@ = DOYostern@ + 1u16
    DOYmaifei@ = GetDayOfYear(Year,5,1)
    DOYchrhim@ = DOYostern@ + 39u16
    DOYpfison@ = DOYostern@ + 49u16
    DOYpfimon@ = DOYostern@ + 50u16
    DOYfronle@ = DOYostern@ + 60u16
    DOYmarhim@ = GetDayOfYear(Year,8,15)
    DOYeinhei@ = GetDayOfYear(Year,10,3)
    //Einmaliger Feiertag, kann nach 2017 wieder entfernt werden:
    DOYreform@ = GetDayOfYear(2017,10,31) + convert(Year != 2017u16,0u16) * 1000u16
    DOYallerh@ = GetDayOfYear(Year,11,1)
    DOYhlgabd@ = GetDayOfYear(Year,12,24)
    DOYweif01@ = DOYhlgabd@ + 1u16
    DOYweif02@ = DOYhlgabd@ + 2u16
    DOYsilves@ = GetDayOfYear(Year,12,31)
    // und um immer einen Tag voraus schauen zu können:
    DOYneuja2@ = DOYsilves@ + 1u16
    
    :var result@
    result@ =     pDOY == DOYostern@ or \\
                pDOY == DOYneuja1@ or \\
                pDOY == DOYhlg3Kg@ or \\
                pDOY == DOYkarfre@ or \\
                pDOY == DOYostmon@ or \\
                pDOY == DOYmaifei@ or \\
                pDOY == DOYchrhim@ or \\
                pDOY == DOYpfison@ or \\
                pDOY == DOYpfimon@ or \\
                pDOY == DOYfronle@ or \\
                pDOY == DOYmarhim@ or \\
                pDOY == DOYeinhei@ or \\
                pDOY == DOYreform@ or \\
                pDOY == DOYallerh@ or \\
                pDOY == DOYhlgabd@ or \\
                pDOY == DOYweif01@ or \\
                pDOY == DOYweif02@ or \\
                pDOY == DOYsilves@ or \\
                pDOY == DOYneuja2@
    
    :return result@
    :end
    So, jetzt werde ich den EibPC mal neu starten, damit ich an den kommenden beweglichen Feiertagen nicht versehentlich geweckt werde...

    #2
    Also grundsätzlich sollte das laut Validierungsschema so passen. Zeig doch bitte auch mal den Code, wo die Variable "Year" zugewiesen wird. Ich mache das bei mir so:

    datum = convert(setdate(), $$)
    tag = convert(split(datum, 0u16, 1u16), 0)
    monat = convert(split(datum, 3u16, 4u16), 0)
    jahr = convert(split(datum, 6u16, 9u16), 0u16)

    Hier sollten konsequenterweise eigentlich auch Funktionen für Tag, Monat und Jahr bereit gestellt werden (so wie für Stunde, Minute und Sekunde), da man ja doch oft auch diese Werte vergleichen muss. Vielleicht liest Michael ja mit ...

    Kommentar


      #3
      Zitat von klaus Beitrag anzeigen
      Also grundsätzlich sollte das laut Validierungsschema so passen. Zeig doch bitte auch mal den Code, wo die Variable "Year" zugewiesen wird. Ich mache das bei mir so:

      datum = convert(setdate(), $$)
      tag = convert(split(datum, 0u16, 1u16), 0)
      monat = convert(split(datum, 3u16, 4u16), 0)
      jahr = convert(split(datum, 6u16, 9u16), 0u16)
      Mein Makro für die globalen Datums- / Zeitwerte: Rot eingefärbt, die Teile, auf die es ankommt (Variablendefinition und ziemlich unten die Zuweisung)
      Code:
      /*===============  Datums- und Zeitmakros ====================*/
      /*---------------  Globale Codes -----------------------------*/
      :begin DateGlobals()
      Date = $$
      Day = 0u08
      Month = 0u08
      [COLOR=#FF0000]Year = 0u16[/COLOR]
      DayOfYear = 0u16
      WeekDay = 0u08
      MinuteOfDay = convert(hour(),0u16) * 60u16 + convert(minute(),0u16)
      // Vielleicht bals mal umstellen auf Wecker 1..3
      NextAlarmInMinutes = min(NextAlarmInMinutesArbeitstag, NextAlarmInMinutesBadmintontag, NextAlarmInMinutesWecker3)
      NextAlarmInMinutesArbeitstag = 65000u16
      NextAlarmInMinutesBadmintontag = 65000u16
      NextAlarmInMinutesWecker3 = 65000u16
      
      
      isDst = isDayLightSaving()
      isLeapY = isLeapYear(Year)
      isHolidayToday = isFeiertag(DayOfYear)
      isHolidayTomorrow = isFeiertag(DayOfYear + 1u16)
      strDst = $CET$
      :var result@
      result@ = AUS
      
      //---------- Kommunikation mit EibPC02, um Heizungssteuerung an Wecker anzupassen
      if change(NextAlarmInMinutes) then {
          write("HeizungMinutenBisWecken-1/5/10"u16, NextAlarmInMinutes);
      } endif
      
      #ifdef EIBPC01
      NextAlarmDueNext12hours = NextAlarmInMinutes <= 720u16
      
      if change(NextAlarmDueNext12hours) or systemstart() then {
          write("WeckerIn24Std-3/4/101", NextAlarmDueNext12hours);
      } endif
      #endif
      
      //----------- String für Sommer-/Winterzeit
      if change(isDst) or systemstart() then {
          if isDst then {
              strDst = $MESZ$;
          } else {
              strDst = $MEZ$;
          } endif;
      } endif
      
      [COLOR=#FF0000]//--------- Täglich zu Mitternacht und nach Systemstart Datumsinfo bereitstellen
      if change(dayofweek()) or systemstart() then {
          Date = convert(setdate(), $$);
           Day = convert(split(Date, 0u16, 1u16), 0u08);
           Month = convert(split(Date, 3u16, 4u16), 0u08);
      [B]Year = convert(split(Date, 6u16, 9u16), 0u16);[/B]
          DayOfYear = GetDayOfYear(Year, Month, Day);
          WeekDay = GetDayOfWeek(Day, Month, Year);
          result@=EIN;
      } endif[/COLOR]
      :return result@
      Zitat von klaus Beitrag anzeigen
      Hier sollten konsequenterweise eigentlich auch Funktionen für Tag, Monat und Jahr bereit gestellt werden (so wie für Stunde, Minute und Sekunde), da man ja doch oft auch diese Werte vergleichen muss. Vielleicht liest Michael ja mit ...
      Das kann ich nur bekräftigen und Michael bitten, diese wohl eher unkomplizierten Funktionen implementieren zu lassen.

      Kommentar


        #4
        enertegus : Wäre schön, wenn Ihr da mal genauer draufschauen könntet. Wenn ich die Variable "Year" (s.o.) im Debugger auf einen neuen Wert setze, ändert sich DOYostern@ (oberes Codebeispiel) nicht wie erwartet. Da ist anscheinend definitiv etwas im Argen. Im Debugger habe ich startend vom Ausgangspunkt 2018 die Variable "Year" nacheinander in 2017, 2016, 2018 geändert. Das Ergebnis gefällt mir nicht:

        (Das Makro wird im Programm zweimal verwendet, deshalb die Doppelung für __isFeiertag_xxx_DOYostern)
        Ausgangspunkt 2018: Ostern ist der 91. Tag des Jahres
        Ausgangspunkt.PNG

        2017: Ostern war der 106. Tag des Jahres
        2017.PNG

        2016 (Schaltjahr): Ostern war der 87. Tag des Jahres
        2016.PNG

        (Satz "Man sieht, dass zwar das Schaltjahr irgendwie durchschlägt, aber nicht das Jahr, mit dem die Ostersonntagsfunktion aufgerufen wird" stimmt nicht, das macht ja mein Makro DayOfYear(...)). Initialisiert Ihr vielleicht in der EibPC-Funktion für den Ostersonntag beim Systemstart eine Variable, die sich danach nie mehr ändert?

        Zurück auf 2018:
        2018.PNG
        Zuletzt geändert von klaus_kraemer; 15.04.2018, 20:31. Grund: Das mit dem Schaltjahr hat nichts mit der Ostersonntagsfunktion zu tun...

        Kommentar


          #5
          Hallo Klaus,

          ich habe auch den Eindruck, dass etwas nicht stimmt und dies in einem anderen Post auch schon vermutet
          => ich denke, da muss man tatsaechlich noch mal ueberpruefen
          ( ich setzte daher aktuell wieder meine eigene Berechnung ein ... )
          Gruss


          Wolfgang
          ETS 6.2 EibPC V3.x

          Kommentar


            #6
            Bin inzwischen absolut überzeugt, dass Eastermonth() und Easterday() nen Bug haben. Die Änderung für 2016 (ein Tag mehr wegen Schalttag) hat meine DayOfYear(...) Funktion gemacht - und das halt richtig. Die beiden Easterfunktionen scheinen tatsächlich beim Programmstart initialisiert zu werden und verpennen dann den Jahreswechsel.

            Kommentar


              #7
              Wir werden das mal überprüfen.
              offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
              Enertex Produkte kaufen

              Kommentar

              Lädt...
              X