Commit 82d01b3d authored by Pavel Vainerman's avatar Pavel Vainerman

(ModbusSlave): попытка все паузы в ожидании, отдавать eventloop

parent 1f715ac3
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
Name: libuniset2 Name: libuniset2
Version: 2.2 Version: 2.2
Release: alt31.2 Release: alt31.3
Summary: UniSet - library for building distributed industrial control systems Summary: UniSet - library for building distributed industrial control systems
License: LGPL License: LGPL
...@@ -486,6 +486,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname ...@@ -486,6 +486,9 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
# .. # ..
%changelog %changelog
* Sun Apr 03 2016 Pavel Vainerman <pv@altlinux.ru> 2.2-alt31.3
- ModbusSlave: iowait optimization
* Thu Mar 31 2016 Pavel Vainerman <pv@etersoft.ru> 2.2-alt31.2 * Thu Mar 31 2016 Pavel Vainerman <pv@etersoft.ru> 2.2-alt31.2
- test build - test build
......
...@@ -2589,6 +2589,12 @@ UniSetTypes::SimpleInfo* MBSlave::getInfo( CORBA::Long userparam ) ...@@ -2589,6 +2589,12 @@ UniSetTypes::SimpleInfo* MBSlave::getInfo( CORBA::Long userparam )
for( const auto& m : cmap ) for( const auto& m : cmap )
inf << " " << m.second.getShortInfo() << endl; inf << " " << m.second.getShortInfo() << endl;
{
uniset_mutex_lock l(sessMutex);
inf << "TCP sessions[" << sess.size() << "]:" << endl;
for( const auto& m : sess )
inf << " " << m.iaddr << " askCount=" << m.askCount << endl;
}
inf << endl; inf << endl;
} }
......
...@@ -89,9 +89,9 @@ class ModbusServer ...@@ -89,9 +89,9 @@ class ModbusServer
void setRecvTimeout( timeout_t msec ); void setRecvTimeout( timeout_t msec );
/*! установить паузу при ожидании символа */ /*! установить паузу при ожидании символа */
inline void setSleepPause( timeout_t usec ) inline void setSleepPause( timeout_t msec )
{ {
sleepPause_usec = usec; sleepPause_msec = msec;
} }
inline void setCRCNoCheckit( bool set ) inline void setCRCNoCheckit( bool set )
...@@ -159,6 +159,9 @@ class ModbusServer ...@@ -159,6 +159,9 @@ class ModbusServer
protected: protected:
virtual void iowait( timeout_t usec );
/*! реализация получения очередного сообщения */ /*! реализация получения очередного сообщения */
virtual ModbusRTU::mbErrCode realReceive( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout ) = 0; virtual ModbusRTU::mbErrCode realReceive( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout ) = 0;
...@@ -315,7 +318,7 @@ class ModbusServer ...@@ -315,7 +318,7 @@ class ModbusServer
timeout_t recvTimeOut_ms; /*!< таймаут на приём */ timeout_t recvTimeOut_ms; /*!< таймаут на приём */
timeout_t replyTimeout_ms; /*!< таймаут на формирование ответа */ timeout_t replyTimeout_ms; /*!< таймаут на формирование ответа */
timeout_t aftersend_msec; /*!< пауза после посылки ответа */ timeout_t aftersend_msec; /*!< пауза после посылки ответа */
timeout_t sleepPause_usec; /*!< пауза между попытками чтения символа из канала */ timeout_t sleepPause_msec; /*!< пауза между попытками чтения символа из канала */
bool onBroadcast; /*!< включен режим работы с broadcst-сообщениями */ bool onBroadcast; /*!< включен режим работы с broadcst-сообщениями */
bool crcNoCheckit; bool crcNoCheckit;
bool cleanBeforeSend; bool cleanBeforeSend;
......
...@@ -104,10 +104,11 @@ class ModbusTCPServer: ...@@ -104,10 +104,11 @@ class ModbusTCPServer:
return tmTime; return tmTime;
} }
void iowait( timeout_t msec ); // ожидание (при этом время отдаётся eventloop-у)
protected: protected:
// ожидание (при этом время отдаётся eventloop-у)
virtual void iowait( timeout_t msec ) override;
// функция receive пока не поддерживается... // функция receive пока не поддерживается...
virtual ModbusRTU::mbErrCode realReceive( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout ) override; virtual ModbusRTU::mbErrCode realReceive( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout ) override;
......
...@@ -35,7 +35,7 @@ ModbusServer::ModbusServer(): ...@@ -35,7 +35,7 @@ ModbusServer::ModbusServer():
recvTimeOut_ms(50), recvTimeOut_ms(50),
replyTimeout_ms(2000), replyTimeout_ms(2000),
aftersend_msec(0), aftersend_msec(0),
sleepPause_usec(100), sleepPause_msec(10),
onBroadcast(false), onBroadcast(false),
crcNoCheckit(false), crcNoCheckit(false),
cleanBeforeSend(false) cleanBeforeSend(false)
...@@ -606,7 +606,7 @@ mbErrCode ModbusServer::recv( const std::unordered_set<ModbusRTU::ModbusAddr>& v ...@@ -606,7 +606,7 @@ mbErrCode ModbusServer::recv( const std::unordered_set<ModbusRTU::ModbusAddr>& v
break; break;
} }
usleep(sleepPause_usec); iowait(sleepPause_msec);
} }
if( !begin ) if( !begin )
...@@ -1581,8 +1581,8 @@ void ModbusServer::initLog( UniSetTypes::Configuration* conf, ...@@ -1581,8 +1581,8 @@ void ModbusServer::initLog( UniSetTypes::Configuration* conf,
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void ModbusServer::printProcessingTime() void ModbusServer::printProcessingTime()
{ {
if( dlog->is_info() ) if( dlog->is_level9() )
dlog->info() << "(processingTime): " << tmProcessing.getCurrent() << " [msec] (lim: " << tmProcessing.getInterval() << ")" << endl; dlog->level9() << "(processingTime): " << tmProcessing.getCurrent() << " [msec] (lim: " << tmProcessing.getInterval() << ")" << endl;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
ModbusRTU::mbErrCode ModbusServer::replyFileTransfer( const std::string& fname, ModbusRTU::mbErrCode ModbusServer::replyFileTransfer( const std::string& fname,
...@@ -1693,6 +1693,11 @@ void ModbusServer::resetAskCounter() ...@@ -1693,6 +1693,11 @@ void ModbusServer::resetAskCounter()
askCount = 0; askCount = 0;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void ModbusServer::iowait( timeout_t msec )
{
msleep(msec);
}
// -------------------------------------------------------------------------
ModbusRTU::mbErrCode ModbusServer::replySetDateTime( ModbusRTU::SetDateTimeMessage& query, ModbusRTU::mbErrCode ModbusServer::replySetDateTime( ModbusRTU::SetDateTimeMessage& query,
ModbusRTU::SetDateTimeRetMessage& reply, ModbusRTU::SetDateTimeRetMessage& reply,
std::shared_ptr<DebugStream> dlog ) std::shared_ptr<DebugStream> dlog )
...@@ -1784,7 +1789,7 @@ mbErrCode ModbusServer::send( ModbusMessage& msg ) ...@@ -1784,7 +1789,7 @@ mbErrCode ModbusServer::send( ModbusMessage& msg )
} }
if( aftersend_msec > 0 ) if( aftersend_msec > 0 )
msleep(aftersend_msec); iowait(aftersend_msec);
return post_send_request(msg); return post_send_request(msg);
} }
......
...@@ -255,7 +255,7 @@ void ModbusTCPServer::ioAccept(ev::io& watcher, int revents) ...@@ -255,7 +255,7 @@ void ModbusTCPServer::ioAccept(ev::io& watcher, int revents)
s->setAfterSendPause(aftersend_msec); s->setAfterSendPause(aftersend_msec);
s->setReplyTimeout(replyTimeout_ms); s->setReplyTimeout(replyTimeout_ms);
s->setRecvTimeout(recvTimeOut_ms); s->setRecvTimeout(recvTimeOut_ms);
s->setSleepPause(sleepPause_usec); s->setSleepPause(sleepPause_msec);
s->setCleanBeforeSend(cleanBeforeSend); s->setCleanBeforeSend(cleanBeforeSend);
s->setSessionTimeout( (double)sessTimeout / 1000. ); s->setSessionTimeout( (double)sessTimeout / 1000. );
s->signal_post_receive().connect( sigc::mem_fun(this, &ModbusTCPServer::postReceiveEvent) ); s->signal_post_receive().connect( sigc::mem_fun(this, &ModbusTCPServer::postReceiveEvent) );
......
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