UniSet  2.7.0
ModbusServer.h
1 // -------------------------------------------------------------------------
2 #ifndef ModbusServer_H_
3 #define ModbusServer_H_
4 // -------------------------------------------------------------------------
5 #include <string>
6 #include <unordered_set>
7 #include <unordered_map>
8 #include <sigc++/sigc++.h>
9 
10 #include "Debug.h"
11 #include "Mutex.h"
12 #include "Configuration.h"
13 #include "PassiveTimer.h"
14 #include "ModbusTypes.h"
15 // -------------------------------------------------------------------------
16 namespace std
17 {
18  template<>
19  class hash<uniset::ModbusRTU::mbErrCode>
20  {
21  public:
22  size_t operator()(const uniset::ModbusRTU::mbErrCode& e) const
23  {
24  return std::hash<size_t>()(e);
25  }
26  };
27 }
28 // -------------------------------------------------------------------------
29 namespace uniset
30 {
31  // -------------------------------------------------------------------------
34  {
35  public:
36  ModbusServer();
37  virtual ~ModbusServer();
38 
39  void initLog( uniset::Configuration* conf, const std::string& name, const std::string& logfile = "" );
40  void setLog( std::shared_ptr<DebugStream> dlog );
41  inline std::shared_ptr<DebugStream> log()
42  {
43  return dlog;
44  }
45 
46  static std::unordered_set<ModbusRTU::ModbusAddr> addr2vaddr( ModbusRTU::ModbusAddr& mbaddr );
47 
53  ModbusRTU::mbErrCode receive( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout );
54 
55  // версия с "одним" адресом
56  virtual ModbusRTU::mbErrCode receive_one( const ModbusRTU::ModbusAddr addr, timeout_t msec );
57 
58 
59  // ---------------------------------------------------------------------------------------
60  // сигналы по обработке событий приёма сообщения.
61  // ---------------------------------------------------------------------------------------
62  // сигнал вызова receive, ДО обработки realReceive()
63  // \return ModbusRTU::errNoError, тогда обработка продолжиться.
64  typedef sigc::signal<ModbusRTU::mbErrCode, const std::unordered_set<ModbusRTU::ModbusAddr>, timeout_t> PreReceiveSignal;
65  PreReceiveSignal signal_pre_receive();
66 
67  // сигнал после обработки realReceive()
68  typedef sigc::signal<void, ModbusRTU::mbErrCode> PostReceiveSignal;
69  PostReceiveSignal signal_post_receive();
70  // ---------------------------------------------------------------------------------------
71 
78  static bool checkAddr( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, const ModbusRTU::ModbusAddr addr );
79  static std::string vaddr2str( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr );
80 
84  timeout_t setAfterSendPause( timeout_t msec );
85 
89  timeout_t setReplyTimeout( timeout_t msec );
90 
92  void setRecvTimeout( timeout_t msec );
93 
95  void setSleepPause( timeout_t msec );
96 
97  void setCRCNoCheckit( bool set );
98  bool isCRCNoCheckit() const;
99 
100  void setBroadcastMode( bool set );
101  bool getBroadcastMode() const;
102 
103  void setCleanBeforeSend( bool set );
104  bool getCleanBeforeSend() const;
105 
109  static ModbusRTU::mbErrCode replySetDateTime( ModbusRTU::SetDateTimeMessage& query,
111  std::shared_ptr<DebugStream> dlog = nullptr );
112 
113 
119  static ModbusRTU::mbErrCode replyFileTransfer( const std::string& fname,
122  std::shared_ptr<DebugStream> dlog = nullptr );
123 
124  virtual void cleanupChannel() {}
125  virtual void terminate() {}
126 
127  virtual bool isActive() const = 0;
128 
129  // ------------ Статистика ---------------
130  typedef std::unordered_map<ModbusRTU::mbErrCode, size_t> ExchangeErrorMap;
131 
132  ExchangeErrorMap getErrorMap();
133  size_t getErrCount( ModbusRTU::mbErrCode e ) const;
134  size_t resetErrCount( ModbusRTU::mbErrCode e, size_t set = 0 );
135 
136  size_t getAskCount() const noexcept;
137  void resetAskCounter();
138 
139  protected:
140 
141  virtual void iowait( timeout_t usec );
142 
144  virtual ModbusRTU::mbErrCode realReceive( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout ) = 0;
145 
151  virtual ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query,
152  ModbusRTU::ReadCoilRetMessage& reply ) = 0;
158  virtual ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query,
160 
166  virtual ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query,
167  ModbusRTU::ReadOutputRetMessage& reply ) = 0;
168 
174  virtual ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query,
175  ModbusRTU::ReadInputRetMessage& reply ) = 0;
176 
182  virtual ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query,
184 
185 
191  virtual ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query,
193 
199  virtual ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query,
200  ModbusRTU::ForceCoilsRetMessage& reply ) = 0;
201 
207  virtual ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query,
209 
210 
216  virtual ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query,
217  ModbusRTU::DiagnosticRetMessage& reply ) = 0;
218 
224  virtual ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query,
225  ModbusRTU::MEIMessageRetRDI& reply ) = 0;
226 
227 
233  virtual ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query,
235 
236 
242  virtual ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query,
244 
245 
251  virtual ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query,
253 
254 
260  virtual ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query,
262 
269  virtual size_t getNextData( unsigned char* buf, int len ) = 0;
270 
271  virtual ModbusRTU::mbErrCode sendData( unsigned char* buf, int len ) = 0;
272 
274  virtual void setChannelTimeout( timeout_t msec ) = 0;
275 
277  virtual ModbusRTU::mbErrCode send( ModbusRTU::ModbusMessage& buf );
278 
279  // Если заголовок не должен использоваться оставляйте request.header.len = 0
280  virtual ModbusRTU::mbErrCode make_adu_header( ModbusRTU::ModbusMessage& request )
281  {
282  return ModbusRTU::erNoError;
283  }
284  virtual ModbusRTU::mbErrCode post_send_request( ModbusRTU::ModbusMessage& request )
285  {
286  return ModbusRTU::erNoError;
287  }
288 
289  // default processing
290  virtual ModbusRTU::mbErrCode processing( ModbusRTU::ModbusMessage& buf );
291 
293  ModbusRTU::mbErrCode recv(const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, ModbusRTU::ModbusMessage& buf, timeout_t timeout );
294  ModbusRTU::mbErrCode recv_pdu( ModbusRTU::ModbusMessage& rbuf, timeout_t timeout );
295 
296  std::timed_mutex recvMutex;
297  timeout_t recvTimeOut_ms = { 50 };
298  timeout_t replyTimeout_ms = { 2000 };
299  timeout_t aftersend_msec = { 0 };
300  timeout_t sleepPause_msec = { 10 };
301  bool onBroadcast = { false };
302  bool crcNoCheckit = { false };
303  bool cleanBeforeSend = { false };
304 
305  void printProcessingTime();
306  PassiveTimer tmProcessing;
307 
308  std::shared_ptr<DebugStream> dlog;
309 
310  // статистика сервера
311  size_t askCount = { 0 };
312  ExchangeErrorMap errmap;
314  PreReceiveSignal m_pre_signal;
315  PostReceiveSignal m_post_signal;
316 
317  private:
318 
319  };
320  // -------------------------------------------------------------------------
321 } // end of namespace uniset
322 // -------------------------------------------------------------------------
323 #endif // ModbusServer_H_
324 // -------------------------------------------------------------------------
Пассивный таймер
Definition: PassiveTimer.h:92
Definition: ModbusTypes.h:1436
Definition: ModbusTypes.h:1013
Definition: CallbackTimer.h:29
Definition: ModbusTypes.h:824
Definition: ModbusTypes.h:1469
ExchangeErrorMap errmap
Definition: ModbusServer.h:312
Definition: ModbusTypes.h:327
Definition: ModbusTypes.h:784
STL namespace.
Definition: ModbusTypes.h:878
Definition: ModbusTypes.h:1555
Definition: ModbusTypes.h:1098
Definition: ModbusTypes.h:1168
Definition: ModbusTypes.h:646
Definition: Configuration.h:45
Definition: ModbusTypes.h:1583
Definition: ModbusTypes.h:1156
Definition: ModbusTypes.h:358
Definition: ModbusTypes.h:427
Definition: ModbusTypes.h:1223
Definition: ModbusTypes.h:707
Definition: ModbusServer.h:33
Definition: ModbusTypes.h:1290
Definition: ModbusTypes.h:616
Definition: ModbusTypes.h:557
Definition: ModbusTypes.h:192
Definition: ModbusTypes.h:528
Definition: ModbusTypes.h:1378
Definition: ModbusTypes.h:917
Definition: ModbusTypes.h:1416
Definition: ModbusTypes.h:1313