javalikecalc
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| javalikecalc [2025/06/26 16:33] – walhi | javalikecalc [2026/09/11 13:57] (current) – Добавлен новый скрипт walhi | ||
|---|---|---|---|
| Line 20: | Line 20: | ||
| </ | </ | ||
| ---- | ---- | ||
| + | |||
| + | **Разворачивание** стандартного параметра на несколько логических. Развитие скрипта выше. Была у меня задача по модернизации опроса. Был параметр с опросом N штук сигнализаций (биты '' | ||
| + | |||
| + | |||
| + | <code java> | ||
| + | function setConfig(node, | ||
| + | req = SYS.XMLNode(" | ||
| + | SYS.cntrReq(req); | ||
| + | } | ||
| + | |||
| + | |||
| + | src = SYS.DAQ.ModBus.PLC1.prm_Alarm.prm_template; | ||
| + | target = SYS.DAQ.ModBus.PLC1.prm_Alarm; | ||
| + | |||
| + | // Получаем список атрибутов, | ||
| + | list = target.cfg(" | ||
| + | |||
| + | out = ""; | ||
| + | for (var i = 0; i < list.length; | ||
| + | c = list[i].split(":" | ||
| + | // Пропуск комментариев и пустышек | ||
| + | if (c[0].indexOf("#" | ||
| + | if (c.length < 4) continue; | ||
| + | | ||
| + | // " | ||
| + | id = c[3]; | ||
| + | name = (c.length < 5)? | ||
| + | regType = c[0]; | ||
| + | regNum = c[1]; | ||
| + | regPerm = c[2]; | ||
| + | | ||
| + | // Копирование элемента | ||
| + | req = SYS.XMLNode(" | ||
| + | req.setAttr(" | ||
| + | req.setAttr(" | ||
| + | req.setAttr(" | ||
| + | SYS.cntrReq(req); | ||
| + | | ||
| + | // Прописываем конфигурацию в созданный параметр | ||
| + | newParam = target.nodeAt(" | ||
| + | newParam.cfgSet(" | ||
| + | setConfig(newParam, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | Что это за константа ''/ | ||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | **Массовое изменение** логических параметров. Всплыл мой косяк, который надо исправить быстро и в нескольких местах. Свою ситуацию рассматривать не буду, но приведу аналогию. Есть у вас обработка входных данных, | ||
| + | |||
| + | Для начала, | ||
| + | |||
| + | <code java> | ||
| + | io = SYS.XMLNode(" | ||
| + | SYS.cntrReq(io); | ||
| + | </ | ||
| + | |||
| + | Далее уже работать с этим объектом. В нем будет 7 массивов по количеству столбцов таблицы с переменными: | ||
| + | |||
| + | Теперь про код обработки. Для начала надо описать задание: | ||
| + | |||
| + | |||
| + | <code java> | ||
| + | // Формируем задание | ||
| + | // Формат: | ||
| + | // " | ||
| + | // " | ||
| + | // " | ||
| + | config = new Array(); | ||
| + | |||
| + | command = new Object(); | ||
| + | command.template = " | ||
| + | command.param = new Array(); | ||
| + | command.value = new Array(); | ||
| + | command.param.push(" | ||
| + | command.value.push(0.01); | ||
| + | config.push(command); | ||
| + | |||
| + | command = new Object(); | ||
| + | command.template = " | ||
| + | command.param = new Array(); | ||
| + | command.value = new Array(); | ||
| + | command.param.push(" | ||
| + | command.value.push(0.01); | ||
| + | config.push(command); | ||
| + | |||
| + | command = new Object(); | ||
| + | command.template = " | ||
| + | command.param = new Array(); | ||
| + | command.value = new Array(); | ||
| + | command.param.push(" | ||
| + | command.value.push(0.01); | ||
| + | command.param.push(" | ||
| + | command.value.push(5); | ||
| + | config.push(command); | ||
| + | </ | ||
| + | |||
| + | После того, как сформировали задание, | ||
| + | |||
| + | |||
| + | <code java> | ||
| + | for (var i = 0; i < config.length; | ||
| + | // Получаем объект шаблона | ||
| + | tmp = config[i].template.split(" | ||
| + | templateObject = SYS.DAQ.nodeAt(" | ||
| + | | ||
| + | // Создаем в конфигурации задания дополнительное поле | ||
| + | // с номером элемента в таблице, | ||
| + | config[i].el = new Array(); | ||
| + | | ||
| + | const_mask = 0x40; // Взято из исходных кодов | ||
| + | // TPrmTempl:: | ||
| + | // TPrmTempl:: | ||
| + | |||
| + | // Запрашиваем таблицу с вводами и выводами шаблона | ||
| + | io = SYS.XMLNode(" | ||
| + | SYS.cntrReq(io); | ||
| + | |||
| + | // Столбцы таблицы редактирования шаблона | ||
| + | // Идентификатор, | ||
| + | // Связь, переменная или константа описано в столбце " | ||
| + | varNames = io.childGet(0); | ||
| + | varSource = io.childGet(5); | ||
| + | for (var j = 0; j < varNames.childSize(); | ||
| + | name = varNames.childGet(j).text(); | ||
| + | source = varSource.childGet(j).text().toInt(); | ||
| + | tmp = config[i].param.indexOf(name); | ||
| + | if (tmp != -1){ | ||
| + | // Найден целевой параметр | ||
| + | // Проверяем, | ||
| + | if (source & const_mask) | ||
| + | config[i].el[tmp] = j; | ||
| + | else | ||
| + | config[i].el[tmp] = EVAL; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Теперь можно пройтись по дереву. Указываем начальную точку и вызываем рекурсивную функцию, | ||
| + | |||
| + | |||
| + | |||
| + | <code java> | ||
| + | // Рекурсивная функция для прохода по дереву опроса | ||
| + | function runConfig(parent){ | ||
| + | attrs = parent.nodeList(" | ||
| + | for (var i = 0; i < attrs.length; | ||
| + | attr = parent.nodeAt(attrs[i]); | ||
| + | tmpl = attr.cfg(" | ||
| + | if (!tmpl.isEVal()){ | ||
| + | // Это логический параметр | ||
| + | for (var j = 0; j < config.length; | ||
| + | if (config[j].template == tmpl){ | ||
| + | // Есть задание для этого шаблона | ||
| + | for (var k = 0; k < config[j].param.length; | ||
| + | if (!config[j].el[k].isEVal()) | ||
| + | setConfig(attr, | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } else { | ||
| + | // Это стандартный параметр. Вызываем рекурсивно, | ||
| + | if (attr.nodeList(" | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | plc = SYS.DAQ.ModBus.PLC01; | ||
| + | runConfig(plc); | ||
| + | </ | ||
| + | |||
| + | Функция '' | ||
| + | |||
| + | <code java> | ||
| + | function setConfig(node, | ||
| + | req = SYS.XMLNode(" | ||
| + | SYS.cntrReq(req); | ||
| + | oldValue = req.text(); | ||
| + | if (oldValue != value) log += node.nodePath() + id.replace("/", | ||
| + | req = SYS.XMLNode(" | ||
| + | SYS.cntrReq(req); | ||
| + | } | ||
| + | </ | ||
javalikecalc.1750955637.txt.gz · Last modified: by walhi
