Step 7 Automatische Umstellung Sommer-/Winterzeit

artur

Level-1
Beiträge
19
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich erhalte vom Kunden über den NTP-Server Datum und Uhrzeit(aber keine Umschaltung auf Sommerzeit).
Wie kann ich die CPU-Zeit automatisch auf Sommer- und Winterzeit umstellen.
Die Hardware: CPU 414F-3 PN/DP mit CP443-1 für die Zeitsynchronisation.

Kann mir bitte jemand helfen.

Danke
Artur
 
Wenn die CPU-Uhr per NTP synchronisiert wird, dann ist es ziemlich sinnfrei, die Uhr auf Sommerzeit umzustellen, weil sie bei der nächsten Synchronisation wieder auf Winterzeit eingestellt wird...

Laß die Uhr in Winterzeit laufen und berechne die aktuelle Lokalzeit (Winterzeit/Sommerzeit) für Anzeigezwecke (?), z.B. mit dem FC61 BT_LT (Standard Library > Miscellaneous Blocks)

Wie kann die aktuelle Lokalzeit (Sommer- bzw. Winterzeit) in der S7-300/400 CPU berechnet und auf dem Panel als Systemzeit verwendet werden?


Ich benutze einen selbstgeschriebenen Ersatz für den pompösen FC61, welcher ohne Regel-DB auskommt und fest auf Mitteleuropäische Zeit (CET/CEST) eingestellt ist. Hier die Version, wenn die CPU-Uhr mit einem Zeitzonenversatz in CET (UTC+1) läuft (wenn im CPx43-1 ein Zeitzonenversatz eingestellt ist):
Code:
FUNCTION "BT_LT_3" : VOID
TITLE =BT_LT_3: Convert base time to local time (Summertime/Wintertime)
//Ersatz für FC61 BT_LT aus der S7-Standard-Library auf S7-300, die keinen 
//Uhrzeitstatus besitzen (Im Uhrzeitstatus der CPU sind die Basiszeit sowie 
//die für den jeweiligen Ort geltende Zeitzone, eine Sommerzeit-Kennung sowie 
//eine Kennung für die Ankündigungsstunde hinterlegt und werden von der CPU 
//aktualisiert.) BT_LT_3 benutzt keinen Regel-DB.
//
//Typisches Szenario:
//Eine S7-300-CPU besitzt keinen Uhrzeitstatus, die CPU-Uhr ist nach der lokalen 
//Normalzeit (Winterzeit) gestellt und ggf. nach NTP-Verfahren synchronisiert.
//BT_LT_3 ermittelt, ob der am Eingang BT angegebene Zeitpunkt in der Sommerzeit 
//liegt und gibt am Ausgang LT die ggf. als Sommerzeit korrigierte lokale Uhrzeit 
//aus. BT muß ein gültiges DATE_AND_TIME inkl. Wochentag sein.
//
//BT_LT_3 berücksichtigt keine Zeitzone, sondern nur den Uhrzeit-Versatz in 
//der Sommerzeit. Die Sommerzeit gilt vom letzten Sonntag im März 02:00 BT 
//bis zum letzten Sonntag im Oktober 02:00 BT (03:00 ST).
//BT_LT_3 benutzt intern die folgende Funktion der S7-Standard-Library – 
//IEC Function Blocks: FC(1) AD_DT_TM
AUTHOR : PN_DP
FAMILY : TIMEFUNC
NAME : BT_LT_3
VERSION : 1.0

VAR_INPUT
  BT : DATE_AND_TIME ;       //Basiszeit (z.B. CPU-Clock)
END_VAR
VAR_OUTPUT
  LT : DATE_AND_TIME ;       //Lokalzeit
  SUMMER : BOOL ;            //Sommerzeitkennung (0: Winter / 1: Sommer)
END_VAR
VAR_TEMP
  AR1_Save : DWORD ;
  AR2_Save : DWORD ;
  tmpBT : DATE_AND_TIME ;
  tmpLT : DATE_AND_TIME ;
  DB_No : INT ;
  LT_Offset : TIME ;
  March : BOOL ;
END_VAR
BEGIN
NETWORK
TITLE =Basiszeit von IN-Aktualparameter BT in TEMP kopieren
//DATE_AND_TIME (DT) wird bei FC als 6-Byte-POINTER übergeben und kann nicht 
//direkt weitergereicht werden. Deshalb IN.BT nach TEMP umkopieren.

//Adressregister sichern
      TAR1  #AR1_Save;
      TAR2  #AR2_Save;

