UniSet  2.0.0
ModbusMaster/MBTCPMultiMaster.h
00001 #ifndef _MBTCPMultiMaster_H_
00002 #define _MBTCPMultiMaster_H_
00003 // -----------------------------------------------------------------------------
00004 #include <ostream>
00005 #include <string>
00006 #include <map>
00007 #include <vector>
00008 #include "MBExchange.h"
00009 #include "modbus/ModbusTCPMaster.h"
00010 // -----------------------------------------------------------------------------
00203 // -----------------------------------------------------------------------------
00213 class MBTCPMultiMaster:
00214     public MBExchange
00215 {
00216     public:
00217         MBTCPMultiMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, SharedMemory* ic=0,
00218                         const std::string& prefix="mbtcp" );
00219         virtual ~MBTCPMultiMaster();
00220 
00222         static MBTCPMultiMaster* init_mbmaster( int argc, const char* const* argv,
00223                                             UniSetTypes::ObjectId shmID, SharedMemory* ic=0,
00224                                             const std::string& prefix="mbtcp" );
00225 
00227         static void help_print( int argc, const char* const* argv );
00228 
00229     protected:
00230         virtual void sysCommand( const UniSetTypes::SystemMessage *sm ) override;
00231         virtual void initIterators() override;
00232         virtual std::shared_ptr<ModbusClient> initMB( bool reopen=false ) override;
00233         void poll_thread();
00234         void check_thread();
00235 
00236         UniSetTypes::uniset_rwmutex mbMutex;
00237         bool force_disconnect;
00238         int checktime;
00239 
00240      private:
00241         MBTCPMultiMaster();
00242 
00243         struct MBSlaveInfo
00244         {
00245             MBSlaveInfo():ip(""),port(0),mbtcp(0),priority(0),
00246                 respond(false),respond_id(UniSetTypes::DefaultObjectId),respond_invert(false),
00247                 recv_timeout(200),aftersend_pause(0),sleepPause_usec(100),
00248                 force_disconnect(true),
00249                 myname(""),initOK(false){}
00250 
00251             std::string ip;
00252             int port;
00253             std::shared_ptr<ModbusTCPMaster> mbtcp;
00254             int priority;
00255 
00256             bool respond;
00257             UniSetTypes::ObjectId respond_id;
00258             IOController::IOStateList::iterator respond_it;
00259             bool respond_invert;
00260 
00261             inline bool operator < ( const MBSlaveInfo& mbs ) const
00262             {
00263                 return priority < mbs.priority;
00264             }
00265 
00266             bool init();
00267             bool check();
00268 
00269             int recv_timeout;
00270             int aftersend_pause;
00271             int sleepPause_usec;
00272             bool force_disconnect;
00273 
00274             std::string myname;
00275 
00276             bool initOK;
00277         };
00278 
00279         typedef std::list<MBSlaveInfo> MBGateList;
00280 
00281         MBGateList mblist;
00282         MBGateList::reverse_iterator mbi;
00283 
00284         // т.к. TCP может "зависнуть" на подключении к недоступному узлу
00285         // делаем опрос в отдельном потоке
00286         ThreadCreator<MBTCPMultiMaster>* pollThread; 
00287         UniSetTypes::uniset_rwmutex tcpMutex;
00288 
00289         ThreadCreator<MBTCPMultiMaster>* checkThread; 
00290 };
00291 // -----------------------------------------------------------------------------
00292 #endif // _MBTCPMultiMaster_H_
00293 // -----------------------------------------------------------------------------