UniSet  1.7.0
include/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( UniSetTypes::SystemMessage *sm );
00231         virtual void initIterators();
00232         virtual ModbusClient* initMB( bool reopen=false );
00233         void poll_thread();
00234         void check_thread();
00235 
00236         UniSetTypes::uniset_mutex mbMutex;
00237         int recv_timeout;
00238         bool force_disconnect;
00239         int checktime;
00240 
00241      private:
00242         MBTCPMultiMaster();
00243 
00244         struct MBSlaveInfo
00245         {
00246             MBSlaveInfo():ip(""),port(0),mbtcp(0),priority(0),
00247                 respond(false),respond_id(UniSetTypes::DefaultObjectId),respond_invert(false),
00248                 recv_timeout(200),aftersend_pause(0),sleepPause_usec(100),
00249                 force_disconnect(true),
00250                 myname(""),initOK(false){}
00251 
00252             std::string ip;
00253             int port;
00254             ModbusTCPMaster* mbtcp;
00255             int priority;
00256             
00257             bool respond;
00258             UniSetTypes::ObjectId respond_id;
00259             IOController::DIOStateList::iterator respond_dit;
00260             bool respond_invert;
00261 
00262             inline bool operator < ( const MBSlaveInfo& mbs ) const
00263             {
00264                 return priority < mbs.priority;
00265             }
00266 
00267             bool init();
00268             bool check();
00269 
00270             int recv_timeout;
00271             int aftersend_pause;
00272             int sleepPause_usec;
00273             bool force_disconnect;
00274             
00275             std::string myname;
00276 
00277             bool initOK;
00278         };
00279 
00280         typedef std::list<MBSlaveInfo> MBGateList;
00281 
00282         MBGateList mblist;
00283         MBGateList::reverse_iterator mbi;
00284 
00285         // т.к. TCP может "зависнуть" на подключении к недоступному узлу
00286         // делаем опрос в отдельном потоке
00287         ThreadCreator<MBTCPMultiMaster>* pollThread; 
00288         UniSetTypes::uniset_mutex tcpMutex;
00289 
00290         ThreadCreator<MBTCPMultiMaster>* checkThread; 
00291 };
00292 // -----------------------------------------------------------------------------
00293 #endif // _MBTCPMultiMaster_H_
00294 // -----------------------------------------------------------------------------