Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Эксперт по компьютерным сетямЭксперт NIX
 Аватар для Dmitry
13440 / 7534 / 830
Регистрация: 09.09.2009
Сообщений: 29,554

Проверка "недельного" расписания для заданий, переходящих на следующую неделю

29.07.2022, 18:36. Показов 895. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
хочу сделать "умное" управление бойлером (по расписанию)
решил время (и текущее, и старта задачи, и стопа) приводить к целому числу по формуле:
Code
1
int value = number_of_day * 1440 + hour * 60 + minute;
(пример показан на с++ (ардуино), но не думаю, что в контексте самого вопроса это настолько уже важно)

после такого преобразования просто сравниваются целые числа.

с заданиями, которые не переходят через конец недели (например старт в 9:00 понедельника и стоп в 18:37 среды) - все работает так как и должно (без проблем).

проблемы возникают, если в шедулер вписать задание, которое (для примера) начинается 18:00 пятницы, а закончится должно в 9:00 понедельника (получается, уже следующей недели). сам код сравнивает время с "стартом/стопом" раз в 10 секунд, и в итоге такие задания работают в режиме "включилось, через 10 секунд - выключилось. через 10 секунд снова включилось"...

подозреваю, что при проверках таких заданий нужно куда-то добавлять "целую неделю" (10080, т.е. (7 дней по 1440 минут)), но вот как-то мозг тупит - куда именно добавлять...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.07.2022, 18:36
Ответы с готовыми решениями:

DataGridView вывод недельного расписания
Имеется таблица аудитория, в которой находятся названия групп, даты, расписание. (всё на скрине). Как сделать так, чтобы при нажатии на...

Программа для просмотра расписания на неделю
Короче, мне задали дз, сделать расписание, где можно просмотреть это расписание, изменить его, а затем ещё раз просмотреть его. У меня в...

Вывод расписания на неделю в Word
Здравствуйте такая проблема есть шаблон расписания: и там нужно вывести таблицу по дням недели

10
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
29.07.2022, 19:56
У Вас какие часы на борту? Год, месяц, день можно определить?
0
Эксперт по компьютерным сетямЭксперт NIX
 Аватар для Dmitry
13440 / 7534 / 830
Регистрация: 09.09.2009
Сообщений: 29,554
29.07.2022, 20:47  [ТС]
ntp-клиент.
можно, но очень хочется без этого
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
29.07.2022, 21:17
Цитата Сообщение от Dmitry Посмотреть сообщение
хочется без этого
Ну а зачем себя мучить.

Задача элементарно решается при помощи тайм-стампа. Организуйте от какой-нибудь даты - и все проблемы отпадут.

Добавлено через 3 минуты
Цитата Сообщение от Dmitry Посмотреть сообщение
в итоге такие задания работают в режиме "включилось, через 10 секунд - выключилось. через 10 секунд снова включилось"
А это то как получается? Вам следует ловить не равенство времени какому-то заданному, а переход через это заданное время - и флаг выставлять с таймаутом, чтобы такого дребезга не было.
0
Эксперт по компьютерным сетямЭксперт NIX
 Аватар для Dmitry
13440 / 7534 / 830
Регистрация: 09.09.2009
Сообщений: 29,554
30.07.2022, 10:20  [ТС]
Цитата Сообщение от vantfiles Посмотреть сообщение
элементарно решается при помощи тайм-стампа
и в чем вы тут видите удобство использования юникстайма? пояснить сможете?
Цитата Сообщение от vantfiles Посмотреть сообщение
А это то как получается?
элементарно, как раз в четком соответствии с вашим тезисом
Цитата Сообщение от vantfiles Посмотреть сообщение
Вам следует ловить ... переход через ... заданное время
проверки как раз и выполнялись в режиме (текущее время >= какого-либо из времени срабатываний задания)
-----------------------
то есть:
примеры "преобразованных времен/дат":
СРД 9:10 = 4870 (его в нашем примере мы будем использовать как время старта задачи)
ПНД 9:10 = 1990 (это будем использовать как время окончания задания)
ну и допустим текущее время:
СББ 9:10 = 9190

"старт"
проверяем, пора ли включать задание?
9190 >= 4870 ?
да, больше, нужно включить нагреватель
во время следующей проверки через 10 секунд (и кстати, именно такая нечастая частота проверок избавляет от всяких там "подавителей дребезга"), мы уже проверяем - пора ли выключать?
9190 >= 1990 ?
да, больше, бежим выключать нагреватель!
через 10 секунд - см. метку "старт"...

в итоге, получаем то, что я и написал выше - включаемся/выключаемся/включаемся/выключаемся...
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
30.07.2022, 11:07
Цитата Сообщение от Dmitry Посмотреть сообщение
юникстайма? пояснить сможете?
Кто сказал юникс? Таймстамп можно считать от произвольного момента, например от момента включения устройства.
Цитата Сообщение от Dmitry Посмотреть сообщение
проверки как раз и выполнялись в режиме (текущее время >= какого-либо из времени срабатываний задания)
Вот именно. Я и говорю - этого недостаточно. Сейчас набросаю алгоритм в общем виде.

