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
00102
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
00207
00208
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