Probleme mit Zeit

emilio20

Level-1
Beiträge
835
Reaktionspunkte
20
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

ich wollte die umstellung der Sommerzeit in eine DT schreiben. Hierzu verwende ich eine AT sich auf eine DT Variable und schreibe die Tag und da Jahr in die Variable. Leider erhalte ich auf dem Panel nur #######################

Code:
// Berechnung der UmstellungsTag Sommerzeit    
DT_TIME1:=DT#2010-03-01-02:00:00.0;     
AT_DT_TIME1.JAHR:=WORD_TO_BYTE(INT_TO_BCD (AKTUELLE_ZEIT.Jahr));    
TAG_Sommerzeit:=31-((AKTUELLE_ZEIT.Jahr + 5 + (AKTUELLE_ZEIT.Jahr/4)) MOD 7);     
AT_DT_TIME1.TAG:=WORD_TO_BYTE(INT_TO_BCD (TAG_Sommerzeit));     
AKTUELLE_ZEIT.Umstellungs_Sommerzeit:=DT_TIME1;

was mache ich falsch ?
 
Hmm, für die ######## gibt es viele mögliche Ursachen.
- das Panel hat keine Verbindung zur CPU
- das EA-Feld ist nicht für Datum/Uhrzeit-Anzeige formatiert
- das EA-Feld ist zu kurz um alle Zeichen auszugeben
- das EA-Feld verweißt auf eine falsche Variable
- die Variable enthält kein gültiges Datum/Uhrzeit

Was steht in Deinem AKTUELLE_ZEIT.Jahr? Ist das Jahr womöglich schon im BCD-Format oder größer als 99? Dann wird die Berechnung wohl ein falsches Ergebnis liefern.
Wenn Du Dein AKTUELLE_ZEIT.Umstellungs_Sommerzeit in einer Variablentabelle beobachtest, steht da ein korrektes Datum/Uhrzeit drin?

Ich mache die Sommerzeit-Umrechnung gewöhnlich mit meinem "BT_LT_3".

Harald
 
Zuletzt bearbeitet:
DT beobachten:
Den DT in einen DB schreiben. Den DB online öffnen, dann die Brille einschalten.
Oder die einzelnen Bytes des DT in einer Variablentabelle beobachten.
Der SCL-Debugger zeigt den Wert von DT auch nicht an?

BT_LT_3:
Der Trick ist, die CPU-Uhr gerade nicht zu verstellen sondern immer in Normalzeit (Winterzeit) laufen zu lassen (z.B. weil die Uhr mit einem NTP-Server synchronisiert wird). Die Sommerzeit wird nur für die Anzeige/Synchronisation des Panels berechnet.

Ich weiß nicht, wozu Du den Tag der Umstellung ausrechnen und anzeigen willst. Der BT_LT_3 gibt nicht den Tag der Umstellung aus, sondern die ggf. als Sommerzeit korrigierte Uhrzeit.

Harald
 
Wenn ich AKTUELLE_ZEIT.Jahr := 13 setze, dann liefert Dein Programmteil korrekt AKTUELLE_ZEIT.Umstellungs_Sommerzeit = DT#13-3-31-2:0:0.000

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo wenn ich den Db beobachter erhalte ich folgende werte siehe Bild.

Am Panel habe ich Datum and Time als Variable. Ich verstehe nicht was da falsch sein soll. Poste mal bein ganzes Programm

Code:
(*****************************************************************************************************************************************************)
DATA_BLOCK AKTUELLE_ZEIT
(*****************************************************************************************************************************************************)

    STRUCT
          
    Datum_und_Zeit                        :DT;
    Datum                                 :DATE;
    Lokalzeit                             :TOD;
    UTC                                   :TOD;
    Zeitzone                              :INT;
    Jahr                                  :INT;
    Jahres_Tag                            :INT;
    Monat                                 :INT;
    Monats_Tag                            :INT;
    Wochen_Tag                            :INT;
    Stunde                                :INT;
    Minute                                :INT;
    Sekunde                               :INT;
    Umstellungs_Sommerzeit                :DT;
    Umstellungs_Winterzeit                :DT;
    Sommerzeit                            :BOOL;
    Winterzeit                            :BOOL;
              
    END_STRUCT
