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