помогите с XML
| 1 | 2 | 3 | Next » | Last
Author |
Message |
Written on: 03. 07. 2013 [13:56]
|
monia
Олег Намятов
Topic creator
registered since: 21.05.2012
Posts: 173
|
написал небольшой скрипт на изменение привязок параметров аварии "CO 1 порог" для обработки 94 объектов
Все работает нормально
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 и немного по форуму пошарился
если не сложно напишите пример хотя бы на добавления узла обработки в контроллер логического уровня
Attachment
|
Written on: 04. 07. 2013 [08:51]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 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
Хотя если одноимённый узел уже есть то запрос просто проигнорируется.
Раз уж используете запросы к интерфейсу управления то читать нужно здесь http://wiki.oscada.org/Doc/API#h154-1 и смотреть в исходники, поскольку данный механизм не позиционируется как пользовательский.
"monia" wrote:
если не сложно напишите пример хотя бы на добавления узла обработки в контроллер логического уровня
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.
|
Written on: 04. 07. 2013 [13:55]
|
monia
Олег Намятов
Topic creator
registered since: 21.05.2012
Posts: 173
|
а где можно почитать про
1) %2fbr%2fprm_
2) %2fcfg%2fprm%2fel_1
Я попробовал добавить узел, все получилось. Даже есть проверка на дублирование, XML запрос выдает предупреждение и не чего не делает.
спасибо за пример
Рома можешь оценить код
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);
}
}
Можно ли код минимизировать? спрашиваю на будущее, хочу еще несколько штук придумать для облегчение своего труда
[This article was edited 1 times, at last 04.07.2013 at 14:39.]
|
Written on: 04. 07. 2013 [18:15]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
"monia" wrote:
а где можно почитать про
1) %2fbr%2fprm_
2) %2fcfg%2fprm%2fel_1
Выше я писал:
"roman" wrote:
Раз уж используете запросы к интерфейсу управления то читать нужно здесь http://wiki.oscada.org/Doc/API#h154-1 и смотреть в исходники, поскольку данный механизм не позиционируется как пользовательский.
"monia" wrote:
Рома можешь оценить код
Раз запрос фактически к одному элементу интерфейса то это всё можно сгруппировать
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.
|
Written on: 05. 07. 2013 [09:30]
|
monia
Олег Намятов
Topic creator
registered since: 21.05.2012
Posts: 173
|
Рома, подскажи
Возможно ли изменить размер поля "Лог ошибок"
я пытался его изменить вот таким образом
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);
делаю это для своего удобства, для просмотра ошибок
скриншот в файле
Attachment
|
Written on: 05. 07. 2013 [09:56]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
"monia" wrote:
Возможно ли изменить размер поля "Лог ошибок"
Информационные поля менять нельзя!
Learn, learn and learn better than work, work and work.
|
Written on: 18. 07. 2014 [10:28]
|
adsum
Andrew S
registered since: 03.10.2013
Posts: 31
|
Подскажите пожалуйста, в чём я ошибаюсь
При выполнении следующего скрипта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">Элемент 'SwitchDLink8' отсутствует или отключен!
</XMLNodeObj:add>
При этом, насколько я помню, я проверял его на предыдущих версиях, и он работал.
Сейчас установлена 0.8.0.10
|
Written on: 18. 07. 2014 [10:47]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 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.
|
Written on: 18. 07. 2014 [11:16]
|
adsum
Andrew S
registered since: 03.10.2013
Posts: 31
|
Спасибо. Понял свою ошибку.
Собственно контроллер я и пытался создать. Есть ли такая возможность из JavaScript? Если можно, подскажите как.
|
Written on: 18. 07. 2014 [11:56]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
"adsum" wrote:
Спасибо. Понял свою ошибку.
Собственно контроллер я и пытался создать. Есть ли такая возможность из 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.
|
| 1 | 2 | 3 | Next » | Last
|
|