|
UniSet
2.0.0
|
00001 // ----------------------------------------------------------------------------- 00002 #ifndef _MBSlave_H_ 00003 #define _MBSlave_H_ 00004 // ----------------------------------------------------------------------------- 00005 #include <ostream> 00006 #include <string> 00007 #include <map> 00008 #include <vector> 00009 #include "UniSetObject_LT.h" 00010 #include "modbus/ModbusTypes.h" 00011 #include "modbus/ModbusServerSlot.h" 00012 #include "PassiveTimer.h" 00013 #include "Trigger.h" 00014 #include "Mutex.h" 00015 #include "SMInterface.h" 00016 #include "SharedMemory.h" 00017 #include "IOBase.h" 00018 #include "VTypes.h" 00019 #include "ThreadCreator.h" 00020 // ----------------------------------------------------------------------------- 00254 // ----------------------------------------------------------------------------- 00256 class MBSlave: 00257 public UniSetObject_LT 00258 { 00259 public: 00260 MBSlave( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, SharedMemory* ic=0, const std::string& prefix="mbs" ); 00261 virtual ~MBSlave(); 00262 00264 static MBSlave* init_mbslave( int argc, const char* const* argv, 00265 UniSetTypes::ObjectId shmID, SharedMemory* ic=0, 00266 const std::string& prefix="mbs" ); 00267 00269 static void help_print( int argc, const char* const* argv ); 00270 00271 static const int NoSafetyState=-1; 00272 00273 enum AccessMode 00274 { 00275 amRW, 00276 amRO, 00277 amWO 00278 }; 00279 00280 struct IOProperty: 00281 public IOBase 00282 { 00283 ModbusRTU::ModbusData mbreg; 00284 AccessMode amode; 00285 VTypes::VType vtype; 00286 int wnum; 00287 int nbyte; 00288 bool rawdata; 00290 IOProperty(): 00291 mbreg(0), 00292 amode(amRW), 00293 vtype(VTypes::vtUnknown), 00294 wnum(0), 00295 nbyte(0), 00296 rawdata(false) 00297 {} 00298 00299 friend std::ostream& operator<<( std::ostream& os, IOProperty& p ); 00300 }; 00301 00302 inline long getAskCount(){ return askCount; } 00303 00304 protected: 00305 00307 ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query, 00308 ModbusRTU::ReadCoilRetMessage& reply ); 00310 ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query, 00311 ModbusRTU::ReadInputStatusRetMessage& reply ); 00312 00314 ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query, 00315 ModbusRTU::ReadOutputRetMessage& reply ); 00316 00318 ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query, 00319 ModbusRTU::ReadInputRetMessage& reply ); 00320 00322 ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query, 00323 ModbusRTU::ForceSingleCoilRetMessage& reply ); 00324 00326 ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query, 00327 ModbusRTU::ForceCoilsRetMessage& reply ); 00328 00329 00331 ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query, 00332 ModbusRTU::WriteOutputRetMessage& reply ); 00333 00335 ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query, 00336 ModbusRTU::WriteSingleOutputRetMessage& reply ); 00337 00339 // ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query, 00340 // ModbusRTU::JournalCommandRetMessage& reply ); 00341 00343 ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query, 00344 ModbusRTU::SetDateTimeRetMessage& reply ); 00345 00347 ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query, 00348 ModbusRTU::RemoteServiceRetMessage& reply ); 00349 00350 ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query, 00351 ModbusRTU::FileTransferRetMessage& reply ); 00352 00353 ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query, 00354 ModbusRTU::DiagnosticRetMessage& reply ); 00355 00356 ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query, 00357 ModbusRTU::MEIMessageRetRDI& reply ); 00358 00362 virtual ModbusRTU::mbErrCode checkRegister( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData& val ) 00363 { return ModbusRTU::erNoError; } 00364 00365 typedef std::map<ModbusRTU::ModbusData,IOProperty> IOMap; 00366 IOMap iomap; 00368 ModbusServerSlot* mbslot; 00369 ModbusRTU::ModbusAddr addr; 00371 xmlNode* cnode; 00372 std::string s_field; 00373 std::string s_fvalue; 00374 00375 SMInterface* shm; 00376 00377 virtual void sysCommand( const UniSetTypes::SystemMessage *msg ) override; 00378 virtual void sensorInfo( const UniSetTypes::SensorMessage* sm ) override; 00379 void askSensors( UniversalIO::UIOCommand cmd ); 00380 void waitSMReady(); 00381 virtual void execute_rtu(); 00382 virtual void execute_tcp(); 00383 00384 virtual bool activateObject() override; 00385 virtual bool deactivateObject() override; 00386 00387 // действия при завершении работы 00388 virtual void sigterm( int signo ) override; 00389 00390 virtual void initIterators(); 00391 bool initItem( UniXML::iterator& it ); 00392 bool readItem( const std::shared_ptr<UniXML>& xml, UniXML::iterator& it, xmlNode* sec ); 00393 00394 void readConfiguration(); 00395 bool check_item( UniXML::iterator& it ); 00396 00397 ModbusRTU::mbErrCode real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData val ); 00398 ModbusRTU::mbErrCode real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, int& i, int count ); 00399 ModbusRTU::mbErrCode real_read( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData& val ); 00400 ModbusRTU::mbErrCode much_real_read( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, int count ); 00401 ModbusRTU::mbErrCode much_real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, int count ); 00402 00403 ModbusRTU::mbErrCode real_read_it( IOMap::iterator& it, ModbusRTU::ModbusData& val ); 00404 ModbusRTU::mbErrCode real_write_it( IOMap::iterator& it, ModbusRTU::ModbusData* dat, int& i, int count ); 00405 00406 MBSlave(); 00407 bool initPause; 00408 UniSetTypes::uniset_rwmutex mutex_start; 00409 ThreadCreator<MBSlave>* thr; 00410 00411 PassiveTimer ptHeartBeat; 00412 UniSetTypes::ObjectId sidHeartBeat; 00413 int maxHeartBeat; 00414 IOController::IOStateList::iterator itHeartBeat; 00415 UniSetTypes::ObjectId test_id; 00416 00417 IOController::IOStateList::iterator itAskCount; 00418 UniSetTypes::ObjectId askcount_id; 00419 00420 IOController::IOStateList::iterator itRespond; 00421 UniSetTypes::ObjectId respond_id; 00422 bool respond_invert; 00423 00424 PassiveTimer ptTimeout; 00425 long askCount; 00426 typedef std::map<ModbusRTU::mbErrCode,unsigned int> ExchangeErrorMap; 00427 ExchangeErrorMap errmap; 00429 std::atomic_bool activated; 00430 std::atomic_bool cancelled; 00431 int activateTimeout; 00432 bool pingOK; 00433 timeout_t wait_msec; 00434 bool force; 00436 bool mbregFromID; 00437 00438 typedef std::map<int,std::string> FileList; 00439 FileList flist; 00440 std::string prefix; 00441 00442 ModbusRTU::ModbusData buf[ModbusRTU::MAXLENPACKET/2+1]; 00444 // данные для ответа на запрос 0x2B(43)/0x0E(14) 00445 // 'MEI' - modbus encapsulated interface 00446 // 'RDI' - read device identification 00447 typedef std::map<int,std::string> MEIValMap; 00448 typedef std::map<int,MEIValMap> MEIObjIDMap; 00449 typedef std::map<int,MEIObjIDMap> MEIDevIDMap; 00450 00451 MEIDevIDMap meidev; 00452 }; 00453 // ----------------------------------------------------------------------------- 00454 #endif // _MBSlave_H_ 00455 // -----------------------------------------------------------------------------
1.7.6.1