2 #ifndef ModbusServer_H_
3 #define ModbusServer_H_
6 #include <unordered_set>
7 #include <unordered_map>
8 #include <sigc++/sigc++.h>
12 #include "Configuration.h"
13 #include "PassiveTimer.h"
14 #include "ModbusTypes.h"
19 class hash<uniset::ModbusRTU::mbErrCode>
22 size_t operator()(
const uniset::ModbusRTU::mbErrCode& e)
const
24 return std::hash<size_t>()(e);
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()
46 static std::unordered_set<ModbusRTU::ModbusAddr> addr2vaddr( ModbusRTU::ModbusAddr& mbaddr );
53 ModbusRTU::mbErrCode
receive(
const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout );
56 virtual ModbusRTU::mbErrCode receive_one(
const ModbusRTU::ModbusAddr addr, timeout_t msec );
64 typedef sigc::signal<ModbusRTU::mbErrCode, const std::unordered_set<ModbusRTU::ModbusAddr>, timeout_t> PreReceiveSignal;
65 PreReceiveSignal signal_pre_receive();
68 typedef sigc::signal<void, ModbusRTU::mbErrCode> PostReceiveSignal;
69 PostReceiveSignal signal_post_receive();
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 );
100 inline void setCRCNoCheckit(
bool set )
104 inline bool isCRCNoCheckit()
const
109 inline void setBroadcastMode(
bool set )
113 inline bool getBroadcastMode()
const
118 inline void setCleanBeforeSend(
bool set )
120 cleanBeforeSend =
set;
122 inline bool getCleanBeforeSend()
124 return cleanBeforeSend;
130 static ModbusRTU::mbErrCode
replySetDateTime( ModbusRTU::SetDateTimeMessage& query,
131 ModbusRTU::SetDateTimeRetMessage& reply,
132 std::shared_ptr<DebugStream> dlog =
nullptr );
141 ModbusRTU::FileTransferMessage& query,
142 ModbusRTU::FileTransferRetMessage& reply,
143 std::shared_ptr<DebugStream> dlog =
nullptr );
145 virtual void cleanupChannel() {}
146 virtual void terminate() {}
148 virtual bool isActive()
const = 0;
151 typedef std::unordered_map<ModbusRTU::mbErrCode, size_t> ExchangeErrorMap;
153 ExchangeErrorMap getErrorMap();
154 size_t getErrCount( ModbusRTU::mbErrCode e );
155 size_t resetErrCount( ModbusRTU::mbErrCode e,
size_t set = 0 );
157 inline size_t getAskCount()
const
161 void resetAskCounter();
165 virtual void iowait( timeout_t usec );
169 virtual ModbusRTU::mbErrCode
realReceive(
const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout ) = 0;
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;
192 ModbusRTU::ReadOutputRetMessage& reply ) = 0;
200 ModbusRTU::ReadInputRetMessage& reply ) = 0;
207 virtual ModbusRTU::mbErrCode
forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query,
208 ModbusRTU::ForceSingleCoilRetMessage& reply ) = 0;
217 ModbusRTU::WriteSingleOutputRetMessage& reply ) = 0;
225 ModbusRTU::ForceCoilsRetMessage& reply ) = 0;
233 ModbusRTU::WriteOutputRetMessage& reply ) = 0;
241 virtual ModbusRTU::mbErrCode
diagnostics( ModbusRTU::DiagnosticMessage& query,
242 ModbusRTU::DiagnosticRetMessage& reply ) = 0;
249 virtual ModbusRTU::mbErrCode
read4314( ModbusRTU::MEIMessageRDI& query,
250 ModbusRTU::MEIMessageRetRDI& reply ) = 0;
258 virtual ModbusRTU::mbErrCode
journalCommand( ModbusRTU::JournalCommandMessage& query,
259 ModbusRTU::JournalCommandRetMessage& reply ) = 0;
267 virtual ModbusRTU::mbErrCode
setDateTime( ModbusRTU::SetDateTimeMessage& query,
268 ModbusRTU::SetDateTimeRetMessage& reply ) = 0;
276 virtual ModbusRTU::mbErrCode
remoteService( ModbusRTU::RemoteServiceMessage& query,
277 ModbusRTU::RemoteServiceRetMessage& reply ) = 0;
285 virtual ModbusRTU::mbErrCode
fileTransfer( ModbusRTU::FileTransferMessage& query,
286 ModbusRTU::FileTransferRetMessage& reply ) = 0;
294 virtual size_t getNextData(
unsigned char* buf,
int len ) = 0;
296 virtual ModbusRTU::mbErrCode sendData(
unsigned char* buf,
int len ) = 0;
302 virtual ModbusRTU::mbErrCode
send( ModbusRTU::ModbusMessage& buf );
305 virtual ModbusRTU::mbErrCode make_adu_header( ModbusRTU::ModbusMessage& request )
307 return ModbusRTU::erNoError;
309 virtual ModbusRTU::mbErrCode post_send_request( ModbusRTU::ModbusMessage& request )
311 return ModbusRTU::erNoError;
315 virtual ModbusRTU::mbErrCode processing( ModbusRTU::ModbusMessage& buf );
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 );
321 std::timed_mutex recvMutex;
327 bool crcNoCheckit = {
false };
328 bool cleanBeforeSend = {
false };
330 void printProcessingTime();
331 PassiveTimer tmProcessing;
333 std::shared_ptr<DebugStream> dlog;
336 size_t askCount = { 0 };
339 PreReceiveSignal m_pre_signal;
340 PostReceiveSignal m_post_signal;
348 #endif // ModbusServer_H_