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
00286
00287 ThreadCreator<MBTCPMultiMaster>* pollThread;
00288 UniSetTypes::uniset_mutex tcpMutex;
00289
00290 ThreadCreator<MBTCPMultiMaster>* checkThread;
00291 };
00292
00293 #endif // _MBTCPMultiMaster_H_
00294