|
UniSet
1.7.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 // ----------------------------------------------------------------------------- 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 // -----------------------------------------------------------------------------
1.7.6.1