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

Протокол обмена с счетчиками Меркурий 200 и Меркурий 230


Автор Повідомлення
Повідомлення створено: 05. 02. 2019 [12:48]
pr_Black
Vladislav Mastenitca
Зареєстрован(а) с: 05.02.2019
Повідомлення: 1
Всем доброго времени суток!
Подскажите как модифицировать протоколы для опроса счетчиков через концентраторы Меркурий 225.11. В программировании не совсем новичок, но под СКАДА пробую писать первый раз и JavaLikeCalc вкупе системными переменными, привязанными к разным модулям, воспринимаются для понимания очень тяжело :(
Передача от счетчиков концентраторам по сети 0,4 кВ по протоколу PLC-I. получить данные от концентраторов при этом обращаться по адресу концентратора с указанием адреса счетчика. Протокол обмена Инкотекс мне по запросу передал.
от АРМ переходник usb2rs485 далее на шине три концентратора (по одному на каждой фазе) далее на линии 0,4 кВ однофазные счетчики М201.22. адреса счетчикам задавались через программатор. штатными средствами BMonitor и BQuark показания получаются. но нужна скада :(

[Повідомлення редагувалось 1 раз(ів), останній раз 05.02.2019 в 13:42.]
Повідомлення створено: 05. 02. 2019 [13:56]
Godzilla
Арсен Закоян
Contributor
Автор теми
Зареєстрован(а) с: 12.02.2013
Повідомлення: 123
Насколько я помню у концентраторов свой протокол обмена. Нужно его описание, тогда и написать его реализацию на скаде можно.
Повідомлення створено: 05. 02. 2019 [14:07]
Godzilla
Арсен Закоян
Contributor
Автор теми
Зареєстрован(а) с: 12.02.2013
Повідомлення: 123
А если у вас есть и протокол обмена скиньте мне его в лс например
Повідомлення створено: 29. 04. 2019 [15:09]
Godzilla
Арсен Закоян
Contributor
Автор теми
Зареєстрован(а) с: 12.02.2013
Повідомлення: 123
"tavx" wrote:

Вот я и не могу понять почему потерялся ответ.


В связи с тем что на форум закрыт доступ из России пришлось долго искать обходные пути. Если еще актуально, попробуйте в транспортном протоколе вставить вместо
JAVASCRIPT
resp1 = tr.messIO(request+CRC);
resp2 = tr.messIO("");
resp3 = tr.messIO("");
resp=(resp1+resp2+resp3);

следующее
JAVASCRIPT
resp = tr.messIO(request+CRC);

а если не поможет то
JAVASCRIPT
resp1 = tr.messIO(request+CRC);
resp2 = tr.messIO("");
resp3 = tr.messIO("");
resp4 = tr.messIO("");
resp=(resp1+resp2+resp3+resp4);




Повідомлення створено: 29. 04. 2019 [15:50]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3747
"Godzilla" wrote:

"tavx" wrote:

Вот я и не могу понять почему потерялся ответ.

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

Скорее IP хоста тут: http://oscada.org/ru/novosti/odinochnaja-stranica/article/ddos-on-the-openscada-server/

Learn, learn and learn better than work, work and work.
Повідомлення створено: 29. 04. 2019 [16:31]
Godzilla
Арсен Закоян
Contributor
Автор теми
Зареєстрован(а) с: 12.02.2013
Повідомлення: 123

Почти все IP из Китая, причем тут Россия?
Повідомлення створено: 25. 01. 2020 [14:54]
walhi
Sergey Karpesh
Зареєстрован(а) с: 26.01.2016
Повідомлення: 29
Снял небольшой ролик по данной теме. Счетчик: Меркурий 206 PRNO. https://youtu.be/rTEl0fgKoyM
Повідомлення створено: 23. 09. 2020 [18:57]
KION
DEnis Bublikoff
Зареєстрован(а) с: 23.09.2020
Повідомлення: 3
Здравствуйте.. У меня появилась задача организовать опрос счетчиков Меркурий 234 в Open Scada, протокол был взят из репозиториев OS, с помощью описания к протоколу был настроен опрос через ОВЕН AC4 по rs 485, но появилась проблема следующего характера, прибор принимает пароль и отвечает открытием канала это видно в логах OS, но при этом чтения мгновенных значений не происходит, все значения имеют статус EVAL. так же было проверенно через Конфигуратор Меркуриев что линия связи полностью работоспособна и адрес счетчика соответствует. Не могу понять в чем затык, помогите пожалуйста, разобраться. перечитал всю тему, результатов нет(
Повідомлення створено: 23. 09. 2020 [20:02]
Sfinx2
Zubarev Dmitriy
Зареєстрован(а) с: 03.02.2018
Повідомлення: 29
Пару лет назад была похожая ситуация, только еще более бредовая....
12 счетчиков Меркурий 230. С одинаковыми параметрами. С прекрасно работающим заводским конфигуратором.... Со всеми 12, да.
Но при опросе из OpenSCADA два счетчика не желали передавать данные вообще. Все счетчики счетчики на одной шине RS-485. C кабелем все норм. Дублирования адресов тоже не было. Но два проклятых счетчика молчали. (прекрасно работая с заводским конфигуратором меркуриев, я на тот комп даже винду ставил для теста - все норм. ) Из оставшихся пара счетчиков не выдавала всех опрашиваемых данных - EVALвместо показаний напряжения, кажется.
Вообщем решил правкой шаблона, отключив одну из проверок, вот так:

JAVASCRIPT
if(f_start)
//очищаем все данные
{answer = EVAL_STR;TSAp  = EVAL_STR;TSAm = EVAL_STR;TSRp = EVAL_STR;TSRm = EVAL_STR;
T1Ap  = EVAL_STR;T1Am = EVAL_STR;T1Rp = EVAL_STR;T1Rm = EVAL_STR;T2Ap  = EVAL_STR;T2Am = EVAL_STR;
T2Rp = EVAL_STR;T2Rm = EVAL_STR; T3Ap  = EVAL_STR;T3Am = EVAL_STR;T3Rp = EVAL_STR;T3Rm = EVAL_STR;
T4Ap  = EVAL_STR;T4Am = EVAL_STR;T4Rp = EVAL_STR;T4Rm = EVAL_STR;
PS = EVAL_STR;P1= EVAL_STR;P2= EVAL_STR;P3= EVAL_STR;U1= EVAL_STR;U2= EVAL_STR;U3= EVAL_STR;
I1= EVAL_STR;I2= EVAL_STR;I3= EVAL_STR;QS= EVAL_STR;Q1= EVAL_STR;Q2= EVAL_STR;Q3= EVAL_STR;
SS= EVAL_STR;S1= EVAL_STR;S2= EVAL_STR;S3= EVAL_STR;KS= EVAL_STR;K1= EVAL_STR;K2= EVAL_STR;
K3= EVAL_STR;F1= EVAL_STR;N1= EVAL_STR;}
//отправка пароля
req = SYS.XMLNode().setAttr("ProtIt","m230").setAttr("netaddr",netaddr).setAttr("data",SYS.strFromCharCode(0x01,0x01,Special.FLibSYS.str2int(password.slice(0,1)),Special.FLibSYS.str2int(password.slice(1,2)),Special.FLibSYS.str2int(password.slice(2,3)),Special.FLibSYS.str2int(password.slice(3,4)),Special.FLibSYS.str2int(password.slice(4,5)),Special.FLibSYS.str2int(password.slice(5,6))));
SYS.Transport["Serial"]["out_"+transport].messIO(req,"UserProtocol");
answer =req.text();
//Энергия от сброса сумма Т
if(TS){
req = SYS.XMLNode().setAttr("ProtIt","m230").setAttr("netaddr",netaddr).setAttr("data",SYS.strFromCharCode(0x05,0x00,0x00));
SYS.Transport["Serial"]["out_"+transport].messIO(req,"UserProtocol");
if(!req.text()){TSAp  = EVAL_STR;TSAm = EVAL_STR;TSRp = EVAL_STR;TSRm = EVAL_STR; }
else {
if(req.text().slice(0,10)!=2147483647)TSAp=req.text().slice(0,10)/1000;
else TSAp= EVAL_STR;
if(req.text().slice(10,20)!=2147483647)TSAm=req.text().slice(10,20)/1000;
else TSAm= EVAL_STR;
if(req.text().slice(20,30)!=2147483647)TSRp=req.text().slice(20,30)/1000;
else TSRp= EVAL_STR;
if(req.text().slice(30,40)!=2147483647)TSAm=req.text().slice(30,40)/1000;
else TSRm= EVAL_STR;}
}
if(T1){
//Энергия от сброса Т1
req = SYS.XMLNode().setAttr("ProtIt","m230").setAttr("netaddr",netaddr).setAttr("data",SYS.strFromCharCode(0x05,0x00,0x01));
SYS.Transport["Serial"]["out_"+transport].messIO(req,"UserProtocol");
if(!req.text()){T1Ap  = EVAL_STR;T1Am = EVAL_STR;T1Rp = EVAL_STR;T1Rm = EVAL_STR; }
else {
if(req.text().slice(0,10)!=2147483647)T1Ap=req.text().slice(0,10)/1000;
else T1Ap= EVAL_STR;
if(req.text().slice(10,20)!=2147483647)T1Am=req.text().slice(10,20)/1000;
else T1Am= EVAL_STR;
if(req.text().slice(20,30)!=2147483647)T1Rp=req.text().slice(20,30)/1000;
else T1Rp= EVAL_STR;
if(req.text().slice(30,40)!=2147483647)T1Am=req.text().slice(30,40)/1000;
else T1Rm= EVAL_STR;}
}
//Энергия от сброса Т2
if(T2){
req = SYS.XMLNode().setAttr("ProtIt","m230").setAttr("netaddr",netaddr).setAttr("data",SYS.strFromCharCode(0x05,0x00,0x02));
SYS.Transport["Serial"]["out_"+transport].messIO(req,"UserProtocol");
if(!req.text()){T2Ap  = EVAL_STR;T2Am = EVAL_STR;T2Rp = EVAL_STR;T2Rm = EVAL_STR; }
else {
if(req.text().slice(0,10)!=2147483647)T2Ap=req.text().slice(0,10)/1000;
else T2Ap= EVAL_STR;
if(req.text().slice(10,20)!=2147483647)T2Am=req.text().slice(10,20)/1000;
else T2Am= EVAL_STR;
if(req.text().slice(20,30)!=2147483647)T2Rp=req.text().slice(20,30)/1000;
else T2Rp= EVAL_STR;
if(req.text().slice(30,40)!=2147483647)T2Am=req.text().slice(30,40)/1000;
else T2Rm= EVAL_STR;}
}
//Энергия от сброса Т3
if(T3){
req = SYS.XMLNode().setAttr("ProtIt","m230").setAttr("netaddr",netaddr).setAttr("data",SYS.strFromCharCode(0x05,0x00,0x03));
SYS.Transport["Serial"]["out_"+transport].messIO(req,"UserProtocol");
if(!req.text()){T3Ap  = EVAL_STR;T3Am = EVAL_STR;T3Rp = EVAL_STR;T3Rm = EVAL_STR; }
else {
if(req.text().slice(0,10)!=2147483647)T3Ap=req.text().slice(0,10)/1000;
else T3Ap= EVAL_STR;
if(req.text().slice(10,20)!=2147483647)T3Am=req.text().slice(10,20)/1000;
else T3Am= EVAL_STR;
if(req.text().slice(20,30)!=2147483647)T3Rp=req.text().slice(20,30)/1000;
else T3Rp= EVAL_STR;
if(req.text().slice(30,40)!=2147483647)T3Am=req.text().slice(30,40)/1000;
else T3Rm= EVAL_STR;}
}
//Энергия от сброса Т4
if(T4){
req = SYS.XMLNode().setAttr("ProtIt","m230").setAttr("netaddr",netaddr).setAttr("data",SYS.strFromCharCode(0x05,0x00,0x04));
SYS.Transport["Serial"]["out_"+transport].messIO(req,"UserProtocol");
if(!req.text()){T4Ap  = EVAL_STR;T4Am = EVAL_STR;T4Rp = EVAL_STR;T4Rm = EVAL_STR; }
else {
if(req.text().slice(0,10)!=2147483647)T4Ap=req.text().slice(0,10)/1000;
else T4Ap= EVAL_STR;
if(req.text().slice(10,20)!=2147483647)T4Am=req.text().slice(10,20)/1000;
else T4Am= EVAL_STR;
if(req.text().slice(20,30)!=2147483647)T4Rp=req.text().slice(20,30)/1000;
else T4Rp= EVAL_STR;
if(req.text().slice(30,40)!=2147483647)T4Am=req.text().slice(30,40)/1000;
else T4Rm= EVAL_STR;}
}
//Мощность P
if(P){
req = SYS.XMLNode().setAttr("ProtIt","m230").setAttr("netaddr",netaddr).setAttr("data",SYS.strFromCharCode(0x08,0x16,0x00));
SYS.Transport["Serial"]["out_"+transport].messIO(req,"UserProtocol");
if(!req.text()){PS=EVAL_STR;P1=EVAL_STR;P2=EVAL_STR;P3=EVAL_STR;}
else PS=req.text().slice(0,7)/100;P1=req.text().slice(7,14)/100;P2=req.text().slice(14,21)/100;P3=req.text().slice(21,28)/100;}
//Мощность Q
if(Q){
req = SYS.XMLNode().setAttr("ProtIt","m230").setAttr("netaddr",netaddr).setAttr("data",SYS.strFromCharCode(0x08,0x16,0x04));
SYS.Transport["Serial"]["out_"+transport].messIO(req,"UserProtocol");
if(!req.text()){QS=EVAL_REAL;Q1=EVAL_REAL;Q2=EVAL_REAL;Q3=EVAL_REAL;}
else 
{if (req.text().slice(28,29)==4||req.text().slice(28,29)=="C")QS=(req.text().slice(0,7)/100)*-1;
else QS=(req.text().slice(0,7)/100);
if (req.text().slice(29,30)==4||req.text().slice(29,30)=="C")Q1=(req.text().slice(7,14)/100)*-1;
else Q1=(req.text().slice(7,14)/100);
if (req.text().slice(30,31)==4||req.text().slice(30,31)=="C")Q2=(req.text().slice(14,21)/100)*-1;
else Q2=(req.text().slice(14,21)/100);
if (req.text().slice(31,32)==4||req.text().slice(31,32)=="C")Q3=(req.text().slice(21,28)/100)*-1;
else Q3=(req.text().slice(21,28)/100);}}
//Мощность S
if(S){
req = SYS.XMLNode().setAttr("ProtIt","m230").setAttr("netaddr",netaddr).setAttr("data",SYS.strFromCharCode(0x08,0x16,0x08));
SYS.Transport["Serial"]["out_"+transport].messIO(req,"UserProtocol");
if(!req.text()){SS=EVAL_STR;S1=EVAL_STR;S2=EVAL_STR;S3=EVAL_STR;}
else SS=req.text().slice(0,7)/100;S1=req.text().slice(7,14)/100;S2=req.text().slice(14,21)/100;S3=req.text().slice(21,28)/100;}
// Напряжение U
if(U){
req = SYS.XMLNode().setAttr("ProtIt","m230").setAttr("netaddr",netaddr).setAttr("data",SYS.strFromCharCode(0x08,0x16,0x11));
SYS.Transport["Serial"]["out_"+transport].messIO(req,"UserProtocol");
if(!req.text()){U1=EVAL_STR;U2=EVAL_STR;U3=EVAL_STR;}
else U1=req.text().slice(0,8)/100;U2=req.text().slice(8,16)/100;U3=req.text().slice(16,24)/100;}
//Ток I
if(I){
req = SYS.XMLNode().setAttr("ProtIt","m230").setAttr("netaddr",netaddr).setAttr("data",SYS.strFromCharCode(0x08,0x16,0x21));
SYS.Transport["Serial"]["out_"+transport].messIO(req,"UserProtocol");
if(!req.text()){I1=EVAL_STR;I2=EVAL_STR;I3=EVAL_STR;}
else I1=req.text().slice(0,8)/1000;I2=req.text().slice(8,16)/1000;I3=req.text().slice(16,24)/1000;}
//Коэффициент мощности
if(K){
req = SYS.XMLNode().setAttr("ProtIt","m230").setAttr("netaddr",netaddr).setAttr("data",SYS.strFromCharCode(0x08,0x16,0x30));
SYS.Transport["Serial"]["out_"+transport].messIO(req,"UserProtocol");
if(!req.text()){KS=EVAL_STR;K1=EVAL_STR;K2=EVAL_STR;K3=EVAL_STR;}
else KS=req.text().slice(0,7)/1000;K1=req.text().slice(7,14)/1000;K2=req.text().slice(14,21)/1000;K3=req.text().slice(21,28)/1000;}
//частота F
if(F){
req = SYS.XMLNode().setAttr("ProtIt","m230").setAttr("netaddr",netaddr).setAttr("data",SYS.strFromCharCode(0x08,0x16,0x40));
SYS.Transport["Serial"]["out_"+transport].messIO(req,"UserProtocol");
if(!req.text())F1= EVAL_STR;
else F1 =req.text();}
//серийный номер
if(N){
req = SYS.XMLNode().setAttr("ProtIt","m230").setAttr("netaddr",netaddr).setAttr("data",SYS.strFromCharCode(0x08,0x00));
SYS.Transport["Serial"]["out_"+transport].messIO(req,"UserProtocol");
if(!req.text())N1= EVAL_STR;
else N1 =req.text();}
Повідомлення створено: 24. 09. 2020 [09:29]
KION
DEnis Bublikoff
Зареєстрован(а) с: 23.09.2020
Повідомлення: 3
Что то я не увидел изменений в коде, сегодня поставил монитор порта, счётчик отвечает довольно хорошо, а склада не может расшифровать как буд то нормально пакеты



2161