Commit 392b948b authored by Pavel Vainerman's avatar Pavel Vainerman

(ModbusMultiMaster): немного скорректирована логика переключения с канала на канал,

make style
parent e721fd6d
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
Name: libuniset2 Name: libuniset2
Version: 2.1 Version: 2.1
Release: alt11 Release: alt12
Summary: UniSet - library for building distributed industrial control systems Summary: UniSet - library for building distributed industrial control systems
...@@ -456,6 +456,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname ...@@ -456,6 +456,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
# .. # ..
%changelog %changelog
* Sat Aug 08 2015 Pavel Vainerman <pv@altlinux.ru> 2.1-alt12
- (Modbus): minor fixes in ModbusMultiMaster
* Tue Jul 21 2015 Pavel Vainerman <pv@altlinux.ru> 2.1-alt11 * Tue Jul 21 2015 Pavel Vainerman <pv@altlinux.ru> 2.1-alt11
- minor fixes in uniset2-codegen - minor fixes in uniset2-codegen
- ModbusMaster: add --prefix-query-max-count val - the maximum - ModbusMaster: add --prefix-query-max-count val - the maximum
......
...@@ -83,8 +83,8 @@ ...@@ -83,8 +83,8 @@
<item addr="0x01" invert="0" respondSensor="RespondRTU_S" timeout="5000" modeSensor="MB1_Mode_AS"/> <item addr="0x01" invert="0" respondSensor="RespondRTU_S" timeout="5000" modeSensor="MB1_Mode_AS"/>
</DeviceList> </DeviceList>
<GateList> <GateList>
<item ip="127.0.0.1" port="2048" recv_timeout="200" invert="1" respondSensor="MM1_Not_Respond_S"/> <item ip="localhost" port="2048" recv_timeout="800" invert="1" respondSensor="MM1_Not_Respond_S"/>
<item ip="127.0.0.1" port="2049" recv_timeout="200" invert="1" respondSensor="MM2_Not_Respond_S"/> <item ip="localhost" port="2049" recv_timeout="800" invert="1" respondSensor="MM2_Not_Respond_S"/>
</GateList> </GateList>
</MBMultiMaster1> </MBMultiMaster1>
......
...@@ -2728,6 +2728,7 @@ bool MBExchange::initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXM ...@@ -2728,6 +2728,7 @@ bool MBExchange::initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXM
d->second->resp_Delay.set(tout, false); d->second->resp_Delay.set(tout, false);
d->second->resp_invert = it.getIntProp("invert"); d->second->resp_invert = it.getIntProp("invert");
d->second->resp_force = it.getIntProp("force");
int init_tout = it.getPIntProp("respondInitTimeout", tout); int init_tout = it.getPIntProp("respondInitTimeout", tout);
d->second->resp_ptInit.setTiming(init_tout); d->second->resp_ptInit.setTiming(init_tout);
...@@ -3001,7 +3002,9 @@ bool MBExchange::poll() ...@@ -3001,7 +3002,9 @@ bool MBExchange::poll()
updateSM(); updateSM();
allInitOK = false; allInitOK = false;
return false;
if( !mb )
return false;
} }
if( !allInitOK ) if( !allInitOK )
...@@ -3119,7 +3122,7 @@ bool MBExchange::RTUDevice::checkRespond( std::shared_ptr<DebugStream>& mblog ) ...@@ -3119,7 +3122,7 @@ bool MBExchange::RTUDevice::checkRespond( std::shared_ptr<DebugStream>& mblog )
<< " ]" << " ]"
<< endl; << endl;
return (prev != resp_state); return (prev != resp_state || resp_force);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void MBExchange::updateRespondSensors() void MBExchange::updateRespondSensors()
......
...@@ -188,6 +188,7 @@ class MBExchange: ...@@ -188,6 +188,7 @@ class MBExchange:
PassiveTimer resp_ptInit; // таймер для формирования задержки на инициализацию связи (задержка на выставление датчика связи после запуска) PassiveTimer resp_ptInit; // таймер для формирования задержки на инициализацию связи (задержка на выставление датчика связи после запуска)
bool resp_state; bool resp_state;
bool resp_invert; bool resp_invert;
bool resp_force = { false };
std::atomic<unsigned int> numreply; // количество успешных запросов.. std::atomic<unsigned int> numreply; // количество успешных запросов..
std::atomic<unsigned int> prev_numreply; std::atomic<unsigned int> prev_numreply;
......
...@@ -105,13 +105,14 @@ MBTCPMultiMaster::MBTCPMultiMaster( UniSetTypes::ObjectId objId, UniSetTypes::Ob ...@@ -105,13 +105,14 @@ MBTCPMultiMaster::MBTCPMultiMaster( UniSetTypes::ObjectId objId, UniSetTypes::Ob
auto l = loga->create(sinf.myname); auto l = loga->create(sinf.myname);
sinf.mbtcp->setLog(l); sinf.mbtcp->setLog(l);
if( ic )
ic->logAgregator()->add(loga);
mblist.push_back(sinf); mblist.push_back(sinf);
mbinfo << myname << "(init): add slave channel " << sinf.myname << endl; mbinfo << myname << "(init): add slave channel " << sinf.myname << endl;
} }
if( ic )
ic->logAgregator()->add(loga);
if( mblist.empty() ) if( mblist.empty() )
{ {
ostringstream err; ostringstream err;
...@@ -190,6 +191,7 @@ std::shared_ptr<ModbusClient> MBTCPMultiMaster::initMB( bool reopen ) ...@@ -190,6 +191,7 @@ std::shared_ptr<ModbusClient> MBTCPMultiMaster::initMB( bool reopen )
// тогда выставляем ему признак игнорирования // тогда выставляем ему признак игнорирования
if( mbi != mblist.rend() && reopen ) if( mbi != mblist.rend() && reopen )
{ {
mbi->setUse(false);
mbi->ignore = true; mbi->ignore = true;
mbi->ptIgnoreTimeout.reset(); mbi->ptIgnoreTimeout.reset();
mbwarn << myname << "(initMB): set ignore=true for " << mbi->ip << ":" << mbi->port << endl; mbwarn << myname << "(initMB): set ignore=true for " << mbi->ip << ":" << mbi->port << endl;
...@@ -203,15 +205,19 @@ std::shared_ptr<ModbusClient> MBTCPMultiMaster::initMB( bool reopen ) ...@@ -203,15 +205,19 @@ std::shared_ptr<ModbusClient> MBTCPMultiMaster::initMB( bool reopen )
if( !mbi->ignore ) if( !mbi->ignore )
{ {
mb = mbi->mbtcp; mb = mbi->mbtcp;
mbi->setUse(true);
return mbi->mbtcp; return mbi->mbtcp;
} }
if( mbi->ptIgnoreTimeout.checkTime() ) if( mbi->ptIgnoreTimeout.checkTime() )
{ {
mbi->ignore = false; mbi->ignore = false;
mbi->setUse(true);
mb = mbi->mbtcp; mb = mbi->mbtcp;
return mbi->mbtcp; return mbi->mbtcp;
} }
mbi->setUse(false);
} }
} }
...@@ -236,6 +242,7 @@ std::shared_ptr<ModbusClient> MBTCPMultiMaster::initMB( bool reopen ) ...@@ -236,6 +242,7 @@ std::shared_ptr<ModbusClient> MBTCPMultiMaster::initMB( bool reopen )
mbi = it; mbi = it;
mb = mbi->mbtcp; mb = mbi->mbtcp;
mbi->setUse(true);
return it->mbtcp; return it->mbtcp;
} }
} }
...@@ -257,7 +264,10 @@ void MBTCPMultiMaster::final_thread() ...@@ -257,7 +264,10 @@ void MBTCPMultiMaster::final_thread()
bool MBTCPMultiMaster::MBSlaveInfo::check() bool MBTCPMultiMaster::MBSlaveInfo::check()
{ {
return mbtcp->checkConnection(ip, port); if( use )
return true;
return mbtcp->checkConnection(ip, port, recv_timeout);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
bool MBTCPMultiMaster::MBSlaveInfo::init( std::shared_ptr<DebugStream>& mblog ) bool MBTCPMultiMaster::MBSlaveInfo::init( std::shared_ptr<DebugStream>& mblog )
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
\code \code
<MBMaster1 name="MBMaster1" gateway_iaddr="127.0.0.1" gateway_port="30000" polltime="200"> <MBMaster1 name="MBMaster1" gateway_iaddr="127.0.0.1" gateway_port="30000" polltime="200">
<DeviceList> <DeviceList>
<item addr="0x01" respondSensor="RTU1_Not_Respond_FS" timeout="2000" invert="1"/> <item addr="0x01" respondSensor="RTU1_Not_Respond_FS" force="0" timeout="2000" invert="1"/>
<item addr="0x02" respondSensor="RTU2_Respond_FS" timeout="2000" invert="0"/> <item addr="0x02" respondSensor="RTU2_Respond_FS" timeout="2000" invert="0"/>
</DeviceList> </DeviceList>
<GateList> <GateList>
...@@ -53,6 +53,7 @@ ...@@ -53,6 +53,7 @@
- \b timeout msec - таймаут, для определения отсутствия связи - \b timeout msec - таймаут, для определения отсутствия связи
- \b invert - инвертировать логику. По умолчанию датчик выставляется в "1" при \b наличии связи. - \b invert - инвертировать логику. По умолчанию датчик выставляется в "1" при \b наличии связи.
- \b respondSensor - идентификатор датчика связи (DI). - \b respondSensor - идентификатор датчика связи (DI).
- \b force [1,0] - "1" - обновлять значение датчика связи в SM принудительно на каждом цикле проверки ("0" - только по изменению).
- \b modeSensor - идентификатор датчика режима работы (см. MBExchange::ExchangeMode). - \b modeSensor - идентификатор датчика режима работы (см. MBExchange::ExchangeMode).
- \b ask_every_reg - 1 - опрашивать ВСЕ регистры подряд, не обращая внимания на timeout. По умолчанию - "0" Т.е. опрос устройства (на текущем шаге цикла опроса), прерывается на первом же регистре, при опросе которого возникнет timeout. - \b ask_every_reg - 1 - опрашивать ВСЕ регистры подряд, не обращая внимания на timeout. По умолчанию - "0" Т.е. опрос устройства (на текущем шаге цикла опроса), прерывается на первом же регистре, при опросе которого возникнет timeout.
...@@ -252,7 +253,7 @@ class MBTCPMultiMaster: ...@@ -252,7 +253,7 @@ class MBTCPMultiMaster:
respond(false), respond_id(UniSetTypes::DefaultObjectId), respond_invert(false), respond(false), respond_id(UniSetTypes::DefaultObjectId), respond_invert(false),
recv_timeout(200), aftersend_pause(0), sleepPause_usec(100), recv_timeout(200), aftersend_pause(0), sleepPause_usec(100),
force_disconnect(true), force_disconnect(true),
myname(""), initOK(false), ignore(false) {} myname(""), use(false), initOK(false), ignore(false) {}
std::string ip; std::string ip;
int port; int port;
...@@ -272,6 +273,10 @@ class MBTCPMultiMaster: ...@@ -272,6 +273,10 @@ class MBTCPMultiMaster:
bool init( std::shared_ptr<DebugStream>& mblog ); bool init( std::shared_ptr<DebugStream>& mblog );
bool check(); bool check();
inline void setUse( bool st )
{
use = st;
}
int recv_timeout; int recv_timeout;
int aftersend_pause; int aftersend_pause;
...@@ -280,8 +285,9 @@ class MBTCPMultiMaster: ...@@ -280,8 +285,9 @@ class MBTCPMultiMaster:
std::string myname; std::string myname;
bool initOK; bool use = { false }; // флаг используется ли в данный момент этот канал
bool ignore; // игнорировать данное соединение (обычно флаг выставляется на время ignoreTimeout, если узел не отвечает, хотя связь есть. bool initOK = { false };
bool ignore = { false }; // игнорировать данное соединение (обычно флаг выставляется на время ignoreTimeout, если узел не отвечает, хотя связь есть.
PassiveTimer ptIgnoreTimeout; PassiveTimer ptIgnoreTimeout;
const std::string getShortInfo() const; const std::string getShortInfo() const;
......
...@@ -8,11 +8,8 @@ ...@@ -8,11 +8,8 @@
--mbtcp-set-prop-prefix \ --mbtcp-set-prop-prefix \
--mbtcp-filter-field rs \ --mbtcp-filter-field rs \
--mbtcp-filter-value 5 \ --mbtcp-filter-value 5 \
--mbtcp-gateway-iaddr server \ --mbtcp-recv-timeout 1000 \
--mbtcp-gateway-port 2048 \
--mbtcp-recv-timeout 3000 \
--mbtcp-timeout 2000 \ --mbtcp-timeout 2000 \
--mbtcp-force-disconnect 1 \
--mbtcp-polltime 1000 \ --mbtcp-polltime 1000 \
--mbtcp-force-out 1 \ --mbtcp-force-out 1 \
--mbtcp-log-add-levels any \ --mbtcp-log-add-levels any \
......
...@@ -255,7 +255,7 @@ void IOBase::processingFasAI( IOBase* it, float fval, const std::shared_ptr<SMIn ...@@ -255,7 +255,7 @@ void IOBase::processingFasAI( IOBase* it, float fval, const std::shared_ptr<SMIn
long val = lroundf(fval); long val = lroundf(fval);
if( it->stype == UniversalIO::DI || it->stype == UniversalIO::DO ) if( it->stype == UniversalIO::DI || it->stype == UniversalIO::DO )
val = (fval!=0 ? 1.0 : 0.0); val = (fval != 0 ? 1.0 : 0.0);
else else
{ {
if( it->rawdata ) if( it->rawdata )
......
...@@ -490,7 +490,7 @@ TEST_CASE("[IOBase]: FasAI to DI", "[iobase][floatToDI]") ...@@ -490,7 +490,7 @@ TEST_CASE("[IOBase]: FasAI to DI", "[iobase][floatToDI]")
IOBase ib; IOBase ib;
CHECK( init_iobase(&ib, "FasDI_S") ); CHECK( init_iobase(&ib, "FasDI_S") );
float f=23.23; float f = 23.23;
IOBase::processingFasAI(&ib, f, shm, true); IOBase::processingFasAI(&ib, f, shm, true);
......
...@@ -137,7 +137,7 @@ class VMonitor ...@@ -137,7 +137,7 @@ class VMonitor
static const std::string pretty_str( const std::string& name, const std::string* v, int width = NameWidth ); static const std::string pretty_str( const std::string& name, const std::string* v, int width = NameWidth );
static const std::string pretty_str( const std::string& name, const std::string& v, int width = NameWidth ); static const std::string pretty_str( const std::string& name, const std::string& v, int width = NameWidth );
protected: protected:
private: private:
......
...@@ -238,7 +238,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -238,7 +238,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
} }
if( dlog->is_info() ) if( dlog->is_info() )
dlog->info() << "(query): input pending timeout " << endl; dlog->info() << "(query): input pending timeout=" << timeout << endl;
if( force_disconnect ) if( force_disconnect )
{ {
......
...@@ -366,6 +366,7 @@ std::list<UniSetTypes::ConsumerInfo> UniSetTypes::getObjectsList( const string& ...@@ -366,6 +366,7 @@ std::list<UniSetTypes::ConsumerInfo> UniSetTypes::getObjectsList( const string&
else else
{ {
item.id = conf->getObjectID(s_id); item.id = conf->getObjectID(s_id);
if( item.id == DefaultObjectId ) if( item.id == DefaultObjectId )
item.id = conf->getControllerID(s_id); item.id = conf->getControllerID(s_id);
} }
...@@ -382,6 +383,7 @@ std::list<UniSetTypes::ConsumerInfo> UniSetTypes::getObjectsList( const string& ...@@ -382,6 +383,7 @@ std::list<UniSetTypes::ConsumerInfo> UniSetTypes::getObjectsList( const string&
else else
{ {
item.id = conf->getObjectID(s_id); item.id = conf->getObjectID(s_id);
if( item.id == DefaultObjectId ) if( item.id == DefaultObjectId )
item.id = conf->getControllerID(s_id); item.id = conf->getControllerID(s_id);
} }
......
...@@ -193,7 +193,7 @@ void SViewer::getInfo( ObjectId id ) ...@@ -193,7 +193,7 @@ void SViewer::getInfo( ObjectId id )
IOController_i::SensorInfoSeq_var amap = ioc->getSensorsMap(); IOController_i::SensorInfoSeq_var amap = ioc->getSensorsMap();
updateSensors(amap, id); updateSensors(amap, id);
} }
catch( IOController_i::NameNotFound ){} catch( IOController_i::NameNotFound ) {}
catch(...) {} catch(...) {}
try try
...@@ -201,7 +201,7 @@ void SViewer::getInfo( ObjectId id ) ...@@ -201,7 +201,7 @@ void SViewer::getInfo( ObjectId id )
IONotifyController_i::ThresholdsListSeq_var tlst = ioc->getThresholdsList(); IONotifyController_i::ThresholdsListSeq_var tlst = ioc->getThresholdsList();
updateThresholds(tlst, id); updateThresholds(tlst, id);
} }
catch( IOController_i::NameNotFound ){} catch( IOController_i::NameNotFound ) {}
catch(...) {} catch(...) {}
return; return;
......
...@@ -112,7 +112,7 @@ TEST_CASE("UniSetTypes: getSInfoList", "[utypes][getsinfo]" ) ...@@ -112,7 +112,7 @@ TEST_CASE("UniSetTypes: getSInfoList", "[utypes][getsinfo]" )
CHECK( t1.size() == 5 ); CHECK( t1.size() == 5 );
vector<UniSetTypes::ParamSInfo> v(t1.begin(),t1.end()); vector<UniSetTypes::ParamSInfo> v(t1.begin(), t1.end());
REQUIRE( v[0].si.id == 141 ); REQUIRE( v[0].si.id == 141 );
REQUIRE( v[0].si.node == 1001 ); REQUIRE( v[0].si.node == 1001 );
...@@ -138,7 +138,7 @@ TEST_CASE("UniSetTypes: getObjectsList", "[utypes][getolist]" ) ...@@ -138,7 +138,7 @@ TEST_CASE("UniSetTypes: getObjectsList", "[utypes][getolist]" )
CHECK( t1.size() == 5 ); CHECK( t1.size() == 5 );
vector<UniSetTypes::ConsumerInfo> v(t1.begin(),t1.end()); vector<UniSetTypes::ConsumerInfo> v(t1.begin(), t1.end());
REQUIRE( v[0].id == 100 ); REQUIRE( v[0].id == 100 );
REQUIRE( v[0].node == 1001 ); REQUIRE( v[0].node == 1001 );
......
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