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_
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
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