Суточные и месячные данные — формулы

Стартовая страница Форумы Понять, как работает ПО Формулы Суточные и месячные данные — формулы

Просмотр 15 сообщений - с 46 по 60 (из 63 всего)
  • Автор
    Записи
  • #41654
    Boriss
    Участник

    Дайте хоть какую-нибудь подсказку, как это реализовать. Пожалуйста. Нужна скользящая разность за период 30 секунд.

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

    #41655
    manjey73
    Участник

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

    Какая задача?

    #41656
    Boriss
    Участник

    Архивы пишутся секундные. Нужно видеть, на сколько быстро падает или растет температура.

    #41657
    manjey73
    Участник

    я как-то делал формулу Среднего, возможно можно сделать на ее основе, но не уверен.
    Если найду, скину

    #41658
    manjey73
    Участник

    не нашел…
    пока навскидку — использовать скрипт EverySec и заполнять им массив из 30-ти элементов, когда массив заполнится через 30 сек, переписывать ячейки.
    Ну и считать среднее. Среднее число и будет тем самым больше или меньше за последние 30 секунд

    • Ответ изменён 6 месяцев назад пользователем manjey73.
    #41660
    Boriss
    Участник
    #41661
    manjey73
    Участник

    о, надо же, где-то сохранилось 🙂

    Но в 6-й версии добавились EverySec, и лучше построить через него, так как формулы по умолчанию выполняются раз 10 в секунду, а тут этого не требуется.
    Ну и сделать увеличение массива до 30, либо сразу сделать массив на 30 элементов + счетчик, на сколько делить, пока не вырастит количество значений до 30, а потом делить всегда на 30.

    Суть — Среднее это и есть больше или меньше за Х времени

    #41662
    manjey73
    Участник

    Чтобы формула получилась универсальной, наверное стоит сделать пару параметров при ее вводе. Это на сколько делить (максимальное количество ячеек заодно) и шаг, например 10 сек, 1 сек, 1 минута и т.д.

    #41663
    Boriss
    Участник

    Т.е. Ticks() не нужен в 6 версии? Попробую разобраться…

    #41665
    manjey73
    Участник

    Если использовать формулу Каждую секунду и внутрь нее вставлять вызов своей то да, Ticks и таймер не нужен вообще.

    То есть при запуске делаете счетчик, чтобы досчитал до 30-ти, и потом на 30-ти остановился. По мере заполнения (кстати можно использовать Dictionary, а можно кстати List использовать, тогда по индексации будет понятно на сколько делить) делить на свой счетчик и получать среднее.

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

    Продублирую ссылку здесь. Ссылка

    #41673
    manjey73
    Участник

    мои попытки добавить в таблицу скриптов формулы по ссылке не увенчались успехом в 6-й версии.

    Вот я Идиот, оказывается я уже добавлял эти формулы в скрипты 🙂

    • Ответ изменён 6 месяцев назад пользователем manjey73.
    #41722
    Boriss
    Участник

    Добавил скрипт в таблицу. Сервер запустился без ошибок. Как проверить работает ли формула? А черт его знает. Полнейший тупняк…
    Как применить формулу 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
    	}
    }
    #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 секунд

    #41724
    manjey73
    Участник

    Как передать результат в другой компонент на схеме? Передать результат в канал, как я понимаю, не возможно? Вообще это не правильно, городить городушки с js скриптами. Похоже надо осваивать С#…

    что значит передать в другой компонент? просто выведите его в динамический текст, формула то считает в какой-то расчетный канал.

    а расчетный канал это такой же, как и другой, который доступен для вывода на мнемосхему или в таблицу

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