UniSet  1.7.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 // -----------------------------------------------------------------------------
00022 class MBSlave:
00023     public UniSetObject_LT
00024 {
00025     public:
00026         MBSlave( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, SharedMemory* ic=0, std::string prefix="mbs" );
00027         virtual ~MBSlave();
00028     
00030         static MBSlave* init_mbslave( int argc, const char* const* argv,
00031                                             UniSetTypes::ObjectId shmID, SharedMemory* ic=0,
00032                                             std::string prefix="mbs" );
00033 
00035         static void help_print( int argc, const char* const* argv );
00036 
00037         static const int NoSafetyState=-1;
00038 
00039         enum AccessMode
00040         {
00041             amRW,
00042             amRO,
00043             amWO
00044         };
00045 
00046         struct IOProperty:
00047             public IOBase
00048         {
00049             ModbusRTU::ModbusData mbreg;    
00050             AccessMode amode;
00051             VTypes::VType vtype;    
00052             int wnum;               
00054             IOProperty():
00055                 mbreg(0),
00056                 amode(amRW),
00057                 vtype(VTypes::vtUnknown),
00058                 wnum(0)
00059             {}
00060 
00061             friend std::ostream& operator<<( std::ostream& os, IOProperty& p );
00062         };
00063 
00064         inline long getAskCount(){ return askCount; }
00065 
00066     protected:
00067 
00069         ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query, 
00070                                                     ModbusRTU::ReadCoilRetMessage& reply );
00072         ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query, 
00073                                                     ModbusRTU::ReadInputStatusRetMessage& reply );
00074 
00076         ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query, 
00077                                                     ModbusRTU::ReadOutputRetMessage& reply );
00078 
00080         ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query, 
00081                                                     ModbusRTU::ReadInputRetMessage& reply );
00082 
00084         ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query, 
00085                                                         ModbusRTU::ForceSingleCoilRetMessage& reply );
00086 
00088         ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query, 
00089                                                     ModbusRTU::ForceCoilsRetMessage& reply );
00090 
00091 
00093         ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query, 
00094                                                         ModbusRTU::WriteOutputRetMessage& reply );
00095 
00097         ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query, 
00098                                                         ModbusRTU::WriteSingleOutputRetMessage& reply );
00099 
00101 //      ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query, 
00102 //                                                          ModbusRTU::JournalCommandRetMessage& reply );
00103 
00105         ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query, 
00106                                                             ModbusRTU::SetDateTimeRetMessage& reply );
00107 
00109         ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query, 
00110                                                             ModbusRTU::RemoteServiceRetMessage& reply );
00111 
00112         ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query, 
00113                                                             ModbusRTU::FileTransferRetMessage& reply );
00114 
00115         ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query, 
00116                                                         ModbusRTU::DiagnosticRetMessage& reply );
00117 
00118         ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query, 
00119                                                         ModbusRTU::MEIMessageRetRDI& reply );
00120         
00124         virtual ModbusRTU::mbErrCode checkRegister( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData& val )
00125         { return ModbusRTU::erNoError; }
00126 
00127         typedef std::map<ModbusRTU::ModbusData,IOProperty> IOMap;
00128         IOMap iomap;            
00130         ModbusServerSlot* mbslot;
00131         ModbusRTU::ModbusAddr addr;         
00133         UniSetTypes::uniset_mutex mbMutex;
00134 
00135         xmlNode* cnode;
00136         std::string s_field;
00137         std::string s_fvalue;
00138 
00139         SMInterface* shm;
00140 
00141         virtual void processingMessage( UniSetTypes::VoidMessage *msg );
00142         void sysCommand( UniSetTypes::SystemMessage *msg );
00143         void sensorInfo( UniSetTypes::SensorMessage* sm );
00144         void askSensors( UniversalIO::UIOCommand cmd ); 
00145         void waitSMReady();
00146         void execute_rtu();
00147         void execute_tcp();
00148 
00149         virtual bool activateObject();
00150         
00151         // действия при завершении работы
00152         virtual void sigterm( int signo );
00153 
00154         void initIterators();
00155         bool initItem( UniXML_iterator& it );
00156         bool readItem( UniXML& xml, UniXML_iterator& it, xmlNode* sec );
00157 
00158         void readConfiguration();
00159         bool check_item( UniXML_iterator& it );
00160 
00161         ModbusRTU::mbErrCode real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData val );
00162         ModbusRTU::mbErrCode real_read( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData& val );
00163         ModbusRTU::mbErrCode much_real_read( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, int count );
00164         ModbusRTU::mbErrCode much_real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, int count );
00165         
00166         ModbusRTU::mbErrCode real_read_it( IOMap::iterator& it, ModbusRTU::ModbusData& val );
00167         ModbusRTU::mbErrCode real_write_it( IOMap::iterator& it, ModbusRTU::ModbusData& val );
00168     private:
00169         MBSlave();
00170         bool initPause;
00171         UniSetTypes::uniset_mutex mutex_start;
00172         ThreadCreator<MBSlave>* thr;
00173 
00174         PassiveTimer ptHeartBeat;
00175         UniSetTypes::ObjectId sidHeartBeat;
00176         int maxHeartBeat;
00177         IOController::AIOStateList::iterator aitHeartBeat;
00178         UniSetTypes::ObjectId test_id;
00179 
00180         IOController::AIOStateList::iterator aitAskCount;
00181         UniSetTypes::ObjectId askcount_id;
00182 
00183         IOController::DIOStateList::iterator ditRespond;
00184         UniSetTypes::ObjectId respond_id;
00185         bool respond_invert;
00186 
00187         PassiveTimer ptTimeout;
00188         long askCount;
00189         typedef std::map<ModbusRTU::mbErrCode,unsigned int> ExchangeErrorMap;
00190         ExchangeErrorMap errmap;    
00192         bool activated;
00193         int activateTimeout;
00194         bool pingOK;
00195         timeout_t wait_msec;
00196         bool force;     
00198         bool mbregFromID;
00199 
00200         typedef std::map<int,std::string> FileList;
00201         FileList flist;
00202         std::string prefix;
00203         
00204         ModbusRTU::ModbusData buf[ModbusRTU::MAXLENPACKET/2+1];  
00206         // данные для ответа на запрос 0x2B(43)/0x0E(14)
00207         // 'MEI' - modbus encapsulated interface
00208         // 'RDI' - read device identification
00209         typedef std::map<int,std::string> MEIValMap;
00210         typedef std::map<int,MEIValMap> MEIObjIDMap;
00211         typedef std::map<int,MEIObjIDMap> MEIDevIDMap;
00212 
00213         MEIDevIDMap meidev;
00214 };
00215 // -----------------------------------------------------------------------------
00216 #endif // _MBSlave_H_
00217 // -----------------------------------------------------------------------------