Commit 7641f93c authored by Pavel Vainerman's avatar Pavel Vainerman

(MBSlave): исправлена ошибка с обработкой prop_prefix, добавлена возможность

задавать его принудительно --xxx-set-prop-prefix.
parent 32d7f514
...@@ -44,6 +44,7 @@ Version 2.0 ...@@ -44,6 +44,7 @@ Version 2.0
uniset-codegen: добавить ключ --gen-sensor-name для генерирования name_Item.. (чтобы можно было в логах использовать текстовые названия) uniset-codegen: добавить ключ --gen-sensor-name для генерирования name_Item.. (чтобы можно было в логах использовать текстовые названия)
- перевести PassiveTimer на использование crono:: (c++11)
Version 2.1 Version 2.1
============ ============
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
Name: libuniset2 Name: libuniset2
Version: 2.0 Version: 2.0
Release: alt24 Release: alt25
Summary: UniSet - library for building distributed industrial control systems Summary: UniSet - library for building distributed industrial control systems
...@@ -409,6 +409,10 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname ...@@ -409,6 +409,10 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
# .. # ..
%changelog %changelog
* Tue Apr 07 2015 Pavel Vainerman <pv@altlinux.ru> 2.0-alt25
- fixed bug in 'MBSlave' (thank`s Alexandr Hanadeev)
- add --xxx-set-prop-prefix for MBSlave
* Thu Apr 02 2015 Pavel Vainerman <pv@altlinux.ru> 2.0-alt24 * Thu Apr 02 2015 Pavel Vainerman <pv@altlinux.ru> 2.0-alt24
- codegen: modify interface for messages (setMsg()) - codegen: modify interface for messages (setMsg())
- remove alarm() function (deprecated) - remove alarm() function (deprecated)
......
...@@ -53,6 +53,8 @@ pollActivated(false) ...@@ -53,6 +53,8 @@ pollActivated(false)
dinfo << myname << "(init): read fileter-field='" << s_field dinfo << myname << "(init): read fileter-field='" << s_field
<< "' filter-value='" << s_fvalue << "'" << endl; << "' filter-value='" << s_fvalue << "'" << endl;
prop_prefix = initPropPrefix();
stat_time = conf->getArgPInt("--" + prefix + "-statistic-sec",it.getProp("statistic_sec"),0); stat_time = conf->getArgPInt("--" + prefix + "-statistic-sec",it.getProp("statistic_sec"),0);
if( stat_time > 0 ) if( stat_time > 0 )
ptStatistic.setTiming(stat_time*1000); ptStatistic.setTiming(stat_time*1000);
...@@ -141,6 +143,30 @@ pollActivated(false) ...@@ -141,6 +143,30 @@ pollActivated(false)
activateTimeout = conf->getArgPInt("--" + prefix + "-activate-timeout", 20000); activateTimeout = conf->getArgPInt("--" + prefix + "-activate-timeout", 20000);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
std::string MBExchange::initPropPrefix( const std::string& def_prop_prefix )
{
auto conf = uniset_conf();
string pp(def_prop_prefix);
// если задано поле для "фильтрации"
// то в качестве префикса используем его
if( !s_field.empty() )
pp = s_field + "_";
// если "принудительно" задан префикс
// используем его.
{
string p("--" + prefix + "-set-prop-prefix");
string v = conf->getArgParam(p,"");
if( !v.empty() && v[0] != '-' )
pp = v;
// если параметр всё-таки указан, считаем, что это попытка задать "пустой" префикс
else if( findArgParam(p,conf->getArgc(),conf->getArgv()) != -1 )
pp = "";
}
return pp;
}
// -----------------------------------------------------------------------------
void MBExchange::help_print( int argc, const char* const* argv ) void MBExchange::help_print( int argc, const char* const* argv )
{ {
cout << "--prefix-name name - ObjectId (имя) процесса. По умолчанию: MBExchange1" << endl; cout << "--prefix-name name - ObjectId (имя) процесса. По умолчанию: MBExchange1" << endl;
......
...@@ -286,6 +286,8 @@ class MBExchange: ...@@ -286,6 +286,8 @@ class MBExchange:
bool initRTUDevice( RTUDevice* d, UniXML::iterator& it ); bool initRTUDevice( RTUDevice* d, UniXML::iterator& it );
virtual bool initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXML::iterator& it ); virtual bool initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXML::iterator& it );
std::string initPropPrefix( const std::string& def_prop_prefix="" );
void rtuQueryOptimization( RTUDeviceMap& m ); void rtuQueryOptimization( RTUDeviceMap& m );
xmlNode* cnode; xmlNode* cnode;
......
...@@ -22,24 +22,8 @@ pollThread(0) ...@@ -22,24 +22,8 @@ pollThread(0)
auto conf = uniset_conf(); auto conf = uniset_conf();
// префикс для "свойств" - по умолчанию // префикс для "свойств" - по умолчанию "tcp_";
prop_prefix = "tcp_"; prop_prefix = initPropPrefix("tcp_");
// если задано поле для "фильтрации"
// то в качестве префикса используем его
if( !s_field.empty() )
prop_prefix = s_field + "_";
// если "принудительно" задан префикс
// используем его.
{
string p("--" + prefix + "-set-prop-prefix");
string v = conf->getArgParam(p,"");
if( !v.empty() && v[0] != '-' )
prop_prefix = v;
// если параметр всё-таки указан, считаем, что это попытка задать "пустой" префикс
else if( findArgParam(p,conf->getArgc(),conf->getArgv()) != -1 )
prop_prefix = "";
}
dinfo << myname << "(init): prop_prefix=" << prop_prefix << endl; dinfo << myname << "(init): prop_prefix=" << prop_prefix << endl;
UniXML::iterator it(cnode); UniXML::iterator it(cnode);
......
...@@ -24,24 +24,7 @@ checkThread(0) ...@@ -24,24 +24,7 @@ checkThread(0)
auto conf = uniset_conf(); auto conf = uniset_conf();
// префикс для "свойств" - по умолчанию prop_prefix = initPropPrefix("tcp_");
prop_prefix = "tcp_";
// если задано поле для "фильтрации"
// то в качестве префикса используем его
if( !s_field.empty() )
prop_prefix = s_field + "_";
// если "принудительно" задан префикс
// используем его.
{
string p("--" + prefix + "-set-prop-prefix");
string v = conf->getArgParam(p,"");
if( !v.empty() && v[0] != '-' )
prop_prefix = v;
// если параметр всё-таки указан, считаем, что это попытка задать "пустой" префикс
else if( findArgParam(p,conf->getArgc(),conf->getArgv()) != -1 )
prop_prefix = "";
}
dinfo << myname << "(init): prop_prefix=" << prop_prefix << endl; dinfo << myname << "(init): prop_prefix=" << prop_prefix << endl;
UniXML::iterator it(cnode); UniXML::iterator it(cnode);
......
...@@ -25,7 +25,8 @@ activateTimeout(500), ...@@ -25,7 +25,8 @@ activateTimeout(500),
pingOK(true), pingOK(true),
force(false), force(false),
mbregFromID(false), mbregFromID(false),
prefix(prefix) prefix(prefix),
prop_prefix("")
{ {
if( objId == DefaultObjectId ) if( objId == DefaultObjectId )
throw UniSetTypes::SystemError("(MBSlave): objId=-1?!! Use --mbs-name" ); throw UniSetTypes::SystemError("(MBSlave): objId=-1?!! Use --mbs-name" );
...@@ -50,6 +51,26 @@ prefix(prefix) ...@@ -50,6 +51,26 @@ prefix(prefix)
dinfo << myname << "(init): read s_field='" << s_field dinfo << myname << "(init): read s_field='" << s_field
<< "' s_fvalue='" << s_fvalue << "'" << endl; << "' s_fvalue='" << s_fvalue << "'" << endl;
// префикс для "свойств" - по умолчанию
prop_prefix = "";
// если задано поле для "фильтрации"
// то в качестве префикса используем его
if( !s_field.empty() )
prop_prefix = s_field + "_";
// если "принудительно" задан префикс
// используем его.
{
string p("--" + prefix + "-set-prop-prefix");
string v = conf->getArgParam(p,"");
if( !v.empty() && v[0] != '-' )
prop_prefix = v;
// если параметр всё-таки указан, считаем, что это попытка задать "пустой" префикс
else if( findArgParam(p,conf->getArgc(),conf->getArgv()) != -1 )
prop_prefix = "";
}
dinfo << myname << "(init): prop_prefix=" << prop_prefix << endl;
force = conf->getArgInt("--" + prefix + "-force",it.getProp("force")); force = conf->getArgInt("--" + prefix + "-force",it.getProp("force"));
// int recv_timeout = conf->getArgParam("--" + prefix + "-recv-timeout",it.getProp("recv_timeout"))); // int recv_timeout = conf->getArgParam("--" + prefix + "-recv-timeout",it.getProp("recv_timeout")));
...@@ -816,8 +837,6 @@ bool MBSlave::initItem( UniXML::iterator& it ) ...@@ -816,8 +837,6 @@ bool MBSlave::initItem( UniXML::iterator& it )
{ {
IOProperty p; IOProperty p;
string prop_prefix(prefix+"_");
if( !IOBase::initItem( static_cast<IOBase*>(&p),it,shm,prop_prefix,false,dlog(),myname) ) if( !IOBase::initItem( static_cast<IOBase*>(&p),it,shm,prop_prefix,false,dlog(),myname) )
return false; return false;
...@@ -828,7 +847,7 @@ bool MBSlave::initItem( UniXML::iterator& it ) ...@@ -828,7 +847,7 @@ bool MBSlave::initItem( UniXML::iterator& it )
string r = IOBase::initProp(it,"mbreg",prop_prefix,false); string r = IOBase::initProp(it,"mbreg",prop_prefix,false);
if( r.empty() ) if( r.empty() )
{ {
dcrit << myname << "(initItem): Unknown 'mbreg' for " << it.getProp("name") << endl; dcrit << myname << "(initItem): Unknown '" << prop_prefix << "mbreg' for " << it.getProp("name") << endl;
return false; return false;
} }
...@@ -866,14 +885,14 @@ bool MBSlave::initItem( UniXML::iterator& it ) ...@@ -866,14 +885,14 @@ bool MBSlave::initItem( UniXML::iterator& it )
p.nbyte = IOBase::initIntProp(it,"nbyte",prop_prefix,false); p.nbyte = IOBase::initIntProp(it,"nbyte",prop_prefix,false);
if( p.nbyte <=0 ) if( p.nbyte <=0 )
{ {
dcrit << myname << "(initItem): Unknown nbyte='' for " dcrit << myname << "(initItem): Unknown " << prop_prefix << "nbyte='' for "
<< it.getProp("name") << it.getProp("name")
<< endl; << endl;
return false; return false;
} }
else if( p.nbyte > 2 ) else if( p.nbyte > 2 )
{ {
dcrit << myname << "(initItem): BAD nbyte='" << p.nbyte << "' for " dcrit << myname << "(initItem): BAD " << prop_prefix << "nbyte='" << p.nbyte << "' for "
<< it.getProp("name") << it.getProp("name")
<< ". Must be [1,2]." << ". Must be [1,2]."
<< endl; << endl;
...@@ -928,6 +947,7 @@ void MBSlave::help_print( int argc, const char* const* argv ) ...@@ -928,6 +947,7 @@ void MBSlave::help_print( int argc, const char* const* argv )
cout << "--prefix-reply-timeout msec - Контрольное время для формирования ответа. " << endl cout << "--prefix-reply-timeout msec - Контрольное время для формирования ответа. " << endl
<< " Если обработка запроса превысит это время, ответ не будет послан (timeout)." << endl << " Если обработка запроса превысит это время, ответ не будет послан (timeout)." << endl
<< " По умолчанию: 3 сек" << endl; << " По умолчанию: 3 сек" << endl;
cout << "--prefix-set-prop-prefix [val] - Использовать для свойств указанный или пустой префикс." << endl;
cout << "--prefix-allow-setdatetime - On set date and time (0x50) modbus function" << endl; cout << "--prefix-allow-setdatetime - On set date and time (0x50) modbus function" << endl;
cout << "--prefix-my-addr - адрес текущего узла" << endl; cout << "--prefix-my-addr - адрес текущего узла" << endl;
......
...@@ -440,6 +440,7 @@ class MBSlave: ...@@ -440,6 +440,7 @@ class MBSlave:
typedef std::map<int,std::string> FileList; typedef std::map<int,std::string> FileList;
FileList flist; FileList flist;
std::string prefix; std::string prefix;
std::string prop_prefix;
ModbusRTU::ModbusData buf[ModbusRTU::MAXLENPACKET/2+1]; /*!< буфер для формирования ответов */ ModbusRTU::ModbusData buf[ModbusRTU::MAXLENPACKET/2+1]; /*!< буфер для формирования ответов */
......
...@@ -943,3 +943,5 @@ TEST_CASE("access mode","[modbus][mbslvae][mbtcpslave]") ...@@ -943,3 +943,5 @@ TEST_CASE("access mode","[modbus][mbslvae][mbtcpslave]")
REQUIRE( rret.data[0] == 555 ); REQUIRE( rret.data[0] == 555 );
} }
} }
/*! \todo Доделать тесты на считывание с разными prop_prefix.. */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment