UniSet  1.7.0
ModbusServer.h
00001 // -------------------------------------------------------------------------
00002 #ifndef ModbusServer_H_
00003 #define ModbusServer_H_
00004 // -------------------------------------------------------------------------
00005 #include <string>
00006 
00007 #include "Debug.h"
00008 #include "Mutex.h"
00009 #include "Configuration.h"
00010 #include "PassiveTimer.h"
00011 #include "ModbusTypes.h"
00012 // -------------------------------------------------------------------------
00014 class ModbusServer
00015 {
00016     public:
00017         ModbusServer();
00018         virtual ~ModbusServer();
00019 
00020         void initLog( UniSetTypes::Configuration* conf, const std::string name, const std::string logfile="" );
00021         void setLog( DebugStream& dlog );
00022 
00023 
00029         virtual ModbusRTU::mbErrCode receive( ModbusRTU::ModbusAddr addr, timeout_t msecTimeout )=0;
00030 
00031 
00035         timeout_t setAfterSendPause( timeout_t msec );
00036 
00040         timeout_t setReplyTimeout( timeout_t msec );
00041 
00043         void setRecvTimeout( timeout_t msec );
00044 
00046         inline void setSleepPause( timeout_t usec ){ sleepPause_usec = usec; }
00047 
00048         inline void setCRCNoCheckit( bool set ){ crcNoCheckit = set; }
00049         inline bool isCRCNoCheckit(){ return crcNoCheckit; }
00050 
00051         inline void setBroadcastMode( bool set ){ onBroadcast = set; }
00052         inline bool getBroadcastMode(){ return onBroadcast; }
00053 
00054         inline void setCleanBeforeSend( bool set ){ cleanBeforeSend = set; }
00055         inline bool getCleanBeforeSend(){ return cleanBeforeSend; }
00056 
00060         static ModbusRTU::mbErrCode replySetDateTime( ModbusRTU::SetDateTimeMessage& query, 
00061                                                         ModbusRTU::SetDateTimeRetMessage& reply,
00062                                                         DebugStream* dlog=0 );
00063 
00064 
00070         static ModbusRTU::mbErrCode replyFileTransfer( const std::string fname, 
00071                                                             ModbusRTU::FileTransferMessage& query, 
00072                                                             ModbusRTU::FileTransferRetMessage& reply,
00073                                                             DebugStream* dlog=0 );
00074 
00075         virtual void cleanupChannel(){}
00076         virtual void terminate(){}
00077 
00078     protected:
00079 
00085         virtual ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query, 
00086                                                             ModbusRTU::ReadCoilRetMessage& reply )=0;
00092         virtual ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query, 
00093                                                             ModbusRTU::ReadInputStatusRetMessage& reply )=0;
00094     
00100         virtual ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query, 
00101                                                             ModbusRTU::ReadOutputRetMessage& reply )=0;
00102 
00108         virtual ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query, 
00109                                                             ModbusRTU::ReadInputRetMessage& reply )=0;
00110 
00116         virtual ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query, 
00117                                                         ModbusRTU::ForceSingleCoilRetMessage& reply )=0;
00118 
00119 
00125         virtual ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query, 
00126                                                         ModbusRTU::WriteSingleOutputRetMessage& reply )=0;
00127 
00133         virtual ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query, 
00134                                                         ModbusRTU::ForceCoilsRetMessage& reply )=0;
00135 
00141         virtual ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query, 
00142                                                         ModbusRTU::WriteOutputRetMessage& reply )=0;
00143 
00144         
00150         virtual ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query, 
00151                                                         ModbusRTU::DiagnosticRetMessage& reply )=0;
00152 
00158         virtual ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query, 
00159                                                         ModbusRTU::MEIMessageRetRDI& reply )=0;
00160 
00161 
00167         virtual ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query, 
00168                                                             ModbusRTU::JournalCommandRetMessage& reply )=0;
00169 
00170 
00176         virtual ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query, 
00177                                                             ModbusRTU::SetDateTimeRetMessage& reply )=0;
00178 
00179 
00185         virtual ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query, 
00186                                                             ModbusRTU::RemoteServiceRetMessage& reply )=0;
00187 
00188 
00194         virtual ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query, 
00195                                                             ModbusRTU::FileTransferRetMessage& reply )=0;
00196 
00203         virtual int getNextData( unsigned char* buf, int len )=0;
00204         
00205         virtual ModbusRTU::mbErrCode sendData( unsigned char* buf, int len )=0;
00206         
00207 
00209         virtual void setChannelTimeout( timeout_t msec )=0;
00210 
00212         virtual ModbusRTU::mbErrCode send( ModbusRTU::ModbusMessage& buf );
00213 
00214         virtual ModbusRTU::mbErrCode pre_send_request( ModbusRTU::ModbusMessage& request ){ return ModbusRTU::erNoError; }
00215         virtual ModbusRTU::mbErrCode post_send_request( ModbusRTU::ModbusMessage& request ){ return ModbusRTU::erNoError; }
00216 
00217         // default processing
00218         virtual ModbusRTU::mbErrCode processing( ModbusRTU::ModbusMessage& buf );
00219 
00221         ModbusRTU::mbErrCode recv( ModbusRTU::ModbusAddr addr, ModbusRTU::ModbusMessage& buf, timeout_t timeout );
00222         ModbusRTU::mbErrCode recv_pdu( ModbusRTU::ModbusMessage& rbuf, timeout_t timeout );
00223 
00224         UniSetTypes::uniset_mutex recvMutex;
00225         timeout_t recvTimeOut_ms;       
00226         timeout_t replyTimeout_ms;  
00227         timeout_t aftersend_msec;       
00228         timeout_t sleepPause_usec;  
00229         bool onBroadcast;       
00230         bool crcNoCheckit;
00231         bool cleanBeforeSend;
00232 
00233         void printProcessingTime();
00234         PassiveTimer tmProcessing;
00235 
00236         DebugStream dlog;
00237 
00238     private:
00239 
00240 };
00241 // -------------------------------------------------------------------------
00242 #endif // ModbusServer_H_
00243 // -------------------------------------------------------------------------