Стартовая страница › Форумы › Понять, как работает ПО › Мнемосхемы › Mimic js-script Скользящая разница
- В этой теме 20 ответов, 4 участника, последнее обновление 2 месяца назад сделано
Mikhail.
-
АвторСообщения
-
27.01.2026 в 09:51 #41741
Boriss
УчастникДанное решение не претендует на работоспособность, но возможно поможет разобраться как все это работает …или не работает.
Задача: Увидеть на сколько быстро изменяется значение канала.скрипт работает при условии, что схема обновляется один раз в секунду.
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.
27.01.2026 в 17:15 #41756
MikhailМодераторКак передать результат (в скрипте customData.res) в другой компонент на схеме?
Выведите аргументы в консоль браузера:
console.log(args)
чтобы увидеть доступные свойства.
Скорее всего Вы найдёте ссылку на объект схемы, который в свою очередь имеет массив объектных моделей всех компонентов схемы.
Далее нужно записать какие-то свои данные в свойства компонента customData и при необходимости использовать эти данные в скрипте компонента.28.01.2026 в 13:25 #41769Boriss
УчастникСкорее всего Вы найдёте ссылку на объект схемы, который в свою очередь имеет массив объектных моделей всех компонентов схемы.
Не нашел. Только на текущий компонент.
Возможно, Вы имели видуconsole.log(mimic.components);, что-бы увидеть полную картину.28.01.2026 в 16:41 #41770GreatAlex
Участникчто-бы увидеть полную картину.
Скрипт запускайте на самой мнемосхеме, а не в компоненте.
Тогда увидите много интересного.28.01.2026 в 16:50 #41771GreatAlex
Участниквот у меня как получилось (пишем в текстовый компонент с именем «Text1»):
args.component.children.find(tt => tt.name == «Text1»).properties.text=’qqq’27.02.2026 в 10:16 #42154Boriss
УчастникОстановился на таком варианте. Цель: привлечь внимание оператора, если какой то параметр «поплыл». Скрипт для компонента мнемосхемы «Текст». В свойствах указывается номер канала, который надо контролировать. Скрипт отображает стрелку ↓ или ↑, когда значение канала меняется на определенную величину за заданный временной интервал.
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); //выводим результат в консоль } }27.02.2026 в 13:08 #42159
MikhailМодераторСпасибо, полезно.
Если есть возможность, было бы, наверное, лучше всего так:
1. Оформить в виде фейсплейта отдельным файлом.
2. Опубликовать его для скачивания. Со своей стороны я могу создать папку на облачном диске и выкладывать в неё фейсплейты от сообщества по аналогии с шаблонами Модбас.04.03.2026 в 12:04 #42265Boriss
УчастникФейсплейт: https://disk.yandex.ru/d/ea0vo560GrjvTQ
04.03.2026 в 12:45 #42266Boriss
УчастникИ возникло множество вопросов. Некоторые я пока даже внятно озвучить не смогу, очень сложно разобраться, как что работает.
Свойство blinking(мигание) компонента текст я не смог изменить из скрипта. Не работает. Скрипт меняет свойство blinking для фейсплейта. Т.е. мигает не конкретный компонент на фейсплейте, а весь фейсплейт. И как быть, если на фейсплейте больше одного компонента? Похоже, что никак.
Как сделать рабочий фейсплейт из нескольких компонентов? Например из двух компонентов «Текст» с привязкой к разным каналам? А если надо сделать около пятидесяти однотипных элементов мнемосхемы, каждый из которых состоит из 5-10 компонентов с привязкой к разным каналам. Фейсплейты тут не помогут. Или помогут? Я не совсем понимаю логику и назначение фейсплейтов.04.03.2026 в 12:50 #42267
manjey73Участникмигание, общий фон, цвет рамки, видимость это по определению и относится к самому фейсплейту, а не вашему тексту, или что в него вставлено.
У вставленного это свои свойства. По идее надо делать экспортируемые свойства и связывать с нужным, ну или скриптом внутри.сам с этим «разбираюсь» или больше воюю пока. 🙂
04.03.2026 в 13:44 #42268Boriss
УчастникЭэээ… с этим все понятно и эти свойства будут доступны на мнемосхеме. С этим проблем нет. Но у меня скрипт на фейсплейте, который меняет свойства компонента, на него вставленного. Можно повесить скрипт на мнемосхему и использовать экспортируемые свойства, но тогда зачем вообще нужен фейсплейт и экспорт свойств, если и без него все работает и объем рутинной работы по созданию мнемосхемы он не сокращает никак? С фейсплейтом пока проблем больше, чем пользы.
04.03.2026 в 13:50 #42269Boriss
Участниксвойство inCnlNum (Входной канал) невозможно экспортировать, канал привязывается к фейсплейту. Мда… Для моих задач фейсплейт совершенно бесполезен.
04.03.2026 в 14:03 #42270
manjey73Участники вот он еще один, про бесполезность фейсплейтов 🙂
04.03.2026 в 14:28 #42271Boriss
УчастникНадеюсь нас не станет больше.
Разработчикам респект за привязку свойств компонента в последней версии. Теперь не надо все это выискивать в js скриптах и в консоли.04.03.2026 в 14:41 #42272
manjey73УчастникА вот тут есть идеи.
1. Отделять мух от котлет, системные, добавленные для настройки, для управлнния (чекбоксы)
2. Фильтр, ибо у меня их может быть сотня легко
3. Помимо имени добавить описание, а то fon(fon) как-то не очень
4. Быстрый выбор что добавить в привязки, а не по одному ту же сотню. -
Тема изменена 2 месяца назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.