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
uniset-codegen: добавить ключ --gen-sensor-name для генерирования name_Item.. (чтобы можно было в логах использовать текстовые названия)
- перевести PassiveTimer на использование crono:: (c++11)
Version 2.1
============
......
......@@ -12,7 +12,7 @@
Name: libuniset2
Version: 2.0
Release: alt24
Release: alt25
Summary: UniSet - library for building distributed industrial control systems
......@@ -409,6 +409,10 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
# ..
%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
- codegen: modify interface for messages (setMsg())
- remove alarm() function (deprecated)
......
......@@ -53,6 +53,8 @@ pollActivated(false)
dinfo << myname << "(init): read fileter-field='" << s_field
<< "' filter-value='" << s_fvalue << "'" << endl;
prop_prefix = initPropPrefix();
stat_time = conf->getArgPInt("--" + prefix + "-statistic-sec",it.getProp("statistic_sec"),0);
if( stat_time > 0 )
ptStatistic.setTiming(stat_time*1000);
......@@ -141,6 +143,30 @@ pollActivated(false)
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 )
{
cout << "--prefix-name name - ObjectId (имя) процесса. По умолчанию: MBExchange1" << endl;
......
......@@ -286,6 +286,8 @@ class MBExchange:
bool initRTUDevice( RTUDevice* d, 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 );
xmlNode* cnode;
......
......@@ -22,24 +22,8 @@ pollThread(0)
auto conf = uniset_conf();
// префикс для "свойств" - по умолчанию
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 = "";
}
// префикс для "свойств" - по умолчанию "tcp_";
prop_prefix = initPropPrefix("tcp_");
dinfo << myname << "(init): prop_prefix=" << prop_prefix << endl;
UniXML::iterator it(cnode);
......
......@@ -24,24 +24,7 @@ checkThread(0)
auto conf = uniset_conf();
// префикс для "свойств" - по умолчанию
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 = "";
}
prop_prefix = initPropPrefix("tcp_");
dinfo << myname << "(init): prop_prefix=" << prop_prefix << endl;
UniXML::iterator it(cnode);
......
......@@ -25,7 +25,8 @@ activateTimeout(500),
pingOK(true),
force(false),
mbregFromID(false),
prefix(prefix)
prefix(prefix),
prop_prefix("")
{
if( objId == DefaultObjectId )
throw UniSetTypes::SystemError("(MBSlave): objId=-1?!! Use --mbs-name" );
......@@ -50,6 +51,26 @@ prefix(prefix)
dinfo << myname << "(init): read s_field='" << s_field
<< "' 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"));
// int recv_timeout = conf->getArgParam("--" + prefix + "-recv-timeout",it.getProp("recv_timeout")));
......@@ -816,8 +837,6 @@ bool MBSlave::initItem( UniXML::iterator& it )
{
IOProperty p;
string prop_prefix(prefix+"_");
if( !IOBase::initItem( static_cast<IOBase*>(&p),it,shm,prop_prefix,false,dlog(),myname) )
return false;
......@@ -828,7 +847,7 @@ bool MBSlave::initItem( UniXML::iterator& it )
string r = IOBase::initProp(it,"mbreg",prop_prefix,false);
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;
}
......@@ -866,14 +885,14 @@ bool MBSlave::initItem( UniXML::iterator& it )
p.nbyte = IOBase::initIntProp(it,"nbyte",prop_prefix,false);
if( p.nbyte <=0 )
{
dcrit << myname << "(initItem): Unknown nbyte='' for "
dcrit << myname << "(initItem): Unknown " << prop_prefix << "nbyte='' for "
<< it.getProp("name")
<< endl;
return false;
}
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")
<< ". Must be [1,2]."
<< endl;
......@@ -928,6 +947,7 @@ void MBSlave::help_print( int argc, const char* const* argv )
cout << "--prefix-reply-timeout msec - Контрольное время для формирования ответа. " << endl
<< " Если обработка запроса превысит это время, ответ не будет послан (timeout)." << 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-my-addr - адрес текущего узла" << endl;
......
......@@ -440,6 +440,7 @@ class MBSlave:
typedef std::map<int,std::string> FileList;
FileList flist;
std::string prefix;
std::string prop_prefix;
ModbusRTU::ModbusData buf[ModbusRTU::MAXLENPACKET/2+1]; /*!< буфер для формирования ответов */
......
......@@ -943,3 +943,5 @@ TEST_CASE("access mode","[modbus][mbslvae][mbtcpslave]")
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