Jochen Kühner
Level-3
- Beiträge
- 4.291
- Reaktionspunkte
- 527
-> Hier kostenlos registrieren
Hallo, Ich möchte gern aus der Oscat lib die Funktion für den Sonnenstand verwenden, doch diese liefert bei mir leider falsche Werte! Irgendwelche Tips???
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
(* @PATH := '\/Time&Date' *)
FUNCTION_BLOCK sun_pos
TITLE = 'sun_pos'
//
// version 1.0 22.feb 2008
// programmer jochen
// tested by
//
// this FUNCTION block calculates the sun position for a given date and time.
// the times are calculated in utc and have to be corrected for the given time zone.
// B is the angle from north and HR is the highth in degrees.
//
// uses: oscat/mathematical/modR
// oscat/mathematical/deg
// oscat/mathematical/Rad
//
VERSION : '1.0'
AUTHOR : jochen
NAME : SUNPOS
FAMILY : TIDT
VAR_INPUT
year : INT;
month : INT;
day : INT;
hour : INT;
minute : INT;
second : INT;
latitude : REAL; (* latitude of geographical position *)
longitude : REAL; (* longitude of geographical position *)
END_VAR
VAR_OUTPUT
azimuth : REAL;
height : REAL;
END_VAR
VAR
DAYOFYEAR:
ARRAY[0..11] OF INT:= 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334;
END_VAR
VAR_TEMP
J: REAL;
J2: REAL;
Zgl: REAL;
MOZ: REAL;
WOZ: REAL;
w: REAL;
decl: REAL;
sunaz: REAL;
sunhi: REAL;
asinGs: REAL;
acosAs: REAL;
END_VAR
BEGIN
(* EXIT the routine IF it was executed the 10 seconds which is equal to 0.04 degrees accuracy *)
// IF DWORD_TO_DINT(T_PLC_MS()) - DWORD_TO_DINT(last) < 10000 THEN RETURN; END_IF;
// last := T_PLC_MS();
J2 := 365.0;
IF modR(IN:=year, DIVI:=4.0) = 0.0 THEN J2 := J2 + 1.0; END_IF;
J := DAYOFYEAR[month-1] + day;
IF modR(IN:=year, DIVI:=4.0) = 0.0 AND (modR(IN:=year, DIVI:=100.0) <> 0.0 OR modR(IN:=year, DIVI:=400.0) = 0.0) AND month > 2 THEN J := J + 1.0; END_IF;
MOZ := hour + (1.0/60.0) * minute + (1.0/360.0) * second + 1.0;
MOZ := MOZ - 4.0 * (15.0 - longitude) / 60.0;
J := J * 360 / J2 + MOZ / 24;
decl := 0.3948 - 23.2559 * COS(Rad(J + 9.1)) - 0.3915 * COS(RAD(2.0 * J + 5.4)) - 0.1764 * COS(Rad(3.0 * J + 26.0));
Zgl := 0.0066 + 7.3525 * COS(rad(J + 85.9)) + 9.9359 * COS(rad(2.0 * J + 108.9)) + 0.3387 * COS(rad(3.0 * J + 105.2));
WOZ := MOZ + Zgl / 60.0;
w := (12.0 - WOZ) * 15.0;
asinGs := COS(rad(w)) * COS(rad(latitude)) * COS(rad(decl)) + SIN(rad(latitude)) * SIN(rad(decl));
IF asinGs > 1 THEN asinGs := 1; END_IF;
IF asinGs < -1 THEN asinGs := -1; END_IF;
sunhi := deg(ASIN(asinGs));
acosAs := (SIN(rad(sunhi)) * SIN(rad(latitude)) - SIN(rad(decl))) / (COS(rad(sunhi)) * COS(rad(latitude)));
IF acosAs > 1 THEN acosAs := 1; END_IF;
IF acosAs < -1 THEN acosAs := -1; END_IF;
sunaz := deg(ACOS(acosAs));
IF ((WOZ > 12) OR (WOZ < 0)) THEN sunaz := 180 + sunaz; ELSE sunaz := 180 - sunaz; END_IF;
azimuth := sunaz; //ROUND(sunaz*1000)/1000;
height := sunhi; //ROUND(sunhi*1000)/1000;
END_FUNCTION_BLOCK
Wir verwenden essentielle Cookies, damit diese Website funktioniert, und optionale Cookies, um den Komfort bei der Nutzung zu verbessern.
Siehe weitere Informationen und konfiguriere deine Einstellungen