На данной странице собраны решения некоторых задач на встроенном в OpenSCADA языке JavaLikeCalc. ---- **Копирование** контроллеров/параметров дерева DAQ. Полезно для автоматизации процесса разворачивания проекта на N одинаковых контроллеров. src = SYS.DAQ.ModBus.Test; target = SYS.DAQ.ModBus; targetName = "NewPLC"; req = SYS.XMLNode("copy"); req.setAttr("path", src.nodePath() + "/obj".replace("/", "%2f")); req.setAttr("src", src.nodePath()); if (typeof(src) == "TCntrNode:TController"){ pref = "cntr_"; } else { pref = "prm_"; } req.setAttr("dst", target.nodePath() + pref + targetName); SYS.cntrReq(req); ---- **Разворачивание** стандартного параметра на несколько логических. Развитие скрипта выше. Была у меня задача по модернизации опроса. Был параметр с опросом N штук сигнализаций (биты ''R/RI_b'' или ''C/CI''), по которому понадобилось выводить сообщения в журнал. Сделать это на стандартных параметрах, насколько мне известно, невозможно. Значит нужно преобразовать это в N логических параметров, которые будут обрабатывать данные. Ручками делать напряжно, так что создаем шаблон для копирования со всеми интересующими настройками и размножаем его на N с указанием источника данных. Размещаем создаваемые логические параметры прямо внутри источника (это законно и вполне работает). Но приходится указывать именно адреса регистров, а не ссылки относительные. Есть баг в OpenSCADA, когда при перезапуске программы относительные ссылки разрушаются. Пока что его не пофиксили. function setConfig(node, id, value){ req = SYS.XMLNode("set").setAttr("path", node.nodePath() + id.replace("/", "%2f")).setText(value); SYS.cntrReq(req); } src = SYS.DAQ.ModBus.PLC1.prm_Alarm.prm_template; target = SYS.DAQ.ModBus.PLC1.prm_Alarm; // Получаем список атрибутов, которые нужно перегнать в логические параметры list = target.cfg("ATTR_LS").split("\n"); out = ""; for (var i = 0; i < list.length; i++){ c = list[i].split(":"); // Пропуск комментариев и пустышек if (c[0].indexOf("#") == 0) continue; if (c.length < 4) continue; // "парсим" строку id = c[3]; name = (c.length < 5)?c[3]:c[4]; // может быть без имени, только ID regType = c[0]; regNum = c[1]; regPerm = c[2]; // Копирование элемента req = SYS.XMLNode("copy"); req.setAttr("path", src.nodePath() + "/obj".replace("/", "%2f")); req.setAttr("src", src.nodePath()); req.setAttr("dst", target.nodePath() + "prm_" + id); SYS.cntrReq(req); // Прописываем конфигурацию в созданный параметр newParam = target.nodeAt("prm_" + id); newParam.cfgSet("NAME", name); setConfig(newParam, "/cfg/prm/pr_3", regType + ":" + regNum + ":" + regPerm); } Что это за константа ''/cfg/prm/pr_3''? Я не совсем понимаю как они формируются, но это обозначение констант с вкладки конфигурации шаблона. Если навести на поле ввода, то внизу окна в подсказке будет строка с полным путем параметра и ''%2fcfg%2fprm%2fpr_3'' или ''%2fcfg%2fprm%2fel_7'' в конце. Как получить это из читаемого имени, указанного в шаблоне, я пока не знаю.