emilio20
Level-1
- Beiträge
- 835
- Reaktionspunkte
- 20
-> Hier kostenlos registrieren
Hallo
habe mal eine Grundlegende Frage zu den FC s
Ich habe einen FC mit dem ich Sonnenaufgang und Sonnenuntergang berechne. Damit der FC nicht Permanent den Algorithmus durchläuft habe ich eine In Out variable wann der Letzte Tag der Berechnung war. Soweit funktioniert der Baustein auch.
Wenn ich die CPU Stoppe und wieder Starte bekomme ich im DB wo sich die Werte befinden den Zeitwert 00:00:00.000 . Im Speicher steht aber noch der Letzte Tag. Erst bei Tageswechsel wird wieder Berechnet.
Ligt das an der In_Out Variable SP_BERECHNUNG_TAG ?
habe mal eine Grundlegende Frage zu den FC s
Ich habe einen FC mit dem ich Sonnenaufgang und Sonnenuntergang berechne. Damit der FC nicht Permanent den Algorithmus durchläuft habe ich eine In Out variable wann der Letzte Tag der Berechnung war. Soweit funktioniert der Baustein auch.
Wenn ich die CPU Stoppe und wieder Starte bekomme ich im DB wo sich die Werte befinden den Zeitwert 00:00:00.000 . Im Speicher steht aber noch der Letzte Tag. Erst bei Tageswechsel wird wieder Berechnet.
Ligt das an der In_Out Variable SP_BERECHNUNG_TAG ?
Code:
(*****************************************************************************************************************************************************)
FUNCTION SUN_TIME:VOID
TITLE = 'Berechnung Sonnenzeiten'
(*****************************************************************************************************************************************************)
// Benötigte Bausteine
// FC131 UHRZEIT
VAR_INPUT
Aktuelle_Zeit :TOD;
JahresTag :INT; // Jahres Tages Nummer
Zeitzone :TIME;//
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;
Tag :BOOL;
Nacht :BOOL;
SonnenStunden :TOD;
END_VAR
VAR_IN_OUT
SP_BERECHNUNG_TAG :INT; // Speicher letzte Berechnung TagesNummer
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;
END_VAR
BEGIN
IF SP_BERECHNUNG_TAG <> JahresTag THEN
// 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:=INT_TO_REAL (JahresTag);
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) ) *3600000)))+Zeitzone;
Untergang:=(DINT_TO_TOD (REAL_TO_DINT ((Untergang_Ortszeit - (geographische_Lange /15.0) ) *3600000)))+Zeitzone;
SonnenStunden:=DINT_TO_TOD (TOD_TO_DINT (Untergang)-TOD_TO_DINT (Aufgang));
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Speicher wann letzte berechnung war
SP_BERECHNUNG_TAG := JahresTag;
END_IF;
// Abfrage Tag oder Nacht
IF Aktuelle_Zeit > Aufgang AND Aktuelle_Zeit < Untergang THEN
TAG:=TRUE;
NACHT:=FALSE;
ELSE
TAG:=FALSE;
NACHT:=TRUE;
END_IF;
END_FUNCTION