BEGIN
 

END_DATA_BLOCK


FUNCTION UHRZEITEN : VOID

VAR_TEMP
    
    TEMP_INT                      :INT;
    AKT_DT                        :DT;
    DT_TIME                       :DT;
    DT_TIME1                      :DT;

    Jahr_anfang_DATE              :DATE;
    Timer1                        :TOD;
    TAG_Sommerzeit                :INT;
    TAG_Winterzeit                :INT;

    
    AT_AKT_DT AT AKT_DT:
              STRUCT 
                JAHR             : BYTE;
                MONAT            : BYTE;
                TAG              : BYTE;
                STUNDE           : BYTE;
                MINUTE           : BYTE;
                SEKUNDE          : BYTE;
                MS_MSD           : BYTE;                          
                MS_LSD           : BYTE;
            END_STRUCT;
            
     AT_DT_TIME AT DT_TIME:
             STRUCT 
                JAHR             : BYTE;
                MONAT            : BYTE;
                TAG              : BYTE;
                STUNDE           : BYTE;
                MINUTE           : BYTE;
                SEKUNDE          : BYTE;
                MS_MSD           : BYTE;                          
                MS_LSD           : BYTE;
            END_STRUCT;
    
    AT_DT_TIME1 AT DT_TIME1:
             STRUCT 
                JAHR             : BYTE;
                MONAT            : BYTE;
                TAG              : BYTE;
                STUNDE           : BYTE;
                MINUTE           : BYTE;
                SEKUNDE          : BYTE;
                MS_MSD           : BYTE;                          
                MS_LSD           : BYTE;
             END_STRUCT;
        
            
            
       
       

END_VAR

    BEGIN
    
    
    // Aktuelle Systemzeit lesen
    TEMP_INT := READ_CLK(CDT := AKT_DT);
    
    // Aktuelles Datum
    AKTUELLE_ZEIT.Datum :=DT_DATE(IN :=AKT_DT); 
    
    // Datum und Zeit in DB verschieben
    AKTUELLE_ZEIT.Datum_und_Zeit :=AKT_DT;
    
    // Lokalzeit Berechnen
    AKTUELLE_ZEIT.Lokalzeit:=DT_TOD(IN :=AKT_DT); 

    
    // Jahr in DB verschieben
    AKTUELLE_ZEIT.Jahr:=BCD_TO_INT (AT_AKT_DT.JAHR);   
        
    // Jahrestag Berechnen und in DB verschieben
    Jahr_anfang_DATE:=D#2010-01-01;
    DT_TIME:=D_TOD_DT(IN1 :=Jahr_anfang_DATE,IN2 := Timer1);                   // Jahres anfang auslesen und in DT umwandeln T=Platzhalter
    AT_DT_TIME.JAHR  := AT_AKT_DT.JAHR;                                        // Aktuelle Jahreszahl in AT Sicht Jahr schreiben
    Jahr_anfang_DATE  :=DT_DATE(IN :=DT_TIME);     
    AKTUELLE_ZEIT.Jahres_Tag:=DINT_TO_INT (DATE_TO_DINT (AKTUELLE_ZEIT.Datum) - DATE_TO_DINT (Jahr_anfang_DATE))+1;
    
    // Monat in DB verschieben
    AKTUELLE_ZEIT.Monat:=BCD_TO_INT (AT_AKT_DT.MONAT);
    
    // Monats Tag in DB verschieben
    AKTUELLE_ZEIT.Monats_Tag:=BCD_TO_INT (AT_AKT_DT.TAG);

    // Wochentag in DB verschieben
    AKTUELLE_ZEIT.Wochen_Tag :=DT_DAY(IN :=AKT_DT);
    
    // Stunde in DB verschieben
    AKTUELLE_ZEIT.Stunde:=BCD_TO_INT  (AT_AKT_DT.STUNDE);

    // Minute in DB verschieben
    AKTUELLE_ZEIT.Minute:=BCD_TO_INT (AT_AKT_DT.MINUTE);
    
    // Sekunde in DB verschieben
    AKTUELLE_ZEIT.Sekunde:=BCD_TO_INT (AT_AKT_DT.SEKUNDE);
    
    
    // Berechnung der UmstellungsTag Sommerzeit
    DT_TIME1:=DT#2010-03-31-02:00:00.000;
    AT_DT_TIME1.JAHR:=WORD_TO_BYTE(INT_TO_BCD (AKTUELLE_ZEIT.Jahr));
    TAG_Sommerzeit:=31 -((AKTUELLE_ZEIT.Jahr + 5 + (AKTUELLE_ZEIT.Jahr/4)) MOD 7);
    AT_DT_TIME1.TAG:=WORD_TO_BYTE(INT_TO_BCD (TAG_Sommerzeit));
    AKTUELLE_ZEIT.Umstellungs_Sommerzeit:=DT_TIME1;
    
    // Berechnung der UmstellungsTag Winterzeit
    DT_TIME:=DT#2010-10-01-03:00:00.0;
    AT_DT_TIME.JAHR:=WORD_TO_BYTE(INT_TO_BCD (AKTUELLE_ZEIT.Jahr));
    TAG_Winterzeit:=31 -((AKTUELLE_ZEIT.Jahr + 2 + (AKTUELLE_ZEIT.Jahr/4)) MOD 7);
    AT_DT_TIME.TAG:=WORD_TO_BYTE(INT_TO_BCD (TAG_Winterzeit));
    AKTUELLE_ZEIT.Umstellungs_Winterzeit:=DT_TIME;
    
    
    

    
       END_FUNCTION
 

Anhänge

  • zeit.JPG
    zeit.JPG
    32,6 KB · Aufrufe: 29
Deine beobachteten Werte sind BCD-codiert, wenn ich den Screenshot auf meinem Handy richtig sehe.
Liegt da irgendwo der Hund begraben?
 
@hucki
BCD-codiert ist völlig korrekt.

@emilio20

Nicht, daß Dein Panel rumzickt, weil der Wochentag in Deinen DT nicht zum Datum passt?
Belege mal Deine DT mit einem Sonntag-Wert oder schreibe den Sonntag-Code in das letzte Byte (1 = Sonntag):
Code:
    // Berechnung der UmstellungsTag Sommerzeit
    DT_TIME1:=DT#[COLOR="#FF0000"]2013-03-31[/COLOR]-02:00:00.000;  //muß ein Sonntag-Datum sein!
//oder:
    [COLOR="#FF0000"]AT_DT_TIME1.MS_LSD := 1 ;[/COLOR]  // 1 = Sonntag
...

Falls das auch nichts ändert, dann überprüfe das Datumsanzeigefeld im Panel. Siehe meine Hinweise im Beitrag #2.
Um sicherzugehen, daß sich Deine exzessive Datenschieberei nicht auf das anzuzeigende Datum auswirkt, schreibe mal nur ein garantiert richtiges Datum/Uhrzeit in die Anzeigevariablen:
Code:
// allen vorhandenen Code überspringen und/oder diesen Code am Schluß:

    // Aktuelle Systemzeit lesen
    TEMP_INT := READ_CLK(CDT := AKTUELLE_ZEIT.Umstellungs_Sommerzeit);
    AKTUELLE_ZEIT.Umstellungs_Winterzeit:=AKTUELLE_ZEIT.Umstellungs_Sommerzeit;

Harald
 
Zurück
Oben