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
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