Commit e9b908e5 authored by Pavel Vainerman's avatar Pavel Vainerman

(ModbusMaster): реализовал отключаемую проверку связи по всем каналам в ModbusMultiMaster.

parent 371de247
...@@ -99,7 +99,7 @@ int main( int argc, char **argv ) ...@@ -99,7 +99,7 @@ int main( int argc, char **argv )
<< " timeout=" << tout << " msec " << " timeout=" << tout << " msec "
<< endl; << endl;
dlog.addLevel( Debug::type(Debug::CRIT | Debug::WARN | Debug::INFO) ); dlog.addLevel( Debug::ANY );
} }
MBTCPServer mbs(myaddr,iaddr,port,verb); MBTCPServer mbs(myaddr,iaddr,port,verb);
......
...@@ -54,10 +54,10 @@ ...@@ -54,10 +54,10 @@
<DeviceList> <DeviceList>
<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>
<SlaveList> <GateList>
<item ip="127.0.0.1" port="2049" recv_timeout="200"/>
<item ip="127.0.0.1" port="2048" recv_timeout="200"/> <item ip="127.0.0.1" port="2048" recv_timeout="200"/>
</SlaveList> <item ip="127.0.0.1" port="2049" recv_timeout="200"/>
</GateList>
</MBMultiMaster1> </MBMultiMaster1>
<MBSlave1 addr="0x31" aftersend-pause="0" dev="/dev/ttyS0" levels="info,warn,crit" name="MBSlave1" poll_time="200" reply_timeout="60" speed="9600"> <MBSlave1 addr="0x31" aftersend-pause="0" dev="/dev/ttyS0" levels="info,warn,crit" name="MBSlave1" poll_time="200" reply_timeout="60" speed="9600">
......
...@@ -45,10 +45,10 @@ checkThread(0) ...@@ -45,10 +45,10 @@ checkThread(0)
checktime = conf->getArgPInt("--" + prefix + "-checktime",it.getProp("checktime"), 5000); checktime = conf->getArgPInt("--" + prefix + "-checktime",it.getProp("checktime"), 5000);
UniXML_iterator it1(it); UniXML_iterator it1(it);
if( !it1.find("SlaveList") ) if( !it1.find("GateList") )
{ {
ostringstream err; ostringstream err;
err << myname << "(init): not found <SlaveList>"; err << myname << "(init): not found <GateList>";
dlog[Debug::CRIT] << err.str() << endl; dlog[Debug::CRIT] << err.str() << endl;
throw UniSetTypes::SystemError(err.str()); throw UniSetTypes::SystemError(err.str());
} }
...@@ -56,7 +56,7 @@ checkThread(0) ...@@ -56,7 +56,7 @@ checkThread(0)
if( !it1.goChildren() ) if( !it1.goChildren() )
{ {
ostringstream err; ostringstream err;
err << myname << "(init): empty <SlaveList> ?!"; err << myname << "(init): empty <GateList> ?!";
dlog[Debug::CRIT] << err.str() << endl; dlog[Debug::CRIT] << err.str() << endl;
throw UniSetTypes::SystemError(err.str()); throw UniSetTypes::SystemError(err.str());
} }
...@@ -68,7 +68,7 @@ checkThread(0) ...@@ -68,7 +68,7 @@ checkThread(0)
if( sinf.ip.empty() ) if( sinf.ip.empty() )
{ {
ostringstream err; ostringstream err;
err << myname << "(init): ip='' in <SlaveList>"; err << myname << "(init): ip='' in <GateList>";
dlog[Debug::CRIT] << err.str() << endl; dlog[Debug::CRIT] << err.str() << endl;
throw UniSetTypes::SystemError(err.str()); throw UniSetTypes::SystemError(err.str());
} }
...@@ -77,7 +77,7 @@ checkThread(0) ...@@ -77,7 +77,7 @@ checkThread(0)
if( sinf.port <=0 ) if( sinf.port <=0 )
{ {
ostringstream err; ostringstream err;
err << myname << "(init): ERROR: port=''" << sinf.port << " for ip='" << sinf.ip << "' in <SlaveList>"; err << myname << "(init): ERROR: port=''" << sinf.port << " for ip='" << sinf.ip << "' in <GateList>";
dlog[Debug::CRIT] << err.str() << endl; dlog[Debug::CRIT] << err.str() << endl;
throw UniSetTypes::SystemError(err.str()); throw UniSetTypes::SystemError(err.str());
} }
...@@ -88,7 +88,7 @@ checkThread(0) ...@@ -88,7 +88,7 @@ checkThread(0)
if( sinf.respond_id == DefaultObjectId ) if( sinf.respond_id == DefaultObjectId )
{ {
ostringstream err; ostringstream err;
err << myname << "(init): ERROR: Unknown SensorID for '" << it1.getProp("respond") << "' in <SlaveList>"; err << myname << "(init): ERROR: Unknown SensorID for '" << it1.getProp("respond") << "' in <GateList>";
dlog[Debug::CRIT] << err.str() << endl; dlog[Debug::CRIT] << err.str() << endl;
throw UniSetTypes::SystemError(err.str()); throw UniSetTypes::SystemError(err.str());
} }
...@@ -108,6 +108,9 @@ checkThread(0) ...@@ -108,6 +108,9 @@ checkThread(0)
n << sinf.ip << ":" << sinf.port; n << sinf.ip << ":" << sinf.port;
sinf.myname = n.str(); sinf.myname = n.str();
if( dlog.debugging(Debug::LEVEL9) )
sinf.mbtcp->setLog(dlog);
mblist.push_back(sinf); mblist.push_back(sinf);
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
...@@ -117,13 +120,13 @@ checkThread(0) ...@@ -117,13 +120,13 @@ checkThread(0)
if( mblist.empty() ) if( mblist.empty() )
{ {
ostringstream err; ostringstream err;
err << myname << "(init): empty <SlaveList>!"; err << myname << "(init): empty <GateList>!";
dlog[Debug::CRIT] << err.str() << endl; dlog[Debug::CRIT] << err.str() << endl;
throw UniSetTypes::SystemError(err.str()); throw UniSetTypes::SystemError(err.str());
} }
mblist.sort(); mblist.sort();
mbi = mblist.begin(); mbi = mblist.rbegin();
if( shm->isLocalwork() ) if( shm->isLocalwork() )
{ {
...@@ -145,41 +148,63 @@ MBTCPMultiMaster::~MBTCPMultiMaster() ...@@ -145,41 +148,63 @@ MBTCPMultiMaster::~MBTCPMultiMaster()
{ {
delete pollThread; delete pollThread;
delete checkThread; delete checkThread;
for( MBSlaveList::iterator it=mblist.begin(); it!=mblist.end(); ++it ) for( MBGateList::iterator it=mblist.begin(); it!=mblist.end(); ++it )
{ {
delete it->mbtcp; delete it->mbtcp;
it->mbtcp = 0; it->mbtcp = 0;
mbi = mblist.end(); mbi = mblist.rend();
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
ModbusClient* MBTCPMultiMaster::initMB( bool reopen ) ModbusClient* MBTCPMultiMaster::initMB( bool reopen )
{ {
if( mbi!=mblist.end() && mbi->respond ) // просто движемся по кругу (т.к. связь не проверяется)
// движемся в обратном порядке, т.к. сортировка по возрастанию приоритета
if( checktime <=0 )
{ {
cerr << "******** initMB(0): " << mbi->myname << endl; mbi++;
if( mbi == mblist.rend() )
mbi = mblist.rbegin();
mbi->init();
mb = mbi->mbtcp; mb = mbi->mbtcp;
return mbi->mbtcp; return mbi->mbtcp;
} }
if( mbi != mblist.end() ) {
uniset_mutex_lock l(tcpMutex,100);
// Если по текущему каналу связь есть, то возвращаем его
if( mbi!=mblist.rend() && mbi->respond )
{
if( mbi->mbtcp->isConnection() || ( !mbi->mbtcp->isConnection() && mbi->init()) )
{
mb = mbi->mbtcp;
return mbi->mbtcp;
}
}
if( mbi != mblist.rend() )
mbi->mbtcp->disconnect(); mbi->mbtcp->disconnect();
}
// проходим по списку (в обратном порядке, т.к. самый приоритетный в конце) // проходим по списку (в обратном порядке, т.к. самый приоритетный в конце)
for( MBSlaveList::reverse_iterator it=mblist.rbegin(); it!=mblist.rend(); ++it ) for( MBGateList::reverse_iterator it=mblist.rbegin(); it!=mblist.rend(); ++it )
{ {
if( it->respond ) uniset_mutex_lock l(tcpMutex,100);
if( it->respond && it->init() )
{ {
mbi = it;
mb = mbi->mbtcp; mb = mbi->mbtcp;
mbi = it.base();
cerr << "******** initMB(L): " << mbi->myname << endl;
return it->mbtcp; return it->mbtcp;
} }
} }
cout << myname << "(initMB): return 0..." << endl; {
mbi = mblist.end(); uniset_mutex_lock l(tcpMutex,100);
mbi = mblist.rend();
mb = 0; mb = 0;
}
return 0; return 0;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -192,24 +217,28 @@ bool MBTCPMultiMaster::MBSlaveInfo::init() ...@@ -192,24 +217,28 @@ bool MBTCPMultiMaster::MBSlaveInfo::init()
{ {
try try
{ {
ost::Thread::setException(ost::Thread::throwException); // ost::Thread::setException(ost::Thread::throwException);
ost::InetAddress ia(ip.c_str());
mbtcp->connect(ia,port); if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << myname << "(init): connect..." << endl;
mbtcp->connect(ip,port);
// mbtcp->setForceDisconnect(force_disconnect); // mbtcp->setForceDisconnect(force_disconnect);
if( recv_timeout > 0 ) if( recv_timeout > 0 )
mbtcp->setTimeout(recv_timeout); mbtcp->setTimeout(recv_timeout);
// if( !initOK )
{
mbtcp->setSleepPause(sleepPause_usec); mbtcp->setSleepPause(sleepPause_usec);
mbtcp->setAfterSendPause(aftersend_pause); mbtcp->setAfterSendPause(aftersend_pause);
if( dlog.debugging(Debug::INFO) ) if( mbtcp->isConnection() && dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << "(init): " << myname << endl; dlog[Debug::INFO] << "(init): " << myname << " connect OK" << endl;
if( dlog.debugging(Debug::LEVEL9) ) initOK = true;
mbtcp->setLog(dlog); }
return mbtcp->isConnection();
return true;
} }
catch( ModbusRTU::mbException& ex ) catch( ModbusRTU::mbException& ex )
{ {
...@@ -222,6 +251,7 @@ bool MBTCPMultiMaster::MBSlaveInfo::init() ...@@ -222,6 +251,7 @@ bool MBTCPMultiMaster::MBSlaveInfo::init()
dlog[Debug::WARN] << "(init): " << myname << " catch ..." << endl; dlog[Debug::WARN] << "(init): " << myname << " catch ..." << endl;
} }
initOK = false;
return false; return false;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -231,6 +261,7 @@ void MBTCPMultiMaster::sysCommand( UniSetTypes::SystemMessage *sm ) ...@@ -231,6 +261,7 @@ void MBTCPMultiMaster::sysCommand( UniSetTypes::SystemMessage *sm )
if( sm->command == SystemMessage::StartUp ) if( sm->command == SystemMessage::StartUp )
{ {
pollThread->start(); pollThread->start();
if( checktime > 0 )
checkThread->start(); checkThread->start();
} }
} }
...@@ -267,7 +298,7 @@ void MBTCPMultiMaster::check_thread() ...@@ -267,7 +298,7 @@ void MBTCPMultiMaster::check_thread()
{ {
while( checkProcActive() ) while( checkProcActive() )
{ {
for( MBSlaveList::iterator it=mblist.begin(); it!=mblist.end(); ++it ) for( MBGateList::iterator it=mblist.begin(); it!=mblist.end(); ++it )
{ {
try try
{ {
...@@ -290,8 +321,12 @@ void MBTCPMultiMaster::check_thread() ...@@ -290,8 +321,12 @@ void MBTCPMultiMaster::check_thread()
} }
catch(...){} catch(...){}
{
uniset_mutex_lock l(tcpMutex,130);
it->respond = r; it->respond = r;
} }
}
catch(...){} catch(...){}
if( !checkProcActive() ) if( !checkProcActive() )
...@@ -308,7 +343,7 @@ void MBTCPMultiMaster::check_thread() ...@@ -308,7 +343,7 @@ void MBTCPMultiMaster::check_thread()
void MBTCPMultiMaster::initIterators() void MBTCPMultiMaster::initIterators()
{ {
MBExchange::initIterators(); MBExchange::initIterators();
for( MBSlaveList::iterator it=mblist.begin(); it!=mblist.end(); ++it ) for( MBGateList::iterator it=mblist.begin(); it!=mblist.end(); ++it )
shm->initDIterator(it->respond_dit); shm->initDIterator(it->respond_dit);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -319,9 +354,7 @@ void MBTCPMultiMaster::help_print( int argc, const char* const* argv ) ...@@ -319,9 +354,7 @@ void MBTCPMultiMaster::help_print( int argc, const char* const* argv )
// ---------- init MBTCP ---------- // ---------- init MBTCP ----------
// cout << "--prefix-sm-ready-timeout - время на ожидание старта SM" << endl; // cout << "--prefix-sm-ready-timeout - время на ожидание старта SM" << endl;
cout << " Настройки протокола TCP: " << endl; cout << " Настройки протокола TCP: " << endl;
cout << "--prefix-gateway-iaddr hostname,IP - IP опрашиваемого узла" << endl; cout << "--prefix-checktime - период проверки связи по каналам (<GateList>)" << endl;
cout << "--prefix-gateway-port num - port на опрашиваемом узле" << endl;
cout << "--prefix-persistent-connection 0,1 - Не закрывать соединение на каждом цикле опроса" << endl;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
MBTCPMultiMaster* MBTCPMultiMaster::init_mbmaster( int argc, const char* const* argv, MBTCPMultiMaster* MBTCPMultiMaster::init_mbmaster( int argc, const char* const* argv,
......
...@@ -36,10 +36,10 @@ ...@@ -36,10 +36,10 @@
<item addr="0x01" respondSensor="RTU1_Not_Respond_FS" timeout="2000" invert="1"/> <item addr="0x01" respondSensor="RTU1_Not_Respond_FS" 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>
<SlaveList> <GateList>
<item ip="" port="" respond_id="" priority=""/> <item ip="" port="" respond_id="" priority=""/>
<item ip="" port="" respond_id="" priority=""/> <item ip="" port="" respond_id="" priority="" respond_invert="1"/>
<SlaveList> <GateList>
</MBMaster1> </MBMaster1>
\endcode \endcode
Секция <DeviceList> позволяет задать параметры обмена с конкретным RTU-устройством. Секция <DeviceList> позволяет задать параметры обмена с конкретным RTU-устройством.
...@@ -47,17 +47,18 @@ ...@@ -47,17 +47,18 @@
- \b addr - адрес устройства для которого, задаются параметры - \b addr - адрес устройства для которого, задаются параметры
- \b timeout msec - таймаут, для определения отсутствия связи - \b timeout msec - таймаут, для определения отсутствия связи
- \b invert - инвертировать логику. По умолчанию датчик выставляется в "1" при \b наличии связи. - \b invert - инвертировать логику. По умолчанию датчик выставляется в "1" при \b наличии связи.
- \b respondSensor - идентификатор датчика связи. - \b respondSensor - идентификатор датчика связи (DI).
- \b modeSensor - идентификатор датчика режима работы (см. MBExchange::ExchangeMode). - \b modeSensor - идентификатор датчика режима работы (см. MBExchange::ExchangeMode).
- \b ask_every_reg - 1 - опрашивать ВСЕ регистры подряд, не обращая внимания на timeout. По умолчанию - "0" Т.е. опрос устройства (на текущем шаге цикла опроса), прерывается на первом же регистре, при опросе которого возникнет timeout. - \b ask_every_reg - 1 - опрашивать ВСЕ регистры подряд, не обращая внимания на timeout. По умолчанию - "0" Т.е. опрос устройства (на текущем шаге цикла опроса), прерывается на первом же регистре, при опросе которого возникнет timeout.
Секция <SlaveList> позволяет задать несколько каналов связи со Slave-устройством. Это удобно для случая, когда Slave имеет Секция <GateList> позволяет задать несколько каналов связи со Slave-устройством. Это удобно для случая, когда Slave имеет
более одного канала связи с ним (основной и резервный например). более одного канала связи с ним (основной и резервный например).
- \b ip - ip-адрес - \b ip - ip-адрес
- \b port - порт - \b port - порт
- \b respond - датчик связи по данному каналу (помимо обобщённого) - \b respond - датчик связи по данному каналу (помимо обобщённого)
- \b priority - приоритет канала (чем больше число, тем выше приоритет) - \b priority - приоритет канала (чем больше число, тем выше приоритет)
- \b respond_invert - инвертировать датчик связи (DI)
\par Параметры запуска \par Параметры запуска
...@@ -85,7 +86,11 @@ ...@@ -85,7 +86,11 @@
В связи с чем, функция указанная в качестве \b mbfunc игнорируется и подменяется на работающую с многими регистрами. В связи с чем, функция указанная в качестве \b mbfunc игнорируется и подменяется на работающую с многими регистрами.
\b --xxx-poll-time или \b poll_time msec - пауза между опросами. По умолчанию 100 мсек. \b --xxx-polltime или \b polltime msec - пауза между опросами. По умолчанию 100 мсек.
\b --xxx-checktime или \b checktime msec - пауза между проверками связи по разным каналам. По умолчанию 5000 мсек.
Если задать <=0, то каналы будут просто переключаться по кругу (по timeout-у) в соответсвии с приоритетом (см. <GateList>).
Если >0, то происходит проверка связи (раз в checktime) по всем каналам (см. <GateList>) и в случае потери связи,
происходит переключение на следующий канал, по которому связь есть.
\b --xxx-initPause или \b initPause msec - пауза перед началом работы, после активации. По умолчанию 50 мсек. \b --xxx-initPause или \b initPause msec - пауза перед началом работы, после активации. По умолчанию 50 мсек.
...@@ -219,16 +224,13 @@ class MBTCPMultiMaster: ...@@ -219,16 +224,13 @@ class MBTCPMultiMaster:
protected: protected:
virtual void sysCommand( UniSetTypes::SystemMessage *sm ); virtual void sysCommand( UniSetTypes::SystemMessage *sm );
virtual void initIterators(); virtual void initIterators();
UniSetTypes::uniset_mutex mbMutex;
int recv_timeout;
virtual ModbusClient* initMB( bool reopen=false ); virtual ModbusClient* initMB( bool reopen=false );
void poll_thread(); void poll_thread();
void check_thread(); void check_thread();
bool force_disconnect;
UniSetTypes::uniset_mutex mbMutex;
int recv_timeout;
bool force_disconnect;
int checktime; int checktime;
private: private:
...@@ -238,7 +240,7 @@ class MBTCPMultiMaster: ...@@ -238,7 +240,7 @@ class MBTCPMultiMaster:
{ {
MBSlaveInfo():ip(""),port(0),mbtcp(0),priority(0), MBSlaveInfo():ip(""),port(0),mbtcp(0),priority(0),
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),myname(""){} recv_timeout(200),aftersend_pause(0),sleepPause_usec(100),myname(""),initOK(false){}
std::string ip; std::string ip;
int port; int port;
...@@ -263,12 +265,14 @@ class MBTCPMultiMaster: ...@@ -263,12 +265,14 @@ class MBTCPMultiMaster:
int sleepPause_usec; int sleepPause_usec;
std::string myname; std::string myname;
bool initOK;
}; };
typedef std::list<MBSlaveInfo> MBSlaveList; typedef std::list<MBSlaveInfo> MBGateList;
MBSlaveList mblist; MBGateList mblist;
MBSlaveList::iterator mbi; MBGateList::reverse_iterator mbi;
// т.к. TCP может "зависнуть" на подключении к недоступному узлу // т.к. TCP может "зависнуть" на подключении к недоступному узлу
// делаем опрос в отдельном потоке // делаем опрос в отдельном потоке
......
...@@ -54,20 +54,22 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -54,20 +54,22 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
{ {
if( iaddr.empty() ) if( iaddr.empty() )
{ {
dlog[Debug::WARN] << "(query): unknown ip address for server..." << endl; if( dlog.debugging(Debug::WARN) )
dlog[Debug::WARN] << iaddr << "(ModbusTCPMaster::query): unknown ip address for server..." << endl;
return erTimeOut; // erHardwareError return erTimeOut; // erHardwareError
} }
if( !isConnection() ) if( !isConnection() )
{ {
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << "(ModbusTCPMaster): no connection.. reconnnect..." << endl; dlog[Debug::INFO] << iaddr << "(ModbusTCPMaster::query): no connection.. reconnnect..." << endl;
reconnect(); reconnect();
} }
if( !isConnection() ) if( !isConnection() )
{ {
dlog[Debug::WARN] << "(query): not connected to server..." << endl; if( dlog.debugging(Debug::WARN) )
dlog[Debug::WARN] << iaddr << "(ModbusTCPMaster::query): not connected to server..." << endl;
return erTimeOut; return erTimeOut;
} }
...@@ -95,7 +97,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -95,7 +97,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
// send TCP header // send TCP header
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
{ {
dlog[Debug::INFO] << "(ModbusTCPMaster::query): send tcp header(" << sizeof(mh) <<"): "; dlog[Debug::INFO] << iaddr << "(ModbusTCPMaster::query): send tcp header(" << sizeof(mh) <<"): ";
mbPrintMessage( dlog, (ModbusByte*)(&mh), sizeof(mh)); mbPrintMessage( dlog, (ModbusByte*)(&mh), sizeof(mh));
dlog(Debug::INFO) << endl; dlog(Debug::INFO) << endl;
} }
...@@ -118,6 +120,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -118,6 +120,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
reconnect(); reconnect();
if( !isConnection() ) if( !isConnection() )
{ {
if( dlog.debugging(Debug::WARN) )
dlog[Debug::WARN] << "(ModbusTCPMaster::query): not connected to server..." << endl; dlog[Debug::WARN] << "(ModbusTCPMaster::query): not connected to server..." << endl;
return erTimeOut; return erTimeOut;
} }
...@@ -223,28 +226,34 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -223,28 +226,34 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
} }
catch( ModbusRTU::mbException& ex ) catch( ModbusRTU::mbException& ex )
{ {
if( dlog.debugging(Debug::WARN) )
dlog[Debug::WARN] << "(query): " << ex << endl; dlog[Debug::WARN] << "(query): " << ex << endl;
} }
catch( SystemError& err ) catch( SystemError& err )
{ {
if( dlog.debugging(Debug::WARN) )
dlog[Debug::WARN] << "(query): " << err << endl; dlog[Debug::WARN] << "(query): " << err << endl;
} }
catch( Exception& ex ) catch( Exception& ex )
{ {
if( dlog.debugging(Debug::WARN) )
dlog[Debug::WARN] << "(query): " << ex << endl; dlog[Debug::WARN] << "(query): " << ex << endl;
} }
catch( ost::SockException& e ) catch( ost::SockException& e )
{ {
if( dlog.debugging(Debug::WARN) )
dlog[Debug::WARN] << "(query): tcp error: " << e.getString() << endl; dlog[Debug::WARN] << "(query): tcp error: " << e.getString() << endl;
return erTimeOut; return erTimeOut;
} }
catch( std::exception& e ) catch( std::exception& e )
{ {
if( dlog.debugging(Debug::WARN) )
dlog[Debug::CRIT] << "(query): " << e.what() << std::endl; dlog[Debug::CRIT] << "(query): " << e.what() << std::endl;
return erTimeOut; return erTimeOut;
} }
catch(...) catch(...)
{ {
if( dlog.debugging(Debug::WARN) )
dlog[Debug::WARN] << "(query): cath..." << endl; dlog[Debug::WARN] << "(query): cath..." << endl;
} }
...@@ -307,21 +316,27 @@ void ModbusTCPMaster::reconnect() ...@@ -307,21 +316,27 @@ void ModbusTCPMaster::reconnect()
} }
catch( std::exception& e ) catch( std::exception& e )
{ {
if( dlog.debugging(Debug::CRIT) )
{
ostringstream s; ostringstream s;
s << "(ModbusTCPMaster): connection " << s.str() << " error: " << e.what(); s << "(ModbusTCPMaster): connection " << s.str() << " error: " << e.what();
dlog[Debug::CRIT] << s.str() << std::endl; dlog[Debug::CRIT] << s.str() << std::endl;
} }
}
catch( ... ) catch( ... )
{ {
if( dlog.debugging(Debug::CRIT) )
{
ostringstream s; ostringstream s;
s << "(ModbusTCPMaster): connection " << s.str() << " error: catch ..."; s << "(ModbusTCPMaster): connection " << s.str() << " error: catch ...";
dlog[Debug::CRIT] << s.str() << std::endl; dlog[Debug::CRIT] << s.str() << std::endl;
} }
}
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void ModbusTCPMaster::connect( const std::string addr, int port ) void ModbusTCPMaster::connect( const std::string addr, int port )
{ {
ost::InetAddress ia(iaddr.c_str()); ost::InetAddress ia(addr.c_str());
connect(ia,port); connect(ia,port);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
...@@ -347,7 +362,7 @@ void ModbusTCPMaster::connect( ost::InetAddress addr, int port ) ...@@ -347,7 +362,7 @@ void ModbusTCPMaster::connect( ost::InetAddress addr, int port )
ost::Thread::setException(ost::Thread::throwException); ost::Thread::setException(ost::Thread::throwException);
try try
{ {
tcp = new ost::TCPStream(iaddr.c_str()); tcp = new ost::TCPStream(iaddr.c_str(),ost::Socket::IPV4,536,true,500);
tcp->setTimeout(replyTimeOut_ms); tcp->setTimeout(replyTimeOut_ms);
} }
catch( std::exception& e ) catch( std::exception& e )
...@@ -374,7 +389,7 @@ void ModbusTCPMaster::connect( ost::InetAddress addr, int port ) ...@@ -374,7 +389,7 @@ void ModbusTCPMaster::connect( ost::InetAddress addr, int port )
void ModbusTCPMaster::disconnect() void ModbusTCPMaster::disconnect()
{ {
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << "(ModbusTCPMaster): disconnect." << endl; dlog[Debug::INFO] << iaddr << "(ModbusTCPMaster): disconnect." << endl;
if( !tcp ) if( !tcp )
return; return;
......
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