УкраїнськаEnglishmRussian
Вхід/Новий
У темі багато повідомлень

помогите с XML


Автор Повідомлення
Повідомлення створено: 03. 07. 2013 [13:56]
monia
Олег Намятов
Автор теми
Зареєстрован(а) с: 21.05.2012
Повідомлення: 173
написал небольшой скрипт на изменение привязок параметров аварии "CO 1 порог" для обработки 94 объектов
Все работает нормально
JAVASCRIPT
for(kot = 1; kot < 94; kot++)
{
	if((kot < 85) || (kot > 87))
	{
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_"+ kot + "_LL/prm_"+ kot + "_CO1/%2fcfg%2fprm%2fel_0");
		req.setText("ModBus."+ kot + "_cp."+ kot + "_SumParam.vNKot");
		SYS.cntrReq(req);
		idSt = req.text() + "\n";
 
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_"+ kot + "_LL/prm_"+ kot + "_CO1/%2fcfg%2fprm%2fel_1");
		req.setText("ModBus."+ kot + "_cp."+ kot + "_SumParam.vAdrKot");
		SYS.cntrReq(req);
		idSt += req.text() + "\n";
 
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_"+ kot + "_LL/prm_"+ kot + "_CO1/%2fcfg%2fprm%2fel_4");
		req.setText("ModBus."+ kot + "_tp."+ kot + "_MaskAlarms.vmaCO1");
		SYS.cntrReq(req);
		idSt += req.text() + "\n";
 
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_"+ kot + "_LL/prm_"+ kot + "_CO1/%2fcfg%2fprm%2fel_7");
		req.setText("ModBus."+ kot + "_cp."+ kot + "_SumParam.vTimeAlarm");
		SYS.cntrReq(req);
		idSt += req.text() + "\n";
 
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_"+ kot + "_LL/prm_"+ kot + "_CO1/%2fcfg%2fprm%2fel_9");
		req.setText("ModBus."+ kot + "_cp."+ kot + "_SumParam.pvaCO1");
		SYS.cntrReq(req);
		idSt += req.text() + "\n";
 
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_"+ kot + "_LL/prm_"+ kot + "_CO1/%2fcfg%2fprm%2fel_12");
		req.setText("LogicLev."+ kot + "_LL."+ kot + "_KotLink.vKotLink");
		SYS.cntrReq(req);
		idSt += req.text();
	}
}


а вот и вопрос:
1) как добавить узел в контроллер N
N - номер составляющего имени контроллера (к примеру :sub_DAQ/mod_LogicLev/cntr_10_LL)
т.е. необходимо добавить узел обработки аварии sub_DAQ/mod_LogicLev/cntr_10_LL/prm_10_CO1
2) как проверить существования узла, что бы не создать дубликат (хотя мне кажется если будет дубликат то XML скрипт выполниться с ошибкой и ни чего не произойдет)

хотел сделать автоматическое добавление узлов, перепробовал все, но ничего не получилось
руководствовался http://wiki.oscada.org/Doc/OpisanieProgrammy#h920-1 и немного по форуму пошарился

если не сложно напишите пример хотя бы на добавления узла обработки в контроллер логического уровня
Вкладений файл

Снимок экрана от 2013-07-03 14:55:23.png (Тип файлу: image/png, Розмір: 328.21 кілобайтів) — 2345 завантажень
Повідомлення створено: 04. 07. 2013 [08:51]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
"monia" wrote:

а вот и вопрос:
1) как добавить узел в контроллер N
N - номер составляющего имени контроллера (к примеру :sub_DAQ/mod_LogicLev/cntr_10_LL)
т.е. необходимо добавить узел обработки аварии sub_DAQ/mod_LogicLev/cntr_10_LL/prm_10_CO1

Командой "add", вместо "set".

"monia" wrote:

2) как проверить существования узла, что бы не создать дубликат (хотя мне кажется если будет дубликат то XML скрипт выполниться с ошибкой и ни чего не произойдет)

