UniSet  2.6.0
MBTCPTestServer.h
00001 #ifndef MBTCPTestServer_H_
00002 #define MBTCPTestServer_H_
00003 // -------------------------------------------------------------------------
00004 #include <string>
00005 #include <atomic>
00006 #include <ostream>
00007 #include <unordered_set>
00008 #include "modbus/ModbusTCPServerSlot.h"
00009 // -------------------------------------------------------------------------
00011 class MBTCPTestServer
00012 {
00013     public:
00014         MBTCPTestServer( const std::unordered_set<uniset::ModbusRTU::ModbusAddr>& vaddr, const std::string& inetaddr, int port = 502, bool verbose = false );
00015         ~MBTCPTestServer();
00016 
00017         inline void setVerbose( bool state )
00018         {
00019             verbose = state;
00020         }
00021 
00022         inline void setReply( long val )
00023         {
00024             replyVal = val;
00025         }
00026 
00027         inline void setIgnoreAddrMode( bool state )
00028         {
00029             if( sslot )
00030                 sslot->setIgnoreAddrMode(state);
00031         }
00032 
00033         void execute();    
00034         void setLog( std::shared_ptr<DebugStream> dlog );
00035 
00036         inline bool isRunning()
00037         {
00038             return ( sslot && sslot->isActive() );
00039         }
00040 
00041         inline void disableExchange( bool set = true )
00042         {
00043             disabled = set;
00044         }
00045 
00046         inline bool getForceSingleCoilCmd()
00047         {
00048             return forceSingleCoilCmd;
00049         }
00050         inline int getLastWriteOutputSingleRegister()
00051         {
00052             return lastWriteOutputSingleRegister;
00053         }
00054         inline uniset::ModbusRTU::ForceCoilsMessage getLastForceCoilsQ()
00055         {
00056             return lastForceCoilsQ;
00057         }
00058         inline uniset::ModbusRTU::WriteOutputMessage getLastWriteOutput()
00059         {
00060             return lastWriteOutputQ;
00061         }
00062 
00063         friend std::ostream& operator<<(std::ostream& os, const MBTCPTestServer* m );
00064 
00065         inline float getF2TestValue()
00066         {
00067             return f2_test_value;
00068         }
00069 
00070     protected:
00071         // действия при завершении работы
00072         void sigterm( int signo );
00073 
00075         uniset::ModbusRTU::mbErrCode readCoilStatus( uniset::ModbusRTU::ReadCoilMessage& query,
00076                                                      uniset::ModbusRTU::ReadCoilRetMessage& reply );
00078         uniset::ModbusRTU::mbErrCode readInputStatus( uniset::ModbusRTU::ReadInputStatusMessage& query,
00079                                                       uniset::ModbusRTU::ReadInputStatusRetMessage& reply );
00080 
00082         uniset::ModbusRTU::mbErrCode readOutputRegisters( uniset::ModbusRTU::ReadOutputMessage& query,
00083                                                           uniset::ModbusRTU::ReadOutputRetMessage& reply );
00084 
00086         uniset::ModbusRTU::mbErrCode readInputRegisters( uniset::ModbusRTU::ReadInputMessage& query,
00087                                                          uniset::ModbusRTU::ReadInputRetMessage& reply );
00088 
00090         uniset::ModbusRTU::mbErrCode forceSingleCoil( uniset::ModbusRTU::ForceSingleCoilMessage& query,
00091                                                       uniset::ModbusRTU::ForceSingleCoilRetMessage& reply );
00092 
00094         uniset::ModbusRTU::mbErrCode forceMultipleCoils( uniset::ModbusRTU::ForceCoilsMessage& query,
00095                                                          uniset::ModbusRTU::ForceCoilsRetMessage& reply );
00096 
00097 
00099         uniset::ModbusRTU::mbErrCode writeOutputRegisters( uniset::ModbusRTU::WriteOutputMessage& query,
00100                 uniset::ModbusRTU::WriteOutputRetMessage& reply );
00101 
00103         uniset::ModbusRTU::mbErrCode writeOutputSingleRegister( uniset::ModbusRTU::WriteSingleOutputMessage& query,
00104                 uniset::ModbusRTU::WriteSingleOutputRetMessage& reply );
00105 
00106 
00107         uniset::ModbusRTU::mbErrCode diagnostics( uniset::ModbusRTU::DiagnosticMessage& query,
00108                                                   uniset::ModbusRTU::DiagnosticRetMessage& reply );
00109 
00110         uniset::ModbusRTU::mbErrCode read4314( uniset::ModbusRTU::MEIMessageRDI& query,
00111                                                uniset::ModbusRTU::MEIMessageRetRDI& reply );
00112 
00114         uniset::ModbusRTU::mbErrCode journalCommand( uniset::ModbusRTU::JournalCommandMessage& query,
00115                                                      uniset::ModbusRTU::JournalCommandRetMessage& reply );
00116 
00118         uniset::ModbusRTU::mbErrCode setDateTime( uniset::ModbusRTU::SetDateTimeMessage& query,
00119                                                   uniset::ModbusRTU::SetDateTimeRetMessage& reply );
00120 
00122         uniset::ModbusRTU::mbErrCode remoteService( uniset::ModbusRTU::RemoteServiceMessage& query,
00123                                                     uniset::ModbusRTU::RemoteServiceRetMessage& reply );
00124 
00125         uniset::ModbusRTU::mbErrCode fileTransfer( uniset::ModbusRTU::FileTransferMessage& query,
00126                                                    uniset::ModbusRTU::FileTransferRetMessage& reply );
00127 
00128 
00130         uniset::ModbusTCPServerSlot* sslot;
00131         std::unordered_set<uniset::ModbusRTU::ModbusAddr> vaddr; 
00133         bool verbose;
00134         long replyVal;
00135         bool forceSingleCoilCmd;
00136         int lastWriteOutputSingleRegister;
00137         uniset::ModbusRTU::ForceCoilsMessage lastForceCoilsQ;
00138         uniset::ModbusRTU::WriteOutputMessage lastWriteOutputQ;
00139         float f2_test_value = {0.0};
00140 
00141 #if 0
00142         typedef std::map<uniset::ModbusRTU::mbErrCode, unsigned int> ExchangeErrorMap;
00143         ExchangeErrorMap errmap;     
00144         uniset::ModbusRTU::mbErrCode prev;
00145 
00146 
00147         // можно было бы сделать unsigned, но аналоговые датчики у нас имеют
00148         // тип long. А это число передаётся в графику в виде аналогового датчика
00149         long askCount;    
00152         typedef std::map<int, std::string> FileList;
00153         FileList flist;
00154 #endif
00155 
00156     private:
00157         bool disabled;
00158         std::string myname;
00159 };
00160 // -------------------------------------------------------------------------
00161 #endif // MBTCPTestServer_H_
00162 // -------------------------------------------------------------------------