|
UniSet
1.7.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( 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 // -----------------------------------------------------------------------------
1.7.6.1