|
UniSet
2.2.1
|
00001 // ------------------------------------------------------------------------- 00002 #ifndef ModbusServer_H_ 00003 #define ModbusServer_H_ 00004 // ------------------------------------------------------------------------- 00005 #include <string> 00006 #include <unordered_set> 00007 00008 #include "Debug.h" 00009 #include "Mutex.h" 00010 #include "Configuration.h" 00011 #include "PassiveTimer.h" 00012 #include "ModbusTypes.h" 00013 // ------------------------------------------------------------------------- 00015 class ModbusServer 00016 { 00017 public: 00018 ModbusServer(); 00019 virtual ~ModbusServer(); 00020 00021 void initLog( UniSetTypes::Configuration* conf, const std::string& name, const std::string& logfile = "" ); 00022 void setLog( std::shared_ptr<DebugStream> dlog ); 00023 00024 00025 std::unordered_set<ModbusRTU::ModbusAddr> addr2vaddr( ModbusRTU::ModbusAddr& mbaddr ); 00026 00032 virtual ModbusRTU::mbErrCode receive( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout ) = 0; 00033 00034 // версия с "одним" адресом 00035 virtual ModbusRTU::mbErrCode receive_one( const ModbusRTU::ModbusAddr addr, timeout_t msec ); 00036 00043 static bool checkAddr( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, const ModbusRTU::ModbusAddr addr ); 00044 static std::string vaddr2str( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr ); 00045 00049 timeout_t setAfterSendPause( timeout_t msec ); 00050 00054 timeout_t setReplyTimeout( timeout_t msec ); 00055 00057 void setRecvTimeout( timeout_t msec ); 00058 00060 inline void setSleepPause( timeout_t usec ) 00061 { 00062 sleepPause_usec = usec; 00063 } 00064 00065 inline void setCRCNoCheckit( bool set ) 00066 { 00067 crcNoCheckit = set; 00068 } 00069 inline bool isCRCNoCheckit() 00070 { 00071 return crcNoCheckit; 00072 } 00073 00074 inline void setBroadcastMode( bool set ) 00075 { 00076 onBroadcast = set; 00077 } 00078 inline bool getBroadcastMode() 00079 { 00080 return onBroadcast; 00081 } 00082 00083 inline void setCleanBeforeSend( bool set ) 00084 { 00085 cleanBeforeSend = set; 00086 } 00087 inline bool getCleanBeforeSend() 00088 { 00089 return cleanBeforeSend; 00090 } 00091 00095 static ModbusRTU::mbErrCode replySetDateTime( ModbusRTU::SetDateTimeMessage& query, 00096 ModbusRTU::SetDateTimeRetMessage& reply, 00097 std::shared_ptr<DebugStream> dlog = nullptr ); 00098 00099 00105 static ModbusRTU::mbErrCode replyFileTransfer( const std::string& fname, 00106 ModbusRTU::FileTransferMessage& query, 00107 ModbusRTU::FileTransferRetMessage& reply, 00108 std::shared_ptr<DebugStream> dlog = nullptr ); 00109 00110 virtual void cleanupChannel() {} 00111 virtual void terminate() {} 00112 00113 protected: 00114 00120 virtual ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query, 00121 ModbusRTU::ReadCoilRetMessage& reply ) = 0; 00127 virtual ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query, 00128 ModbusRTU::ReadInputStatusRetMessage& reply ) = 0; 00129 00135 virtual ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query, 00136 ModbusRTU::ReadOutputRetMessage& reply ) = 0; 00137 00143 virtual ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query, 00144 ModbusRTU::ReadInputRetMessage& reply ) = 0; 00145 00151 virtual ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query, 00152 ModbusRTU::ForceSingleCoilRetMessage& reply ) = 0; 00153 00154 00160 virtual ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query, 00161 ModbusRTU::WriteSingleOutputRetMessage& reply ) = 0; 00162 00168 virtual ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query, 00169 ModbusRTU::ForceCoilsRetMessage& reply ) = 0; 00170 00176 virtual ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query, 00177 ModbusRTU::WriteOutputRetMessage& reply ) = 0; 00178 00179 00185 virtual ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query, 00186 ModbusRTU::DiagnosticRetMessage& reply ) = 0; 00187 00193 virtual ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query, 00194 ModbusRTU::MEIMessageRetRDI& reply ) = 0; 00195 00196 00202 virtual ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query, 00203 ModbusRTU::JournalCommandRetMessage& reply ) = 0; 00204 00205 00211 virtual ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query, 00212 ModbusRTU::SetDateTimeRetMessage& reply ) = 0; 00213 00214 00220 virtual ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query, 00221 ModbusRTU::RemoteServiceRetMessage& reply ) = 0; 00222 00223 00229 virtual ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query, 00230 ModbusRTU::FileTransferRetMessage& reply ) = 0; 00231 00238 virtual int getNextData( unsigned char* buf, int len ) = 0; 00239 00240 virtual ModbusRTU::mbErrCode sendData( unsigned char* buf, int len ) = 0; 00241 00242 00244 virtual void setChannelTimeout( timeout_t msec ) = 0; 00245 00247 virtual ModbusRTU::mbErrCode send( ModbusRTU::ModbusMessage& buf ); 00248 00249 virtual ModbusRTU::mbErrCode pre_send_request( ModbusRTU::ModbusMessage& request ) 00250 { 00251 return ModbusRTU::erNoError; 00252 } 00253 virtual ModbusRTU::mbErrCode post_send_request( ModbusRTU::ModbusMessage& request ) 00254 { 00255 return ModbusRTU::erNoError; 00256 } 00257 00258 // default processing 00259 virtual ModbusRTU::mbErrCode processing( ModbusRTU::ModbusMessage& buf ); 00260 00262 ModbusRTU::mbErrCode recv(const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, ModbusRTU::ModbusMessage& buf, timeout_t timeout ); 00263 ModbusRTU::mbErrCode recv_pdu( ModbusRTU::ModbusMessage& rbuf, timeout_t timeout ); 00264 00265 UniSetTypes::uniset_mutex recvMutex; 00266 timeout_t recvTimeOut_ms; 00267 timeout_t replyTimeout_ms; 00268 timeout_t aftersend_msec; 00269 timeout_t sleepPause_usec; 00270 bool onBroadcast; 00271 bool crcNoCheckit; 00272 bool cleanBeforeSend; 00273 00274 void printProcessingTime(); 00275 PassiveTimer tmProcessing; 00276 00277 std::shared_ptr<DebugStream> dlog; 00278 00279 private: 00280 00281 }; 00282 // ------------------------------------------------------------------------- 00283 #endif // ModbusServer_H_ 00284 // -------------------------------------------------------------------------
1.7.6.1