UniSet  2.2.1
ModbusServer.h
00001 // -------------------------------------------------------------------------
00002 #ifndef ModbusServer_H_
00003 #define ModbusServer_H_
00004 // -------------------------------------------------------------------------
00005 #include <string>
00006 #include <unordered_set>
00007 
00008 #include "Debug.h"
00009 #include "Mutex.h"
00010 #include "Configuration.h"
00011 #include "PassiveTimer.h"
00012 #include "ModbusTypes.h"
00013 // -------------------------------------------------------------------------
00015 class ModbusServer
00016 {
00017     public:
00018         ModbusServer();
00019         virtual ~ModbusServer();
00020 
00021         void initLog( UniSetTypes::Configuration* conf, const std::string& name, const std::string& logfile = "" );
00022         void setLog( std::shared_ptr<DebugStream> dlog );
00023 
00024 
00025         std::unordered_set<ModbusRTU::ModbusAddr> addr2vaddr( ModbusRTU::ModbusAddr& mbaddr );
00026 
00032         virtual ModbusRTU::mbErrCode receive( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout ) = 0;
00033 
00034         // версия с "одним" адресом
00035         virtual ModbusRTU::mbErrCode receive_one( const ModbusRTU::ModbusAddr addr, timeout_t msec );
00036 
00043         static bool checkAddr( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, const ModbusRTU::ModbusAddr addr );
00044         static std::string vaddr2str( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr );
00045 
00049         timeout_t setAfterSendPause( timeout_t msec );
00050 
00054         timeout_t setReplyTimeout( timeout_t msec );
00055 
00057         void setRecvTimeout( timeout_t msec );
00058 
00060         inline void setSleepPause( timeout_t usec )
00061         {
00062             sleepPause_usec = usec;
00063         }
00064 
00065         inline void setCRCNoCheckit( bool set )
00066         {
00067             crcNoCheckit = set;
00068         }
00069         inline bool isCRCNoCheckit()
00070         {
00071             return crcNoCheckit;
00072         }
00073 
00074         inline void setBroadcastMode( bool set )
00075         {
00076             onBroadcast = set;
00077         }
00078         inline bool getBroadcastMode()
00079         {
00080             return onBroadcast;
00081         }
00082 
00083         inline void setCleanBeforeSend( bool set )
00084         {
00085             cleanBeforeSend = set;
00086         }
00087         inline bool getCleanBeforeSend()
00088         {
00089             return cleanBeforeSend;
00090         }
00091 
00095         static ModbusRTU::mbErrCode replySetDateTime( ModbusRTU::SetDateTimeMessage& query,
00096                 ModbusRTU::SetDateTimeRetMessage& reply,
00097                 std::shared_ptr<DebugStream> dlog = nullptr );
00098 
00099 
00105         static ModbusRTU::mbErrCode replyFileTransfer( const std::string& fname,
00106                 ModbusRTU::FileTransferMessage& query,
00107                 ModbusRTU::FileTransferRetMessage& reply,
00108                 std::shared_ptr<DebugStream> dlog = nullptr );
00109 
00110         virtual void cleanupChannel() {}
00111         virtual void terminate() {}
00112 
00113     protected:
00114 
00120         virtual ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query,
00121                 ModbusRTU::ReadCoilRetMessage& reply ) = 0;
00127         virtual ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query,
00128                 ModbusRTU::ReadInputStatusRetMessage& reply ) = 0;
00129 
00135         virtual ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query,
00136                 ModbusRTU::ReadOutputRetMessage& reply ) = 0;
00137 
00143         virtual ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query,
00144                 ModbusRTU::ReadInputRetMessage& reply ) = 0;
00145 
00151         virtual ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query,
00152                 ModbusRTU::ForceSingleCoilRetMessage& reply ) = 0;
00153 
00154 
00160         virtual ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query,
00161                 ModbusRTU::WriteSingleOutputRetMessage& reply ) = 0;
00162 
00168         virtual ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query,
00169                 ModbusRTU::ForceCoilsRetMessage& reply ) = 0;
00170 
00176         virtual ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query,
00177                 ModbusRTU::WriteOutputRetMessage& reply ) = 0;
00178 
00179 
00185         virtual ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query,
00186                 ModbusRTU::DiagnosticRetMessage& reply ) = 0;
00187 
00193         virtual ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query,
00194                                                ModbusRTU::MEIMessageRetRDI& reply ) = 0;
00195 
00196 
00202         virtual ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query,
00203                 ModbusRTU::JournalCommandRetMessage& reply ) = 0;
00204 
00205 
00211         virtual ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query,
00212                 ModbusRTU::SetDateTimeRetMessage& reply ) = 0;
00213 
00214 
00220         virtual ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query,
00221                 ModbusRTU::RemoteServiceRetMessage& reply ) = 0;
00222 
00223 
00229         virtual ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query,
00230                 ModbusRTU::FileTransferRetMessage& reply ) = 0;
00231 
00238         virtual int getNextData( unsigned char* buf, int len ) = 0;
00239 
00240         virtual ModbusRTU::mbErrCode sendData( unsigned char* buf, int len ) = 0;
00241 
00242 
00244         virtual void setChannelTimeout( timeout_t msec ) = 0;
00245 
00247         virtual ModbusRTU::mbErrCode send( ModbusRTU::ModbusMessage& buf );
00248 
00249         virtual ModbusRTU::mbErrCode pre_send_request( ModbusRTU::ModbusMessage& request )
00250         {
00251             return ModbusRTU::erNoError;
00252         }
00253         virtual ModbusRTU::mbErrCode post_send_request( ModbusRTU::ModbusMessage& request )
00254         {
00255             return ModbusRTU::erNoError;
00256         }
00257 
00258         // default processing
00259         virtual ModbusRTU::mbErrCode processing( ModbusRTU::ModbusMessage& buf );
00260 
00262         ModbusRTU::mbErrCode recv(const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, ModbusRTU::ModbusMessage& buf, timeout_t timeout );
00263         ModbusRTU::mbErrCode recv_pdu( ModbusRTU::ModbusMessage& rbuf, timeout_t timeout );
00264 
00265         UniSetTypes::uniset_mutex recvMutex;
00266         timeout_t recvTimeOut_ms;        
00267         timeout_t replyTimeout_ms;    
00268         timeout_t aftersend_msec;        
00269         timeout_t sleepPause_usec;     
00270         bool onBroadcast;        
00271         bool crcNoCheckit;
00272         bool cleanBeforeSend;
00273 
00274         void printProcessingTime();
00275         PassiveTimer tmProcessing;
00276 
00277         std::shared_ptr<DebugStream> dlog;
00278 
00279     private:
00280 
00281 };
00282 // -------------------------------------------------------------------------
00283 #endif // ModbusServer_H_
00284 // -------------------------------------------------------------------------