Формула таймера 1 сек

Просмотр 8 сообщений - с 76 по 83 (из 83 всего)
  • Автор
    Сообщения
  • #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;
        }
    }
    
    #38217
    Mikhail
    Модератор

    Указанные выше изменения войдут в шаблон проекта в следующем релизе.

    #38223
    alexandr1803
    Участник

    Спасибо большое Михаил.

    #41800
    Sem13@nxt.ru
    Участник

    Здраввствуйте.
    EverySec(() => HourStarted() ? 0 : Val() + 1)
    Можно ли сделать обнуление через два часа?

    #41802
    Mikhail
    Модератор

    Добрый день!
    Вариант 1.
    Реализовать свою функцию по аналогии с HourStarted. Код HourStarted находится в таблице Скрипты, ID строки = 8.

    Вариант 2.
    С помощью модуля аутоуправления.
    — Создать канал, который будет устанавливаться в 1, когда нужно выполнить обнуление.
    — С помощью модуля отправить команду на канал, в котором в выходной формуле будет вызов функции обнуления.

    Если нужно подробнее, спрашивайте.

    #41803
    Mikhail
    Модератор

    На мой взгляд, вариант 1 проще.

    #41809
    Sem13@nxt.ru
    Участник

    EverySec(() => HourStarted() ? 0 : Val() + 1)
    Нужно HourStarted(2) и будет срабатывать каждые два часа? Или не такая логика?

    #41822
    Mikhail
    Модератор

    Имел ввиду в таблице Скрипты написать свою новую функцию HourStarted2 по аналогии с HourStarted.

Просмотр 8 сообщений - с 76 по 83 (из 83 всего)
  • Для ответа в этой теме необходимо авторизоваться.