Site Tools


Hotfix release available: 2026-07-14c "Mort". upgrade now! [57.3] (what's this?)
javalikecalc

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
javalikecalc [2026/08/28 11:33] – Добавлен ещё один скрипт walhijavalikecalc [2026/08/28 12:03] (current) – fix 95.129.139.197
Line 1: Line 1:
 +На данной странице собраны решения некоторых задач на встроенном в OpenSCADA языке JavaLikeCalc.
  
 +----
 +
 +**Копирование** контроллеров/параметров дерева DAQ. Полезно для автоматизации процесса разворачивания проекта на N одинаковых контроллеров.
 +<code java>
 +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);
 +</code>
 +----
 +
 +**Разворачивание** стандартного параметра на несколько логических. Развитие скрипта выше. Была у меня задача по модернизации опроса. Был параметр с опросом N штук сигнализаций (биты ''R/RI_b'' или ''C/CI''), по которому понадобилось выводить сообщения в журнал. Сделать это на стандартных параметрах, насколько мне известно, невозможно. Значит нужно преобразовать это в N логических параметров, которые будут обрабатывать данные. Ручками делать напряжно, так что создаем шаблон для копирования со всеми интересующими настройками и размножаем его на N с указанием источника данных. Размещаем создаваемые логические параметры прямо внутри источника (это законно и вполне работает). Но приходится указывать именно адреса регистров, а не ссылки относительные. Есть баг в OpenSCADA, когда при перезапуске программы относительные ссылки разрушаются. Пока что его не пофиксили.
 +
 +
 +<code java>
 +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);
 +}
 +</code>
 +
 +
 +Что это за константа ''/cfg/prm/pr_3''? Я не совсем понимаю как они формируются, но это обозначение констант с вкладки конфигурации шаблона. Если навести на поле ввода, то внизу окна в подсказке будет строка с полным путем параметра и ''%2fcfg%2fprm%2fpr_3'' или ''%2fcfg%2fprm%2fel_7'' в конце. Как получить это из читаемого имени, указанного в шаблоне, я пока не знаю. 
javalikecalc.1787916794.txt.gz · Last modified: by walhi · Currently locked by: 216.73.217.14