UniSet  2.6.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  inline void setSleepPause( timeout_t msec )
96  {
97  sleepPause_msec = msec;
98  }
99 
100  inline void setCRCNoCheckit( bool set )
101  {
102  crcNoCheckit = set;
103  }
104  inline bool isCRCNoCheckit() const
105  {
106  return crcNoCheckit;
107  }
108 
109  inline void setBroadcastMode( bool set )
110  {
111  onBroadcast = set;
112  }
113  inline bool getBroadcastMode() const
114  {
115  return onBroadcast;
116  }
117 
118  inline void setCleanBeforeSend( bool set )
119  {
120  cleanBeforeSend = set;
121  }
122  inline bool getCleanBeforeSend()
123  {
124  return cleanBeforeSend;
125  }
126 
130  static ModbusRTU::mbErrCode replySetDateTime( ModbusRTU::SetDateTimeMessage& query,
131  ModbusRTU::SetDateTimeRetMessage& reply,
132  std::shared_ptr<DebugStream> dlog = nullptr );
133 
134 
140  static ModbusRTU::mbErrCode replyFileTransfer( const std::string& fname,
141  ModbusRTU::FileTransferMessage& query,
142  ModbusRTU::FileTransferRetMessage& reply,
143  std::shared_ptr<DebugStream> dlog = nullptr );
144 
145  virtual void cleanupChannel() {}
146  virtual void terminate() {}
147 
148  virtual bool isActive() const = 0;
149 
150  // ------------ Статистика ---------------
151  typedef std::unordered_map<ModbusRTU::mbErrCode, size_t> ExchangeErrorMap;
152 
153  ExchangeErrorMap getErrorMap();
154  size_t getErrCount( ModbusRTU::mbErrCode e );
155  size_t resetErrCount( ModbusRTU::mbErrCode e, size_t set = 0 );
156 
157  inline size_t getAskCount() const
158  {
159  return askCount;
160  }
161  void resetAskCounter();
162 
163  protected:
164 
165  virtual void iowait( timeout_t usec );
166 
167 
169  virtual ModbusRTU::mbErrCode realReceive( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout ) = 0;
170 
176  virtual ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query,
177  ModbusRTU::ReadCoilRetMessage& reply ) = 0;
183  virtual ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query,
184  ModbusRTU::ReadInputStatusRetMessage& reply ) = 0;
185 
191  virtual ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query,
192  ModbusRTU::ReadOutputRetMessage& reply ) = 0;
193 
199  virtual ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query,
200  ModbusRTU::ReadInputRetMessage& reply ) = 0;
201 
207  virtual ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query,
208  ModbusRTU::ForceSingleCoilRetMessage& reply ) = 0;
209 
210 
216  virtual ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query,
217  ModbusRTU::WriteSingleOutputRetMessage& reply ) = 0;
218 
224  virtual ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query,
225  ModbusRTU::ForceCoilsRetMessage& reply ) = 0;
226 
232  virtual ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query,
233  ModbusRTU::WriteOutputRetMessage& reply ) = 0;
234 
235 
241  virtual ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query,
242  ModbusRTU::DiagnosticRetMessage& reply ) = 0;
243 
249  virtual ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query,
250  ModbusRTU::MEIMessageRetRDI& reply ) = 0;
251 
252 
258  virtual ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query,
259  ModbusRTU::JournalCommandRetMessage& reply ) = 0;
260 
261 
267  virtual ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query,
268  ModbusRTU::SetDateTimeRetMessage& reply ) = 0;
269 
270 
276  virtual ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query,
277  ModbusRTU::RemoteServiceRetMessage& reply ) = 0;
278 
279 
285  virtual ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query,
286  ModbusRTU::FileTransferRetMessage& reply ) = 0;
287 
294  virtual size_t getNextData( unsigned char* buf, int len ) = 0;
295 
296  virtual ModbusRTU::mbErrCode sendData( unsigned char* buf, int len ) = 0;
297 
299  virtual void setChannelTimeout( timeout_t msec ) = 0;
300 
302  virtual ModbusRTU::mbErrCode send( ModbusRTU::ModbusMessage& buf );
303 
304  // Если заголовок не должен использоваться оставляйте request.header.len = 0
305  virtual ModbusRTU::mbErrCode make_adu_header( ModbusRTU::ModbusMessage& request )
306  {
307  return ModbusRTU::erNoError;
308  }
309  virtual ModbusRTU::mbErrCode post_send_request( ModbusRTU::ModbusMessage& request )
310  {
311  return ModbusRTU::erNoError;
312  }
313 
314  // default processing
315  virtual ModbusRTU::mbErrCode processing( ModbusRTU::ModbusMessage& buf );
316 
318  ModbusRTU::mbErrCode recv(const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, ModbusRTU::ModbusMessage& buf, timeout_t timeout );
319  ModbusRTU::mbErrCode recv_pdu( ModbusRTU::ModbusMessage& rbuf, timeout_t timeout );
320 
321  std::timed_mutex recvMutex;
322  timeout_t recvTimeOut_ms = { 50 };
323  timeout_t replyTimeout_ms = { 2000 };
324  timeout_t aftersend_msec = { 0 };
325  timeout_t sleepPause_msec = { 10 };
326  bool onBroadcast = { false };
327  bool crcNoCheckit = { false };
328  bool cleanBeforeSend = { false };
329 
330  void printProcessingTime();
331  PassiveTimer tmProcessing;
332 
333  std::shared_ptr<DebugStream> dlog;
334 
335  // статистика сервера
336  size_t askCount = { 0 };
337  ExchangeErrorMap errmap;
339  PreReceiveSignal m_pre_signal;
340  PostReceiveSignal m_post_signal;
341 
342  private:
343 
344  };
345  // -------------------------------------------------------------------------
346 } // end of namespace uniset
347 // -------------------------------------------------------------------------
348 #endif // ModbusServer_H_
349 // -------------------------------------------------------------------------
virtual ModbusRTU::mbErrCode journalCommand(ModbusRTU::JournalCommandMessage &query, ModbusRTU::JournalCommandRetMessage &reply)=0
static ModbusRTU::mbErrCode replyFileTransfer(const std::string &fname, ModbusRTU::FileTransferMessage &query, ModbusRTU::FileTransferRetMessage &reply, std::shared_ptr< DebugStream > dlog=nullptr)
Definition: ModbusServer.cc:1583
virtual ModbusRTU::mbErrCode forceSingleCoil(ModbusRTU::ForceSingleCoilMessage &query, ModbusRTU::ForceSingleCoilRetMessage &reply)=0
Definition: CallbackTimer.h:29
void setRecvTimeout(timeout_t msec)
Definition: ModbusServer.cc:60
virtual ModbusRTU::mbErrCode readInputRegisters(ModbusRTU::ReadInputMessage &query, ModbusRTU::ReadInputRetMessage &reply)=0
virtual ModbusRTU::mbErrCode fileTransfer(ModbusRTU::FileTransferMessage &query, ModbusRTU::FileTransferRetMessage &reply)=0
timeout_t setAfterSendPause(timeout_t msec)
Definition: ModbusServer.cc:80
ExchangeErrorMap errmap
Definition: ModbusServer.h:337
timeout_t setReplyTimeout(timeout_t msec)
Definition: ModbusServer.cc:66
ModbusRTU::mbErrCode receive(const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, timeout_t msecTimeout)
Definition: ModbusServer.cc:1517
virtual size_t getNextData(unsigned char *buf, int len)=0
timeout_t aftersend_msec
Definition: ModbusServer.h:324
ModbusRTU::mbErrCode recv(const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, ModbusRTU::ModbusMessage &buf, timeout_t timeout)
Definition: ModbusServer.cc:582
STL namespace.
virtual ModbusRTU::mbErrCode diagnostics(ModbusRTU::DiagnosticMessage &query, ModbusRTU::DiagnosticRetMessage &reply)=0
virtual void setChannelTimeout(timeout_t msec)=0
virtual ModbusRTU::mbErrCode writeOutputRegisters(ModbusRTU::WriteOutputMessage &query, ModbusRTU::WriteOutputRetMessage &reply)=0
Definition: Configuration.h:45
virtual ModbusRTU::mbErrCode readOutputRegisters(ModbusRTU::ReadOutputMessage &query, ModbusRTU::ReadOutputRetMessage &reply)=0
timeout_t recvTimeOut_ms
Definition: ModbusServer.h:322
virtual ModbusRTU::mbErrCode remoteService(ModbusRTU::RemoteServiceMessage &query, ModbusRTU::RemoteServiceRetMessage &reply)=0
static bool checkAddr(const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, const ModbusRTU::ModbusAddr addr)
Definition: ModbusServer.cc:87
virtual ModbusRTU::mbErrCode send(ModbusRTU::ModbusMessage &buf)
Definition: ModbusServer.cc:1736
virtual ModbusRTU::mbErrCode setDateTime(ModbusRTU::SetDateTimeMessage &query, ModbusRTU::SetDateTimeRetMessage &reply)=0
virtual ModbusRTU::mbErrCode forceMultipleCoils(ModbusRTU::ForceCoilsMessage &query, ModbusRTU::ForceCoilsRetMessage &reply)=0
virtual ModbusRTU::mbErrCode readCoilStatus(ModbusRTU::ReadCoilMessage &query, ModbusRTU::ReadCoilRetMessage &reply)=0
Definition: ModbusServer.h:33
static ModbusRTU::mbErrCode replySetDateTime(ModbusRTU::SetDateTimeMessage &query, ModbusRTU::SetDateTimeRetMessage &reply, std::shared_ptr< DebugStream > dlog=nullptr)
Definition: ModbusServer.cc:1696
virtual ModbusRTU::mbErrCode read4314(ModbusRTU::MEIMessageRDI &query, ModbusRTU::MEIMessageRetRDI &reply)=0
virtual ModbusRTU::mbErrCode readInputStatus(ModbusRTU::ReadInputStatusMessage &query, ModbusRTU::ReadInputStatusRetMessage &reply)=0
virtual ModbusRTU::mbErrCode writeOutputSingleRegister(ModbusRTU::WriteSingleOutputMessage &query, ModbusRTU::WriteSingleOutputRetMessage &reply)=0
bool onBroadcast
Definition: ModbusServer.h:326
void setSleepPause(timeout_t msec)
Definition: ModbusServer.h:95
virtual ModbusRTU::mbErrCode realReceive(const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, timeout_t msecTimeout)=0
timeout_t sleepPause_msec
Definition: ModbusServer.h:325
timeout_t replyTimeout_ms
Definition: ModbusServer.h:323