Mimic js-script Скользящая разница

Просмотр 15 сообщений - с 1 по 15 (из 21 всего)
  • Автор
    Сообщения
  • #41741
    Boriss
    Участник

    Перенос из темы https://forum.rapidscada.ru/?topic=%D1%81%D1%83%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5-%D0%B8-%D0%BC%D0%B5%D1%81%D1%8F%D1%87%D0%BD%D1%8B%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&paged=4#post-41722

    Данное решение не претендует на работоспособность, но возможно поможет разобраться как все это работает …или не работает.
    Задача: Увидеть на сколько быстро изменяется значение канала.

    скрипт работает при условии, что схема обновляется один раз в секунду.

    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]; //результат: слот 0 минус последний слот.
    				
    		props.text = customData.res.toFixed(6).slice(0,-4); //обрезаем до двух знаков после запятой и выводим на схему
    		console.log(customData.arr_int); //выводим массив в консоль
    		console.log("Разница за " + customData.interval + " сек. : " + customData.res); //выводим результат в консоль
    		
    		args.propertyChanged = true //разрешаем обновление свойства компонента
    	}
    }

    Вопросы. Как передать полученный результат в другой компонент на схеме? Как добавить в начало или в конец полученный результат в свойство text другого компонента на схеме?

    • Тема изменена 2 месяца назад пользователем Mikhail.
    #41756
    Mikhail
    Модератор

    Как передать результат (в скрипте customData.res) в другой компонент на схеме?

    Выведите аргументы в консоль браузера:
    console.log(args)
    чтобы увидеть доступные свойства.
    Скорее всего Вы найдёте ссылку на объект схемы, который в свою очередь имеет массив объектных моделей всех компонентов схемы.
    Далее нужно записать какие-то свои данные в свойства компонента customData и при необходимости использовать эти данные в скрипте компонента.

    #41769
    Boriss
    Участник

    Скорее всего Вы найдёте ссылку на объект схемы, который в свою очередь имеет массив объектных моделей всех компонентов схемы.

    Не нашел. Только на текущий компонент.
    Возможно, Вы имели виду console.log(mimic.components);, что-бы увидеть полную картину.

    #41770
    GreatAlex
    Участник

    что-бы увидеть полную картину.

    Скрипт запускайте на самой мнемосхеме, а не в компоненте.
    Тогда увидите много интересного.

    #41771
    GreatAlex
    Участник

    вот у меня как получилось (пишем в текстовый компонент с именем «Text1»):
    args.component.children.find(tt => tt.name == «Text1»).properties.text=’qqq’

    #42154
    Boriss
    Участник

    Остановился на таком варианте. Цель: привлечь внимание оператора, если какой то параметр «поплыл». Скрипт для компонента мнемосхемы «Текст». В свойствах указывается номер канала, который надо контролировать. Скрипт отображает стрелку ↓ или ↑, когда значение канала меняется на определенную величину за заданный временной интервал.

    class extends ComponentScript {
    	domCreated(args) {
    		args.component.customData ??= {};
    		const customData = args.component.customData;
    		customData.interval = 120; //временной интервал в сек.
    		customData.arr_int = new Array(); //создаем пустой массив
    		//console.log("DOM created 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.arr_int.unshift(cnlData.d.val); //добавляем значение канала в начало массива
    		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]; //результат: слот 0 минус последний слот.
    		customData.res_slice = customData.res.toFixed(6).slice(0,-4); //обрезаем до двух знаков после запятой.	
    		
    		const blinking = customData.res < -10 || customData.res > 10;
    		
    		if (customData.res < -2.5) {
    			props.text = "↓"; //если разница за временной интервал меньше -2.5, рисуем "стрелку вниз"
    		} else if (customData.res > 2.5) {
    			props.text = "↑"; //если разница за временной интервал больше 2.5, рисуем "стрелку вверх"
    		} else {
    			props.text = " ";			
    		}
            
    		if (props.blinking !== blinking) {
    			props.blinking = blinking; //если разница за временной интервал меньше -10 или больше 10, включаем мигание стрелки.
            }
    		args.propertyChanged = true //разрешаем обновление свойства компонента
    		
    		//console.log(customData.arr_int); //выводим массив в консоль
    		//console.log("Разница за " + customData.interval + " сек. : " + customData.res_slice); //выводим результат в консоль
    		
    	}
    }
    #42159
    Mikhail
    Модератор

    Спасибо, полезно.
    Если есть возможность, было бы, наверное, лучше всего так:
    1. Оформить в виде фейсплейта отдельным файлом.
    2. Опубликовать его для скачивания. Со своей стороны я могу создать папку на облачном диске и выкладывать в неё фейсплейты от сообщества по аналогии с шаблонами Модбас.

    #42265
    Boriss
    Участник
    #42266
    Boriss
    Участник

    И возникло множество вопросов. Некоторые я пока даже внятно озвучить не смогу, очень сложно разобраться, как что работает.
    Свойство blinking(мигание) компонента текст я не смог изменить из скрипта. Не работает. Скрипт меняет свойство blinking для фейсплейта. Т.е. мигает не конкретный компонент на фейсплейте, а весь фейсплейт. И как быть, если на фейсплейте больше одного компонента? Похоже, что никак.
    Как сделать рабочий фейсплейт из нескольких компонентов? Например из двух компонентов «Текст» с привязкой к разным каналам? А если надо сделать около пятидесяти однотипных элементов мнемосхемы, каждый из которых состоит из 5-10 компонентов с привязкой к разным каналам. Фейсплейты тут не помогут. Или помогут? Я не совсем понимаю логику и назначение фейсплейтов.

    #42267
    manjey73
    Участник

    мигание, общий фон, цвет рамки, видимость это по определению и относится к самому фейсплейту, а не вашему тексту, или что в него вставлено.
    У вставленного это свои свойства. По идее надо делать экспортируемые свойства и связывать с нужным, ну или скриптом внутри.

    сам с этим «разбираюсь» или больше воюю пока. 🙂

    #42268
    Boriss
    Участник

    Ээээ… с этим все понятно и эти свойства будут доступны на мнемосхеме. С этим проблем нет. Но у меня скрипт на фейсплейте, который меняет свойства компонента, на него вставленного. Можно повесить скрипт на мнемосхему и использовать экспортируемые свойства, но тогда зачем вообще нужен фейсплейт и экспорт свойств, если и без него все работает и объем рутинной работы по созданию мнемосхемы он не сокращает никак? С фейсплейтом пока проблем больше, чем пользы.

    #42269
    Boriss
    Участник

    свойство inCnlNum (Входной канал) невозможно экспортировать, канал привязывается к фейсплейту. Мда… Для моих задач фейсплейт совершенно бесполезен.

    #42270
    manjey73
    Участник

    и вот он еще один, про бесполезность фейсплейтов 🙂

    #42271
    Boriss
    Участник

    Надеюсь нас не станет больше.
    Разработчикам респект за привязку свойств компонента в последней версии. Теперь не надо все это выискивать в js скриптах и в консоли.

    #42272
    manjey73
    Участник

    А вот тут есть идеи.
    1. Отделять мух от котлет, системные, добавленные для настройки, для управлнния (чекбоксы)
    2. Фильтр, ибо у меня их может быть сотня легко
    3. Помимо имени добавить описание, а то fon(fon) как-то не очень
    4. Быстрый выбор что добавить в привязки, а не по одному ту же сотню.

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