(*****************************************************************************************************************************************************)
FUNCTION SUN_TIME:VOID
TITLE = 'Berechnung Sonnenzeiten'
(*****************************************************************************************************************************************************)
VAR_INPUT
Zeitzone :REAL;//-1
geographische_Lange :REAL;// Länge von Stadt Sandberg ist 10
geographische_Breite :REAL;// Breitengrad von Stadt Sandberg ist 50.35
Daemmerung :INT; // 0=geometrische Dämerung, 1=bürgerlicher Dämmerung,2=nautische Dämmerung, 3=Astro Dämerung
END_VAR
VAR_OUTPUT
Aufgang :TOD;
Untergang :TOD;
END_VAR
VAR_TEMP
TEMP_INT :INT;
AKT_DT :DT;
DT_TIME :DT;
AKT_DATE :DATE;
Jahr_anfang_DATE :DATE;
i2 :INT;
i3 :INT;
Timer1 :TOD;
YEAR :INT;
WOZ :REAL;
MOZ :REAL;
T :REAL;
Pi :REAL;
Aufgang_Ortszeit :REAL;
Untergang_Ortszeit :REAL;
Zeitgleichung :REAL;
Deklination :REAL;
Zeitdifferenz :REAL;
B :REAL;
h :REAL;
D :REAL;
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;
END_VAR
BEGIN
// Aktuelle Systemzeit
TEMP_INT := READ_CLK(CDT := AKT_DT); // Systemzeit auslesen in Format DT
AKT_DATE :=DT_DATE(IN :=AKT_DT); // Datum in Variable schreiben
// Aktuelles Jahr bei Jahresanfang anpassen
//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); // aktueller Jahresanfang in Variable übergeben
// Berechnung
Pi :=3.14159265359; // Pi
// Horizonthöhe Dämmerung
CASE Daemmerung OF
0 : D:=-0.833;
1 : D:=-6 ;
2 : D:=-12 ;
3 : D:=-18 ;
ELSE:
D:=-0.833 ;
END_CASE;
T:=DINT_TO_REAL (DATE_TO_DINT (AKT_DATE) - DATE_TO_DINT (Jahr_anfang_DATE))+1.0;
B:= Pi *geographische_Breite / 180 ;
h:=D /57.29578;
Zeitgleichung := -0.171*SIN(0.0337 * T + 0.465) - 0.1299*SIN(0.01787 * T - 0.168);
Deklination := 0.4095*SIN(0.016906*(T-80.086)) ;
Zeitdifferenz := 12.0*ACOS((SIN(h) - SIN(B)*SIN(Deklination)) / (COS(B)*COS(Deklination)))/Pi;
Aufgang_Ortszeit := 12.0 - Zeitdifferenz - Zeitgleichung;
Untergang_Ortszeit := 12.0 + Zeitdifferenz - Zeitgleichung;
Aufgang:=DINT_TO_TOD (REAL_TO_DINT ((Aufgang_Ortszeit - (geographische_Lange /15.0) + Zeitzone)*3600000));
Untergang:=DINT_TO_TOD (REAL_TO_DINT ((Untergang_Ortszeit - (geographische_Lange /15.0) + Zeitzone)*3600000));
END_FUNCTION