UniSet  2.24.2
ModbusTCPServer.h
1 // -------------------------------------------------------------------------
2 #ifndef ModbusTCPServer_H_
3 #define ModbusTCPServer_H_
4 // -------------------------------------------------------------------------
5 #include <string>
6 #include <queue>
7 #include <ev++.h>
8 #include <sigc++/sigc++.h>
9 #include "Mutex.h"
10 #include "Debug.h"
11 #include "Configuration.h"
12 #include "PassiveTimer.h"
13 #include "ModbusTypes.h"
14 #include "ModbusServer.h"
15 #include "ModbusTCPSession.h"
16 #include "UTCPSocket.h"
17 #include "EventLoopServer.h"
18 // -------------------------------------------------------------------------
19 namespace uniset
20 {
21  // -------------------------------------------------------------------------
30  public EventLoopServer,
31  public ModbusServer
32  {
33  public:
34  ModbusTCPServer( const std::string& addr, int port = 502 );
35  virtual ~ModbusTCPServer();
36 
41  bool run( const std::unordered_set<ModbusRTU::ModbusAddr>& vmbaddr );
42 
46  bool async_run( const std::unordered_set<ModbusRTU::ModbusAddr>& vmbaddr );
47 
49  virtual void terminate() override;
50 
51  virtual bool isActive() const override;
52 
53  void setMaxSessions( size_t num );
54  size_t getMaxSessions() const noexcept;
55 
57  void setSessionTimeout( timeout_t msec );
58  timeout_t getSessionTimeout() const noexcept;
59 
61  size_t getCountSessions() const noexcept;
62 
63  // Сбор статистики по соединениям...
64  struct SessionInfo
65  {
66  SessionInfo( const std::string& a, size_t ask ): iaddr(a), askCount(ask) {}
67 
68  std::string iaddr;
69  size_t askCount;
70  };
71 
72  typedef std::list<SessionInfo> Sessions;
73 
74  void getSessions( Sessions& lst );
75 
76  std::string getInetAddress() const noexcept;
77  int getInetPort() const noexcept;
78 
79  // статистика
80  size_t getConnectionCount() const noexcept;
81 
82  // -------------------------------------------------
83  // Таймер.
84  // Т.к. eventLoop() "бесконечный", то сделана возможность
85  // подключиться к сигналу "таймера", например для обновления статистики по сессиям
86  // \warning Следует иметь ввиду, что обработчик сигнала, должен быть максимально коротким
87  // т.к. на это время останавливается работа основного потока (eventLoop)
88  // -------------------------------------------------
89  typedef sigc::signal<void> TimerSignal;
90  TimerSignal signal_timer();
91 
92  void setTimer( timeout_t msec );
93  timeout_t getTimer() const noexcept;
94 
95  // Таймаут для переоткрытия сокета.
96  // Если в течение msec миллисекунд нет действующих соединений
97  // сокет переоткрывается
98  void setSocketTimeout( timeout_t msec );
99  timeout_t getSocketTimeout() const noexcept;
100 
101  protected:
102 
103  // ожидание (при этом время отдаётся eventloop-у)
104  virtual void iowait( timeout_t msec ) override;
105 
106  // функция receive пока не поддерживается...
107  virtual ModbusRTU::mbErrCode realReceive( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout ) override;
108 
109  virtual void evprepare() override;
110  virtual void evfinish() override;
111 
112  virtual void ioAccept(ev::io& watcher, int revents);
113  void onTimer( ev::timer& t, int revents );
114  void onSocketTimeout( ev::timer& t, int revents );
115  void onSocketResetTimeout( ev::async& watcher, int revents ) noexcept;
116 
117  void sessionFinished( const ModbusTCPSession* s );
118 
119  virtual size_t getNextData( unsigned char* buf, int len ) override
120  {
121  return 0;
122  }
123 
124  virtual ModbusRTU::mbErrCode sendData( unsigned char* buf, int len ) override
125  {
126  return ModbusRTU::erHardwareError;
127  }
128 
130  virtual void setChannelTimeout( timeout_t msec ) override {};
131 
132  int port = { 0 };
133  std::string iaddr;
134  std::string myname;
135  std::queue<unsigned char> qrecv;
136  ModbusRTU::MBAPHeader curQueryHeader;
137 
138  std::mutex sMutex;
139  typedef std::list<std::shared_ptr<ModbusTCPSession>> SessionList;
140  SessionList slist;
141 
142  bool ignoreAddr = { false };
143 
144  size_t maxSessions = { 100 };
145  size_t sessCount = { 0 };
146 
147  // Статистика
148  size_t connCount = { 0 }; // количество обработанных соединений
149 
150  timeout_t sessTimeout = { 10000 }; // msec
151 
152  ev::io io;
153  ev::timer ioTimer;
154  std::shared_ptr<UTCPSocket> sock;
155 
156  ev::timer sockTimeout;
157  timeout_t socketTimeout_msec = { UniSetTimer::WaitUpTime };
158  double tmSockTimeout = { 0.0 };
159  ev::async asyncResetSockTimeout;
160 
161  std::unordered_set<ModbusRTU::ModbusAddr> vmbaddr;
162  TimerSignal m_timer_signal;
163 
164  timeout_t tmTime_msec = { UniSetTimer::WaitUpTime }; // время по умолчанию для таймера (TimerSignal)
165  double tmTime = { 0.0 };
166 
167  PassiveTimer ptWait;
168 
169  private:
170  void createSocket();
171 
172  // транслирование сигналов от Sessions..
173  void postReceiveEvent( ModbusRTU::mbErrCode res );
174  ModbusRTU::mbErrCode preReceiveEvent( const std::unordered_set<ModbusRTU::ModbusAddr> vaddr, timeout_t tout );
175  };
176  // -------------------------------------------------------------------------
177 } // end of namespace uniset
178 // -------------------------------------------------------------------------
179 #endif // ModbusTCPServer_H_
180 // -------------------------------------------------------------------------
The EventLoopServer class Реализация общей части всех процессов использующих libev....
Definition: EventLoopServer.h:18
Definition: ModbusServer.h:33
Definition: ModbusTCPServer.h:32
virtual size_t getNextData(unsigned char *buf, int len) override
Definition: ModbusTCPServer.h:119
virtual ModbusRTU::mbErrCode realReceive(const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, timeout_t msecTimeout) override
Definition: ModbusTCPServer.cc:464
virtual void setChannelTimeout(timeout_t msec) override
Definition: ModbusTCPServer.h:130
void setSessionTimeout(timeout_t msec)
Definition: ModbusTCPServer.cc:86
size_t getCountSessions() const noexcept
Definition: ModbusTCPServer.cc:81
bool async_run(const std::unordered_set< ModbusRTU::ModbusAddr > &vmbaddr)
Definition: ModbusTCPServer.cc:102
virtual void terminate() override
Definition: ModbusTCPServer.cc:162
bool run(const std::unordered_set< ModbusRTU::ModbusAddr > &vmbaddr)
Definition: ModbusTCPServer.cc:96
The ModbusTCPSession class Класс рассчитан на совместную работу с ModbusTCPServer,...
Definition: ModbusTCPSession.h:36
static const timeout_t WaitUpTime
Definition: PassiveTimer.h:69
Definition: CommonEventLoop.h:15
Definition: ModbusTCPServer.h:65