Стартовая страница › Форумы › Понять, как работает ПО › Формулы › Суточные и месячные данные — формулы
- В этой теме 62 ответа, 6 участников, последнее обновление 5 месяцев, 3 недели назад сделано
Mikhail.
-
АвторЗаписи
-
19.01.2026 в 08:10 #41654
Boriss
УчастникДайте хоть какую-нибудь подсказку, как это реализовать. Пожалуйста. Нужна скользящая разность за период 30 секунд.
Если нужна скользящая разность, то потребуется разработать скрипты, которые будут «помнить» все полученные измерения за час (или другой период).
19.01.2026 в 08:56 #41655
manjey73УчастникСкользящая за 30 секунд предполагает, что архивы будут писаться чаще 30 секунд.
Вы уверены, что вам нужны секунды?Какая задача?
19.01.2026 в 13:03 #41656Boriss
УчастникАрхивы пишутся секундные. Нужно видеть, на сколько быстро падает или растет температура.
19.01.2026 в 13:29 #41657
manjey73Участникя как-то делал формулу Среднего, возможно можно сделать на ее основе, но не уверен.
Если найду, скину19.01.2026 в 13:37 #41658
manjey73Участникне нашел…
пока навскидку — использовать скрипт EverySec и заполнять им массив из 30-ти элементов, когда массив заполнится через 30 сек, переписывать ячейки.
Ну и считать среднее. Среднее число и будет тем самым больше или меньше за последние 30 секунд-
Ответ изменён 6 месяцев назад пользователем
manjey73.
19.01.2026 в 13:41 #41660Boriss
Участник19.01.2026 в 13:45 #41661
manjey73Участнико, надо же, где-то сохранилось 🙂
Но в 6-й версии добавились EverySec, и лучше построить через него, так как формулы по умолчанию выполняются раз 10 в секунду, а тут этого не требуется.
Ну и сделать увеличение массива до 30, либо сразу сделать массив на 30 элементов + счетчик, на сколько делить, пока не вырастит количество значений до 30, а потом делить всегда на 30.Суть — Среднее это и есть больше или меньше за Х времени
19.01.2026 в 13:49 #41662
manjey73УчастникЧтобы формула получилась универсальной, наверное стоит сделать пару параметров при ее вводе. Это на сколько делить (максимальное количество ячеек заодно) и шаг, например 10 сек, 1 сек, 1 минута и т.д.
19.01.2026 в 14:23 #41663Boriss
УчастникТ.е. Ticks() не нужен в 6 версии? Попробую разобраться…
19.01.2026 в 15:06 #41665
manjey73УчастникЕсли использовать формулу Каждую секунду и внутрь нее вставлять вызов своей то да, Ticks и таймер не нужен вообще.
То есть при запуске делаете счетчик, чтобы досчитал до 30-ти, и потом на 30-ти остановился. По мере заполнения (кстати можно использовать Dictionary, а можно кстати List использовать, тогда по индексации будет понятно на сколько делить) делить на свой счетчик и получать среднее.
19.01.2026 в 16:13 #4167119.01.2026 в 17:27 #41673
manjey73Участникмои попытки добавить в таблицу скриптов формулы по ссылке не увенчались успехом в 6-й версии.
Вот я Идиот, оказывается я уже добавлял эти формулы в скрипты 🙂
-
Ответ изменён 6 месяцев назад пользователем
manjey73.
26.01.2026 в 10:04 #41722Boriss
УчастникДобавил скрипт в таблицу. Сервер запустился без ошибок. Как проверить работает ли формула? А черт его знает. Полнейший тупняк…
Как применить формулу MovAvg(5) с расчетным каналом? Например канал 100 входной, канал 101 расчетный и вычисляет MovAvg(5) в канале 100. не понятно… Не понимаю я #C…Скрипт на js за пол часа. Корявенько, но как-то работает. Здесь мне проще, но познания минимальны. Как передать результат в другой компонент на схеме? Передать результат в канал, как я понимаю, не возможно? Вообще это не правильно, городить городушки с js скриптами. Похоже надо осваивать С#…
class extends ComponentScript { domCreated(args) { args.component.customData ??= {}; const customData = args.component.customData customData.interval = 30; customData.arr_int = new Array(); console.log("DOM created for component " + args.component.id); } domUpdated(args) { console.log("DOM updated for component " + args.component.id); } dataUpdated(args) { const customData = args.component.customData const props = args.component.properties; const cnlData = args.dataProvider.getCurData(props.inCnlNum); customData.Cur_Data = cnlData.d.val; customData.arr_int.unshift(customData.Cur_Data); if (customData.arr_int.length > customData.interval) { customData.arr_int.pop(); } customData.res = +customData.arr_int[0] - customData.arr_int[customData.arr_int.length - 1]; props.text = customData.res.toFixed(6).slice(0,-4); console.log(customData.arr_int); console.log("Разница за " + customData.interval + " сек. : " + customData.res); args.propertyChanged = true } }26.01.2026 в 13:03 #41723
manjey73УчастникНу вы описание почитайте — MovAvg(5) — по идее это среднее последних 5-ти значений.
Set the Formula field of an input channel to the following: MovAvg(5); AvgStat() /// This means that the input channel value is the average of the last 5 values.Задайте для поля формулы входного канала следующее значение: MovAvg(5); AvgStat()
/// Это означает, что значение входного канала является средним из последних 5 значений.в переводчик кидаете и читаете 🙂
Опять же, формулы вычисляются в цикле и эти 5 значений это все в рамках одной секунды по идее попадут.
Значит надо обернуть ее в EverySec( () => MovAvg(5)); AvgStat()стату наверное тоже надо обернутьНу и там есть, которая указывает в настройках в том числе и время
This means that the input channel value is the average over the last 10 seconds and includes max. 5 last values.Это означает, что входное значение канала в среднем за последние 10 секунд и включает в себя Макс. 5 последних значений.
тут надо бы поизучать код, как оно работает, но по мне так проще первую обернуть на запуск каждую секунду и указать 30 значений. получите за последние 30 секунд
26.01.2026 в 13:05 #41724
manjey73УчастникКак передать результат в другой компонент на схеме? Передать результат в канал, как я понимаю, не возможно? Вообще это не правильно, городить городушки с js скриптами. Похоже надо осваивать С#…что значит передать в другой компонент? просто выведите его в динамический текст, формула то считает в какой-то расчетный канал.
а расчетный канал это такой же, как и другой, который доступен для вывода на мнемосхему или в таблицу
-
Ответ изменён 6 месяцев назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.