UniSet  2.7.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  std::string getClientAddress() const;
52 
53  void setSessionTimeout( double t );
54 
55  // запуск обработки входящих запросов
56  void run( ev::loop_ref& loop );
57 
58  virtual bool isActive() const override;
59 
60  protected:
61 
62  virtual void iowait( timeout_t msec ) override;
63 
64  virtual ModbusRTU::mbErrCode realReceive( const std::unordered_set<ModbusRTU::ModbusAddr>& vmbaddr, timeout_t msecTimeout ) override;
65 
66  void callback( ev::io& watcher, int revents );
67  void onTimeout( ev::timer& watcher, int revents );
68  virtual void readEvent( ev::io& watcher );
69  virtual void writeEvent( ev::io& watcher );
70  virtual void final();
71 
72  virtual size_t getNextData( unsigned char* buf, int len ) override;
73  virtual void setChannelTimeout( timeout_t msec );
74  virtual ModbusRTU::mbErrCode sendData( unsigned char* buf, int len ) override;
75  virtual ModbusRTU::mbErrCode tcp_processing( ModbusRTU::MBAPHeader& mhead );
76  virtual ModbusRTU::mbErrCode make_adu_header( ModbusRTU::ModbusMessage& request ) override;
77  virtual ModbusRTU::mbErrCode post_send_request(ModbusRTU::ModbusMessage& request ) override;
78 
79  virtual ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query,
81 
82  virtual ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query,
84 
85  virtual ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query,
87 
88  virtual ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query,
90 
91  virtual ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query,
93 
94  virtual ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query,
96 
97  virtual ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query,
99 
100  virtual ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query,
102 
103  virtual ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query,
105 
106  virtual ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query,
108 
109  virtual ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query,
111 
112  virtual ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query,
114 
115  virtual ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query,
117 
118  virtual ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query,
120 
121  private:
122  std::queue<unsigned char> qrecv;
123  std::unordered_set<ModbusRTU::ModbusAddr> vaddr;
124  ModbusRTU::MBAPHeader curQueryHeader;
125  PassiveTimer ptTimeout;
126  timeout_t timeout = { 0 };
128 
129  ev::io io;
130  ev::timer ioTimeout;
131 
132  std::shared_ptr<UTCPStream> sock;
133  std::queue<UTCPCore::Buffer*> qsend;
134  double sessTimeout = { 10.0 };
135 
136  bool ignoreAddr = { false };
137  std::string peername = { "" };
138 
139  std::string caddr = { "" };
140 
141  FinalSlot slFin;
142 
143  std::atomic_bool cancelled = { false };
144  PassiveTimer pt;
145  PassiveTimer ptWait;
146  };
147  // -------------------------------------------------------------------------
148 } // end of namespace uniset
149 // -------------------------------------------------------------------------
150 #endif // ModbusTCPSession_H_
151 // -------------------------------------------------------------------------
Пассивный таймер
Definition: PassiveTimer.h:92
virtual ModbusRTU::mbErrCode remoteService(ModbusRTU::RemoteServiceMessage &query, ModbusRTU::RemoteServiceRetMessage &reply)
Definition: ModbusTCPSession.cc:568
Definition: ModbusTypes.h:1436
virtual ModbusRTU::mbErrCode readOutputRegisters(ModbusRTU::ReadOutputMessage &query, ModbusRTU::ReadOutputRetMessage &reply)
Definition: ModbusTCPSession.cc:471
Definition: ModbusTypes.h:1013
Definition: CallbackTimer.h:29
virtual ModbusRTU::mbErrCode readCoilStatus(ModbusRTU::ReadCoilMessage &query, ModbusRTU::ReadCoilRetMessage &reply)
Definition: ModbusTCPSession.cc:450
Definition: ModbusTypes.h:824
Definition: ModbusTypes.h:1469
virtual ModbusRTU::mbErrCode setDateTime(ModbusRTU::SetDateTimeMessage &query, ModbusRTU::SetDateTimeRetMessage &reply)
Definition: ModbusTCPSession.cc:559
virtual ModbusRTU::mbErrCode journalCommand(ModbusRTU::JournalCommandMessage &query, ModbusRTU::JournalCommandRetMessage &reply)
Definition: ModbusTCPSession.cc:550
Definition: ModbusTypes.h:327
Definition: ModbusTypes.h:784
virtual ModbusRTU::mbErrCode readInputRegisters(ModbusRTU::ReadInputMessage &query, ModbusRTU::ReadInputRetMessage &reply)
Definition: ModbusTCPSession.cc:481
Definition: ModbusTypes.h:878
Definition: ModbusTypes.h:1555
Definition: ModbusTypes.h:1098
Definition: ModbusTypes.h:1168
Definition: ModbusTypes.h:646
Definition: ModbusTypes.h:174
Definition: ModbusTypes.h:1583
Definition: ModbusTypes.h:1156
Definition: ModbusTypes.h:358
Definition: ModbusTypes.h:427
Definition: ModbusTypes.h:1223
The ModbusTCPSession class Класс рассчитан на совместную работу с ModbusTCPServer, т.к. построен на основе libev, и главный цикл (default_loop) находиться там.
Definition: ModbusTCPSession.h:33
virtual ModbusRTU::mbErrCode fileTransfer(ModbusRTU::FileTransferMessage &query, ModbusRTU::FileTransferRetMessage &reply)
Definition: ModbusTCPSession.cc:577
virtual ModbusRTU::mbErrCode read4314(ModbusRTU::MEIMessageRDI &query, ModbusRTU::MEIMessageRetRDI &reply)
Definition: ModbusTCPSession.cc:521
Definition: ModbusTypes.h:707
Definition: ModbusServer.h:33
virtual ModbusRTU::mbErrCode writeOutputRegisters(ModbusRTU::WriteOutputMessage &query, ModbusRTU::WriteOutputRetMessage &reply)
Definition: ModbusTCPSession.cc:502
Definition: ModbusTypes.h:1290
virtual ModbusRTU::mbErrCode forceMultipleCoils(ModbusRTU::ForceCoilsMessage &query, ModbusRTU::ForceCoilsRetMessage &reply)
Definition: ModbusTCPSession.cc:491
Definition: ModbusTypes.h:616
Definition: ModbusTypes.h:557
virtual size_t getNextData(unsigned char *buf, int len) override
Definition: ModbusTCPSession.cc:299
Definition: ModbusTypes.h:192
virtual ModbusRTU::mbErrCode writeOutputSingleRegister(ModbusRTU::WriteSingleOutputMessage &query, ModbusRTU::WriteSingleOutputRetMessage &reply)
Definition: ModbusTCPSession.cc:540
virtual ModbusRTU::mbErrCode readInputStatus(ModbusRTU::ReadInputStatusMessage &query, ModbusRTU::ReadInputStatusRetMessage &reply)
Definition: ModbusTCPSession.cc:460
Definition: ModbusTypes.h:528
Definition: ModbusTypes.h:1378
virtual ModbusRTU::mbErrCode forceSingleCoil(ModbusRTU::ForceSingleCoilMessage &query, ModbusRTU::ForceSingleCoilRetMessage &reply)
Definition: ModbusTCPSession.cc:530
Definition: ModbusTypes.h:917
Definition: ModbusTypes.h:1416
virtual void setChannelTimeout(timeout_t msec)
Definition: ModbusTCPSession.cc:586
virtual ModbusRTU::mbErrCode diagnostics(ModbusRTU::DiagnosticMessage &query, ModbusRTU::DiagnosticRetMessage &reply)
Definition: ModbusTCPSession.cc:512
virtual ModbusRTU::mbErrCode realReceive(const std::unordered_set< ModbusRTU::ModbusAddr > &vmbaddr, timeout_t msecTimeout) override
Definition: ModbusTCPSession.cc:211
Definition: ModbusTypes.h:1313
Definition: ModbusServerSlot.h:13