UniSet @VERSION@
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// -------------------------------------------------------------------------
16namespace 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// -------------------------------------------------------------------------
28namespace uniset
29{
30 // -------------------------------------------------------------------------
33 {
34 public:
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 setCleanBeforeSend( bool set );
100 bool getCleanBeforeSend() const;
101
105 static ModbusRTU::mbErrCode replySetDateTime( const ModbusRTU::SetDateTimeMessage& query,
107 std::shared_ptr<DebugStream> dlog = nullptr );
108
114 static ModbusRTU::mbErrCode replyFileTransfer( const std::string& fname,
117 std::shared_ptr<DebugStream> dlog = nullptr );
118
119 virtual void cleanupChannel() {}
120 virtual void terminate() {}
121
122 virtual bool isActive() const = 0;
123
124 // ------------ Статистика ---------------
125 typedef std::unordered_map<ModbusRTU::mbErrCode, size_t> ExchangeErrorMap;
126
127 ExchangeErrorMap getErrorMap();
128 size_t getErrCount( ModbusRTU::mbErrCode e ) const;
129 size_t resetErrCount( ModbusRTU::mbErrCode e, size_t set = 0 );
130
131 size_t getAskCount() const noexcept;
132 void resetAskCounter();
133
134 protected:
135
136 virtual void iowait( timeout_t usec );
137
139 virtual ModbusRTU::mbErrCode realReceive( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout ) = 0;
140
146 virtual ModbusRTU::mbErrCode readCoilStatus( const ModbusRTU::ReadCoilMessage& query,
153 virtual ModbusRTU::mbErrCode readInputStatus( const ModbusRTU::ReadInputStatusMessage& query,
155
161 virtual ModbusRTU::mbErrCode readOutputRegisters( const ModbusRTU::ReadOutputMessage& query,
163
169 virtual ModbusRTU::mbErrCode readInputRegisters( const ModbusRTU::ReadInputMessage& query,
171
177 virtual ModbusRTU::mbErrCode forceSingleCoil( const ModbusRTU::ForceSingleCoilMessage& query,
179
180
186 virtual ModbusRTU::mbErrCode writeOutputSingleRegister( const ModbusRTU::WriteSingleOutputMessage& query,
188
194 virtual ModbusRTU::mbErrCode forceMultipleCoils( const ModbusRTU::ForceCoilsMessage& query,
196
202 virtual ModbusRTU::mbErrCode writeOutputRegisters( const ModbusRTU::WriteOutputMessage& query,
204
205
211 virtual ModbusRTU::mbErrCode diagnostics( const ModbusRTU::DiagnosticMessage& query,
213
219 virtual ModbusRTU::mbErrCode read4314( const ModbusRTU::MEIMessageRDI& query,
220 ModbusRTU::MEIMessageRetRDI& reply ) = 0;
221
222
228 virtual ModbusRTU::mbErrCode journalCommand( const ModbusRTU::JournalCommandMessage& query,
230
231
237 virtual ModbusRTU::mbErrCode setDateTime( const ModbusRTU::SetDateTimeMessage& query,
239
240
246 virtual ModbusRTU::mbErrCode remoteService( const ModbusRTU::RemoteServiceMessage& query,
248
249
255 virtual ModbusRTU::mbErrCode fileTransfer( const ModbusRTU::FileTransferMessage& query,
257
264 virtual size_t getNextData( unsigned char* buf, int len ) = 0;
265
266 virtual ModbusRTU::mbErrCode sendData( unsigned char* buf, int len ) = 0;
267
269 virtual void setChannelTimeout( timeout_t msec ) = 0;
270
272 virtual ModbusRTU::mbErrCode send( ModbusRTU::ModbusMessage& buf );
273
274 // Если заголовок не должен использоваться оставляйте request.header.len = 0
275 virtual ModbusRTU::mbErrCode make_adu_header( ModbusRTU::ModbusMessage& request )
276 {
277 return ModbusRTU::erNoError;
278 }
279 virtual ModbusRTU::mbErrCode post_send_request( ModbusRTU::ModbusMessage& request )
280 {
281 return ModbusRTU::erNoError;
282 }
283
284 // default processing
285 virtual ModbusRTU::mbErrCode processing( ModbusRTU::ModbusMessage& buf );
286
288 ModbusRTU::mbErrCode recv(const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, ModbusRTU::ModbusMessage& buf, timeout_t timeout );
289 ModbusRTU::mbErrCode recv_pdu( ModbusRTU::ModbusMessage& rbuf, timeout_t timeout );
290
291 std::timed_mutex recvMutex;
292 timeout_t recvTimeOut_ms = { 50 };
293 timeout_t replyTimeout_ms = { 2000 };
294 timeout_t aftersend_msec = { 0 };
295 timeout_t sleepPause_msec = { 10 };
296 bool crcNoCheckit = { false };
297 bool cleanBeforeSend = { false };
298
299 void printProcessingTime();
300 PassiveTimer tmProcessing;
301
302 std::shared_ptr<DebugStream> dlog;
303
304 // статистика сервера
305 size_t askCount = { 0 };
306 ExchangeErrorMap errmap;
308 PreReceiveSignal m_pre_signal;
309 PostReceiveSignal m_post_signal;
310
311 private:
312
313 };
314 // -------------------------------------------------------------------------
315} // end of namespace uniset
316// -------------------------------------------------------------------------
317#endif // ModbusServer_H_
318// -------------------------------------------------------------------------
Definition Configuration.h:46
Definition ModbusServer.h:33
void setRecvTimeout(timeout_t msec)
Definition ModbusServer.cc:59
timeout_t aftersend_msec
Definition ModbusServer.h:294
static bool checkAddr(const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, const ModbusRTU::ModbusAddr addr)
Definition ModbusServer.cc:111
static ModbusRTU::mbErrCode replyFileTransfer(const std::string &fname, const ModbusRTU::FileTransferMessage &query, ModbusRTU::FileTransferRetMessage &reply, std::shared_ptr< DebugStream > dlog=nullptr)
Definition ModbusServer.cc:1538
timeout_t recvTimeOut_ms
Definition ModbusServer.h:292
virtual ModbusRTU::mbErrCode forceSingleCoil(const ModbusRTU::ForceSingleCoilMessage &query, ModbusRTU::ForceSingleCoilRetMessage &reply)=0
timeout_t setReplyTimeout(timeout_t msec)
Definition ModbusServer.cc:90
virtual ModbusRTU::mbErrCode realReceive(const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, timeout_t msecTimeout)=0
virtual ModbusRTU::mbErrCode remoteService(const ModbusRTU::RemoteServiceMessage &query, ModbusRTU::RemoteServiceRetMessage &reply)=0
virtual ModbusRTU::mbErrCode send(ModbusRTU::ModbusMessage &buf)
Definition ModbusServer.cc:1696
virtual ModbusRTU::mbErrCode journalCommand(const ModbusRTU::JournalCommandMessage &query, ModbusRTU::JournalCommandRetMessage &reply)=0
virtual ModbusRTU::mbErrCode writeOutputRegisters(const ModbusRTU::WriteOutputMessage &query, ModbusRTU::WriteOutputRetMessage &reply)=0
virtual ModbusRTU::mbErrCode writeOutputSingleRegister(const ModbusRTU::WriteSingleOutputMessage &query, ModbusRTU::WriteSingleOutputRetMessage &reply)=0
static ModbusRTU::mbErrCode replySetDateTime(const ModbusRTU::SetDateTimeMessage &query, ModbusRTU::SetDateTimeRetMessage &reply, std::shared_ptr< DebugStream > dlog=nullptr)
Definition ModbusServer.cc:1656
virtual ModbusRTU::mbErrCode readCoilStatus(const ModbusRTU::ReadCoilMessage &query, ModbusRTU::ReadCoilRetMessage &reply)=0
virtual ModbusRTU::mbErrCode setDateTime(const ModbusRTU::SetDateTimeMessage &query, ModbusRTU::SetDateTimeRetMessage &reply)=0
virtual ModbusRTU::mbErrCode readOutputRegisters(const ModbusRTU::ReadOutputMessage &query, ModbusRTU::ReadOutputRetMessage &reply)=0
timeout_t setAfterSendPause(timeout_t msec)
Definition ModbusServer.cc:104
virtual ModbusRTU::mbErrCode readInputStatus(const ModbusRTU::ReadInputStatusMessage &query, ModbusRTU::ReadInputStatusRetMessage &reply)=0
virtual void setChannelTimeout(timeout_t msec)=0
timeout_t replyTimeout_ms
Definition ModbusServer.h:293
virtual ModbusRTU::mbErrCode read4314(const ModbusRTU::MEIMessageRDI &query, ModbusRTU::MEIMessageRetRDI &reply)=0
void setSleepPause(timeout_t msec)
Definition ModbusServer.cc:65
virtual ModbusRTU::mbErrCode diagnostics(const ModbusRTU::DiagnosticMessage &query, ModbusRTU::DiagnosticRetMessage &reply)=0
virtual ModbusRTU::mbErrCode fileTransfer(const ModbusRTU::FileTransferMessage &query, ModbusRTU::FileTransferRetMessage &reply)=0
virtual ModbusRTU::mbErrCode forceMultipleCoils(const ModbusRTU::ForceCoilsMessage &query, ModbusRTU::ForceCoilsRetMessage &reply)=0
virtual size_t getNextData(unsigned char *buf, int len)=0
virtual ModbusRTU::mbErrCode readInputRegisters(const ModbusRTU::ReadInputMessage &query, ModbusRTU::ReadInputRetMessage &reply)=0
timeout_t sleepPause_msec
Definition ModbusServer.h:295
ExchangeErrorMap errmap
Definition ModbusServer.h:306
ModbusRTU::mbErrCode receive(const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, timeout_t msecTimeout)
Definition ModbusServer.cc:1472
ModbusRTU::mbErrCode recv(const std::unordered_set< ModbusRTU::ModbusAddr > &vaddr, ModbusRTU::ModbusMessage &buf, timeout_t timeout)
Definition ModbusServer.cc:580
STL namespace.
Definition AccessConfig.h:30
Definition ModbusTypes.h:1176
Definition ModbusTypes.h:1238
Definition ModbusTypes.h:1665
Definition ModbusTypes.h:1698
Definition ModbusTypes.h:764
Definition ModbusTypes.h:842
Definition ModbusTypes.h:984
Definition ModbusTypes.h:1380
Definition ModbusTypes.h:1405
Definition ModbusTypes.h:1250
Definition ModbusTypes.h:1310
Definition ModbusTypes.h:211
Definition ModbusTypes.h:422
Definition ModbusTypes.h:458
Definition ModbusTypes.h:665
Definition ModbusTypes.h:699
Definition ModbusTypes.h:495
Definition ModbusTypes.h:569
Definition ModbusTypes.h:602
Definition ModbusTypes.h:1538
Definition ModbusTypes.h:1573
Definition ModbusTypes.h:1474
Definition ModbusTypes.h:1515
Definition ModbusTypes.h:886
Definition ModbusTypes.h:941
Definition ModbusTypes.h:1085