Homepage

  • Projekte
  • Shop
  • Forum
Erweiterte Suche
  • Schnellzugriff
    • Unbeantwortete Themen
    • Aktive Themen
    • Suche
  • FAQ
  • Anmelden
  • Registrieren
  • Foren-Übersicht
  • Suche

decode_time-Funktion in ntp.c

Informationen, Fehlermeldungen, Verbesserungen zu Ulis Basisversion des AVR-Webservers.
Antworten
  • Druckansicht
Erweiterte Suche
4 Beiträge • Seite 1 von 1
Urs59
Beiträge: 3
Registriert: 31.08.2009, 22:31:57
Wohnort: Schweiz

decode_time-Funktion in ntp.c

  • Zitieren

Beitrag von Urs59 » 31.08.2009, 23:06:39

Hallo Uli

Habe mir deine AVR-Miniwebserver-SW auf mein Pollin-Board geladen und betreibe damit einen einfachen Datenlogger. Erst mal vielen Dank für die tolle Software!

In meiner Anwendung messe ich alle 5 Minuten 5 Sensorwerte. Die letzten 100 Messungen können mit Zeitstempel vom AVR-Miniwebserver gelesen werden. Die Messzeit wandle ich mit der Funktion decode_time in eine lesbare Zeit um. Dabei ist mir beim Übergang vom 30. auf den 31. August folgendes Problem aufgefallen:

So 30.08.2009, 23:40:03;210;538;160;0;0
So 30.08.2009, 23:45:03;210;538;160;0;0
So 30.08.2009, 23:50:03;210;538;160;0;0
So 30.08.2009, 23:55:03;210;538;155;0;0
Mo 1.09.2009, 0:00:03;210;538;158;0;0
Mo 1.09.2009, 0:05:03;210;538;160;0;0
Mo 1.09.2009, 0:10:03;210;538;155;0;0
Mo 1.09.2009, 0:15:03;210;538;153;0;0
Mo 1.09.2009, 0:20:03;210;535;155;0;0
Mo 1.09.2009, 0:25:03;210;535;150;0;0
Mo 1.09.2009, 0:30:03;210;535;153;0;0
Mo 1.09.2009, 0:35:03;210;535;153;0;0
Mo 1.09.2009, 0:40:03;210;535;155;0;0
Mo 1.09.2009, 0:45:03;210;535;148;0;0
Mo 1.09.2009, 0:50:03;210;535;150;0;0
Mo 1.09.2009, 0:55:03;210;535;155;0;0
Mo 31.08.2009, 1:00:03;210;535;153;0;0
Mo 31.08.2009, 1:05:03;210;535;145;0;0
Mo 31.08.2009, 1:10:03;210;535;150;0;0

In der ersten Stunde des 31.08. werden Tag und Monat offenbar falsch berechnet. Danach läuft alles wieder einwandfrei.

Habe mir den Code der decode_time-Funktion in ntp.c einmal angeschaut und glaube den Fehler gefunden zu haben.
Während der Sommerzeit muss ja eine Stunde addiert werden. Dies passiert im Abschnitt

Code: Alles auswählen

    if (summertime)
    {
        dt->hour++;              // add one hour
Weiter unten wird dann geprüft, ab das Addieren der einen Stunde zu einem Monatswechsel führt:

Code: Alles auswählen

            if (dt->day == monthlen(LEAPYEAR(dt->year), dt->month))
            {                // next month
                dt->day = 0;
                dt->month++;
            }
Hier liegt nun wohl das Problem:
Die Prüfung auf den letzten Tag im Monat müsste meiner Meinung nach mit mit "dt->month-1" statt mit dt->month gemacht werden, da die Funktion "monthlen" die Monatsnummern im Bereich 0..11 erwartet. In dt->month steht jedoch die Monatsnummer im Bereich 1..12.

Die beiden Aufrufe von "monthlen" im oberen Teil der decode_time-Funktion sind wohl korrekt, da zu Beginn des Codes tatsächlich mit Monatsnummern im Bereich 0..11 gearbeitet wird. Irgendwann wird dann mit

Code: Alles auswählen

dt->month ++;
auf den Bereich 1..12 umgeschaltet.

Ich wäre froh, wenn du meinen Änderungsvorschlag mal prüfen könntest.

Danke und liebe Grüsse
Urs
Nach oben

Urs59
Beiträge: 3
Registriert: 31.08.2009, 22:31:57
Wohnort: Schweiz

Re: decode_time-Funktion in ntp.c

  • Zitieren

Beitrag von Urs59 » 02.09.2009, 21:37:51

Hallo

Habe zur Erläuterung des Problems noch ein kleines Testprogramm geschrieben, welches die Originalfunktion von Ulrich mit meiner korrigierten Funktion über ein gesamtes Jahr vergleicht. Das Testresultat habe ich beigefügt.
Es wird deutlich, dass die Originalfunktion während der Sommerzeit bei den Monatswechseln fehlerhafte Ergebnisse liefert (siehe z.B. Zeile 0092 "Mi 32.03.2009").
Während der Winterzeit läuft auch die Originalfunktion korrekt. Auch die Übergänge Sommer <=> Winter sind fehlerfrei.
Das von mir verwendete Testprogramm "decode_time_test" habe ich vollständigkeitshalber ebenfalls beigefügt.

Gruss
Urs
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Nach oben

Baziizab
Beiträge: 2
Registriert: 26.08.2009, 00:56:14
Wohnort: München

Re: decode_time-Funktion in ntp.c

  • Zitieren

Beitrag von Baziizab » 03.09.2009, 03:36:31

Hallo Urs59,

habe deine Angaben überprüft und konnte den Fehler im Originalcode von Ulrich Radig ebenfalls feststellen. Dies ist ein wunderbares Beispiel dafür, wie schwierig es ist 100% fehlerfreie Software zu erstellen, gerade bei solchen Problemen, die nur sehr selten auftreten und bei einfachen Testläufen nicht auffallen.

Vielen Dank für deine gute Arbeit! Ich nehme an, dass Ulli den korrigierten Code ins nächste Release übernehmen wird, wenn er diesen Thread liest.

Gute Nacht!
Bazi
Nach oben

Urs59
Beiträge: 3
Registriert: 31.08.2009, 22:31:57
Wohnort: Schweiz

Re: decode_time-Funktion in ntp.c

  • Zitieren

Beitrag von Urs59 » 03.09.2009, 23:29:44

Hallo Bazi

Schön, dass du den Fehler ebenfalls nachvollziehen konntest, und dies erst noch mitten in der Nacht! Ja, gerade bei Zeitumwandlungsfunktionen sitzt oft der Fehlerteufel drin und das Testen gestaltet sich entsprechend aufwändig.
Ich würde mich natürlich freuen, wenn Uli die Korrektur beim nächsten Release berücksichtigen würde.

Für alle, welche die Korrektur schon mal selber vornehmen möchten, hier nochmals die im Modul "ntp.c" zu ändernde Codezeile:

Code: Alles auswählen

...
    if (summertime)
    {
        dt->hour++;              // add one hour
        if (dt->hour == 24)
        {                        // next day
            dt->hour = 0;
            dt->wday++;            // next weekday
            if (dt->wday == 7 )
            {
                dt->wday = 0;
            }
/* Originalcodezeile von Ulrich Radig:
            if (dt->day == monthlen(LEAPYEAR(dt->year), dt->month))
*/
//  korrigierte Codezeile:
            if (dt->day == monthlen(LEAPYEAR(dt->year), dt->month -1))
            {                // next month
                dt->day = 0;
                dt->month++;
            }
            dt->day++;
        }
    }
...
Liebe Grüsse
Urs
Nach oben

Antworten
  • Druckansicht

4 Beiträge • Seite 1 von 1

Zurück zu „Software: Ulis Basisversion“



  • Foren-Übersicht
  • Alle Zeiten sind UTC+02:00
  • Alle Cookies löschen

Powered by phpBB® Forum Software © phpBB Limited

Deutsche Übersetzung durch phpBB.de

Datenschutz | Nutzungsbedingungen

 

 

sitemap  |    |  datenschutz   |  impressum