Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Формулы в V6 Beta
Помечено: Формулы Версия 6
- В этой теме 81 ответ, 4 участника, последнее обновление 2 года назад сделано a80808.
-
АвторСообщения
-
23.02.2022 в 13:58 #21994MikhailМодератор
Выборка на хх дней, часов, минут позже, чем сейчас или на определенный момент прошлого времени
Такая функциональность доступна в модулях. В формулах она может привести к неконтролируемому замедлению работы.
23.02.2022 в 14:00 #21995MikhailМодераторВозможно, нужен модуль общего назначения, простой в настройке, который будет обеспечивать вычисления разности с заданным периодом.
04.03.2022 в 19:50 #22148a80808Участник@mikhail, что я должен написать в качестве формулы в канале для получения текущей даты/времени?
В пятой версии в канале была написана формула
EncodeDate(DateTime.Now)Дата отображается правильно, а время +3 от текущего часового пояса = +6 от UTC/
Но если я правильно понимаю, то в идеологии шестой версии зашито скрытое декодирование значения в зависимости от формата. Т.е. если я указал формат «Дата и время» в независимости от формулы в канале перед выводом движок должен неявно выполнить EncodeDate(Val(Cnl))Я оставил в канале только DateTime.Now — время стало 03:00:00 дата что то там 1899 года и время стоит…
04.03.2022 в 21:22 #22152a80808УчастникПодставил в канал формулу UtcNow() — время пришло в норму.
06.03.2022 в 10:47 #22171MikhailМодераторТ.к. документации по формулам пока нет, доступные формулы можно посмотреть в этом файле.
Формула UtcNow, вероятно, описана у Вас в таблице Скрипты.
06.03.2022 в 13:16 #22187a80808УчастникUtcNow(), да в скриптах. Там еще много чего интересного нашел :).
15.03.2022 в 10:09 #22346a80808Участник@mikhail, а как в шестой версии пользоваться формулами для создания аналогичных пятерке каналов пересчета ежеминутный/ежечасовой и т.д.? В исходном коде вроде есть какие то «Похожие» формулы…
15.03.2022 в 15:08 #22367MikhailМодераторПример формулы, которая рассчитывает значение канала 1 раз в минуту:
EveryMin(MyFunc)В таблице Скрипты нужно объявить
public CnlData MyFunc() { return NewData(Val() + 1, 1); }
Альтернативный вариант
EveryMin(() => Val() + 1)Если будете тестировать и обнаружится синтаксическая ошибка, напишите, пожалуйста.
- Этот ответ был изменен 2 года, 1 месяц назад от Mikhail.
15.03.2022 в 15:09 #22368MikhailМодераторАналогично функция EveryHour.
Функция MyFunc может возвращать тип CnlData или обычный double15.03.2022 в 15:14 #22370a80808УчастникАга, а в канале я соответственно пишу MyFunc() а уже внутри нее всю обработку…
Т.е. про существу EveryMin() это как бы скобки верхнего уровня в моей формуле…
Спасибо!
Тестировать буду обязательно, только проект переконвертирую в шестерку…
Отпишу обязательно!16.03.2022 в 16:54 #22402MikhailМодераторС точки зрения программирования в функцию EveryMin передаётся ссылка на ту функцию, которую нужно выполнять 1 раз в минуту.
Сама EveryMin вызывается на каждой итерации цикла сервера, она проверяет наступление новой минуты и вызывает MyFunc, если пора.25.03.2022 в 22:19 #22655a80808Участник@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())); }
25.03.2022 в 22:26 #22656a80808УчастникТак еще:
1. При перезапуске сервера все события перегенерируются каждый раз с новым временем перезапуска
2. Формулы (возможно с типом CnlData) обязательно должны возвращать значение? Иначе если нет return выдается ошибка26.03.2022 в 11:47 #22658MikhailМодератор> EveryMin(TankEmu65010())
Попробуйте заменить на EveryMin(TankEmu65010) без лишних скобок.> При перезапуске сервера все события перегенерируются каждый раз с новым временем перезапуска
Что имеется ввиду?> Формулы (возможно с типом CnlData) обязательно должны возвращать значение?
Приведите конкретный пример, пожалуйста.26.03.2022 в 13:48 #22662a80808УчастникПопробуйте заменить на EveryMin(TankEmu65010) без лишних скобок.
Михаил, а как же тогда передать параметры в формулу?
К сожалению теперь с работой RAM диска файлы после отключения теряются. Постараюсь сегодня — завтра смоделировать ситуации.
По возврату — я формулу менял следующим образом:
public CnlData TankEmu65010()
{
SetVal(65012, Val()+10);
}Появлялось сообщение (дословно не помню) что требуется возвращаемое значение. Смоделирую, напишу.
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.