Written on: 14. 01. 2011 [11:33]
|
TY_Obninsk
Илья Клемышев
Topic creator
registered since: 14.01.2011
Posts: 63
|
Скажите пожалуйста, как я могу собирать данные с модуля I-7015? Он не значится среди поддерживаемых модулем DCON. Нужно ли для этого дорабатывать данный модуль или есть другие пути решения?
|
Written on: 14. 01. 2011 [12:23]
|
almaz
Almaz Karimov
Contributor
registered since: 25.09.2008
Posts: 516
|
Попробуйте прочитать с него как с I-7017. Вариантов подключения много. Можно добавить модуль в существующий драйвер, но лучше переделать для поддержки любых блоков по DCON. Чем и занимаюсь. Можно в ява написать программу обмена:
http://oscada.org/ru/forum/posts/vnedrenie/opros_ustroistv_po_sobytiju/
21 век - век повсеместной автоматизации. Главное - во благо всем людям.
|
Written on: 14. 01. 2011 [14:27]
|
TY_Obninsk
Илья Клемышев
Topic creator
registered since: 14.01.2011
Posts: 63
|
Спасибо, попробую!...как только разберусь с портом: http://oscada.org/ru/forum/posts/otslezhivanie_oshibok/oshibka_podkljuchenija_k_posledovatelnomu_portu/#pid
:wink:
|
Written on: 19. 01. 2011 [16:00]
|
TY_Obninsk
Илья Клемышев
Topic creator
registered since: 14.01.2011
Posts: 63
|
Almaz, прочитать как с I-7017 не получается - все значения = 0, ошибка длины пакета.
Создал "Выходной транспорт" последовательного интерфейса, запускаю, пробую отправить запрос (скажем, команда запроса конфигурации модуля- "$022" в текстовом режиме) - вылетает ошибка "Время исчерпано!".
еще такой вопрос: использовать "Пользовательский протокол" возможно с "Выходным транспортом"? Или как иначе делать запросы к модулям?
|
Written on: 19. 01. 2011 [18:25]
|
TY_Obninsk
Илья Клемышев
Topic creator
registered since: 14.01.2011
Posts: 63
|
нюанс с запросом решен!...оказалось, что при вводе команды необходимо вставлять символ возврата каретки, тогда приходит ответ от модуля: "$022\r"
P.S. кстати, при посылке еще одного запроса (второго, команда та же), программа виснет.
но вопрос сбора данных с модуля остается открытым!
[This article was edited 1 times, at last 19.01.2011 at 18:32.]
|
Written on: 20. 01. 2011 [10:59]
|
almaz
Almaz Karimov
Contributor
registered since: 25.09.2008
Posts: 516
|
Для меня открыт вопрос опроса любых модулей по протоколу DCON (чтобы не городить для каждого блока ввода-вывода свои процедуры в исходнике OpenSCADA). Всё что нужно для опроса любых устройств из явы обсуждалось в теме:
http://oscada.org/ru/forum/posts/vnedrenie/opros_ustroistv_po_sobytiju/
Пробуйте сделать в ява - знание пригодится!
21 век - век повсеместной автоматизации. Главное - во благо всем людям.
|
Written on: 24. 01. 2011 [18:12]
|
TY_Obninsk
Илья Клемышев
Topic creator
registered since: 14.01.2011
Posts: 63
|
Дополнил DCON-модуль кодом для 7015 модуля, данные собираются. Может оно и не пригодится никому, просто у меня проект "горит". Модуль аналогичен полностью I-7017, кроме того, что у него 6 (AI) против 8.
измененные участки кода DCON_client.cpp:
...
tpPrmAt(t_prm).fldAdd( new TFld("MOD_TP",_("I-7000 module type"),TFld::Integer,TFld::Selected|TCfg::NoVal,"1","0","0;1;2;3;4;5;6;7",_("I-7051;I-7045;I-7063;I-7017;I-7024;I-7015;NL-8AI;HostOK")) );
...
//> Read DAQ parameter's for I-7015 module
case 5:
{
//> Request with I-7015 module
pdu = "#" + HexSymbol[15 & (cntr.p_hd[i_p].at().mod_addr>>4)] + HexSymbol[15 & cntr.p_hd[i_p].at().mod_addr];
if (cntr.p_hd[i_p].at().crc_ctrl) pdu+=cntr.DCONCRC(pdu);
if (cntr.p_hd[i_p].at().crc_ctrl) acq_len=45; else acq_len=43;
// cout << pdu.substr(0,pdu.size()) << " writing\n";
cntr.p_hd[i_p].at().acq_err=cntr.DCONReq(pdu);
// cout << pdu.substr(0,pdu.size()-1) << " reading\n";
//Check errors
cntr.p_hd[i_p].at().acq_err=_("No errors");
cntr.p_hd[i_p].at().module_err=false;
if ((pdu.size()-1)!=acq_len) {cntr.p_hd[i_p].at().module_err=true; cntr.p_hd[i_p].at().acq_err=_("Module packet length error");}
if ((!cntr.p_hd[i_p].at().module_err)&&(pdu.size()>0)) if (pdu.substr(0,1)!=">") {cntr.p_hd[i_p].at().module_err=true;cntr.p_hd[i_p].at().acq_err=_("Invalid module response");}
if ((cntr.p_hd[i_p].at().crc_ctrl)&&(!cntr.p_hd[i_p].at().module_err)&&(pdu.size()>44)) if ((pdu.substr(43,2))!=(cntr.DCONCRC(pdu.substr(0,43)))) {cntr.p_hd[i_p].at().module_err=true;cntr.p_hd[i_p].at().acq_err=_("Invalid module CRC");}
//Set DAQ attributes
if ((!cntr.p_hd[i_p].at().module_err)&&(pdu.size()>42))
{
cntr.p_hd[i_p].at().AI[0]=atof(pdu.substr(1,7).c_str());
cntr.p_hd[i_p].at().AI[1]=atof(pdu.substr(8,7).c_str());
cntr.p_hd[i_p].at().AI[2]=atof(pdu.substr(15,7).c_str());
cntr.p_hd[i_p].at().AI[3]=atof(pdu.substr(22,7).c_str());
cntr.p_hd[i_p].at().AI[4]=atof(pdu.substr(29,7).c_str());
cntr.p_hd[i_p].at().AI[5]=atof(pdu.substr(36,7).c_str());
}
break;
}
...
//>> Make DAQ parameter's for I-7015 module
case 5:
{
p_el.fldAdd( new TFld("module_err","module_err",TFld::Boolean,TFld::NoWrite|TVal::DirRead,"","","","",smodTp.c_str()) );
for( int i_p = 0; i_p < 6; i_p++ )
p_el.fldAdd( new TFld(TSYS::strMess("AI%d",i_p).c_str(),TSYS::strMess("AI%d",i_p).c_str(),
TFld::Real,TFld::NoWrite|TVal::DirRead,"","","","",smodTp.c_str()) );
break;
}
соответственно, изменил порядок case'ов. надеюсь, ничего не забыл :)
Attachment
DCON_client.cpp (File type: text/x-c++src, Size: 35.11 kilobytes) — 1601 downloads
|
Written on: 24. 01. 2011 [18:15]
|
TY_Obninsk
Илья Клемышев
Topic creator
registered since: 14.01.2011
Posts: 63
|
Almaz, у меня в наличии имеются I-7060D и I-7018, если вдруг понадобятся для испытаний протокола или еще зачем-нибудь!
|
Written on: 25. 01. 2011 [07:16]
|
almaz
Almaz Karimov
Contributor
registered since: 25.09.2008
Posts: 516
|
Пригодятся... Вам проще оказалось сделать в си++, чем в ява. Аналогично можно прицепить любую железку с известным протоколом.
21 век - век повсеместной автоматизации. Главное - во благо всем людям.
|