PDA

Просмотр полной версии : Расчет времени восхода и захода солнца



S.A.D.
15.11.2011, 10:34
Может кто заморачивался с этим? Цель использования - управление освещением. Нашел какой-то код расчета, но это для php http://www.ab-log.ru/smart-house/linux/sunset

Во Вик
15.11.2011, 10:40
Может кто заморачивался с этим? Цель использования - управление освещением. Нашел какой-то код расчета, но это для php http://www.ab-log.ru/smart-house/linux/sunset

Фирма Овен - заморачивалась :)
Есть такой приборчик - УТ1. В нём это реализовано.

S.A.D.
15.11.2011, 10:54
это я знаю... У Евроавтоматики тоже есть астрономическое реле. Правда надо это реализовать на ПЛК. Понимаю что это бред, но это не моя инициатива((( Я хотел сделать через фотодатчик, но заставляют делать мартышкин труд (ради галочки перед высоким начальством).

Игорь Петров
18.11.2011, 10:00
OSCAT Basic 3.21 (http://www.oscat.de/) CALENDAR_CALC

Игорь Петров
18.11.2011, 14:14
Можно и так. В новой версии V3.21 CALENDAR_CALC дает восхода и захода солнца по местному времени.

S.A.D.
18.11.2011, 15:07
спасибо, погляжу)

123
27.02.2012, 23:38
возможно ли это реализовать если программа управления освещением написана на языке LD в codesys v. 2.3.9.30?

Yegor
28.02.2012, 08:20
да, возможно

123
28.02.2012, 18:49
как? можно пример или ссылку

rovki
28.02.2012, 21:55
И мне бы примерчик на ФБ(кодесис) или алгоритм хотя бы :) .А уж где (на чем) применить я бы нашел ;)

rovki
28.02.2012, 22:31
скачал ьиьлиотеку ,подключил смотрю на ФБ калькулятор календаря и не могу увидеть что у него внутри ,только квадрат входа\выхода и описание их типов.Ткните пальцем ,что бы не лезть в дебри кодесис раньше времени,где посмотреть его потраха на ФБ.

Yegor
29.02.2012, 05:43
Подключаем библиотеку OSCAT и делаем так:

VAR
GetSunTime: SUN_TIME;
END_VAR

GetSunTime(LATITUDE := 56.5, LONGITUDE := 60.35, UTC := DATE#2012-06-21, SUN_RISE => sunrise, SUN_SET => sunset);
sunrise := sunrise + TIME#5h;
sunset := sunset + TIME#5h;Просто добавь воды:
VAR
GetSunTime: SUN_TIME;
GetLocalTime: CurTimeEx;
timedate: SystemTimeDate;
systime: SysTime64;
localdate: DWORD;
sunrise, sunset: TOD;
END_VAR

SysMemSet(ADR(systime), 0, SIZEOF(systime));
SysMemSet(ADR(timedate), 0, SIZEOF(timedate));
GetLocalTime(SystemTime := systime, TimeDate := timedate);
localdate := DATE_TO_DWORD(PackDate(timedate.Year, timedate.Month, timedate.Day));
GetSunTime(LATITUDE := 56.5, LONGITUDE := 60.35, UTC := localdate, SUN_RISE => sunrise, SUN_SET => sunset);
sunrise := sunrise + TIME#5h;
sunset := sunset + TIME#5h;Столько воды из-за отсутствия DATE() — пускаю лучики ненависти в сторону разработчиков кодесиса. Необходимые библиотеки: SysLibMem, SysLibTime, TimeExp (задолбался на неё ссылку давать), ну и оскат естественно. Пример приведён для Ёбурга. Возможно, прибавлять теперь уже надо 6, а не 5 часов.

В переменных sunrise и sunset у вас будет время рассвета и заката. Дальше получаем текущее время (просто к предыдущему куску добавьте):

localtime := TIME_TO_TOD(PackTime(timedate.HOUR, timedate.MINUTE, timedate.SECOND, timedate.Milliseconds));Теперь можно сравнивать localtime с sunrise и sunset, чтобы выяснить, рассвело ли.

Усё. Ах да: у SUN_TIME есть ещё параметр H для задания высоты над уровнем горизонта.

скачал ьиьлиотеку ,подключил смотрю на ФБ калькулятор календаря и не могу увидеть что у него внутри ,только квадрат входа\выхода и описание их типов.Ткните пальцем ,что бы не лезть в дебри кодесис раньше времени,где посмотреть его потраха на ФБ.Просто откройте файл библиотеки в кодесисе.

Николаев Андрей
29.02.2012, 07:54
скачал ьиьлиотеку ,подключил смотрю на ФБ калькулятор календаря и не могу увидеть что у него внутри ,только квадрат входа\выхода и описание их типов.Ткните пальцем ,что бы не лезть в дебри кодесис раньше времени,где посмотреть его потраха на ФБ.

Я так понимаю интересен сам алгоритм?
Откройте библиотеку оскатовскую как проект CoDeSys...

rovki
29.02.2012, 16:46
А на ФБ можно?

rovki
29.02.2012, 20:55
Спасибо capzap,буду разбираться.Да уж наглядность кодесис желает лучшего;) :) ,на языке FBD

