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
00101
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