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

Ergebnis 1 bis 10 von 10

Thema: Probleme mit Zeit

  1. #1
    Registriert seit
    10.08.2010
    Beiträge
    770
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard


    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 ?
    Zitieren Zitieren Probleme mit Zeit  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.174
    Danke
    922
    Erhielt 3.288 Danke für 2.657 Beiträge

    Standard

    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
    Geändert von PN/DP (22.03.2013 um 09:00 Uhr) Grund: zugefügt: "EA-Feld ist zu kurz"
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #3
    Registriert seit
    10.08.2010
    Beiträge
    770
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    Ich kann doch keine DT beobachten. Mit BT_LT_3 kann ich nicht die lokalzeit in der CPU schreiben.

  4. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.174
    Danke
    922
    Erhielt 3.288 Danke für 2.657 Beiträge

    Standard

    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #5
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.174
    Danke
    922
    Erhielt 3.288 Danke für 2.657 Beiträge

    Standard

    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. #6
    Registriert seit
    10.08.2010
    Beiträge
    770
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    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
    Angehängte Grafiken Angehängte Grafiken

  7. #7
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.716
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Standard

    Deine beobachteten Werte sind BCD-codiert, wenn ich den Screenshot auf meinem Handy richtig sehe.
    Liegt da irgendwo der Hund begraben?

  8. #8
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.174
    Danke
    922
    Erhielt 3.288 Danke für 2.657 Beiträge

    Standard

    @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#2013-03-31-02:00:00.000;  //muß ein Sonntag-Datum sein!
    //oder:
        AT_DT_TIME1.MS_LSD := 1 ;  // 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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  9. #9
    Registriert seit
    10.08.2010
    Beiträge
    770
    Danke
    1
    Erhielt 14 Danke für 13 Beiträge

    Standard

    Hallo
    es lag wirklich an WochenTag.
    Wenn ich als Startwert den 31.03.2013 eingebe, dieser ist ein Sonntag, dan funktioniert das Programm.

  10. Folgender Benutzer sagt Danke zu emilio20 für den nützlichen Beitrag:

    PN/DP (23.03.2013)

  11. #10
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.174
    Danke
    922
    Erhielt 3.288 Danke für 2.657 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    Danke für die Erfolgsmeldung. Gut zu wissen, daß für das Panel der Wochentag zum Datum passen MUSS.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 19.12.2011, 17:42
  2. Zeit messen mit SCL
    Von Casimyr im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 26.08.2011, 07:40
  3. FB Probleme beim rücksetzen einer Zeit
    Von Ladwig im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 12.11.2010, 09:58
  4. Rngspeicher mit Zeit erfassung
    Von zvende im Forum Simatic
    Antworten: 20
    Letzter Beitrag: 02.11.2010, 23:59
  5. WHILE / RETURN mit ablaufender Zeit
    Von hoOLLOow im Forum CODESYS und IEC61131
    Antworten: 19
    Letzter Beitrag: 03.02.2009, 15:43

Lesezeichen

Berechtigungen

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