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