
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
> Hallo miteinander > > Soweit ich das erkennen kann, arbeitet der Algorithmus in der Tat nur teilweise korrekt. Die mitteleuropĂ€ische Sommerzeit beginnt jeweils am letzten Sonntag im MĂ€rz um 2 Uhr mitteleuropĂ€ischer Zeit (MEZ). Deshalb werden mittels > > IF ((MONTH = 3) AND ((DAY-DOW)<25)) THEN RETURN > > alle Tage im Monat MĂ€rz ausgefiltert, die noch Normalzeit haben. Um zu prĂŒfen, ob der Algorithmus bis hierhin korrekt arbeitet, reicht es, die letzten zwei Wochen im MĂ€rz zu betrachten. Der letzte Sonntag im MĂ€rz kann auf den 25. bis 31. Tag fallen. Im Folgenden sind alle Tage mit Sommerzeit durch eckige Klammern "[]" eingeschlossen. Alle Tage auĂerhalb dieser Klammern haben Normalzeit und deshalb sollte die Subroutine an diesen Tagen mit dem RETURN im einzeiligen IF beendet werden. > > Betrachtung der letzten Tage im Monat MĂ€rz: > > Mo Di Mi Do Fr Sa So Mo Di Mi Do Fr Sa So > 24 25 26 27 28 29[30 31] > 23 24 25 26 27 28[29 30 31] > 22 23 24 25 26 27[28 29 30 31] > 21 22 23 24 25 26[27 28 29 30 31] > 20 21 22 23 24 25[26 27 28 29 30 31] > 19 20 21 22 23 24[25 26 27 28 29 30 31] > 18 19 20 21 22 23 24 25 26 27 28 29 30[31] > > 1 2 3 4 5 6 0 1 2 3 4 5 6 0 DOW nach MOD 7 > 1 2 3 4 5 6 7 1 2 3 4 5 6 7 DOW im DCF77-Signal > > Die nĂ€chste Umstellung auf Sommerzeit findet am Sonntag, dem 26. MĂ€rz 2006, um 2 Uhr MEZ statt: Die Uhren werden eine Stunde vorgestellt auf 3 Uhr MESZ. DOW sollte an diesem Tag 0 sein und DAY gleich 26. (DAY-DOW) ist gleich 26 und (DAY-DOW)<25 ist korrekterweise nicht erfĂŒllt. Das gleiche Ergebnis erhĂ€lt man an allen folgenden Tagen bis zum Freitag, dem 31. MĂ€rz. Am Samstag zuvor, dem 25. MĂ€rz ist (DAY-DOW) = (25-6) gleich 19, weshalb die Subroutine korrekt mit dem RETURN beendet wird. Das gleiche Ergebnis an den Tagen zuvor. > > Problematisch könnten höchstens die ersten Tage im MĂ€rz sein: Am Samstag, dem 4. MĂ€rz, ist (DAY-DOW) = (4-6) gleich -2, also negativ. Alle Micro-Versionen können aber nur mit positiven 8-Bit-Zahlen operieren. Deshalb ergibt sich hier der Wert 254. > > Um anschlieĂend nur den Sonntag zu betrachten, wird mittels > > IF ((MONTH = 3) AND ((DAY-DOW)=25) AND (HOUR<3)) THEN RETURN > > auf (DAY-DOW)=25 abgefragt. Das ist offensichtlich nicht richtig, denn um ein korrektes Ergebnis am 26. MĂ€rz 2006 zu erhalten, mĂŒĂte die DOW-Variable an diesem Sonntag den Wert 1 und nicht 0 haben. > > Ansonsten sollte man niemals direkt mit den Zeitvariablen arbeiten, sondern sie in eigenen Variablen zwischenspeichern. Denn die Zeitvariablen können sich wĂ€hrend der Abfrage verĂ€ndern, da die Uhr weiterlĂ€uft. > > Viele GrĂŒĂe > Dietmar Hallo Dietmar inzwischen haben sich ja mehrere C-Controler der Sache angenommen. Unter Anderem auch der Spezialist Manfred Wilzeck. Er hat mir mittlerweile sogar schon ein Listing gemailt, das die richtigen Ergebnisse liefert. Es wird sich spĂ€ter wohl auch auf seiner Homepage wiederfinden. Wenn es jemand dringend benötigt kann er es vorab natĂŒrlich auch bei mir erhalten. Wollte es aber jetzt und hier nicht veröffentlichen um Manfred nicht vor zu greifen. Trotzdem danke ich Dir fĂŒr Deine scharfe Analyse. Ebenso danke ich allen die sich der Sache angenommen haben fĂŒr die investierte Zeit und MĂŒhe. Besonderen Dank natĂŒrlich an Manfred Wilzeck. Was das direkte arbeiten mit Zeitvariablen betrifft hast Du selbstverstĂ€ndlich recht. Ich habe das hier der Einfachheit halber weggelassen. TatsĂ€chlich speichere ich das LSB der aktuellen Minute im einem TMP_Bit vor dem Einsprung in die Routine. Beim erreichen des Endes frage ich ab, ob TMP_Bit den gleichen Wert hat wie das Bit der aktuellen Minute. Wenn nicht, wird die Routine ein zweites Mal durchlaufen. ( Kann ja nicht zwei mal hinter einander so sein ) MfG, Peter |
| Antwort schreiben |