UniSet  2.2.1
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<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         void execute();    
00027         void setLog( std::shared_ptr<DebugStream>& dlog );
00028 
00029     protected:
00030         // действия при завершении работы
00031         void sigterm( int signo );
00032 
00034         ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query,
00035                                              ModbusRTU::ReadCoilRetMessage& reply );
00037         ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query,
00038                                               ModbusRTU::ReadInputStatusRetMessage& reply );
00039 
00041         ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query,
00042                 ModbusRTU::ReadOutputRetMessage& reply );
00043 
00045         ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query,
00046                 ModbusRTU::ReadInputRetMessage& reply );
00047 
00049         ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query,
00050                                               ModbusRTU::ForceSingleCoilRetMessage& reply );
00051 
00053         ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query,
00054                 ModbusRTU::ForceCoilsRetMessage& reply );
00055 
00056 
00058         ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query,
00059                 ModbusRTU::WriteOutputRetMessage& reply );
00060 
00062         ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query,
00063                 ModbusRTU::WriteSingleOutputRetMessage& reply );
00064 
00065 
00066         ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query,
00067                                           ModbusRTU::DiagnosticRetMessage& reply );
00068 
00069         ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query,
00070                                        ModbusRTU::MEIMessageRetRDI& reply );
00071 
00073         ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query,
00074                                              ModbusRTU::JournalCommandRetMessage& reply );
00075 
00077         ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query,
00078                                           ModbusRTU::SetDateTimeRetMessage& reply );
00079 
00081         ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query,
00082                                             ModbusRTU::RemoteServiceRetMessage& reply );
00083 
00084         ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query,
00085                                            ModbusRTU::FileTransferRetMessage& reply );
00086 
00087 
00089         ModbusTCPServerSlot* sslot;
00090         std::unordered_set<ModbusRTU::ModbusAddr> vaddr; 
00092         bool verbose;
00093         long replyVal;
00094 #if 0
00095         typedef std::unordered_map<ModbusRTU::mbErrCode, unsigned int> ExchangeErrorMap;
00096         ExchangeErrorMap errmap;     
00097         ModbusRTU::mbErrCode prev;
00098 
00099 
00100         // можно было бы сделать unsigned, но аналоговые датчики у нас имеют
00101         // тип long. А это число передаётся в графику в виде аналогового датчика
00102         long askCount;    
00105         typedef std::unordered_map<int, std::string> FileList;
00106         FileList flist;
00107 #endif
00108 
00109     private:
00110 
00111 };
00112 // -------------------------------------------------------------------------
00113 #endif // MBTCPServer_H_
00114 // -------------------------------------------------------------------------