XML это не скрипт, а запрос к интерфейсу управления OpenSCADA, завёрнутый в XML.
Можно проверить с помощью nodeAt(): http://wiki.oscada.org/Doc/OpisanieProgrammy?v=x3w#h920-7
Хотя если одноимённый узел уже есть то запрос просто проигнорируется.

"monia" wrote:

хотел сделать автоматическое добавление узлов, перепробовал все, но ничего не получилось
руководствовался http://wiki.oscada.org/Doc/OpisanieProgrammy#h920-1 и немного по форуму пошарился

Раз уж используете запросы к интерфейсу управления то читать нужно здесь http://wiki.oscada.org/Doc/API#h154-1 и смотреть в исходники, поскольку данный механизм не позиционируется как пользовательский.

"monia" wrote:

если не сложно напишите пример хотя бы на добавления узла обработки в контроллер логического уровня

JAVASCRIPT
req = SYS.XMLNode("add").setAttr("path","/DAQ/LogicLev/10_LL/%2fbr%2fprm_").setAttr("id","10_CO1").setText("{PrmName}");
SYS.cntrReq(req);



Learn, learn and learn better than work, work and work.
Повідомлення створено: 04. 07. 2013 [13:55]
monia
Олег Намятов
Автор теми
Зареєстрован(а) с: 21.05.2012
Повідомлення: 173
а где можно почитать про
1) %2fbr%2fprm_
2) %2fcfg%2fprm%2fel_1

Я попробовал добавить узел, все получилось. Даже есть проверка на дублирование, XML запрос выдает предупреждение и не чего не делает.
спасибо за пример

Рома можешь оценить код
JAVASCRIPT
for(kot = 1; kot < 94; kot++)
{
	if((kot < 85) || (kot > 87))
	{
 
		NameAlarm = "CO 2 порог";
		Alarm = "CO2";
		LvlAlarm = "2";
		MessageAlarm = "Авария, CO 2 порог";
 
		IdAlarm = kot.toString(10,-1,false) + "_" + Alarm;
 
		req = SYS.XMLNode("add").setAttr("path","/DAQ/LogicLev/" + kot + "_LL/%2fbr%2fprm_").setAttr("id",IdAlarm).setText(NameAlarm);
		SYS.cntrReq(req);
 
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_" + kot + "_LL/prm_" + kot + "_" + Alarm + "/%2fprm%2fcfg%2fPRM");
		req.setText("GenShab.shab_AlarmIO");
		SYS.cntrReq(req);
 
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_" + kot + "_LL/prm_" + kot + "_" + Alarm + "/%2fprm%2fcfg%2fEN");
		req.setText("1");
		SYS.cntrReq(req);
 
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_" + kot + "_LL/prm_" + kot + "_" + Alarm + "/%2fprm%2fst%2fen");
		req.setText("1");
		SYS.cntrReq(req);
 
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_" + kot + "_LL/prm_" + kot + "_" + Alarm + "/%2fval%2fvLevel");
		req.setText(LvlAlarm);
		SYS.cntrReq(req);
 
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_" + kot + "_LL/prm_" + kot + "_" + Alarm + "/%2fval%2fvName");
		req.setText(MessageAlarm);
		SYS.cntrReq(req);
 
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_"+ kot + "_LL/prm_"+ kot + "_" + Alarm + "/%2fcfg%2fprm%2fel_0");
		req.setText("ModBus."+ kot + "_cp."+ kot + "_SumParam.vNKot");
		SYS.cntrReq(req);
 
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_"+ kot + "_LL/prm_"+ kot + "_" + Alarm + "/%2fcfg%2fprm%2fel_1");
		req.setText("ModBus."+ kot + "_cp."+ kot + "_SumParam.vAdrKot");
		SYS.cntrReq(req);
 
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_"+ kot + "_LL/prm_"+ kot + "_" + Alarm + "/%2fcfg%2fprm%2fel_4");
		req.setText("ModBus."+ kot + "_tp."+ kot + "_MaskAlarms.vma" + Alarm);
		SYS.cntrReq(req);
 
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_"+ kot + "_LL/prm_"+ kot + "_" + Alarm + "/%2fcfg%2fprm%2fel_7");
		req.setText("ModBus."+ kot + "_cp."+ kot + "_SumParam.vTimeAlarm");
		SYS.cntrReq(req);
 
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_"+ kot + "_LL/prm_"+ kot + "_" + Alarm + "/%2fcfg%2fprm%2fel_9");
		req.setText("ModBus."+ kot + "_cp."+ kot + "_SumParam.pva" + Alarm);
		SYS.cntrReq(req);
 
		req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_LogicLev/cntr_"+ kot + "_LL/prm_"+ kot + "_" + Alarm + "/%2fcfg%2fprm%2fel_12");
		req.setText("LogicLev."+ kot + "_LL."+ kot + "_KotLink.vKotLink");
		SYS.cntrReq(req);
 
	}
}


