FB für Sommer-Winterzeit

Antonio

Level-2
Beiträge
202
Reaktionspunkte
24
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

da es bald wieder soweit ist, wollte ich eine nützliche Quelle posten,
es handelt sich dabei um ein FB für die Uhrzeit der S7, das nützliche dabei ist die automatische Sommer-Winterzeitanpassung.
Vielleicht etwas für die FAQ;)
 

Anhänge

  • Sommer_Winter.zip
    4,1 KB · Aufrufe: 408
Zuviel Werbung?
-> Hier kostenlos registrieren
Davon abgesehen das ich den Code noch nicht testen konnte, aber hast Du mehr wie eine Uhr damit sich eine Multiinstanz lohnt?

Grüße
Michael

es gibt sicher anwendungen, wo ich mehrere uhren betreiben möchte...
aber das ist ja noch nicht das ende der multiinstanz ... ich kann ja mehrere unterschiedliche bausteine in eine multiinstanz einfügen ... dafür ist dieser baustein nicht geeignet
 
Zuletzt bearbeitet:
Multiinstanzfähig heißt nicht unbedingt, daß man den FB mehrmals aufrufen will/muß.
Multiinstanzfähig bedeutet auch, daß der FB nicht unbedingt einen eigenen IDB braucht
und man die Instanz auch in einem Mutter-IDB einfügen kann.

Harald
 
Die Problematik hat sich bei mir nie ergeben, ich habe diesen BAustein jetz seit gut 3 Jahren im Betrieb, der erfüllt all meine Anforderungen.
Ich bin aber auch noch klein:ROFLMAO:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Problematik hat sich bei mir nie ergeben, ich habe diesen BAustein jetz seit gut 3 Jahren im Betrieb, der erfüllt all meine Anforderungen.
Ich bin aber auch noch klein:ROFLMAO:

Mach dir nichts draus, ich mache auch nur Bausteine multiinstanzfähig, bei denen ich das brauche und das ist so gut wie nie. Ist halt abhängig von der Art, in der man sein Programmsystem aufsetzt. Nur nicht aus der Ruhe bringen lassen, auch wenn dieser oder jener nicht immer alles gut findet. Muß er ja auch nicht; denke ich mal. ;)
 
Zuletzt bearbeitet:
Multiinstanzfähig heißt nicht unbedingt, daß man den FB mehrmals aufrufen will/muß.
Multiinstanzfähig bedeutet auch, daß der FB nicht unbedingt einen eigenen IDB braucht
und man die Instanz auch in einem Mutter-IDB einfügen kann.

Harald

Jepp da stimme ich Dir zu, die Mutter aller Instanzen nutze ich auch immer gern.
 
Nur nicht aus der Ruhr bringen lassen, auch wenn dieser oder jener nicht immer alles gut findet. Muß er ja auch nicht; denke ich mal. ;)

Diese Kritik empfinde ich auch als nicht so schlimm, ich wollte halt was nützliches posten, ich behaupte mal,es ist insgesamt gut angekommen, wem das nicht gefällt gebe ich ein tip:

Einfach nicht Downloaden
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Poste auch mal meinen Baustein

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

    STRUCT
          
    DatumUhrzeit                          :DT;
    DatumUhrzeit_set                      :DT;
    Datum                                 :DATE;
    Lokalzeit                             :TOD;
    UTC                                   :TOD;
    UTC_Zeitzone                          :TIME:=T#1H;// Berlin
    Zeitzone                              :TIME:=T#1H; //Lokalzeit +1 Winterzeit
    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;
    P_Sommerzeit                          :BOOL;
    P_Winterzeit                          :BOOL;
    Edge_flag_pos1                        :BOOL;
    Edge_flag_pos2                        :BOOL;  
    HMI_Uhr_Stellen                       :BOOL;
    SOMMER_TO_WINTER                      :BOOL;    
            
    END_STRUCT
BEGIN
 

END_DATA_BLOCK


FUNCTION UHRZEITEN : VOID

