На данной странице собраны решения некоторых задач на встроенном в 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 в конце. Как получить это из читаемого имени, указанного в шаблоне, я пока не знаю.