|
UniSet
2.2.1
|
00001 // ------------------------------------------------------------------------- 00002 #ifndef ModbusTCPSession_H_ 00003 #define ModbusTCPSession_H_ 00004 // ------------------------------------------------------------------------- 00005 #include <string> 00006 #include <queue> 00007 #include <unordered_map> 00008 #include <cc++/socket.h> 00009 #include "ModbusServerSlot.h" 00010 #include "ModbusServer.h" 00011 #include "PassiveTimer.h" 00012 // ------------------------------------------------------------------------- 00013 class ModbusTCPSession: 00014 public ModbusServerSlot, 00015 public ModbusServer, 00016 public ost::TCPSession 00017 { 00018 public: 00019 00020 ModbusTCPSession( ost::TCPSocket& server, const std::unordered_set<ModbusRTU::ModbusAddr>& vmbaddr, timeout_t timeout ); 00021 virtual ~ModbusTCPSession(); 00022 00023 void cleanInputStream(); 00024 00025 virtual void cleanupChannel() 00026 { 00027 cleanInputStream(); 00028 } 00029 virtual void terminate(); 00030 00031 virtual ModbusRTU::mbErrCode receive( const std::unordered_set<ModbusRTU::ModbusAddr>& vmbaddr, timeout_t msecTimeout ); 00032 00033 typedef sigc::slot<void, ModbusTCPSession*> FinalSlot; 00034 00035 void connectFinalSession( FinalSlot sl ); 00036 00037 unsigned int getAskCount(); 00038 00039 inline std::string getClientAddress() 00040 { 00041 return caddr; 00042 } 00043 00044 void setKeepAliveParams( timeout_t timeout_sec = 3, int conn_keepcnt = 2, int keepintvl = 2 ); 00045 00046 protected: 00047 virtual void run(); 00048 virtual void final(); 00049 00050 virtual int getNextData( unsigned char* buf, int len ); 00051 virtual void setChannelTimeout( timeout_t msec ); 00052 virtual ModbusRTU::mbErrCode sendData( unsigned char* buf, int len ); 00053 virtual ModbusRTU::mbErrCode tcp_processing( ost::TCPStream& tcp, ModbusTCP::MBAPHeader& mhead ); 00054 virtual ModbusRTU::mbErrCode pre_send_request( ModbusRTU::ModbusMessage& request ); 00055 virtual ModbusRTU::mbErrCode post_send_request( ModbusRTU::ModbusMessage& request ); 00056 00057 00058 virtual ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query, 00059 ModbusRTU::ReadCoilRetMessage& reply ); 00060 00061 virtual ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query, 00062 ModbusRTU::ReadInputStatusRetMessage& reply ); 00063 00064 virtual ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query, 00065 ModbusRTU::ReadOutputRetMessage& reply ); 00066 00067 virtual ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query, 00068 ModbusRTU::ReadInputRetMessage& reply ); 00069 00070 virtual ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query, 00071 ModbusRTU::ForceSingleCoilRetMessage& reply ); 00072 00073 virtual ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query, 00074 ModbusRTU::WriteSingleOutputRetMessage& reply ); 00075 00076 virtual ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query, 00077 ModbusRTU::ForceCoilsRetMessage& reply ); 00078 00079 virtual ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query, 00080 ModbusRTU::WriteOutputRetMessage& reply ); 00081 00082 virtual ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query, 00083 ModbusRTU::DiagnosticRetMessage& reply ); 00084 00085 virtual ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query, 00086 ModbusRTU::MEIMessageRetRDI& reply ); 00087 00088 virtual ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query, 00089 ModbusRTU::JournalCommandRetMessage& reply ); 00090 00091 virtual ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query, 00092 ModbusRTU::SetDateTimeRetMessage& reply ); 00093 00094 virtual ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query, 00095 ModbusRTU::RemoteServiceRetMessage& reply ); 00096 00097 virtual ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query, 00098 ModbusRTU::FileTransferRetMessage& reply ); 00099 00100 private: 00101 std::queue<unsigned char> qrecv; 00102 ModbusTCP::MBAPHeader curQueryHeader; 00103 std::unordered_set<ModbusRTU::ModbusAddr> vaddr; 00104 PassiveTimer ptTimeout; 00105 timeout_t timeout = { 0 }; 00106 ModbusRTU::ModbusMessage buf; 00107 00108 bool ignoreAddr = { false }; 00109 std::string peername = { "" }; 00110 00111 std::string caddr = { "" }; 00112 00113 FinalSlot slFin; 00114 00115 std::atomic_bool cancelled = { false }; 00116 00117 // статистика 00118 UniSetTypes::uniset_rwmutex mAsk; 00119 unsigned int askCount = { 0 }; 00120 }; 00121 // ------------------------------------------------------------------------- 00122 #endif // ModbusTCPSession_H_ 00123 // -------------------------------------------------------------------------
1.7.6.1