rovki
01.03.2012, 12:44
:) Сильно не ругайтесь, конвертировалось средствами среды разработки, а не человеком. Предполагаю в ручную получилось бы гораздо нагляднее

А в ПР все вручную :D Потому наверное нагляднее .Туда бы такой модуль(макрос хотя бы) для управления освещением.

ssl
27.04.2012, 02:38
В блоке SUN_POS задаю широту 50.17, а долготу меняю, когда долгота больше 70 начинает выдавать время восхода TOD#1193:02:10.772, то есть когда время восхода по UTC становиться меньше 00:00:00 начинает выдавать огромные значения времени, выход - задаю долготу (-23) время восхода и заката совпадают с календарными. Однако, в течение года (меняю месяца) есть отклонение времени восхода и заката, максимум на 10 минут, не знаю на кого грешить: на календарь или на программу

ssl
02.05.2012, 10:00
Опять до Урала не дошли

Yegor
02.05.2012, 16:16
Я же проверял для своего ёбургского пояса. Там вроде просто рассчитываем для своих координат, а потом к результату прибавляем своё смещение (у меня +5). И всё, никакого переполнения — результат нормальный.

ssl
01.06.2012, 06:06
Все правильно надо добавлять к вычисленному времени часовой сдвиг относительно Гринвича. Спасибо.

Igor.m
13.01.2015, 08:56
Подключаем библиотеку OSCAT и делаем так:

VAR
GetSunTime: SUN_TIME;
GetLocalTime: CurTimeEx;
timedate: SystemTimeDate;
systime: SysTime64;
localdate: DWORD;
sunrise, sunset: TOD;
END_VAR

SysMemSet(ADR(systime), 0, SIZEOF(systime));
SysMemSet(ADR(timedate), 0, SIZEOF(timedate));
GetLocalTime(SystemTime := systime, TimeDate := timedate);
localdate := DATE_TO_DWORD(PackDate(timedate.Year, timedate.Month, timedate.Day));
GetSunTime(LATITUDE := 56.5, LONGITUDE := 60.35, UTC := localdate, SUN_RISE => sunrise, SUN_SET => sunset);
sunrise := sunrise + TIME#5h;
sunset := sunset + TIME#5h;
localtime := TIME_TO_TOD(PackTime(timedate.HOUR, timedate.MINUTE, timedate.SECOND, timedate.Milliseconds));

Пробую использовать предложенный код, но выдается ошибка выполнения: неверный индекс массива, откройте стек вызовов! подскажите что не так с кодом?

Yegor
13.01.2015, 09:18
Как видите, там нет массивов. Если выполнять под отладчиком, на какой строчке это происходит?

Не поленился запустить спустя три года. Всё нормально работает. Попутно переписал чуть-чуть:
PROGRAM PLC_PRG
VAR
sun: SUN_TIME := (LATITUDE := 56.5, LONGITUDE := 60.35);
clock: CurTimeEx;
now: SystemTimeDate;
dummy: SysTime64;
sunrise, sunset: TOD;
END_VAR
VAR CONSTANT
nullTime: SystemTimeDate;
END_VAR

now := nullTime;
clock(TimeDate := now, SystemTime := dummy);
sun(UTC := PackDate(now.Year, now.Month, now.Day));
sunrise := sun.SUN_RISE + TIME#5h;
sunset := sun.SUN_SET + TIME#5h;

Igor.m
13.01.2015, 09:48
Как видите, там нет массивов. Если выполнять под отладчиком, на какой строчке это происходит?


Не знаю как отследить строчку на которой это происходит, но попробую еще раз запустить..

Igor.m
13.01.2015, 10:35
Не поленился запустить спустя три года. Всё нормально работает.

Действительно все прекрасно работает, спасибо за помощь , просто совсем заработался начал в режиме эмуляции проверять. С реальным ПЛК все работает

Yegor
13.01.2015, 10:38
Не знаю как отследитьТретья группа команд в меню Онлайн:

16134

Toggle Breakpoint — пометить строки, где программа должна приостанавливаться;
Step Over — выполнить строку не открывая функции на этой строке;
Step In — выполнить строку открывая каждую функцию на этой строке;
Single Cycle — прокрутить один цикл ПЛК.

Помечаете строку, где надо остановиться. Запускаете исполнение — программа тормозит на этой строке. Дальше можете двигаться по одному шагу (Step in/over) или продолжить выполнение до следующей точки остановки. Точки можно ставить и убирать во время выполнения программы. Азы отладки.