Добавлено через 1 минуту
И, кстати, да, можно обойтись временем и днем недели.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
30.07.2022, 11:14
Цитата Сообщение от vantfiles Посмотреть сообщение
например от момента включения устройства.
Рано или поздно счётчик переполнится.

C
1
unsigned long millis()
Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней.
0
Эксперт по компьютерным сетямЭксперт NIX
 Аватар для Dmitry
13440 / 7534 / 830
Регистрация: 09.09.2009
Сообщений: 29,554
30.07.2022, 11:20  [ТС]
Цитата Сообщение от vantfiles Посмотреть сообщение
например от включения устройства.
то есть, для корректнойй работы устройство не должно выключаться, либо я должен эту хрень хранить в каком нибудь энзу, которое в конкретно выбранном проце - кусок флеша, и его предлагают не сильно насиловать записями...
Цитата Сообщение от vantfiles Посмотреть сообщение
Сейчас набросаю алгоритм в общем виде.
спасибо.
задачу я уже решил. причем. оказалось даже проще, чем я думал сначала
имеются три int-значения, полученные преобразованием, описанным в посте #1:
current_time - текущее время
start_time - время запуска задания
stop_time - время выключения задания
проверка на включение
Code
1
2
3
4
5
6
7
8
9
if( stop_ time < start_time)
{
   stop_time = stop_time + 10080 ;
}
if (current_time >= start_time && current_time < stop_time)
{
   work_allowed = 1; // флаг того, что нагреватель должен быть включен
  // тут прочие действия, необходимые по процедуре включения
}
проверка на выключение:
Code
1
2
3
4
5
6
if ((start_time < stop_time && current_ time >= stop_time ) 
or (start_time > stop_time && current_time >= stop_time && current_time < start_time))
{
   work_allowed = 0; // флаг сброшен, значит нагреватель должен быть выключен
   // тут прочие действия, необходимые по процедуре выключения
}
все работает на ура...
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
30.07.2022, 11:47
Общая идея такая, я ее в большом количестве устройств использовал:

Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
events = {
  { time = 4870, event = "on"  },
  { time = 1990, event = "off" },
}
 
-- Эту ф-цию вызываем один раз при старте устройства
function init()
    old_time = get_time()
end
 
-- Эта ф-ция должна вызываться каждые 10 сек
function timer_10_sec()
 
   cur_time = get_time() -- берем текущее время
 
   for i = 1, #events -- цикл по таблице событий
       if old_time < events[i].time and cur_time >= events[i].time then -- проверяем на переход через заданное время
          if events[i].event == "on"  then boiler_on()  end -- включаем бойлер
          if events[i].event == "off" then boiler_off() end -- выключаем бойлер
       end
   end
 
   old_time = cur_time -- присваиваем для следующего срабатывания
end
Добавлено через 1 минуту
Цитата Сообщение от Dmitry Посмотреть сообщение
все работает на ура...
А проверок не многовато? Посмотрите мой вариант.

Добавлено через 15 минут
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Рано или поздно счётчик переполнится.
Я обычно выбираю размерность счетчика так, чтобы его хватило минимум на 25 лет. Дольше электроника не живет.

Добавлено через 6 минут
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Возвращает количество миллисекунд
Не составляет труда ввести старшую часть для этого счетчика и увеличить общее считаемое время до...
Если взять unsigned long, то до 584 942 417 лет
1
Эксперт по компьютерным сетямЭксперт NIX
 Аватар для Dmitry
13440 / 7534 / 830
Регистрация: 09.09.2009
Сообщений: 29,554
30.07.2022, 12:10  [ТС]
Цитата Сообщение от vantfiles Посмотреть сообщение
А проверок не многовато? Посмотрите мой вариант.
не думаю. оставлю свой.
а ваш где-то отложу на будущее, может и "подумаю об этом потом"
спасибо
0
Эксперт по компьютерным сетямЭксперт NIX
 Аватар для Dmitry
13440 / 7534 / 830
Регистрация: 09.09.2009
Сообщений: 29,554
09.01.2024, 17:46  [ТС]
зы. что вышло в итоге:
Ну очень «умный» нагреватель
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.01.2024, 17:46
Помогаю со студенческими работами здесь

Программа по составлению расписания работы на день, неделю, месяц
Ребят, нужна программа по составлению расписания работы на день, неделю, месяц. указывая количество разрешенных часов, т.е на день допустим...

Какова вероятность того, что в следующую неделю семья потратит на мороженое от 200 до 300 руб.?
На мороженое семья тратит в среднем 480 руб. в неделю. Дисперсия составляет400руб.2. Какова вероятность того, что в следующую неделю семья...

Проверка есть ли запись на текущую неделю
Здравствуйте! В строке дата у меня лишь первый день недели. Нужно проверить есть ли запись на текущую. Таблица на google drive...

Проверка заданий по ТОЭ
Добрый день! Попался мне интересный вариантик д/з. В первой части необходимо произвести расчет токов и напряжений во всех ветвях...

Автоматизировать формирование недельного плана
Добрый день уважаемые специалисты. я в программировании вообще не никак. работаю в администрации района небольшого города, и от...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru