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