Формулы в V6 Beta

Просмотр 15 сообщений - с 46 по 60 (из 82 всего)
  • Автор
    Сообщения
  • #21994
    Mikhail
    Модератор

    Выборка на хх дней, часов, минут позже, чем сейчас или на определенный момент прошлого времени

    Такая функциональность доступна в модулях. В формулах она может привести к неконтролируемому замедлению работы.

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

    Возможно, нужен модуль общего назначения, простой в настройке, который будет обеспечивать вычисления разности с заданным периодом.

    #22148
    a80808
    Участник

    @mikhail, что я должен написать в качестве формулы в канале для получения текущей даты/времени?
    В пятой версии в канале была написана формула
    EncodeDate(DateTime.Now)

    Дата отображается правильно, а время +3 от текущего часового пояса = +6 от UTC/
    Но если я правильно понимаю, то в идеологии шестой версии зашито скрытое декодирование значения в зависимости от формата. Т.е. если я указал формат «Дата и время» в независимости от формулы в канале перед выводом движок должен неявно выполнить EncodeDate(Val(Cnl))

    Я оставил в канале только DateTime.Now — время стало 03:00:00 дата что то там 1899 года и время стоит…

    #22152
    a80808
    Участник

    Подставил в канал формулу UtcNow() — время пришло в норму.

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

    Т.к. документации по формулам пока нет, доступные формулы можно посмотреть в этом файле.

    Формула UtcNow, вероятно, описана у Вас в таблице Скрипты.

    #22187
    a80808
    Участник

    UtcNow(), да в скриптах. Там еще много чего интересного нашел :).

    #22346
    a80808
    Участник

    @mikhail, а как в шестой версии пользоваться формулами для создания аналогичных пятерке каналов пересчета ежеминутный/ежечасовой и т.д.? В исходном коде вроде есть какие то «Похожие» формулы…

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

    Пример формулы, которая рассчитывает значение канала 1 раз в минуту:
    EveryMin(MyFunc)

    В таблице Скрипты нужно объявить

    public CnlData MyFunc()
    {
      return NewData(Val() + 1, 1);
    }

    Альтернативный вариант
    EveryMin(() => Val() + 1)

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

    • Этот ответ был изменен 2 года назад от Mikhail.
    #22368
    Mikhail
    Модератор

    Аналогично функция EveryHour.
    Функция MyFunc может возвращать тип CnlData или обычный double

    #22370
    a80808
    Участник

    Ага, а в канале я соответственно пишу MyFunc() а уже внутри нее всю обработку…
    Т.е. про существу EveryMin() это как бы скобки верхнего уровня в моей формуле…
    Спасибо!
    Тестировать буду обязательно, только проект переконвертирую в шестерку…
    Отпишу обязательно!

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

    С точки зрения программирования в функцию EveryMin передаётся ссылка на ту функцию, которую нужно выполнять 1 раз в минуту.
    Сама EveryMin вызывается на каждой итерации цикла сервера, она проверяет наступление новой минуты и вызывает MyFunc, если пора.

    #22655
    a80808
    Участник

    @mikhail, попытался сегодня поработать с EveryMin().
    Начал с достаточно сложной функции, но в результате пришел к элементарной — но все равно не получилось. Вроде делал все как у вас написано (ну и как сам понял).

    Подробности:
    1. В Таблице «Скрипты» есть такая формула (каждую минуту значение канала увеличивается на 10):
    public CnlData TankEmu65010()
    {
    return NewData(Val()+10,1);
    }

    2. Формула в канале 65010:

    EveryMin(TankEmu65010())

    3. В результате в логе сервера получаю вот это:

    2022-03-25 22:06:50 [DELL6230][DELL6230$][ERR] Ошибка при компиляции исходного кода скриптов и формул:
    (574,63): error CS1503: Argument 1: cannot convert from ‘Scada.Data.Models.CnlData’ to ‘System.Func<Scada.Data.Models.CnlData>’
    Проверьте исходный код в файле Z:\SCADA\ScadaServer\Log\CalcEngine.cs
    2022-03-25 22:06:50 [DELL6230][DELL6230$][ERR] Нормальная работа невозможна

    4. Строка №574 в файле Z:\SCADA\ScadaServer\Log\CalcEngine.cs:

    public CnlData CalcCnlData65010() { return ToCnlData(EveryMin(TankEmu65010())); }

    #22656
    a80808
    Участник

    Так еще:
    1. При перезапуске сервера все события перегенерируются каждый раз с новым временем перезапуска
    2. Формулы (возможно с типом CnlData) обязательно должны возвращать значение? Иначе если нет return выдается ошибка

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

    > EveryMin(TankEmu65010())
    Попробуйте заменить на EveryMin(TankEmu65010) без лишних скобок.

    > При перезапуске сервера все события перегенерируются каждый раз с новым временем перезапуска
    Что имеется ввиду?

    > Формулы (возможно с типом CnlData) обязательно должны возвращать значение?
    Приведите конкретный пример, пожалуйста.

    #22662
    a80808
    Участник

    Попробуйте заменить на EveryMin(TankEmu65010) без лишних скобок.

    Михаил, а как же тогда передать параметры в формулу?

    К сожалению теперь с работой RAM диска файлы после отключения теряются. Постараюсь сегодня — завтра смоделировать ситуации.

    По возврату — я формулу менял следующим образом:
    public CnlData TankEmu65010()
    {
    SetVal(65012, Val()+10);
    }

    Появлялось сообщение (дословно не помню) что требуется возвращаемое значение. Смоделирую, напишу.

Просмотр 15 сообщений - с 46 по 60 (из 82 всего)
  • Вы должны авторизироваться для ответа в этой теме.