|
UniSet
2.0.0
|
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 // -----------------------------------------------------------------------------
1.7.6.1