Osact Lib - Sonnenstand...

Hallo,

was heisst falsche Werte ?

Die Bausteine benötigen die Zeitangabe in UTC ! - vielleicht liegts ja daran.

Mfg
 
Falsche werte...

Also, bei mir kommen trotzdem falsche Werte raus! hab nun eine andere Formel in SCL umgesetzt! kann das am Montag gerne mal Online stellen!
 
Ja natürlich, der Wert verändert sich beim SUN_POS ständig.
Beim SUN_TIME gelten die Werte für diesen Tag. Sie verändern sich nicht
laufend. Was stehlt den dort am Baustein.
 
Hallo Jochen,

habe es jetzt mal probiert, tatsächlich gibt es kleinere Abweichungen der Position +- 2° dies hängt mit der Ungenauigkeit der S7 Realvariablen Rechnerei zusammen, werde mal schauen ob man das noch genauer hinbekommt.

MfG
Daniel
 
Also...

Also Ich bekomm da ganz andere Werte! Ich schreib am Montag mal die Internetseite und näheres dazu.... Dannn können wir ja weiter sehen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So....

So, nun bin Ichs nochmal:

Zur kontrolle der Werte habe ich folgende Seiten verwendet:

http://www2.hs-kufstein1.tsn.at/facher/appletseiten/sunearth227/sunearth.html

und

http://www.volker-quaschning.de/datserv/sunpos/

so hab ich es dann realisiert:

(gut mann könnte das datum und die zeit wieder in ein date_time umwandeln!)

Code:
(* @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
 
Zurück
Oben