Commit cfe0364f authored by Pavel Vainerman's avatar Pavel Vainerman

(Modbus): переименовал ModbusTCPMultiSlave --> ModbusTCPPersistentSlave,

попытка решить проблемму с высокой загрузкой процессора при подключении клиентов
parent efa9ec05
......@@ -13,7 +13,7 @@
Name: libuniset2
Version: 2.1
Release: alt18
Release: alt19
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 29 2015 Pavel Vainerman <pv@altlinux.ru> 2.1-alt19
- (ModbusSlave): rename ModbusMultiSlave --> ModbusPersistentSlave, minor fixes
* Thu Aug 27 2015 Pavel Vainerman <pv@altlinux.ru> 2.1-alt18
- (ModbusExchange): add reinit_timeout timer..
......
......@@ -2,7 +2,7 @@
#include <sstream>
#include "Exceptions.h"
#include "Extensions.h"
#include "MBTCPMultiSlave.h"
#include "MBTCPPersistentSlave.h"
#include "modbus/ModbusRTUSlaveSlot.h"
#include "modbus/ModbusTCPServerSlot.h"
#include "modbus/MBLogSugar.h"
......@@ -12,7 +12,7 @@ using namespace UniSetTypes;
using namespace UniSetExtensions;
using namespace ModbusRTU;
// -----------------------------------------------------------------------------
MBTCPMultiSlave::MBTCPMultiSlave( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, const std::shared_ptr<SharedMemory> ic, const string& prefix ):
MBTCPPersistentSlave::MBTCPPersistentSlave( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, const std::shared_ptr<SharedMemory> ic, const string& prefix ):
MBSlave(objId, shmId, ic, prefix),
sesscount_id(DefaultObjectId)
{
......@@ -22,7 +22,7 @@ MBTCPMultiSlave::MBTCPMultiSlave( UniSetTypes::ObjectId objId, UniSetTypes::Obje
cnode = conf->getNode(conf_name);
if( cnode == NULL )
throw UniSetTypes::SystemError("(MBTCPMultiSlave): Not found conf-node for " + myname );
throw UniSetTypes::SystemError("(MBTCPPersistentSlave): Not found conf-node for " + myname );
UniXML::iterator it(cnode);
......@@ -31,18 +31,20 @@ MBTCPMultiSlave::MBTCPMultiSlave( UniSetTypes::ObjectId objId, UniSetTypes::Obje
if( waitTimeout == 0 )
waitTimeout = 4000;
ptUpdateInfo.setTiming(waitTimeout);
vmonit(waitTimeout);
sessTimeout = conf->getArgInt("--" + prefix + "-session-timeout", it.getProp("sessTimeout"));
if( sessTimeout == 0 )
sessTimeout = 10000;
sessTimeout = 2000;
vmonit(sessTimeout);
sessMaxNum = conf->getArgInt("--" + prefix + "-session-maxnum", it.getProp("sessMaxNum"));
if( sessMaxNum == 0 )
sessMaxNum = 10;
sessMaxNum = 3;
vmonit(sessMaxNum);
......@@ -109,11 +111,11 @@ MBTCPMultiSlave::MBTCPMultiSlave( UniSetTypes::ObjectId objId, UniSetTypes::Obje
}
}
// -----------------------------------------------------------------------------
MBTCPMultiSlave::~MBTCPMultiSlave()
MBTCPPersistentSlave::~MBTCPPersistentSlave()
{
}
// -----------------------------------------------------------------------------
void MBTCPMultiSlave::help_print( int argc, const char* const* argv )
void MBTCPPersistentSlave::help_print( int argc, const char* const* argv )
{
MBSlave::help_print(argc, argv);
......@@ -124,7 +126,7 @@ void MBTCPMultiSlave::help_print( int argc, const char* const* argv )
cout << "--prefix-session-count-id id - Датчик для отслеживания текущего количества соединений." << endl;
}
// -----------------------------------------------------------------------------
std::shared_ptr<MBTCPMultiSlave> MBTCPMultiSlave::init_mbslave( int argc, const char* const* argv, UniSetTypes::ObjectId icID,
std::shared_ptr<MBTCPPersistentSlave> MBTCPPersistentSlave::init_mbslave( int argc, const char* const* argv, UniSetTypes::ObjectId icID,
const std::shared_ptr<SharedMemory> ic, const string& prefix )
{
auto conf = uniset_conf();
......@@ -147,10 +149,10 @@ std::shared_ptr<MBTCPMultiSlave> MBTCPMultiSlave::init_mbslave( int argc, const
}
dinfo << "(mbslave): name = " << name << "(" << ID << ")" << endl;
return make_shared<MBTCPMultiSlave>(ID, icID, ic, prefix);
return make_shared<MBTCPPersistentSlave>(ID, icID, ic, prefix);
}
// -----------------------------------------------------------------------------
void MBTCPMultiSlave::execute_tcp()
void MBTCPPersistentSlave::execute_tcp()
{
auto sslot = dynamic_pointer_cast<ModbusTCPServerSlot>(mbslot);
......@@ -177,6 +179,13 @@ void MBTCPMultiSlave::execute_tcp()
{
sslot->waitQuery( addr, waitTimeout );
// если слишком быстро обработали запрос
// то ничего не делаем..
if( !ptUpdateInfo.checkTime() )
continue;
ptUpdateInfo.reset();
// Обновляем информацию по соединениям
sess.clear();
sslot->getSessions(sess);
......@@ -318,7 +327,7 @@ void MBTCPMultiSlave::execute_tcp()
mbinfo << myname << "(execute_tcp): thread stopped.." << endl;
}
// -----------------------------------------------------------------------------
void MBTCPMultiSlave::initIterators()
void MBTCPPersistentSlave::initIterators()
{
MBSlave::initIterators();
......@@ -328,7 +337,7 @@ void MBTCPMultiSlave::initIterators()
i.second.initIterators(shm);
}
// -----------------------------------------------------------------------------
bool MBTCPMultiSlave::deactivateObject()
bool MBTCPPersistentSlave::deactivateObject()
{
if( mbslot )
{
......@@ -341,7 +350,7 @@ bool MBTCPMultiSlave::deactivateObject()
return MBSlave::deactivateObject();
}
// -----------------------------------------------------------------------------
void MBTCPMultiSlave::sigterm( int signo )
void MBTCPPersistentSlave::sigterm( int signo )
{
if( mbslot )
{
......@@ -354,7 +363,7 @@ void MBTCPMultiSlave::sigterm( int signo )
MBSlave::sigterm(signo);
}
// -----------------------------------------------------------------------------
const std::string MBTCPMultiSlave::ClientInfo::getShortInfo() const
const std::string MBTCPPersistentSlave::ClientInfo::getShortInfo() const
{
ostringstream s;
......@@ -363,7 +372,7 @@ const std::string MBTCPMultiSlave::ClientInfo::getShortInfo() const
return std::move(s.str());
}
// -----------------------------------------------------------------------------
UniSetTypes::SimpleInfo* MBTCPMultiSlave::getInfo()
UniSetTypes::SimpleInfo* MBTCPPersistentSlave::getInfo()
{
UniSetTypes::SimpleInfo_var i = MBSlave::getInfo();
......
// -----------------------------------------------------------------------------
#ifndef _MBTCPMultiSlave_H_
#define _MBTCPMultiSlave_H_
#ifndef _MBTCPPersistentSlave_H_
#define _MBTCPPersistentSlave_H_
// -----------------------------------------------------------------------------
#include <unordered_map>
#include "MBSlave.h"
#include "modbus/ModbusTCPServer.h"
// -----------------------------------------------------------------------------
/*!
<MBTCPMultiSlave ....sesscount="">
<MBTCPPersistentSlave ....sesscount="">
<clients>
<item ip="" respond="" invert="1" askcount=""/>
<item ip="" respond="" invert="1" askcount=""/>
<item ip="" respond="" invert="1" askcount=""/>
</clients>
</MBTCPMultiSlave>
</MBTCPPersistentSlave>
*/
// -----------------------------------------------------------------------------
/*! Реализация многоптоточного slave-интерфейса */
class MBTCPMultiSlave:
class MBTCPPersistentSlave:
public MBSlave
{
public:
MBTCPMultiSlave( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, const std::shared_ptr<SharedMemory> ic = nullptr, const std::string& prefix = "mbs" );
virtual ~MBTCPMultiSlave();
MBTCPPersistentSlave( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, const std::shared_ptr<SharedMemory> ic = nullptr, const std::string& prefix = "mbs" );
virtual ~MBTCPPersistentSlave();
/*! глобальная функция для инициализации объекта */
static std::shared_ptr<MBTCPMultiSlave> init_mbslave( int argc, const char* const* argv,
static std::shared_ptr<MBTCPPersistentSlave> init_mbslave( int argc, const char* const* argv,
UniSetTypes::ObjectId shmID, const std::shared_ptr<SharedMemory> ic = nullptr,
const std::string& prefix = "mbs" );
......@@ -44,6 +44,7 @@ class MBTCPMultiSlave:
timeout_t waitTimeout;
ModbusTCPServer::Sessions sess; /*!< список открытых сессий */
unsigned int sessMaxNum;
PassiveTimer ptUpdateInfo;
struct ClientInfo
{
......@@ -82,5 +83,5 @@ class MBTCPMultiSlave:
IOController::IOStateList::iterator sesscount_it;
};
// -----------------------------------------------------------------------------
#endif // _MBTCPMultiSlave_H_
#endif // _MBTCPPersistentSlave_H_
// -----------------------------------------------------------------------------
bin_PROGRAMS = @PACKAGE@-mbslave @PACKAGE@-mbtcp-multislave
bin_PROGRAMS = @PACKAGE@-mbslave @PACKAGE@-mbtcp-persistentslave
# не забывайте править версию в2.pc-файле
UMBS_VER=@LIBVER@
......@@ -10,7 +10,7 @@ libUniSet2MBSlave_la_LIBADD = $(top_builddir)/lib/libUniSet2.la \
$(top_builddir)/extensions/lib/libUniSet2Extensions.la \
$(SIGC_LIBS) $(COMCPP_LIBS)
libUniSet2MBSlave_la_CXXFLAGS = -I$(top_builddir)/extensions/include -I$(top_builddir)/extensions/SharedMemory $(SIGC_CFLAGS) $(COMCPP_CFLAGS)
libUniSet2MBSlave_la_SOURCES = MBSlave.cc MBTCPMultiSlave.cc
libUniSet2MBSlave_la_SOURCES = MBSlave.cc MBTCPPersistentSlave.cc
@PACKAGE@_mbslave_SOURCES = mbslave.cc
@PACKAGE@_mbslave_LDADD = libUniSet2MBSlave.la $(top_builddir)/lib/libUniSet2.la \
......@@ -19,12 +19,12 @@ libUniSet2MBSlave_la_SOURCES = MBSlave.cc MBTCPMultiSlave.cc
$(SIGC_LIBS) $(COMCPP_LIBS)
@PACKAGE@_mbslave_CXXFLAGS = -I$(top_builddir)/extensions/include -I$(top_builddir)/extensions/SharedMemory $(SIGC_CFLAGS) $(COMCPP_CFLAGS)
@PACKAGE@_mbtcp_multislave_SOURCES = mbtcp-multislave.cc
@PACKAGE@_mbtcp_multislave_LDADD = libUniSet2MBSlave.la $(top_builddir)/lib/libUniSet2.la \
@PACKAGE@_mbtcp_persistentslave_SOURCES = mbtcp-persistentslave.cc
@PACKAGE@_mbtcp_persistentslave_LDADD = libUniSet2MBSlave.la $(top_builddir)/lib/libUniSet2.la \
$(top_builddir)/extensions/SharedMemory/libUniSet2SharedMemory.la \
$(top_builddir)/extensions/lib/libUniSet2Extensions.la \
$(SIGC_LIBS) $(COMCPP_LIBS)
@PACKAGE@_mbtcp_multislave_CXXFLAGS = -I$(top_builddir)/extensions/include -I$(top_builddir)/extensions/SharedMemory $(SIGC_CFLAGS) $(COMCPP_CFLAGS)
@PACKAGE@_mbtcp_persistentslave_CXXFLAGS = -I$(top_builddir)/extensions/include -I$(top_builddir)/extensions/SharedMemory $(SIGC_CFLAGS) $(COMCPP_CFLAGS)
# install
devel_include_HEADERS = *.h
......
......@@ -2,7 +2,7 @@
#include <sstream>
#include <string>
#include <cc++/socket.h>
#include "MBTCPMultiSlave.h"
#include "MBTCPPersistentSlave.h"
#include "Configuration.h"
#include "Debug.h"
#include "UniSetActivator.h"
......@@ -56,7 +56,7 @@ int main(int argc, const char** argv)
return 1;
}
auto s = MBTCPMultiSlave::init_mbslave(argc, argv, shmID);
auto s = MBTCPPersistentSlave::init_mbslave(argc, argv, shmID);
if( !s )
{
......@@ -70,9 +70,9 @@ int main(int argc, const char** argv)
act->broadcast( sm.transport_msg() );
ulogany << "\n\n\n";
ulogany << "(main): -------------- MBTCPMultiSlave START -------------------------\n\n";
ulogany << "(main): -------------- MBTCPPersistentSlave START -------------------------\n\n";
dlogany << "\n\n\n";
dlogany << "(main): -------------- MBTCPMultiSlave START -------------------------\n\n";
dlogany << "(main): -------------- MBTCPPersistentSlave START -------------------------\n\n";
act->run(false);
return 0;
......
#!/bin/sh
uniset2-start.sh -f ./uniset2-mbtcp-multislave --confile test.xml --dlog-add-levels level3,level4 \
uniset2-start.sh -f ./uniset2-mbtcp-persistentslave --confile test.xml --dlog-add-levels level3,level4 \
--smemory-id SharedMemory \
--mbs-name MBMultiSlave1 --mbs-type TCP --mbs-inet-addr 127.0.0.1 --mbs-inet-port 2048 --mbs-reg-from-id 1 --mbs-my-addr 0x01 \
$*
......
......@@ -9,7 +9,7 @@
#include "Extensions.h"
#include "RTUExchange.h"
#include "MBSlave.h"
#include "MBTCPMultiSlave.h"
#include "MBTCPPersistentSlave.h"
#include "MBTCPMaster.h"
#include "SharedMemory.h"
//#include "UniExchange.h"
......@@ -215,7 +215,7 @@ int main( int argc, const char** argv )
dinfo << "(smemory-plus): add MBTCPMultiSlave(" << p.str() << ")" << endl;
auto mbs = MBTCPMultiSlave::init_mbslave(argc, argv, shm->getId(), shm, p.str());
auto mbs = MBTCPPersistentSlave::init_mbslave(argc, argv, shm->getId(), shm, p.str());
if( !mbs )
return 1;
......
......@@ -189,12 +189,16 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
ost::tpport_t port;
if( dlog->is_warn() )
{
const char* err = tcp->getErrorString();
dlog->warn() << "(ModbusTCPMaster::query): ret=" << (int)ret
<< " < rmh=" << (int)sizeof(rmh)
<< " errnum: " << tcp->getErrorNumber()
<< " perr: " << tcp->getPeer(&port)
<< " err: " << string(tcp->getErrorString())
<< " err: " << (err ? string(err) : "")
<< endl;
}
disconnect();
return erTimeOut; // return erHardwareError;
......
......@@ -41,7 +41,7 @@ extensions/include/MBExchange.h
extensions/include/MBSlave.h
extensions/include/MBTCPMaster.h
extensions/include/MBTCPMultiMaster.h
extensions/include/MBTCPMultiSlave.h
extensions/include/MBTCPPersistentSlave.h
extensions/include/MTR.h
extensions/include/PassiveLProcessor.h
extensions/include/PID.h
......@@ -144,9 +144,9 @@ extensions/ModbusSlave/Makefile.am
extensions/ModbusSlave/MBSlave.cc
extensions/ModbusSlave/mbslave.cc
extensions/ModbusSlave/MBSlave.h
extensions/ModbusSlave/mbtcp-multislave.cc
extensions/ModbusSlave/MBTCPMultiSlave.cc
extensions/ModbusSlave/MBTCPMultiSlave.h
extensions/ModbusSlave/mbtcp-persistentslave.cc
extensions/ModbusSlave/MBTCPPersistentSlave.cc
extensions/ModbusSlave/MBTCPPersistentSlave.h
extensions/ModbusSlave/test.xml
extensions/RRDServer/libUniSet2RRDServer.pc.in
extensions/RRDServer/main.cc
......
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