Commit bee92874 authored by Pavel Vainerman's avatar Pavel Vainerman

Добавил в MosbusMaster использование shared_ptr

parent be3c8fbf
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <string> #include <string>
#include <map> #include <map>
#include <vector> #include <vector>
#include <memory>
#include "IONotifyController.h" #include "IONotifyController.h"
#include "UniSetObject_LT.h" #include "UniSetObject_LT.h"
#include "PassiveTimer.h" #include "PassiveTimer.h"
...@@ -234,7 +235,7 @@ class MBExchange: ...@@ -234,7 +235,7 @@ class MBExchange:
InitList initRegList; /*!< список регистров для инициализации */ InitList initRegList; /*!< список регистров для инициализации */
UniSetTypes::uniset_rwmutex pollMutex; UniSetTypes::uniset_rwmutex pollMutex;
virtual ModbusClient* initMB( bool reopen=false )= 0; virtual std::shared_ptr<ModbusClient> initMB( bool reopen=false )= 0;
virtual void poll(); virtual void poll();
bool pollRTU( RTUDevice* dev, RegMap::iterator& it ); bool pollRTU( RTUDevice* dev, RegMap::iterator& it );
...@@ -311,7 +312,7 @@ class MBExchange: ...@@ -311,7 +312,7 @@ class MBExchange:
std::string prop_prefix; /*!< префикс для считывания параметров обмена */ std::string prop_prefix; /*!< префикс для считывания параметров обмена */
ModbusClient* mb; std::shared_ptr<ModbusClient> mb;
// определение timeout для соединения // определение timeout для соединения
PassiveTimer ptTimeout; PassiveTimer ptTimeout;
......
...@@ -14,7 +14,7 @@ MBTCPMaster::MBTCPMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shm ...@@ -14,7 +14,7 @@ MBTCPMaster::MBTCPMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shm
SharedMemory* ic, const std::string& prefix ): SharedMemory* ic, const std::string& prefix ):
MBExchange(objId,shmId,ic,prefix), MBExchange(objId,shmId,ic,prefix),
force_disconnect(true), force_disconnect(true),
mbtcp(0), mbtcp(nullptr),
pollThread(0) pollThread(0)
{ {
if( objId == DefaultObjectId ) if( objId == DefaultObjectId )
...@@ -76,25 +76,24 @@ pollThread(0) ...@@ -76,25 +76,24 @@ pollThread(0)
MBTCPMaster::~MBTCPMaster() MBTCPMaster::~MBTCPMaster()
{ {
delete pollThread; delete pollThread;
delete mbtcp; //delete mbtcp;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
ModbusClient* MBTCPMaster::initMB( bool reopen ) std::shared_ptr<ModbusClient> MBTCPMaster::initMB( bool reopen )
{ {
if( mbtcp ) if( mbtcp )
{ {
if( !reopen ) if( !reopen )
return mbtcp; return mbtcp;
delete mbtcp; mbtcp = nullptr;
mb = 0; mb = nullptr;
mbtcp = 0;
} }
try try
{ {
ost::Thread::setException(ost::Thread::throwException); ost::Thread::setException(ost::Thread::throwException);
mbtcp = new ModbusTCPMaster(); mbtcp = std::make_shared<ModbusTCPMaster>();
ost::InetAddress ia(iaddr.c_str()); ost::InetAddress ia(iaddr.c_str());
mbtcp->connect(ia,port); mbtcp->connect(ia,port);
...@@ -118,10 +117,8 @@ ModbusClient* MBTCPMaster::initMB( bool reopen ) ...@@ -118,10 +117,8 @@ ModbusClient* MBTCPMaster::initMB( bool reopen )
} }
catch(...) catch(...)
{ {
if( mbtcp ) mb = nullptr;
delete mbtcp; mbtcp = nullptr;
mb = 0;
mbtcp = 0;
} }
mb = mbtcp; mb = mbtcp;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <string> #include <string>
#include <map> #include <map>
#include <vector> #include <vector>
#include <memory>
#include "MBExchange.h" #include "MBExchange.h"
#include "modbus/ModbusTCPMaster.h" #include "modbus/ModbusTCPMaster.h"
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -206,7 +207,7 @@ class MBTCPMaster: ...@@ -206,7 +207,7 @@ class MBTCPMaster:
protected: protected:
virtual void sysCommand( const UniSetTypes::SystemMessage *sm ) override; virtual void sysCommand( const UniSetTypes::SystemMessage *sm ) override;
virtual ModbusClient* initMB( bool reopen=false ) override; virtual std::shared_ptr<ModbusClient> initMB( bool reopen=false ) override;
UniSetTypes::uniset_rwmutex mbMutex; UniSetTypes::uniset_rwmutex mbMutex;
std::string iaddr; std::string iaddr;
...@@ -218,7 +219,7 @@ class MBTCPMaster: ...@@ -218,7 +219,7 @@ class MBTCPMaster:
private: private:
MBTCPMaster(); MBTCPMaster();
ModbusTCPMaster* mbtcp; std::shared_ptr<ModbusTCPMaster> mbtcp;
// т.к. TCP может "зависнуть" на подключении к недоступному узлу // т.к. TCP может "зависнуть" на подключении к недоступному узлу
// делаем опрос в отдельном потоке // делаем опрос в отдельном потоке
......
...@@ -98,7 +98,7 @@ checkThread(0) ...@@ -98,7 +98,7 @@ checkThread(0)
} }
sinf.priority = it1.getIntProp("priority"); sinf.priority = it1.getIntProp("priority");
sinf.mbtcp = new ModbusTCPMaster(); sinf.mbtcp = std::make_shared<ModbusTCPMaster>();
sinf.recv_timeout = it1.getPIntProp("recv_timeout",recv_timeout); sinf.recv_timeout = it1.getPIntProp("recv_timeout",recv_timeout);
sinf.aftersend_pause = it1.getPIntProp("aftersend_pause",aftersend_pause); sinf.aftersend_pause = it1.getPIntProp("aftersend_pause",aftersend_pause);
...@@ -126,7 +126,7 @@ checkThread(0) ...@@ -126,7 +126,7 @@ checkThread(0)
dcrit << err.str() << endl; dcrit << err.str() << endl;
throw UniSetTypes::SystemError(err.str()); throw UniSetTypes::SystemError(err.str());
} }
mblist.sort(); mblist.sort();
mbi = mblist.rbegin(); mbi = mblist.rbegin();
...@@ -157,20 +157,19 @@ MBTCPMultiMaster::~MBTCPMultiMaster() ...@@ -157,20 +157,19 @@ MBTCPMultiMaster::~MBTCPMultiMaster()
delete checkThread; delete checkThread;
for( auto &it: mblist ) for( auto &it: mblist )
{ {
delete it.mbtcp; it.mbtcp = nullptr;
it.mbtcp = 0;
mbi = mblist.rend(); mbi = mblist.rend();
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
ModbusClient* MBTCPMultiMaster::initMB( bool reopen ) std::shared_ptr<ModbusClient> MBTCPMultiMaster::initMB( bool reopen )
{ {
// просто движемся по кругу (т.к. связь не проверяется) // просто движемся по кругу (т.к. связь не проверяется)
// движемся в обратном порядке, т.к. сортировка по возрастанию приоритета // движемся в обратном порядке, т.к. сортировка по возрастанию приоритета
if( checktime <=0 ) if( checktime <=0 )
{ {
++mbi; ++mbi;
if( mbi == mblist.rend() ) if( mbi == mblist.rend() )
mbi = mblist.rbegin(); mbi = mblist.rbegin();
mbi->init(); mbi->init();
...@@ -209,7 +208,7 @@ ModbusClient* MBTCPMultiMaster::initMB( bool reopen ) ...@@ -209,7 +208,7 @@ ModbusClient* MBTCPMultiMaster::initMB( bool reopen )
{ {
uniset_rwmutex_wrlock l(tcpMutex); uniset_rwmutex_wrlock l(tcpMutex);
mbi = mblist.rend(); mbi = mblist.rend();
mb = 0; mb = nullptr;
} }
return 0; return 0;
......
...@@ -217,7 +217,7 @@ class MBTCPMultiMaster: ...@@ -217,7 +217,7 @@ class MBTCPMultiMaster:
MBTCPMultiMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, SharedMemory* ic=0, MBTCPMultiMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, SharedMemory* ic=0,
const std::string& prefix="mbtcp" ); const std::string& prefix="mbtcp" );
virtual ~MBTCPMultiMaster(); virtual ~MBTCPMultiMaster();
/*! глобальная функция для инициализации объекта */ /*! глобальная функция для инициализации объекта */
static MBTCPMultiMaster* init_mbmaster( int argc, const char* const* argv, static MBTCPMultiMaster* init_mbmaster( int argc, const char* const* argv,
UniSetTypes::ObjectId shmID, SharedMemory* ic=0, UniSetTypes::ObjectId shmID, SharedMemory* ic=0,
...@@ -229,7 +229,7 @@ class MBTCPMultiMaster: ...@@ -229,7 +229,7 @@ class MBTCPMultiMaster:
protected: protected:
virtual void sysCommand( const UniSetTypes::SystemMessage *sm ) override; virtual void sysCommand( const UniSetTypes::SystemMessage *sm ) override;
virtual void initIterators() override; virtual void initIterators() override;
virtual ModbusClient* initMB( bool reopen=false ) override; virtual std::shared_ptr<ModbusClient> initMB( bool reopen=false ) override;
void poll_thread(); void poll_thread();
void check_thread(); void check_thread();
...@@ -250,9 +250,9 @@ class MBTCPMultiMaster: ...@@ -250,9 +250,9 @@ class MBTCPMultiMaster:
std::string ip; std::string ip;
int port; int port;
ModbusTCPMaster* mbtcp; std::shared_ptr<ModbusTCPMaster> mbtcp;
int priority; int priority;
bool respond; bool respond;
UniSetTypes::ObjectId respond_id; UniSetTypes::ObjectId respond_id;
IOController::IOStateList::iterator respond_it; IOController::IOStateList::iterator respond_it;
...@@ -270,7 +270,7 @@ class MBTCPMultiMaster: ...@@ -270,7 +270,7 @@ class MBTCPMultiMaster:
int aftersend_pause; int aftersend_pause;
int sleepPause_usec; int sleepPause_usec;
bool force_disconnect; bool force_disconnect;
std::string myname; std::string myname;
bool initOK; bool initOK;
......
...@@ -88,16 +88,16 @@ void RTUExchange::help_print( int argc, const char* const* argv ) ...@@ -88,16 +88,16 @@ void RTUExchange::help_print( int argc, const char* const* argv )
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
RTUExchange::~RTUExchange() RTUExchange::~RTUExchange()
{ {
delete mbrtu; // delete mbrtu;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
ModbusClient* RTUExchange::initMB( bool reopen ) std::shared_ptr<ModbusClient> RTUExchange::initMB( bool reopen )
{ {
if( !file_exist(devname) ) if( !file_exist(devname) )
{ {
if( mbrtu ) if( mbrtu )
{ {
delete mbrtu; // delete mbrtu;
mb = 0; mb = 0;
mbrtu = 0; mbrtu = 0;
} }
...@@ -108,15 +108,15 @@ ModbusClient* RTUExchange::initMB( bool reopen ) ...@@ -108,15 +108,15 @@ ModbusClient* RTUExchange::initMB( bool reopen )
{ {
if( !reopen ) if( !reopen )
return mbrtu; return mbrtu;
delete mbrtu; // delete mbrtu;
mbrtu = 0; mbrtu = 0;
mb = 0; mb = 0;
} }
try try
{ {
mbrtu = new ModbusRTUMaster(devname,use485F,transmitCtl); mbrtu = std::make_shared<ModbusRTUMaster>(devname,use485F,transmitCtl);
if( defSpeed != ComPort::ComSpeed0 ) if( defSpeed != ComPort::ComSpeed0 )
mbrtu->setSpeed(defSpeed); mbrtu->setSpeed(defSpeed);
...@@ -134,18 +134,18 @@ ModbusClient* RTUExchange::initMB( bool reopen ) ...@@ -134,18 +134,18 @@ ModbusClient* RTUExchange::initMB( bool reopen )
} }
catch( Exception& ex ) catch( Exception& ex )
{ {
if( mbrtu ) //if( mbrtu )
delete mbrtu; // delete mbrtu;
mbrtu = 0; mbrtu = 0;
dwarn << myname << "(init): " << ex << endl; dwarn << myname << "(init): " << ex << endl;
} }
catch(...) catch(...)
{ {
if( mbrtu ) // if( mbrtu )
delete mbrtu; // delete mbrtu;
mbrtu = 0; mbrtu = 0;
dinfo << myname << "(init): catch...." << endl; dinfo << myname << "(init): catch...." << endl;
} }
......
...@@ -26,7 +26,7 @@ class RTUExchange: ...@@ -26,7 +26,7 @@ class RTUExchange:
static void help_print( int argc, const char* const* argv ); static void help_print( int argc, const char* const* argv );
protected: protected:
ModbusRTUMaster* mbrtu; std::shared_ptr<ModbusRTUMaster> mbrtu;
UniSetTypes::uniset_mutex mbMutex; UniSetTypes::uniset_mutex mbMutex;
std::string devname; std::string devname;
ComPort::Speed defSpeed; ComPort::Speed defSpeed;
...@@ -36,7 +36,7 @@ class RTUExchange: ...@@ -36,7 +36,7 @@ class RTUExchange:
virtual void step() override; virtual void step() override;
virtual void poll() override; virtual void poll() override;
virtual ModbusClient* initMB( bool reopen=false ) override; virtual std::shared_ptr<ModbusClient> initMB( bool reopen=false ) override;
virtual bool initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXML_iterator& it ) override; virtual bool initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXML_iterator& it ) override;
private: private:
......
...@@ -32,9 +32,8 @@ RTUStorage::~RTUStorage() ...@@ -32,9 +32,8 @@ RTUStorage::~RTUStorage()
{ {
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void RTUStorage::poll( ModbusRTUMaster* mb ) void RTUStorage::poll( const std::shared_ptr<ModbusRTUMaster> mb ) throw( ModbusRTU::mbException )
throw( ModbusRTU::mbException )
{ {
try try
{ {
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#include <ostream> #include <ostream>
#include <string> #include <string>
#include <memory>
#include "modbus/ModbusTypes.h" #include "modbus/ModbusTypes.h"
#include "UniSetTypes.h" #include "UniSetTypes.h"
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -14,8 +15,8 @@ class RTUStorage ...@@ -14,8 +15,8 @@ class RTUStorage
public: public:
RTUStorage( ModbusRTU::ModbusAddr addr ); RTUStorage( ModbusRTU::ModbusAddr addr );
~RTUStorage(); ~RTUStorage();
void poll( ModbusRTUMaster* mb ) void poll( const std::shared_ptr<ModbusRTUMaster> mb )
throw(ModbusRTU::mbException); throw(ModbusRTU::mbException);
inline ModbusRTU::ModbusAddr getAddress(){ return addr; } inline ModbusRTU::ModbusAddr getAddress(){ return addr; }
...@@ -25,7 +26,7 @@ class RTUStorage ...@@ -25,7 +26,7 @@ class RTUStorage
inline void setPollDI( bool set ){ pollDI = set; } inline void setPollDI( bool set ){ pollDI = set; }
inline void setPollDIO( bool set ){ pollDIO = set; } inline void setPollDIO( bool set ){ pollDIO = set; }
inline void setPollUNIO( bool set ){ pollUNIO = set; } inline void setPollUNIO( bool set ){ pollUNIO = set; }
enum RTUJack enum RTUJack
{ {
nUnknown, nUnknown,
...@@ -37,18 +38,18 @@ class RTUStorage ...@@ -37,18 +38,18 @@ class RTUStorage
nX4, // DI (8) nX4, // DI (8)
nX5 // DI (8) nX5 // DI (8)
}; };
static RTUJack s2j( const std::string& jack ); static RTUJack s2j( const std::string& jack );
static std::string j2s( RTUJack j ); static std::string j2s( RTUJack j );
long getInt( RTUJack jack, unsigned short channel, UniversalIO::IOType t ); long getInt( RTUJack jack, unsigned short channel, UniversalIO::IOType t );
float getFloat( RTUJack jack, unsigned short channel, UniversalIO::IOType t ); float getFloat( RTUJack jack, unsigned short channel, UniversalIO::IOType t );
bool getState( RTUJack jack, unsigned short channel, UniversalIO::IOType t ); bool getState( RTUJack jack, unsigned short channel, UniversalIO::IOType t );
static ModbusRTU::ModbusData getRegister( RTUJack jack, unsigned short channel, UniversalIO::IOType t ); static ModbusRTU::ModbusData getRegister( RTUJack jack, unsigned short channel, UniversalIO::IOType t );
static ModbusRTU::SlaveFunctionCode getFunction( RTUJack jack, unsigned short channel, UniversalIO::IOType t ); static ModbusRTU::SlaveFunctionCode getFunction( RTUJack jack, unsigned short channel, UniversalIO::IOType t );
// ДОДЕЛАТЬ: setState, setValue // ДОДЕЛАТЬ: setState, setValue
void print(); void print();
......
...@@ -87,28 +87,28 @@ int main( int argc, char **argv ) ...@@ -87,28 +87,28 @@ int main( int argc, char **argv )
cout << "(init): dev=" << dev cout << "(init): dev=" << dev
<< " speed=" << speed << " speed=" << speed
<< " timeout=" << tout << " msec " << " timeout=" << tout << " msec "
<< endl; << endl;
} }
ModbusRTUMaster mb(dev,use485); std::shared_ptr<ModbusRTUMaster> mb = std::make_shared<ModbusRTUMaster>(dev,use485);
if( verb ) if( verb )
dlog.addLevel( Debug::type(Debug::CRIT | Debug::WARN | Debug::INFO) ); dlog.addLevel( Debug::type(Debug::CRIT | Debug::WARN | Debug::INFO) );
mb.setTimeout(tout); mb->setTimeout(tout);
mb.setSpeed(speed); mb->setSpeed(speed);
mb.setLog(dlog); mb->setLog(dlog);
RTUStorage rtu(slaveaddr); RTUStorage rtu(slaveaddr);
rtu.poll(&mb); rtu.poll(mb);
cout << rtu << endl; cout << rtu << endl;
for( unsigned int i=0; i<24; i++ ) for( unsigned int i=0; i<24; i++ )
cout << "UNIO1 AI" << i << ": " << rtu.getFloat( RTUStorage::nJ1, i, UniversalIO::AI ) << endl; cout << "UNIO1 AI" << i << ": " << rtu.getFloat( RTUStorage::nJ1, i, UniversalIO::AI ) << endl;
for( unsigned int i=0; i<24; i++ ) for( unsigned int i=0; i<24; i++ )
cout << "UNIO1 DI" << i << ": " << rtu.getState( RTUStorage::nJ1, i, UniversalIO::DI ) << endl; cout << "UNIO1 DI" << i << ": " << rtu.getState( RTUStorage::nJ1, i, UniversalIO::DI ) << endl;
return 0; return 0;
} }
catch( ModbusRTU::mbException& ex ) catch( ModbusRTU::mbException& ex )
......
#!/bin/sh #!/bin/sh
./uniset2-start.sh -f ./uniset2-mbtcpmultimaster \ ./uniset-start.sh -f ./uniset2-mbtcpmultimaster \
--confile test.xml \ --confile test.xml \
--mbtcp-name MBMultiMaster1 \ --mbtcp-name MBMultiMaster1 \
--smemory-id SharedMemory \ --smemory-id SharedMemory \
......
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