UniSet
1.4.0
|
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 // -------------------------------------------------------------------------