UniSet  1.4.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                 vtype(VTypes::vtUnknown),
00057                 wnum(0)
00058             {}
00059 
00060             friend std::ostream& operator<<( std::ostream& os, IOProperty& p );
00061         };
00062 
00063         inline long getAskCount(){ return askCount; }
00064 
00065     protected:
00066 
00068         ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query, 
00069                                                     ModbusRTU::ReadCoilRetMessage& reply );
00071         ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query, 
00072                                                     ModbusRTU::ReadInputStatusRetMessage& reply );
00073 
00075         ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query, 
00076                                                     ModbusRTU::ReadOutputRetMessage& reply );
00077 
00079         ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query, 
00080                                                     ModbusRTU::ReadInputRetMessage& reply );
00081 
00083         ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query, 
00084                                                         ModbusRTU::ForceSingleCoilRetMessage& reply );
00085 
00087         ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query, 
00088                                                     ModbusRTU::ForceCoilsRetMessage& reply );
00089 
00090 
00092         ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query, 
00093                                                         ModbusRTU::WriteOutputRetMessage& reply );
00094 
00096         ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query, 
00097                                                         ModbusRTU::WriteSingleOutputRetMessage& reply );
00098 
00100 //      ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query, 
00101 //                                                          ModbusRTU::JournalCommandRetMessage& reply );
00102 
00104         ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query, 
00105                                                             ModbusRTU::SetDateTimeRetMessage& reply );
00106 
00108         ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query, 
00109                                                             ModbusRTU::RemoteServiceRetMessage& reply );
00110 
00111         ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query, 
00112                                                             ModbusRTU::FileTransferRetMessage& reply );
00113 
00114         ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query, 
00115                                                         ModbusRTU::DiagnosticRetMessage& reply );
00116         
00120         virtual ModbusRTU::mbErrCode checkRegister( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData& val )
00121         { return ModbusRTU::erNoError; }
00122 
00123         typedef std::map<ModbusRTU::ModbusData,IOProperty> IOMap;
00124         IOMap iomap;            
00126         ModbusServerSlot* mbslot;
00127         ModbusRTU::ModbusAddr addr;         
00129         UniSetTypes::uniset_mutex mbMutex;
00130 
00131         xmlNode* cnode;
00132         std::string s_field;
00133         std::string s_fvalue;
00134 
00135         SMInterface* shm;
00136 
00137         virtual void processingMessage( UniSetTypes::VoidMessage *msg );
00138         void sysCommand( UniSetTypes::SystemMessage *msg );
00139         void sensorInfo( UniSetTypes::SensorMessage* sm );
00140         void askSensors( UniversalIO::UIOCommand cmd ); 
00141         void waitSMReady();
00142         void execute_rtu();
00143         void execute_tcp();
00144 
00145         virtual bool activateObject();
00146         
00147         // действия при завершении работы
00148         virtual void sigterm( int signo );
00149 
00150         void initIterators();
00151         bool initItem( UniXML_iterator& it );
00152         bool readItem( UniXML& xml, UniXML_iterator& it, xmlNode* sec );
00153 
00154         void readConfiguration();
00155         bool check_item( UniXML_iterator& it );
00156 
00157         ModbusRTU::mbErrCode real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData val );
00158         ModbusRTU::mbErrCode real_read( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData& val );
00159         ModbusRTU::mbErrCode much_real_read( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, int count );
00160         ModbusRTU::mbErrCode much_real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, int count );
00161         
00162         ModbusRTU::mbErrCode real_read_it( IOMap::iterator& it, ModbusRTU::ModbusData& val );
00163         ModbusRTU::mbErrCode real_write_it( IOMap::iterator& it, ModbusRTU::ModbusData& val );
00164     private:
00165         MBSlave();
00166         bool initPause;
00167         UniSetTypes::uniset_mutex mutex_start;
00168         ThreadCreator<MBSlave>* thr;
00169 
00170         PassiveTimer ptHeartBeat;
00171         UniSetTypes::ObjectId sidHeartBeat;
00172         int maxHeartBeat;
00173         IOController::AIOStateList::iterator aitHeartBeat;
00174         UniSetTypes::ObjectId test_id;
00175 
00176         IOController::AIOStateList::iterator aitAskCount;
00177         UniSetTypes::ObjectId askcount_id;
00178 
00179         IOController::DIOStateList::iterator ditRespond;
00180         UniSetTypes::ObjectId respond_id;
00181         bool respond_invert;
00182 
00183         PassiveTimer ptTimeout;
00184         ModbusRTU::mbErrCode prev;
00185         long askCount;
00186         typedef std::map<ModbusRTU::mbErrCode,unsigned int> ExchangeErrorMap;
00187         ExchangeErrorMap errmap;    
00189         bool activated;
00190         int activateTimeout;
00191         bool pingOK;
00192         timeout_t wait_msec;
00193         bool force;     
00195         bool mbregFromID;
00196 
00197         typedef std::map<int,std::string> FileList;
00198         FileList flist;
00199         std::string prefix;
00200         
00201         ModbusRTU::ModbusData buf[ModbusRTU::MAXLENPACKET/2+1];  
00202 };
00203 // -----------------------------------------------------------------------------
00204 #endif // _MBSlave_H_
00205 // -----------------------------------------------------------------------------