//Pointer auf IN-Aktualparameter BT erstellen
      L     P##BT;             // Adresse IN.BT
      LAR1  ;
      L     W [AR1,P#0.0];     // POINTER.DB_Nr
      T     #DB_No;
      L     D [AR1,P#2.0];     // POINTER.Bereichsadresse
      LAR1  ;                  // AR1: Adresse des IN-DT
      LAR2  P##tmpBT;          // AR2: Adresse des TEMP-DT

//DATE_AND_TIME (8 Byte) BT von IN nach TEMP kopieren
      AUF   DB [#DB_No];
      L     D [AR1,P#0.0];
      T     LD [AR2,P#0.0];
      L     D [AR1,P#4.0];
      T     LD [AR2,P#4.0];

NETWORK
TITLE =Ermitteln ob Sommerzeit ist und Lokalzeit berechnen
//Die Sommerzeit gilt vom letzten Sonntag im März 02:00 BT 
//bis zum letzten Sonntag im Oktober 02:00 BT (03:00 ST)

//AR2: Pointer auf tmpBT

//Der letzte Sonntag im März bzw. Oktober kann auf 25. bis 31. fallen
//vor 25.03. ist Winterzeit
      L     LW [AR2,P#1.0];    // tmpBT.Monat (BCD) + Tag (BCD)
      L     DW#16#325;         // vor 25.03. ist WZ
      <I    ;
      SPB   WINZ;

//nach 31.10. ist Winterzeit
      POP   ;                  // tmpBT.Monat (BCD) + Tag (BCD)
      L     W#16#1031;         // nach 31.10. ist WZ
      >I    ;
      SPB   WINZ;

//nach 31.03. (= 01.04.) bis vor 25.10. (= 24.10.) ist Sommerzeit
      POP   ;                  // tmpBT.Monat (BCD) + Tag (BCD)
      L     W#16#331;          // bis 31.03. Umschaltwoche zu SZ
      <=I   ;
      =     #March;            // Umschaltwoche WZ zu SZ
      SPB   SPEZ;

      POP   ;                  // tmpBT.Monat (BCD) + Tag (BCD)
      L     W#16#1025;         // bis vor 25.10. ist SZ
      <I    ;
      SPB   SOMZ;

//hier nur noch 25.03.-31.03. und 25.10.-31.10.
//letzter Sonntag ?
SPEZ: L     LB [AR2,P#7.0];    // tmpBT.Wochentag 1=So ... 7=Sa
      UW    W#16#F;            // nur Bits .0-.3 (4 LSB)
      L     B#16#1;
      -I    ;                  // WoT: 0=So, 1=Mo, ... 6=Sa
      SPZ   SONN;              // jetzt ist der Umschalt-Sonntag
//Akku1: Wochentag 0=So ... 6=Sa
      L     LB [AR2,P#2.0];    // tmpBT.Tag (BCD)
      BTI   ;                  // Tag (INT)
      TAK   ;                  // Akku1: WoT, Akku2: Tag
      -I    ;
//Ergebnis 19..24 sind Tage vor Umschalt-Sonntag
      L     25;
      <I    ;
      SPBN  NACH;

//Vor Umschalt-Tag bzw. -Uhrzeit
VOR:  U     #March;
      SPB   WINZ;              // März: noch ist Winterzeit
      SPA   SOMZ;              // Okt.: noch ist Sommerzeit

//Nach Umschalt-Tag bzw. -Uhrzeit
NACH: U     #March;
      SPB   SOMZ;              // März: nun ist Sommerzeit
      SPA   WINZ;              // Okt.: nun ist Winterzeit

//es ist jetzt der Umschalt-Sonntag
SONN: L     LB [AR2,P#3.0];    // tmpBT.Stunde (BCD)
      L     B#16#2;            // vor 02:00 Uhr?
      <I    ;
      SPB   VOR;
      SPA   NACH;

//Signalisierung Sommerzeit oder Winterzeit
SOMZ: S     #SUMMER;
      L     T#1H;              // 1 Stunde Zeitdifferenz SZ-WZ
      SPA   TLTO;

WINZ: R     #SUMMER;
      L     T#0MS;             // Winterzeit ist Basiszeit

TLTO: T     #LT_Offset;

//Lokalzeit berechnen
      CALL "AD_DT_TM" (
           T       := #tmpBT,
           D       := #LT_Offset,
           RET_VAL := #tmpLT);

NETWORK
TITLE =Lokalzeit von TEMP in OUT-Aktualparameter LT kopieren
//DATE_AND_TIME (DT) wird bei FC als 6-Byte-POINTER übergeben, OUT kann nicht 
//direkt von anderen FC beschrieben werden. Deshalb mit TEMP-Kopie arbeiten.

//Pointer auf OUT-Aktualparameter LT erstellen
      L     P##LT;             // Adresse OUT.LT
      LAR1  ;
      L     W [AR1,P#0.0];     // POINTER.DB_Nr
      T     #DB_No;
      L     D [AR1,P#2.0];     // POINTER.Bereichsadresse
      LAR1  ;                  // AR1: Adresse des OUT-DT
      LAR2  P##tmpLT;          // AR2: Adresse des TEMP-DT

//DATE_AND_TIME (8 Byte) LT von TEMP nach OUT kopieren
      AUF   DB [#DB_No];
      L     LD [AR2,P#0.0];
      T     D [AR1,P#0.0];
      L     LD [AR2,P#4.0];
      T     D [AR1,P#4.0];

//Adressregister wiederherstellen + BIE/ENO auf TRUE setzen
      LAR1  #AR1_Save;
      LAR2  #AR2_Save;
      SET   ;
      SAVE  ;

END_FUNCTION
Der Baustein benötigt den FC AD_DT_TM aus der Standard Library > IEC Function Blocks

Und hier die Version BT_LT_3_CET für (PN-)CPUs, wo die CPU-Uhr ohne Zeitzonenversatz in UTC läuft.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Artur,
nur der vollständigkeit halber:
OSCAT BASIC333:
LG
Shrimps

########## zitat Seite 125 :#########
12.13. DST
Type Funktion : BOOL
Input UTC : DATE_TIME (Weltzeit)
Output BOOL (TRUE, wenn Sommerzeit)
Die Funktion DST überprüft, ob im Augenblick Sommerzeit herrscht, oder
nicht. Sie kann dazu benutzt werden eine vorhandene nicht-Sommerzeit
fähige Uhr sekundengenau auf Sommer- und Winterzeit umzustellen.
Die Funktion DST schaltet am letzten Sonntag des März um 01:00 UTC
(02:00 MEZ) auf Sommerzeit (03:00 MESZ) und am letzten Sonntag des
Oktober um 01:00 UTC (03:00 MESZ) auf 02:00 MEZ zurück. Der Ausgang
von DST ist dann TRUE, wenn Sommerzeit herrscht.
Die Sommerzeit wird aufgrund von UTC (Weltzeit) berechnet. Eine Berechnung
von Ortszeit nach Sommerzeit ist generell nicht möglich weil im letzten
Sonntag des Oktobers die Stunde von 02:00 - 03:00 MEZ beziehungsweise
MESZ doppelt existiert. Die Sommerzeit wird in allen Ländern der EU
seit 1992 zur selben Sekunde nach Weltzeit umgestellt. In Mitteleuropa
um 02:00, in England um 01:00 und in Griechenland um 04:00. Durch die
Berechnung mithilfe der Weltzeit wird die Sommerzeit für alle Europäischen
Zeitzonen richtig berechnet.
 
@PN/DP:
Wozu eigentlich in einem FC das Sichern und Wiederherstellen der Adressregister, am Anfang und am Ende der Funktion? Meiner Meinung nach ist das unnötig. Wenn ich eine Funktion aufrufe kann ich mich nie darauf verlassen, dass danach meine von mir selbst beschriebenen Registerinhalte unverändert sind.
 
Das Sichern der Adressregister ist in der Tat unnötig bzw. bewirkt nicht das, was beabsichtigt war. Schaden tut es allerdings auch nicht, außer ein paar µs Rechenzeit zu verschwenden.
"Damals" vor langer Zeit, als ich den Baustein geschrieben habe, war ich noch nicht so perfekt wie heute ;) da habe ich noch "vorsichtshalber" Sachen in Programme eingebaut, wo ich erst später sicher wusste, daß die unnötig waren. Das Sichern war wohl eine Angewohnheit aus meinen Assembler-TSR-Programmierungs-Jahren aus der Vor-SPS-Zeit.

Harald
 
Hallo zusammen,

ich will das Thema "Sommer-/Winterzeit-Umstellung" nochmals aufgreifen.

Es gibt hier nun verschiedene Bausteine, die das verwalten können. Da hab ich nun die Frage:

Muss die Steuerung in der besagten Nacht eingeschaltet sein, damit die Umstellung erkannt wird oder kann die Umstellung auch beim
nächsten Einschalten erkannt werden und wird dann nachgeholt (also, quasi Montag früh, nach dem Umstellungswochenende) ???
 
Hallo Remstäler,
m.E. ist DST eine Funktion und daher wird diese bei jedem Aufruf neu berechnet.
Also egal wann die PLC an / Aus ist...
Meine "private" wird auch ab und an neu gestartet und holt sich jedesmal neu die Uhrzeit und Datum und berechnet lt. OSCAT SZ/WZ.

Hoffe es hilft
Shrimps
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Funktionen "BT_LT_3" und "DST" stellen nichts um. Die Funktionen signalisieren nur, ob ein übergebener Winterzeit-basierter bzw. UTC-DATE_AND_TIME in der Zeit der Sommerzeit liegt und geben ggf. eine zur Sommerzeit umgerechnete Zeit zurück. Der zu prüfende Eingangs-DATE_AND_TIME kann ein beliebiger DATE_AND_TIME sein, es muß nicht die aktuelle Uhrzeit sein.

Daher ist es egal, ob die Steuerung zum Umschaltzeitpunkt eingeschaltet ist oder nicht. Die Funktion "BT_LT_3" rechnet trotzdem richtig, bei "DST" weiß ich es nicht, die tut es aber vermutlich ebenfalls korrekt, weil sie eine UTC-Zeit erwartet.

Wenn Du die Signalisierung als Umschaltsignal für irgendwas nutzen willst, dann mußt Du selbst dafür sorgen, daß Du diese Umschaltung nur einmal machst und daß das Programm die erfolgte Umschaltung nicht vergisst! Vermutlich ist es egal, wann Du die Umschaltung machst - Hauptsache nur einmal. Du solltest natürlich nicht die zu prüfende Uhrzeit umschalten, sonst schaltet die Uhr in der Sommer-Winter-Rückschaltstunde alle Stunde jeweils wieder eine Stunde zurück auf 02:00 oder sie schaltet dauernd hin und her. (oder Du wartest mit der Rückschaltung bis nach 03:00, oder merkst Dir die Rückschaltung besonders)
Code:
U  Signal_Sommerzeit
UN wurde_umgeschaltet
SPBN M001
S  wurde_umgeschaltet
... initialisiere Sommer-Aufgaben

M001: SET
UN Signal_Sommerzeit
U  wurde_umgeschaltet
SPBN M002
R  wurde_umgeschaltet
... initialisiere Winter-Aufgaben

M002: SET

Harald
 
Also ich verwende den BT_LT vom Siemens und bin damit SEHR glücklich.

Zur Uhrzeit in der CPU: dort sollte immer UTC laufen, das ist das einzige was nachhaltig funktioniert (also nicht nur Winterzeit sondern die Winterzeit in Greenwich)!
Edit: ok, ich bin halt auch PCS7 verseucht.
 
NTP-Server, zumindest wenn sie der Spezifikation genügen, liefern IMMER UTC.
:oops: Du hast recht, da habe ich in einem Anfall von geistiger Umnachtung was verwechselt. ;)
Früher habe ich das noch besser gewußt... :sad:

So'rum wird ein Schuh draus:

Wenn man bei einer S7-300-PN-CPU oder S7-400-PN-CPU oder ET200-PN-CPU die Uhrzeitsynchronisation per NTP aktiviert, dann läuft die CPU-Uhr in UTC - weil man für diese CPU keine Zeitzone einstellen kann und NTP ja UTC liefert.

Wenn man bei einem IE-CP CP343-1 oder CP443-1 die Uhrzeitsynchronisation per NTP aktiviert, dann berücksichtigt der CP eine einstellbare Zeitzonenkorrektur, so daß die CPU-Uhr bei standardmäßig eingestellter Zeitzone "(GMT +01:00)" "trotz" NTP-Synchronisation in UTC+1 läuft. (Bei flüchtiger Betrachtung könnte der Eindruck entstehen, NTP würde die Uhrzeit in UTC+1 liefern.) Damit auch bei NTP-Synchronisation via CP die CPU-Uhr in UTC läuft, müßte man die Korrektur abschalten, indem man die Zeitzone auf "(GMT)" einstellt.

Welche SIMATIC S7-300/S7-400 Baugruppen unterstützen das NTP-Uhrzeittelegramm zur Synchronisation der Systemzeit und wie aktiviere ich diese Art der Zeitsynchronisation?

Weil nun wegen dieser CP-Geschichte manche meiner SPS-Uhren in UTC und manche in UTC+1 laufen, gibt es meinen Baustein BT_LT_3 in 2 Versionen, einmal für UTC+1 bei CP in GMT+1, und einmal für UTC bei PN-CPU oder CP mit GMT-Einstellung.

Große Linkliste: Uhrzeitsynchronisation - Zeitsynchronisation im Automatisierungsumfeld

Harald
 
Zurück
Oben