
Сообщение от
Ревака Юрий
Не нашел, где начало обсуждаемой темы, но интересно, как себя ведет алгоритм не в симуляции, а непосредственно в приборе.
Еще лучше чем в симуляции.
Начало здесь http://www.owen.ru/forum/showthread....l=1#post278333
и возражения Сергея по макросу здесь http://www.owen.ru/forum/showthread....l=1#post278339
ЗЫ
Макрос сделан по мотивам OSCAT
Код:
FUNCTION_BLOCK SUN_TIME_My
VAR_INPUT
LATITUDE : REAL; (* Широта географического положения *)
LONGITUDE : REAL; (* Долгота географического положения *)
UTC : DATE; (* мировое время *)
H : REAL := -0.83333333333; (* Высота над горизонтом для восхода солнца *)
END_VAR
VAR_OUTPUT
MIDDAY : TOD; (* Астрономический полдень по Гринвичу *)
SUN_RISE : TOD; (* Восход солнца на текущий день по Гринвичу *)
SUN_SET : TOD; (* Заход олнца на текущий день по Гринвичу *)
SUN_DECLINATION : REAL; (* Склонение солнца над горизонтом в полдень в градусах *)
END_VAR
VAR
dk: REAL; (* Склонение солнца над горизонтом в полдень *)
delta: TIME; (* Дельта от полудня для восхода и захода солнца *)
b: REAL;
RAD_H: REAL;
T: REAL;
OFFSET: REAL;
END_VAR
VAR CONSTANT
PI2: REAL := 6.28318530717958647692528676655900576;
END_VAR
B := latitude * 0.0174532925199433;
T := UINT_TO_REAL(DAY_OF_YEAR(utc));
OFFSET := -0.1752 * SIN(0.033430 * T + 0.5474) - 0.1340 * SIN(0.018234 * T - 0.1939);
MIDDAY := DWORD_TO_TOD(REAL_TO_DWORD((12.0 - OFFSET - longitude * 0.0666666666666) * 3600000));
DK := 0.40954 * SIN(0.0172 * (T - 79.35));
sun_declination := MODR(57.29577951308232 * DK, 360.0);
IF sun_declination > 180.0 THEN sun_declination := sun_declination - 360.0; END_IF;
sun_declination := 90.0 - LATITUDE + sun_declination;
RAD_H:= MODR(0.0174532925199433 * H, PI2);
delta := DWORD_TO_TIME(REAL_TO_DWORD((ACOS((SIN(RAD_H) - SIN(B) * SIN(DK)) / (COS(B) * COS(DK))) * 3.819718632) * 3600000));
sun_rise := MIDDAY - delta;
sun_set := MIDDAY + delta;
Это переработаный ФБ с минимальным использованием других функций библиотеки OSCAT