Українська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
Сообщения: 3742
"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
Сообщения: 28
Снял небольшой ролик по данной теме. Счетчик: Меркурий 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
Что то я не увидел изменений в коде, сегодня поставил монитор порта, счётчик отвечает довольно хорошо, а склада не может расшифровать как буд то нормально пакеты



3035