Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Формула таймера 1 сек
- В этой теме 82 ответа, 11 участников, последнее обновление 3 дня, 16 часов назад сделано
Mikhail.
-
АвторСообщения
-
22.04.2025 в 12:17 #38216
MikhailМодераторПричина оказалась в том, что в формула HourStarted срабатывала после 30 секунд, как час наступил, а EveryMin срабатывает в 0 секунд. Задержка в формуле HourStarted полезна в некоторых случаях.
Вы можете обновить таблицу Скрипты в записи Calendar, чтобыEveryMin(() => HourStarted() ? 0 : Val() + 1)заработало:// The functions below use the server's timezone. // Функции ниже используют временную зону сервера. protected Dictionary<int, DateTime> HourStartByCnl = new Dictionary<int, DateTime>(); protected Dictionary<int, DateTime> DayStartByCnl = new Dictionary<int, DateTime>(); protected Dictionary<int, DateTime> MonthStartByCnl = new Dictionary<int, DateTime>(); // Indicates that a new hour has started. The result is true once for each channel. // Указывает, что начался новый час. Результат равен true один раз для каждого канала. public bool HourStarted(int minSecond = 0) { if (!IsCurrent) return false; DateTime nowDT = Timestamp.ToLocalTime(); if (nowDT.Minute == 0 && nowDT.Second >= minSecond && (!HourStartByCnl.TryGetValue(CnlNum, out DateTime startDT) || startDT.Hour != nowDT.Hour )) { HourStartByCnl[CnlNum] = nowDT; return true; } else { return false; } } // Indicates that a new day has started. The result is true once for each channel. // Указывает, что начался новый день. Результат равен true один раз для каждого канала. public bool DayStarted(int minMinute = 0) { if (!IsCurrent) return false; DateTime nowDT = Timestamp.ToLocalTime(); if (nowDT.Hour == 0 && nowDT.Minute >= minMinute && (!DayStartByCnl.TryGetValue(CnlNum, out DateTime startDT) || startDT.Date < nowDT.Date)) { DayStartByCnl[CnlNum] = nowDT; return true; } else { return false; } } // Indicates that a new month has started. The result is true once for each channel. // Указывает, что начался новый месяц. Результат равен true один раз для каждого канала. public bool MonthStarted(int minMinute = 0) { if (!IsCurrent) return false; DateTime nowDT = Timestamp.ToLocalTime(); if (nowDT.Day == 1 && nowDT.Hour == 0 && nowDT.Minute >= minMinute && (!MonthStartByCnl.TryGetValue(CnlNum, out DateTime startDT) || startDT.Date < nowDT.Date)) { MonthStartByCnl[CnlNum] = nowDT; return true; } else { return false; } }22.04.2025 в 12:18 #38217
MikhailМодераторУказанные выше изменения войдут в шаблон проекта в следующем релизе.
23.04.2025 в 09:23 #38223alexandr1803
УчастникСпасибо большое Михаил.
02.02.2026 в 08:48 #41800Sem13@nxt.ru
УчастникЗдраввствуйте.
EverySec(() => HourStarted() ? 0 : Val() + 1)
Можно ли сделать обнуление через два часа?02.02.2026 в 10:49 #41802
MikhailМодераторДобрый день!
Вариант 1.
Реализовать свою функцию по аналогии с HourStarted. Код HourStarted находится в таблице Скрипты, ID строки = 8.Вариант 2.
С помощью модуля аутоуправления.
— Создать канал, который будет устанавливаться в 1, когда нужно выполнить обнуление.
— С помощью модуля отправить команду на канал, в котором в выходной формуле будет вызов функции обнуления.Если нужно подробнее, спрашивайте.
02.02.2026 в 10:50 #41803
MikhailМодераторНа мой взгляд, вариант 1 проще.
02.02.2026 в 12:25 #41809Sem13@nxt.ru
УчастникEverySec(() => HourStarted() ? 0 : Val() + 1)
Нужно HourStarted(2) и будет срабатывать каждые два часа? Или не такая логика?03.02.2026 в 15:22 #41822
MikhailМодераторИмел ввиду в таблице Скрипты написать свою новую функцию HourStarted2 по аналогии с HourStarted.
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.