VAR_TEMP
    
    TEMP_INT                      :INT;
    TEMP_SFC0                     :INT;
    AKT_DT                        :DT;
    DT_TIME                       :DT;
    DT_TIME1                      :DT;
    Umstellung_Time               :TIME;

    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
    
    // Uhr Manuell Stellen
    IF AKTUELLE_ZEIT.HMI_Uhr_Stellen THEN    
       TEMP_SFC0:=SET_CLK(PDT :=AKTUELLE_ZEIT.DatumUhrzeit_set);
       AKTUELLE_ZEIT.HMI_Uhr_Stellen:=False;
    END_IF;

        
    // 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.DatumUhrzeit :=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#2013-03-31-02:00:00.000;// Achtung Datum muss immer ein Sonntag sein sonst fehler in der Berechnung der Zeit
    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#2013-10-27-03:00:00.0; // Achtung Datum muss immer ein Sonntag sein sonst fehler in der Berechnung der Zeit
    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;
    
    // Umstellung von Sommer auf Winterzeit von 3:00 auf 2:00 Uhr. Nach umstellung Bit von 2:00 bis 3:00 Uhr setzten damit Zeit nicht wieder auf Sommerzeit springt  
    AKTUELLE_ZEIT.SOMMER_TO_WINTER:=AKTUELLE_ZEIT.Winterzeit AND (AKT_DT > AKTUELLE_ZEIT.Umstellungs_Winterzeit+-T#1H AND AKT_DT < AKTUELLE_ZEIT.Umstellungs_Winterzeit);
     
    
     //  Sommerzeit 
    IF (AKT_DT>AKTUELLE_ZEIT.Umstellungs_Sommerzeit AND AKT_DT < AKTUELLE_ZEIT.Umstellungs_Winterzeit) AND NOT AKTUELLE_ZEIT.SOMMER_TO_WINTER THEN
       AKTUELLE_ZEIT.Sommerzeit:=TRUE;
       AKTUELLE_ZEIT.Winterzeit:=FALSE;
       AKTUELLE_ZEIT.Zeitzone:=AKTUELLE_ZEIT.UTC_Zeitzone+T#1H;
       Umstellung_Time:=T#1h;
    ELSE // Winterzeit
       AKTUELLE_ZEIT.Sommerzeit:=FALSE;
       AKTUELLE_ZEIT.Winterzeit:=TRUE; 
       AKTUELLE_ZEIT.Zeitzone:=AKTUELLE_ZEIT.UTC_Zeitzone;
       Umstellung_Time:=T#23h;
                                    
    END_IF;
    
    // Flankenmerker   
    //Bildung der positiven Flanke  //get the positive pulse
     AKTUELLE_ZEIT.P_Sommerzeit  := AKTUELLE_ZEIT.Sommerzeit AND NOT AKTUELLE_ZEIT.Edge_flag_pos1;
     AKTUELLE_ZEIT.Edge_flag_pos1   := AKTUELLE_ZEIT.Sommerzeit;
     
     AKTUELLE_ZEIT.P_Winterzeit  := AKTUELLE_ZEIT.Winterzeit AND NOT AKTUELLE_ZEIT.Edge_flag_pos2;
     AKTUELLE_ZEIT.Edge_flag_pos2   := AKTUELLE_ZEIT.Winterzeit;

   
    // Uhr Umstellung Sommer Winterzeit
    IF AKTUELLE_ZEIT.P_Sommerzeit OR AKTUELLE_ZEIT.P_Winterzeit THEN
       AKTUELLE_ZEIT.Lokalzeit:=AKTUELLE_ZEIT.Lokalzeit+Umstellung_Time;
       AKTUELLE_ZEIT.DatumUhrzeit:=D_TOD_DT(IN1 :=AKTUELLE_ZEIT.Datum,IN2 := AKTUELLE_ZEIT.Lokalzeit);
       TEMP_SFC0:=SET_CLK(PDT :=AKTUELLE_ZEIT.DatumUhrzeit); 
    END_IF ; 
     
     //UTC Berechnen
      AKTUELLE_ZEIT.UTC:=AKTUELLE_ZEIT.Lokalzeit +- AKTUELLE_ZEIT.Zeitzone;

    
            
          
    
       
       END_FUNCTION
 
Zurück
Oben