UniSet  2.8.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  struct hash<uniset::ModbusRTU::mbErrCode>
20  {
21  size_t operator()(const uniset::ModbusRTU::mbErrCode& e) const
22  {
23  return std::hash<size_t>()(e);
24  }
25  };
26 }
27 // -------------------------------------------------------------------------
28 namespace uniset
29 {
30  // -------------------------------------------------------------------------
33  {
34  public:
35  ModbusServer();
36  virtual ~ModbusServer();
37 
38  void initLog( uniset::Configuration* conf, const std::string& name, const std::string& logfile = "" );
39  void setLog( std::shared_ptr<DebugStream> dlog );
40  inline std::shared_ptr<DebugStream> log()
41  {
42  return dlog;
43  }
44 
45  static std::unordered_set<ModbusRTU::ModbusAddr> addr2vaddr( ModbusRTU::ModbusAddr& mbaddr );
46 
52  ModbusRTU::mbErrCode receive( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout );
53 
54  // версия с "одним" адресом
55  virtual ModbusRTU::mbErrCode receive_one( const ModbusRTU::ModbusAddr addr, timeout_t msec );
56 
57 
58  // ---------------------------------------------------------------------------------------
59  // сигналы по обработке событий приёма сообщения.
60  // ---------------------------------------------------------------------------------------
61  // сигнал вызова receive, ДО обработки realReceive()
62  // \return ModbusRTU::errNoError, тогда обработка продолжиться.
63  typedef sigc::signal<ModbusRTU::mbErrCode, const std::unordered_set<ModbusRTU::ModbusAddr>, timeout_t> PreReceiveSignal;
64  PreReceiveSignal signal_pre_receive();
65 
66  // сигнал после обработки realReceive()
67  typedef sigc::signal<void, ModbusRTU::mbErrCode> PostReceiveSignal;
68  PostReceiveSignal signal_post_receive();
69  // ---------------------------------------------------------------------------------------
70 
77  static bool checkAddr( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, const ModbusRTU::ModbusAddr addr );
78  static std::string vaddr2str( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr );
79 
83  timeout_t setAfterSendPause( timeout_t msec );
84 
88  timeout_t setReplyTimeout( timeout_t msec );
89 
91  void setRecvTimeout( timeout_t msec );
92 
94  void setSleepPause( timeout_t msec );
95 
96  void setCRCNoCheckit( bool set );
97  bool isCRCNoCheckit() const;
98 
99  void setBroadcastMode( bool set );
100  bool getBroadcastMode() const;
101 
102  void setCleanBeforeSend( bool set );
103  bool getCleanBeforeSend() const;
104 
108  static ModbusRTU::mbErrCode replySetDateTime( ModbusRTU::SetDateTimeMessage& query,
110  std::shared_ptr<DebugStream> dlog = nullptr );
111 
112 
118  static ModbusRTU::mbErrCode replyFileTransfer( const std::string& fname,
121  std::shared_ptr<DebugStream> dlog = nullptr );
122 
123  virtual void cleanupChannel() {}
124  virtual void terminate() {}
125 
126  virtual bool isActive() const = 0;
127 
128  // ------------ Статистика ---------------
129  typedef std::unordered_map<ModbusRTU::mbErrCode, size_t> ExchangeErrorMap;
130 
131  ExchangeErrorMap getErrorMap();
132  size_t getErrCount( ModbusRTU::mbErrCode e ) const;
133  size_t resetErrCount( ModbusRTU::mbErrCode e, size_t set = 0 );
134 
135  size_t getAskCount() const noexcept;
136  void resetAskCounter();
137 
138  protected:
139 
140  virtual void iowait( timeout_t usec );
141 
143  virtual ModbusRTU::mbErrCode realReceive( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout ) = 0;
144 
150  virtual ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query,
151  ModbusRTU::ReadCoilRetMessage& reply ) = 0;
157  virtual ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query,
159 
165  virtual ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query,
166  ModbusRTU::ReadOutputRetMessage& reply ) = 0;
167 
173  virtual ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query,
174  ModbusRTU::ReadInputRetMessage& reply ) = 0;
175 
181  virtual ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query,
183 
184 
190  virtual ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query,
192 
198  virtual ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query,
199  ModbusRTU::ForceCoilsRetMessage& reply ) = 0;
200 
206  virtual ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query,
208 
209 
215  virtual ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query,
216  ModbusRTU::DiagnosticRetMessage& reply ) = 0;
217 
223  virtual ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query,
224  ModbusRTU::MEIMessageRetRDI& reply ) = 0;
225 
226 
232  virtual ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query,
234 
235 
241  virtual ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query,
243 
244 
250  virtual ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query,
252 
253 
259  virtual ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query,
261 
268  virtual size_t getNextData( unsigned char* buf, int len ) = 0;
269 
270  virtual ModbusRTU::mbErrCode sendData( unsigned char* buf, int len ) = 0;
271 
273  virtual void setChannelTimeout( timeout_t msec ) = 0;
274 
276  virtual ModbusRTU::mbErrCode send( ModbusRTU::ModbusMessage& buf );
277 
278  // Если заголовок не должен использоваться оставляйте request.header.len = 0
279  virtual ModbusRTU::mbErrCode make_adu_header( ModbusRTU::ModbusMessage& request )
280  {
281  return ModbusRTU::erNoError;
282  }
283  virtual ModbusRTU::mbErrCode post_send_request( ModbusRTU::ModbusMessage& request )
284  {
285  return ModbusRTU::erNoError;
286  }
287 
288  // default processing
289  virtual ModbusRTU::mbErrCode processing( ModbusRTU::ModbusMessage& buf );
290 
292  ModbusRTU::mbErrCode recv(const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, ModbusRTU::ModbusMessage& buf, timeout_t timeout );
293  ModbusRTU::mbErrCode recv_pdu( ModbusRTU::ModbusMessage& rbuf, timeout_t timeout );
294 
295  std::timed_mutex recvMutex;
296  timeout_t recvTimeOut_ms = { 50 };
297  timeout_t replyTimeout_ms = { 2000 };
298  timeout_t aftersend_msec = { 0 };
299  timeout_t sleepPause_msec = { 10 };
300  bool onBroadcast = { false };
301  bool crcNoCheckit = { false };
302  bool cleanBeforeSend = { false };
303 
304  void printProcessingTime();
305  PassiveTimer tmProcessing;
306 
307  std::shared_ptr<DebugStream> dlog;
308 
309  // статистика сервера
310  size_t askCount = { 0 };
311  ExchangeErrorMap errmap;
313  PreReceiveSignal m_pre_signal;
314  PostReceiveSignal m_post_signal;
315 
316  private:
317 
318  };
319  // -------------------------------------------------------------------------
320 } // end of namespace uniset
321 // -------------------------------------------------------------------------
322 #endif // ModbusServer_H_
323 // -------------------------------------------------------------------------
Definition: ModbusTypes.h:1454
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:1632
Definition: ModbusTypes.h:1031
virtual ModbusRTU::mbErrCode forceSingleCoil(ModbusRTU::ForceSingleCoilMessage &query, ModbusRTU::ForceSingleCoilRetMessage &reply)=0
Definition: CommonEventLoop.h:14
void setRecvTimeout(timeout_t msec)
Definition: ModbusServer.cc:60
virtual ModbusRTU::mbErrCode readInputRegisters(ModbusRTU::ReadInputMessage &query, ModbusRTU::ReadInputRetMessage &reply)=0
Definition: ModbusTypes.h:842
Definition: ModbusTypes.h:1487
virtual ModbusRTU::mbErrCode fileTransfer(ModbusRTU::FileTransferMessage &query, ModbusRTU::FileTransferRetMessage &reply)=0
timeout_t setAfterSendPause(timeout_t msec)
Definition: ModbusServer.cc:115
ExchangeErrorMap errmap
Definition: ModbusServer.h:311
timeout_t setReplyTimeout(timeout_t msec)
Definition: ModbusServer.cc:101
Definition: ModbusTypes.h:345
ModbusRTU::mbErrCode receive(const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, timeout_t msecTimeout)
Definition: ModbusServer.cc:1566
Definition: ModbusTypes.h:802
virtual size_t getNextData(unsigned char *buf, int len)=0
timeout_t aftersend_msec
Definition: ModbusServer.h:298
ModbusRTU::mbErrCode recv(const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, ModbusRTU::ModbusMessage &buf, timeout_t timeout)
Definition: ModbusServer.cc:631
virtual ModbusRTU::mbErrCode diagnostics(ModbusRTU::DiagnosticMessage &query, ModbusRTU::DiagnosticRetMessage &reply)=0
virtual void setChannelTimeout(timeout_t msec)=0
Definition: ModbusTypes.h:896
Definition: ModbusTypes.h:1573
Definition: ModbusTypes.h:1116
virtual ModbusRTU::mbErrCode writeOutputRegisters(ModbusRTU::WriteOutputMessage &query, ModbusRTU::WriteOutputRetMessage &reply)=0
Definition: ModbusTypes.h:1186
Definition: ModbusTypes.h:664
Definition: Configuration.h:45
Definition: ModbusTypes.h:1601
virtual ModbusRTU::mbErrCode readOutputRegisters(ModbusRTU::ReadOutputMessage &query, ModbusRTU::ReadOutputRetMessage &reply)=0
Definition: ModbusTypes.h:1174
timeout_t recvTimeOut_ms
Definition: ModbusServer.h:296
virtual ModbusRTU::mbErrCode remoteService(ModbusRTU::RemoteServiceMessage &query, ModbusRTU::RemoteServiceRetMessage &reply)=0
Definition: ModbusTypes.h:376
static bool checkAddr(const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, const ModbusRTU::ModbusAddr addr)
Definition: ModbusServer.cc:122
virtual ModbusRTU::mbErrCode send(ModbusRTU::ModbusMessage &buf)
Definition: ModbusServer.cc:1790
Definition: ModbusTypes.h:445
Definition: ModbusTypes.h:1241
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: ModbusTypes.h:725
Definition: ModbusServer.h:32
Definition: ModbusTypes.h:1308
static ModbusRTU::mbErrCode replySetDateTime(ModbusRTU::SetDateTimeMessage &query, ModbusRTU::SetDateTimeRetMessage &reply, std::shared_ptr< DebugStream > dlog=nullptr)
Definition: ModbusServer.cc:1750
Definition: ModbusTypes.h:634
virtual ModbusRTU::mbErrCode read4314(ModbusRTU::MEIMessageRDI &query, ModbusRTU::MEIMessageRetRDI &reply)=0
Definition: ModbusTypes.h:575
virtual ModbusRTU::mbErrCode readInputStatus(ModbusRTU::ReadInputStatusMessage &query, ModbusRTU::ReadInputStatusRetMessage &reply)=0
Definition: ModbusTypes.h:210
virtual ModbusRTU::mbErrCode writeOutputSingleRegister(ModbusRTU::WriteSingleOutputMessage &query, ModbusRTU::WriteSingleOutputRetMessage &reply)=0
bool onBroadcast
Definition: ModbusServer.h:300
Definition: ModbusTypes.h:546
Definition: ModbusTypes.h:1396
void setSleepPause(timeout_t msec)
Definition: ModbusServer.cc:66
Definition: ModbusTypes.h:935
Definition: ModbusTypes.h:1434
virtual ModbusRTU::mbErrCode realReceive(const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, timeout_t msecTimeout)=0
timeout_t sleepPause_msec
Definition: ModbusServer.h:299
Definition: ModbusTypes.h:1331
timeout_t replyTimeout_ms
Definition: ModbusServer.h:297