Можно ли код минимизировать? спрашиваю на будущее, хочу еще несколько штук придумать для облегчение своего труда

[Повідомлення редагувалось 1 раз(ів), останній раз 04.07.2013 в 14:39.]
Повідомлення створено: 04. 07. 2013 [18:15]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
"monia" wrote:

а где можно почитать про
1) %2fbr%2fprm_
2) %2fcfg%2fprm%2fel_1

Выше я писал:
"roman" wrote:

Раз уж используете запросы к интерфейсу управления то читать нужно здесь http://wiki.oscada.org/Doc/API#h154-1 и смотреть в исходники, поскольку данный механизм не позиционируется как пользовательский.


"monia" wrote:

Рома можешь оценить код

Раз запрос фактически к одному элементу интерфейса то это всё можно сгруппировать

JAVASCRIPT
for(kot = 1; kot < 94; kot++)
{
	if((kot < 85) || (kot > 87))
	{
 
		NameAlarm = "CO 2 порог";
		Alarm = "CO2";
		LvlAlarm = "2";
		MessageAlarm = "Авария, CO 2 порог";
 
		IdAlarm = kot.toString(10,-1,false) + "_" + Alarm;
 
		req = SYS.XMLNode("add").setAttr("path","/DAQ/LogicLev/"+kot+"_LL/%2fbr%2fprm_").setAttr("id",IdAlarm).setText(NameAlarm);
		SYS.cntrReq(req);
		req = SYS.XMLNode("CntrReqs").setAttr("path","/DAQ/LogicLev/"+kot+"_LL/"+kot+"_"+Alarm);
		req.childAdd("set").setAttr("path","/%2fprm%2fcfg%2fPRM").setText("GenShab.shab_AlarmIO");
		req.childAdd("set").setAttr("path","/%2fprm%2fcfg%2fEN").setText("1");
		req.childAdd("set").setAttr("path","/%2fprm%2fst%2fen").setText("1");
		req.childAdd("set").setAttr("path","/%2fval%2fvLevel").setText(LvlAlarm);
		req.childAdd("set").setAttr("path","/%2fval%2fvName").setText(MessageAlarm);
		req.childAdd("set").setAttr("path","/%2fcfg%2fprm%2fel_0").setText("ModBus."+kot+"_cp."+kot+"_SumParam.vNKot");
		req.childAdd("set").setAttr("path","/%2fcfg%2fprm%2fel_1").setText("ModBus."+kot+"_cp."+kot+"_SumParam.vAdrKot");
		req.childAdd("set").setAttr("path","/%2fcfg%2fprm%2fel_4").setText("ModBus."+kot+"_tp."+kot+"_MaskAlarms.vma"+Alarm);
		req.childAdd("set").setAttr("path","/%2fcfg%2fprm%2fel_7").setText("ModBus."+kot+"_cp."+kot+"_SumParam.vTimeAlarm");
		req.childAdd("set").setAttr("path","/%2fcfg%2fprm%2fel_9").setText("ModBus."+kot+"_cp."+kot+"_SumParam.pva"+Alarm);
		req.childAdd("set").setAttr("path","/%2fcfg%2fprm%2fel_12").setText("LogicLev."+kot+"_LL."+kot+"_KotLink.vKotLink");
		SYS.cntrReq(req);
	}
}


