UniSet
1.4.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 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 // -----------------------------------------------------------------------------