UniSet  2.0.0
ModbusTCPSession.h
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 // -------------------------------------------------------------------------