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