Просмотр полной версии : Расчет времени восхода и захода солнца
Может кто заморачивался с этим? Цель использования - управление освещением. Нашел какой-то код расчета, но это для php http://www.ab-log.ru/smart-house/linux/sunset
Может кто заморачивался с этим? Цель использования - управление освещением. Нашел какой-то код расчета, но это для php http://www.ab-log.ru/smart-house/linux/sunset
Фирма Овен - заморачивалась :)
Есть такой приборчик - УТ1. В нём это реализовано.
это я знаю... У Евроавтоматики тоже есть астрономическое реле. Правда надо это реализовать на ПЛК. Понимаю что это бред, но это не моя инициатива((( Я хотел сделать через фотодатчик, но заставляют делать мартышкин труд (ради галочки перед высоким начальством).
Игорь Петров
18.11.2011, 10:00
OSCAT Basic 3.21 (http://www.oscat.de/) CALENDAR_CALC
Игорь Петров
18.11.2011, 14:14
Можно и так. В новой версии V3.21 CALENDAR_CALC дает восхода и захода солнца по местному времени.
возможно ли это реализовать если программа управления освещением написана на языке LD в codesys v. 2.3.9.30?
как? можно пример или ссылку
И мне бы примерчик на ФБ(кодесис) или алгоритм хотя бы :) .А уж где (на чем) применить я бы нашел ;)
скачал ьиьлиотеку ,подключил смотрю на ФБ калькулятор календаря и не могу увидеть что у него внутри ,только квадрат входа\выхода и описание их типов.Ткните пальцем ,что бы не лезть в дебри кодесис раньше времени,где посмотреть его потраха на ФБ.
Подключаем библиотеку 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...
Спасибо capzap,буду разбираться.Да уж наглядность кодесис желает лучшего;) :) ,на языке FBD
:) Сильно не ругайтесь, конвертировалось средствами среды разработки, а не человеком. Предполагаю в ручную получилось бы гораздо нагляднее
А в ПР все вручную :D Потому наверное нагляднее .Туда бы такой модуль(макрос хотя бы) для управления освещением.
В блоке SUN_POS задаю широту 50.17, а долготу меняю, когда долгота больше 70 начинает выдавать время восхода TOD#1193:02:10.772, то есть когда время восхода по UTC становиться меньше 00:00:00 начинает выдавать огромные значения времени, выход - задаю долготу (-23) время восхода и заката совпадают с календарными. Однако, в течение года (меняю месяца) есть отклонение времени восхода и заката, максимум на 10 минут, не знаю на кого грешить: на календарь или на программу
Я же проверял для своего ёбургского пояса. Там вроде просто рассчитываем для своих координат, а потом к результату прибавляем своё смещение (у меня +5). И всё, никакого переполнения — результат нормальный.
Все правильно надо добавлять к вычисленному времени часовой сдвиг относительно Гринвича. Спасибо.
Подключаем библиотеку 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));
Пробую использовать предложенный код, но выдается ошибка выполнения: неверный индекс массива, откройте стек вызовов! подскажите что не так с кодом?
Как видите, там нет массивов. Если выполнять под отладчиком, на какой строчке это происходит?
Не поленился запустить спустя три года. Всё нормально работает. Попутно переписал чуть-чуть:
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;
Как видите, там нет массивов. Если выполнять под отладчиком, на какой строчке это происходит?
Не знаю как отследить строчку на которой это происходит, но попробую еще раз запустить..
Не поленился запустить спустя три года. Всё нормально работает.
Действительно все прекрасно работает, спасибо за помощь , просто совсем заработался начал в режиме эмуляции проверять. С реальным ПЛК все работает
Не знаю как отследитьТретья группа команд в меню Онлайн:
16134
Toggle Breakpoint — пометить строки, где программа должна приостанавливаться;
Step Over — выполнить строку не открывая функции на этой строке;
Step In — выполнить строку открывая каждую функцию на этой строке;
Single Cycle — прокрутить один цикл ПЛК.
Помечаете строку, где надо остановиться. Запускаете исполнение — программа тормозит на этой строке. Дальше можете двигаться по одному шагу (Step in/over) или продолжить выполнение до следующей точки остановки. Точки можно ставить и убирать во время выполнения программы. Азы отладки.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot