UniSet  2.0.0
extensions/include/MBSlave.h
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 // -----------------------------------------------------------------------------