UniSet  2.6.0
ModbusTCPSession.h
1 // -------------------------------------------------------------------------
2 #ifndef ModbusTCPSession_H_
3 #define ModbusTCPSession_H_
4 // -------------------------------------------------------------------------
5 #include <string>
6 #include <queue>
7 #include <unordered_map>
8 #include <ev++.h>
9 #include "ModbusServerSlot.h"
10 #include "ModbusServer.h"
11 #include "PassiveTimer.h"
12 #include "UTCPCore.h"
13 #include "UTCPStream.h"
14 // -------------------------------------------------------------------------
15 namespace uniset
16 {
17  // -------------------------------------------------------------------------
34  public ModbusServerSlot,
35  public ModbusServer
36  {
37  public:
38 
39  ModbusTCPSession( const Poco::Net::StreamSocket& s, const std::unordered_set<ModbusRTU::ModbusAddr>& vmbaddr, timeout_t timeout );
40  virtual ~ModbusTCPSession();
41 
42  void cleanInputStream();
43 
44  virtual void cleanupChannel() override;
45  virtual void terminate() override;
46 
47  typedef sigc::slot<void, const ModbusTCPSession*> FinalSlot;
48 
49  void connectFinalSession( FinalSlot sl );
50 
51  inline std::string getClientAddress() const
52  {
53  return caddr;
54  }
55 
56  void setSessionTimeout( double t );
57 
58  // запуск обработки входящих запросов
59  void run( ev::loop_ref& loop );
60 
61  virtual bool isActive() const override;
62 
63  void iowait( timeout_t msec );
64 
65  protected:
66 
67  virtual ModbusRTU::mbErrCode realReceive( const std::unordered_set<ModbusRTU::ModbusAddr>& vmbaddr, timeout_t msecTimeout ) override;
68 
69  void callback( ev::io& watcher, int revents );
70  void onTimeout( ev::timer& watcher, int revents );
71  virtual void readEvent( ev::io& watcher );
72  virtual void writeEvent( ev::io& watcher );
73  virtual void final();
74 
75  virtual size_t getNextData( unsigned char* buf, int len ) override;
76  virtual void setChannelTimeout( timeout_t msec );
77  virtual ModbusRTU::mbErrCode sendData( unsigned char* buf, int len ) override;
78  virtual ModbusRTU::mbErrCode tcp_processing( ModbusRTU::ADUHeader& mhead );
79  virtual ModbusRTU::mbErrCode make_adu_header( ModbusRTU::ModbusMessage& request ) override;
80  virtual ModbusRTU::mbErrCode post_send_request(ModbusRTU::ModbusMessage& request ) override;
81 
82  virtual ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query,
84 
85  virtual ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query,
87 
88  virtual ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query,
90 
91  virtual ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query,
93 
94  virtual ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query,
96 
97  virtual ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query,
99 
100  virtual ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query,
102 
103  virtual ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query,
105 
106  virtual ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query,
108 
109  virtual ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query,
111 
112  virtual ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query,
114 
115  virtual ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query,
117 
118  virtual ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query,
120 
121  virtual ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query,
123 
124  private:
125  std::queue<unsigned char> qrecv;
126  std::unordered_set<ModbusRTU::ModbusAddr> vaddr;
127  ModbusRTU::ADUHeader curQueryHeader;
128  PassiveTimer ptTimeout;
129  timeout_t timeout = { 0 };
131 
132  ev::io io;
133  ev::timer ioTimeout;
134 
135  std::shared_ptr<UTCPStream> sock;
136  std::queue<UTCPCore::Buffer*> qsend;
137  double sessTimeout = { 10.0 };
138 
139  bool ignoreAddr = { false };
140  std::string peername = { "" };
141 
142  std::string caddr = { "" };
143 
144  FinalSlot slFin;
145 
146  std::atomic_bool cancelled = { false };
147  PassiveTimer pt;
148  PassiveTimer ptWait;
149  };
150  // -------------------------------------------------------------------------
151 } // end of namespace uniset
152 // -------------------------------------------------------------------------
153 #endif // ModbusTCPSession_H_
154 // -------------------------------------------------------------------------