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

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

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