*
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