Learn, learn and learn better than work, work and work.
Повідомлення створено: 05. 07. 2013 [09:30]
monia
Олег Намятов
Автор теми
Зареєстрован(а) с: 21.05.2012
Повідомлення: 173
Рома, подскажи
Возможно ли изменить размер поля "Лог ошибок"

я пытался его изменить вот таким образом
JAVASCRIPT
req = SYS.XMLNode("set").setAttr("path","/sub_DAQ/mod_JavaLikeCalc/lib_MyLibSetup/fnc_AlarmIO/%2fexec%2fio%2fErrLog");
req.childAdd("fld").setAttr("acs","6").setAttr("cols","100").setAttr("dscr","Лог ошибок").setAttr("id","ErrLog").setAttr("rows","10").setAttr("tp","str");
SYS.cntrReq(req);


делаю это для своего удобства, для просмотра ошибок

скриншот в файле
Вкладений файл

Снимок экрана от 2013-07-05 10:28:04.png (Тип файлу: image/png, Розмір: 193.42 кілобайтів) — 2352 завантажень
Повідомлення створено: 05. 07. 2013 [09:56]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
"monia" wrote:

Возможно ли изменить размер поля "Лог ошибок"

Информационные поля менять нельзя!

Learn, learn and learn better than work, work and work.
Повідомлення створено: 18. 07. 2014 [10:28]
adsum
Andrew S
Зареєстрован(а) с: 03.10.2013
Повідомлення: 31
Подскажите пожалуйста, в чём я ошибаюсь
При выполнении следующего скрипта
JAVASCRIPT
req = SYS.XMLNode("add").setAttr("path","/DAQ/SNMP/SwitchDLink8").setAttr("id","SwitchDLink8").setText("Коммутатор DLink 8");
SYS.cntrReq(req);
Получаю ошибку
<XMLNodeObj:add id="SwitchDLink8" mcat="/WorkStation/sub_DAQ/mod_SNMP/" path="/DAQ/SNMP/SwitchDLink8" rez="2" user="root">Элемент &apos;SwitchDLink8&apos; отсутствует или отключен!
</XMLNodeObj:add>

При этом, насколько я помню, я проверял его на предыдущих версиях, и он работал.
Сейчас установлена 0.8.0.10
Повідомлення створено: 18. 07. 2014 [10:47]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
"adsum" wrote:

<XMLNodeObj:add id="SwitchDLink8" mcat="/WorkStation/sub_DAQ/mod_SNMP/" path="/DAQ/SNMP/SwitchDLink8" rez="2" user="root">Элемент 'SwitchDLink8' отсутствует или отключен!
</XMLNodeObj:add>

При этом, насколько я помню, я проверял его на предыдущих версиях, и он работал.

Оно и работает иначе-бы и с конфигуратора такой операции не сделать.
В вашем случае отсутсвует объект контроллера "SwitchDLink8" в котором Вы патаетесь создать одноимённый объект параметра "SwitchDLink8".

Learn, learn and learn better than work, work and work.
Повідомлення створено: 18. 07. 2014 [11:16]
adsum
Andrew S
Зареєстрован(а) с: 03.10.2013
Повідомлення: 31
Спасибо. Понял свою ошибку.
Собственно контроллер я и пытался создать. Есть ли такая возможность из JavaScript? Если можно, подскажите как.
Повідомлення створено: 18. 07. 2014 [11:56]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
"adsum" wrote:

Спасибо. Понял свою ошибку.
Собственно контроллер я и пытался создать. Есть ли такая возможность из JavaScript? Если можно, подскажите как.

Если поняли ошибку, то к чему вопрос как?

Всё что можно из конфигуратора можно и запросом, а как, для параметра есть выше. Аналогично и для контроллера:
JAVASCRIPT
req = SYS.XMLNode("add").setAttr("path","/DAQ/SNMP/%2fbr%2fcntr_").setAttr("id","SwitchDLink8").setText("Коммутатор DLink 8");
SYS.cntrReq(req);


Learn, learn and learn better than work, work and work.



6632