UniSet 2.32.1
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// -------------------------------------------------------------------------
19namespace 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 // Сбор статистики по соединениям...
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
STL namespace.
Definition Calibration.h:27
Definition ModbusTCPServer.h:65