Uhrzeitsynchronisation über NTP-Verfahren

Susi

Level-1
Beiträge
24
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Habe in meiner CP 343-1 Uhrzeitsynchronisation über NTP - Verfahren angewählt. Der NTP - Server liefert immer GMT.
Leider funktioniert die Sommer-Winter Umstellung nicht.
Die Uhrzeit auf dem HMI wird aktuell um 1 Stunde zurück angezeigt.
Wie realisiere ich eine funktionierende Sommer - Winter Umstellung.
(Voraussetzung ist NTP - Verfahren.)
 
in der OSCAT-Bibliothek findest du entsprechendes Handwerkszeug ohne viel selber erfinden zu müssen ... wenn du es gern zu Fuß machen möchtest: Kalender angucken, gucken wann Zeitumstellung ist, deine Zeit abfragen, feststellen ob umgestellt werden muß oder nicht, muß umgestellt werden Stunde de- oder inkrementieren ... die Zeit liegt im BCD-Format vor
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hab mir grad nochmal die OSCAT angesehen, so ergiebig ist sie auf dem gebiet leider nicht, aber vladi hatte mal einen gerettetet code gepostet, hier ist er:

Code:
*
FUNCTION "SomWinterZeit" : VOID
TITLE =
//Diese FC benutzt die SFC0 (Set_CLK) und SFC1 (READ_CLK).
//Funktionsbeschreibung:
//Die Sommerzeit beginnt am letzten März-Sonntag (Umstellung 2:00 -> 3:00).
//Die Winterzeit beginnt am letzten Oktober-Sonntag (Umstellung 3:00 -> 2:00).
//Ausgewertet wird die Tatsache, dass dieser Sonntag ein Datum >24. ist.
//Diese FC erkennt auch ob die aktuelle Zeit (mit Datum) Sommer- o. Winterzeit 
//ist. Eine Uhrverstellung wird aber nur beim Durchlaufen der Umstellungszeit 
//(2:00/3:00) gemacht.
//
//Die in_out-Variable #SZ zeigt mit HIGH an, das momentan Sommerzeit ist.
//
//Zur Bestimmung, ob das aktuelle Datum in den letzten 7 Tagen des März' bzw. des 
//Oktobers vor oder nach dem letzten Sonntag ist, wird folgendet Algorythmus 
//benutzt:
//Wenn der aktuelle Tag vor dem letzten Sonnntag ist, dann gilt Tag-Wochentag < 24
VERSION : 0.1


VAR_IN_OUT
  SommerZeit : BOOL ;    //Anzeige Somerzeit
  UhrStellen : BOOL ;    
END_VAR
VAR_TEMP
  CDT : DATE_AND_TIME ;    
  rv : INT ;    
  Jahr : BYTE ;    
  Monat : BYTE ;    
  Tag : BYTE ;    
  Wochentag : BYTE ;    
  Stunde : BYTE ;    
  HM1 : BOOL ;    
END_VAR
BEGIN
NETWORK
TITLE =Uhrzeit lesen

      CALL "READ_CLK" (
           RET_VAL                  := #rv,
           CDT                      := #CDT);


NETWORK
TITLE =

      L     LB     0; 
      T     #Jahr; 

      L     LB     1; 
      T     #Monat; 

      L     LB     2; 
      T     #Tag; 

      L     LB     3; 
      T     #Stunde; 

      L     LB     7; // Low-Byte = Wochentag
      L     W#16#F; 
      UW    ; 
      T     #Wochentag; 

// Monat <März & >Oktober ?
      L     #Monat; 
      L     3; 
      <I    ; 
      =     #HM1; 
      TAK   ; 
      L     W#16#10; 
      >I    ; 
      U     #HM1; 
      SPB   Wi; 
// Monat <März & >Oktober ?
      L     #Monat; 
      L     3; 
      >I    ; 
      =     #HM1; 
      TAK   ; 
      L     W#16#10; 
      <I    ; 
      U     #HM1; 
      SPB   So; 
// Ist März?
      L     #Monat; 
      L     3; 
      ==I   ; 
      SPBN  Okt; 

// Sommerzeit: Umstellung
// Es ist März! Ist es später als der 24.März?
      L     #Tag; 
      L     W#16#24; 
      >I    ; 
      SPBN  Wi; 
// Es ist später als der 24.März! Kommt noch ein Sonntag?
      TAK   ; 
      L     #Wochentag; 
      -I    ; 
      L     W#16#24; 
      <I    ; 
      SPB   Wi; 
// Es ist entweder der letzte So. im März oder danach!
      L     #Wochentag; 
      L     1; 
      ==I   ; 
      SPBN  So; 
// Ist es 3 Uhr oder später?
      L     #Stunde; 
      L     3; 
      >=I   ; 
      SPB   So; 
// Ist es 2 Uhr
      TAK   ; 
      L     2; 
      ==I   ; 
      SPBN  Wi; 
// Aktl. Zeit + 1 Std.
      TAK   ; 
      INC   1; 
      T     LB     3; 
      S     #UhrStellen; 
      SPA   So; 
// Winterzeit: Umstellung
// Es ist Oktober! Ist es später als der 24.?
Okt:  L     #Tag; 
      L     W#16#24; 
      >I    ; 
      SPBN  So; 
// es ist später als der 24 Okt.
      TAK   ; 
      BTI   ; 
      L     #Wochentag; 
      -I    ; 
      L     24; 
      <I    ; 
      SPB   So; 
// Es ist entweder der letzte So. im Oktober oder danach!
      L     #Wochentag; 
      L     1; 
      ==I   ; 
      SPBN  Wi; 
// Ist es vor 2 Uhr
      L     #Stunde; 
      L     2; 
      <I    ; 
      SPB   So; 
// Ist es jetzt Sommerzeit
      U     #SommerZeit; 
      SPBN  Wi; 
// Ist es 3 Uhr oder später
      L     #Stunde; 
      L     3; 
      >=I   ; 
      SPBN  So; 
// Aktl Zeit minus 1 Std.
      TAK   ; 
      DEC   1; 
      T     LB     3; 
      S     #UhrStellen; 
      SPA   Wi; 

So:   S     #SommerZeit; 
      SPA   Uhr; 

Wi:   R     #SommerZeit; 

Uhr:  SET   ; 

NETWORK
TITLE =Uhr stellen



      U     #UhrStellen; 
      SPBNB _001; 
      CALL "SET_CLK" (
           PDT                      := #CDT,
           RET_VAL                  := #rv);
_001: NOP   0; 
NETWORK
TITLE =Bit reset

      U     #UhrStellen; 
      R     #UhrStellen; 

END_FUNCTION
 
...
Leider funktioniert die Sommer-Winter Umstellung nicht.
Die Uhrzeit auf dem HMI wird aktuell um 1 Stunde zurück angezeigt.
Wie realisiere ich eine funktionierende Sommer - Winter Umstellung.
(Voraussetzung ist NTP - Verfahren.)

Zitat aus der Siemens FAQ
Das NTP-Verfahren unterstützt keine automatische Umstellung zwischen Sommer- und Winterzeit. Dies ist nicht im Protokoll vorgesehen. Wie Sie die Sommerzeit berechnen können, finden Sie unter folgender Beitrags-ID: 19324378
 
Sommer <-->Winterzeit

Hallo,

wen´s interessiert hier die Formeln für die Berechnungen der genauen Tage im März und im Oktober für Beginn und Ende der Sommerzeit.

Formel zur Berechnung des Beginns der europäischen Sommerzeit

Sonntag (31 - (5*Jahr/4 + 4) mod 7) März um 01.00 Uhr UTC
(Gültig bis 2099).

Formel zur Berechnung des Endes der europäischen Sommerzeit

Sonntag (31 - (5*Jahr/4 + 1) mod 7) Oktober um 01.00 Uhr UTC
(Gültigkeit wie oben).

Das Jahr muß zweistellig eingegeben werden also 08 für 2008.

mfG Jan
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

wen´s interessiert hier die Formeln für die Berechnungen der genauen Tage im März und im Oktober für Beginn und Ende der Sommerzeit.
...
Siemens liefert mit dem Baustein FC61 "BT_LT" aus der Standard Library "Miscellaneous Blocks" ja schon einen fertigen Baustein mit. Warum also selber rechnen. Es sein denn man will das üben
 
Ich stand vor einem ähnlichen Problem: Uhrzeit- Synchronisation läuft über einen CP 343-1 perfekt, aber eben nur im NTP- Verfahren.
Nun gibt es den komfortablen SFC 100: der gestattet sogar die Angabe einer "Ankündigungsstunde". Gibt man vorher die Differenz (hier 2 x 0,5h) ein, dann stellt sich die Uhr unter Beibehaltung der UTC- Zeit genau zur vorher angegebenen Stunde. (Datum muss man aber trotzdem separat berechnen) Das war für mich wichtig, da die Zeit für ein FiFo- Lager genutzt wurde. Auch wenn es sehr unwahrscheinlich ist, dass an diesem bestimmten Sonntag nachts jemand arbeitet - es ergab im Zeitumstell- Bereich unsinnige Lagerzeiten. Daher rechnet das Lager weiter in UTC- Zeit, angezeigt wird aber die korrigierte UTC- SPS- Zeit.
Unter den SZL´s (132 Index 8 lässt sich der "Sommerzeit- Status" permanent auslesen.
Klint im ersten Moment kompliziert, ist es aber nicht.
Genaueres zu dem Baustein SFC 100 liefert (ausnahmsweise) mal die Siemens- Beschreibung.
 
Zuletzt bearbeitet:
Danke

Danke für die vielen hilfreichen Tipps. Besonders der Beitrag von marlob mit dem Verweis zur Siemens FAQ hat mir weitergeholfen.
Wahrscheinlich gibt es mehrere Möglichkeiten die Uhrzeit zu stellen.
Welche davon ich nutzen werde, muss ich noch prüfen.
 
Zurück
Oben