UniSet  2.6.0
MBTCPServer.h
00001 #ifndef MBTCPServer_H_
00002 #define MBTCPServer_H_
00003 // -------------------------------------------------------------------------
00004 #include <unordered_set>
00005 #include <string>
00006 #include "modbus/ModbusTCPServerSlot.h"
00007 
00008 // -------------------------------------------------------------------------
00010 class MBTCPServer
00011 {
00012     public:
00013         MBTCPServer( const std::unordered_set<uniset::ModbusRTU::ModbusAddr>& myaddr, const std::string& inetaddr, int port = 502, bool verbose = false );
00014         ~MBTCPServer();
00015 
00016         inline void setVerbose( bool state )
00017         {
00018             verbose = state;
00019         }
00020 
00021         inline void setReply( long val )
00022         {
00023             replyVal = val;
00024         }
00025 
00026         inline uniset::timeout_t setAfterSendPause( uniset::timeout_t msec )
00027         {
00028             return sslot->setAfterSendPause(msec);
00029         }
00030 
00031         void execute();    
00032         void setLog( std::shared_ptr<DebugStream>& dlog );
00033 
00034         void setMaxSessions( size_t max );
00035 
00036     protected:
00037         // действия при завершении работы
00038         void sigterm( int signo );
00039 
00041         uniset::ModbusRTU::mbErrCode readCoilStatus( uniset::ModbusRTU::ReadCoilMessage& query,
00042                                                      uniset::ModbusRTU::ReadCoilRetMessage& reply );
00044         uniset::ModbusRTU::mbErrCode readInputStatus( uniset::ModbusRTU::ReadInputStatusMessage& query,
00045                                                       uniset::ModbusRTU::ReadInputStatusRetMessage& reply );
00046 
00048         uniset::ModbusRTU::mbErrCode readOutputRegisters( uniset::ModbusRTU::ReadOutputMessage& query,
00049                                                           uniset::ModbusRTU::ReadOutputRetMessage& reply );
00050 
00052         uniset::ModbusRTU::mbErrCode readInputRegisters( uniset::ModbusRTU::ReadInputMessage& query,
00053                                                          uniset::ModbusRTU::ReadInputRetMessage& reply );
00054 
00056         uniset::ModbusRTU::mbErrCode forceSingleCoil( uniset::ModbusRTU::ForceSingleCoilMessage& query,
00057                                                       uniset::ModbusRTU::ForceSingleCoilRetMessage& reply );
00058 
00060         uniset::ModbusRTU::mbErrCode forceMultipleCoils( uniset::ModbusRTU::ForceCoilsMessage& query,
00061                                                          uniset::ModbusRTU::ForceCoilsRetMessage& reply );
00062 
00063 
00065         uniset::ModbusRTU::mbErrCode writeOutputRegisters( uniset::ModbusRTU::WriteOutputMessage& query,
00066                 uniset::ModbusRTU::WriteOutputRetMessage& reply );
00067 
00069         uniset::ModbusRTU::mbErrCode writeOutputSingleRegister( uniset::ModbusRTU::WriteSingleOutputMessage& query,
00070                 uniset::ModbusRTU::WriteSingleOutputRetMessage& reply );
00071 
00072 
00073         uniset::ModbusRTU::mbErrCode diagnostics( uniset::ModbusRTU::DiagnosticMessage& query,
00074                                                   uniset::ModbusRTU::DiagnosticRetMessage& reply );
00075 
00076         uniset::ModbusRTU::mbErrCode read4314( uniset::ModbusRTU::MEIMessageRDI& query,
00077                                                uniset::ModbusRTU::MEIMessageRetRDI& reply );
00078 
00080         uniset::ModbusRTU::mbErrCode journalCommand( uniset::ModbusRTU::JournalCommandMessage& query,
00081                                                      uniset::ModbusRTU::JournalCommandRetMessage& reply );
00082 
00084         uniset::ModbusRTU::mbErrCode setDateTime( uniset::ModbusRTU::SetDateTimeMessage& query,
00085                                                   uniset::ModbusRTU::SetDateTimeRetMessage& reply );
00086 
00088         uniset::ModbusRTU::mbErrCode remoteService( uniset::ModbusRTU::RemoteServiceMessage& query,
00089                                                     uniset::ModbusRTU::RemoteServiceRetMessage& reply );
00090 
00091         uniset::ModbusRTU::mbErrCode fileTransfer( uniset::ModbusRTU::FileTransferMessage& query,
00092                                                    uniset::ModbusRTU::FileTransferRetMessage& reply );
00093 
00094 
00096         uniset::ModbusTCPServerSlot* sslot;
00097         std::unordered_set<uniset::ModbusRTU::ModbusAddr> vaddr; 
00099         bool verbose = { false };
00100         long replyVal = { -1 };
00101 #if 0
00102         typedef std::unordered_map<uniset::ModbusRTU::mbErrCode, unsigned int> ExchangeErrorMap;
00103         ExchangeErrorMap errmap;     
00104         uniset::ModbusRTU::mbErrCode prev;
00105 
00106 
00107         // можно было бы сделать unsigned, но аналоговые датчики у нас имеют
00108         // тип long. А это число передаётся в графику в виде аналогового датчика
00109         long askCount;    
00112         typedef std::unordered_map<int, std::string> FileList;
00113         FileList flist;
00114 #endif
00115 
00116     private:
00117 
00118 };
00119 // -------------------------------------------------------------------------
00120 #endif // MBTCPServer_H_
00121 // -------------------------------------------------------------------------