UniSet  1.4.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 
00153         
00159         virtual ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query, 
00160                                                             ModbusRTU::JournalCommandRetMessage& reply )=0;
00161 
00162 
00168         virtual ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query, 
00169                                                             ModbusRTU::SetDateTimeRetMessage& reply )=0;
00170 
00171 
00177         virtual ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query, 
00178                                                             ModbusRTU::RemoteServiceRetMessage& reply )=0;
00179 
00180 
00186         virtual ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query, 
00187                                                             ModbusRTU::FileTransferRetMessage& reply )=0;
00188 
00195         virtual int getNextData( unsigned char* buf, int len )=0;
00196         
00197         virtual ModbusRTU::mbErrCode sendData( unsigned char* buf, int len )=0;
00198         
00199 
00201         virtual void setChannelTimeout( timeout_t msec )=0;
00202 
00204         virtual ModbusRTU::mbErrCode send( ModbusRTU::ModbusMessage& buf );
00205 
00206         virtual ModbusRTU::mbErrCode pre_send_request( ModbusRTU::ModbusMessage& request ){ return ModbusRTU::erNoError; }
00207         virtual ModbusRTU::mbErrCode post_send_request( ModbusRTU::ModbusMessage& request ){ return ModbusRTU::erNoError; }
00208 
00209         // default processing
00210         virtual ModbusRTU::mbErrCode processing( ModbusRTU::ModbusMessage& buf );
00211 
00213         ModbusRTU::mbErrCode recv( ModbusRTU::ModbusAddr addr, ModbusRTU::ModbusMessage& buf, timeout_t timeout );
00214         ModbusRTU::mbErrCode recv_pdu( ModbusRTU::ModbusMessage& rbuf, timeout_t timeout );
00215 
00216         UniSetTypes::uniset_mutex recvMutex;
00217         timeout_t recvTimeOut_ms;       
00218         timeout_t replyTimeout_ms;  
00219         timeout_t aftersend_msec;       
00220         timeout_t sleepPause_usec;  
00221         bool onBroadcast;       
00222         bool crcNoCheckit;
00223         bool cleanBeforeSend;
00224 
00225         void printProcessingTime();
00226         PassiveTimer tmProcessing;
00227 
00228         DebugStream dlog;
00229 
00230     private:
00231 
00232 };
00233 // -------------------------------------------------------------------------
00234 #endif // ModbusServer_H_
00235 // -------------------------------------------------------------------------