24 #include <unordered_map> 26 #include <condition_variable> 29 #include "UniSetObject.h" 30 #include "modbus/ModbusTypes.h" 31 #include "modbus/ModbusServerSlot.h" 32 #include "modbus/ModbusTCPServer.h" 33 #include "modbus/ModbusTCPServerSlot.h" 34 #include "PassiveTimer.h" 37 #include "SMInterface.h" 38 #include "SharedMemory.h" 41 #include "ThreadCreator.h" 42 #include "LogServer.h" 43 #include "LogAgregator.h" 47 #define vmonit( var ) vmon.add( #var, var ) 340 static std::shared_ptr<MBSlave>
init_mbslave(
int argc,
const char*
const* argv,
342 const std::string& prefix =
"mbs" );
344 static void help_print(
int argc,
const char*
const* argv );
346 static const int NoSafetyState = -1;
355 std::string amode2str( AccessMode m );
368 ModbusRTU::RegID regID;
373 vtype(VTypes::vtUnknown),
379 friend std::ostream& operator<<( std::ostream& os,
IOProperty& p );
385 typedef std::vector<IOProperty> BitSensorMap;
395 friend std::ostream& operator<<( std::ostream& os,
BitRegProperty& p );
396 friend std::ostream& operator<<( std::ostream& os,
BitRegProperty* p );
399 inline long getConnCount()
404 inline std::shared_ptr<LogAgregator> getLogAggregator()
408 inline std::shared_ptr<DebugStream> log()
415 #ifndef DISABLE_REST_API 417 virtual Poco::JSON::Object::Ptr httpHelp(
const Poco::URI::QueryParameters& p )
override;
418 virtual Poco::JSON::Object::Ptr httpRequest(
const std::string& req,
const Poco::URI::QueryParameters& p )
override;
424 ModbusRTU::mbErrCode
readCoilStatus( ModbusRTU::ReadCoilMessage& query,
425 ModbusRTU::ReadCoilRetMessage& reply );
427 ModbusRTU::mbErrCode
readInputStatus( ModbusRTU::ReadInputStatusMessage& query,
428 ModbusRTU::ReadInputStatusRetMessage& reply );
432 ModbusRTU::ReadOutputRetMessage& reply );
436 ModbusRTU::ReadInputRetMessage& reply );
439 ModbusRTU::mbErrCode
forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query,
440 ModbusRTU::ForceSingleCoilRetMessage& reply );
444 ModbusRTU::ForceCoilsRetMessage& reply );
449 ModbusRTU::WriteOutputRetMessage& reply );
453 ModbusRTU::WriteSingleOutputRetMessage& reply );
460 ModbusRTU::mbErrCode
setDateTime( ModbusRTU::SetDateTimeMessage& query,
461 ModbusRTU::SetDateTimeRetMessage& reply );
464 ModbusRTU::mbErrCode
remoteService( ModbusRTU::RemoteServiceMessage& query,
465 ModbusRTU::RemoteServiceRetMessage& reply );
467 ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query,
468 ModbusRTU::FileTransferRetMessage& reply );
470 ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query,
471 ModbusRTU::DiagnosticRetMessage& reply );
473 ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query,
474 ModbusRTU::MEIMessageRetRDI& reply );
478 typedef std::map<ModbusRTU::RegID, IOProperty> RegMap;
480 typedef std::unordered_map<ModbusRTU::ModbusAddr, RegMap> IOMap;
486 typedef std::list<IOBase> ThresholdList;
487 ThresholdList thrlist;
489 std::shared_ptr<ModbusServerSlot> mbslot;
490 std::unordered_set<ModbusRTU::ModbusAddr>
vaddr;
491 std::string default_mbaddr = {
"" };
493 xmlNode* cnode = { 0 };
494 std::string s_field = {
"" };
495 std::string s_fvalue = {
"" };
496 int default_mbfunc = {0};
498 std::shared_ptr<SMInterface> shm;
503 void askSensors( UniversalIO::UIOCommand cmd );
505 virtual void execute_rtu();
506 virtual void execute_tcp();
507 virtual void updateStatistics();
508 virtual void updateTCPStatistics();
509 virtual void updateThresholds();
510 virtual void postReceiveEvent( ModbusRTU::mbErrCode res );
517 virtual void finalThread();
524 uniset::timeout_t checkExchangeTime = { 10000 };
526 virtual void initIterators();
527 bool initItem( UniXML::iterator& it );
528 bool readItem(
const std::shared_ptr<UniXML>& xml, UniXML::iterator& it, xmlNode* sec );
530 void readConfiguration();
531 bool check_item( UniXML::iterator& it );
533 ModbusRTU::mbErrCode real_write( RegMap& rmap,
const ModbusRTU::ModbusData regOKOK, ModbusRTU::ModbusData val,
const int fn = 0 );
534 ModbusRTU::mbErrCode real_write( RegMap& rmap,
const ModbusRTU::ModbusData regOKOK, ModbusRTU::ModbusData* dat,
size_t& i,
size_t count,
const int fn = 0 );
535 ModbusRTU::mbErrCode real_read( RegMap& rmap,
const ModbusRTU::ModbusData regOKOK, ModbusRTU::ModbusData& val,
const int fn = 0 );
536 ModbusRTU::mbErrCode much_real_read( RegMap& rmap,
const ModbusRTU::ModbusData regOKOK, ModbusRTU::ModbusData* dat,
size_t count,
const int fn = 0 );
537 ModbusRTU::mbErrCode much_real_write(RegMap& rmap,
const ModbusRTU::ModbusData regOKOK, ModbusRTU::ModbusData* dat,
size_t count,
const int fn = 0 );
539 ModbusRTU::mbErrCode real_read_it( RegMap& rmap, RegMap::iterator& it, ModbusRTU::ModbusData& val );
540 ModbusRTU::mbErrCode real_bitreg_read_it( std::shared_ptr<BitRegProperty>& bp, ModbusRTU::ModbusData& val );
541 ModbusRTU::mbErrCode real_read_prop( IOProperty* p, ModbusRTU::ModbusData& val );
543 ModbusRTU::mbErrCode real_write_it(RegMap& rmap, RegMap::iterator& it, ModbusRTU::ModbusData* dat,
size_t& i,
size_t count );
544 ModbusRTU::mbErrCode real_bitreg_write_it( std::shared_ptr<BitRegProperty>& bp,
const ModbusRTU::ModbusData val );
545 ModbusRTU::mbErrCode real_write_prop(IOProperty* p, ModbusRTU::ModbusData* dat,
size_t& i,
size_t count );
547 #ifndef DISABLE_REST_API 549 Poco::JSON::Object::Ptr request_regs(
const std::string& req,
const Poco::URI::QueryParameters& p );
550 Poco::JSON::Object::Ptr get_regs(ModbusRTU::ModbusAddr addr,
const RegMap& rmap,
const std::vector<std::string>& q_regs );
551 Poco::JSON::Object::Ptr get_reginfo(
const IOProperty& prop );
554 timeout_t initPause = { 3000 };
556 std::unique_ptr< ThreadCreator<MBSlave> > thr;
558 std::mutex mutexStartNotify;
559 std::condition_variable startNotifyEvent;
561 PassiveTimer ptHeartBeat;
563 long maxHeartBeat = { 10 };
564 IOController::IOStateList::iterator itHeartBeat;
567 IOController::IOStateList::iterator itAskCount;
570 IOController::IOStateList::iterator itRespond;
572 bool respond_invert = {
false };
574 PassiveTimer ptTimeout;
575 long connCount = { 0 };
576 long restartTCPServerCount = { 0 };
578 std::atomic_bool activated = {
false };
579 std::atomic_bool cancelled = {
false };
580 timeout_t activateTimeout = { 20000 };
581 bool smPingOK = {
false };
582 timeout_t wait_msec = { 3000 };
585 bool mbregFromID = {0};
586 bool checkMBFunc = {0};
587 bool noMBFuncOptimize = {0};
589 int getOptimizeWriteFunction(
const int fn );
591 typedef std::unordered_map<int, std::string> FileList;
593 std::string prefix = {
"" };
594 std::string prop_prefix = {
"" };
596 ModbusRTU::ModbusData
buf[ModbusRTU::MAXLENPACKET / 2 + 1];
601 typedef std::unordered_map<int, std::string> MEIValMap;
602 typedef std::unordered_map<int, MEIValMap> MEIObjIDMap;
603 typedef std::unordered_map<int, MEIObjIDMap> MEIDevIDMap;
607 std::shared_ptr<LogAgregator> loga;
608 std::shared_ptr<DebugStream> mblog;
609 std::shared_ptr<LogServer> logserv;
610 std::string logserv_host = {
""};
611 int logserv_port = {0};
613 std::string mbtype = {
"" };
617 void initTCPClients( UniXML::iterator confnode );
620 timeout_t updateStatTime = { 4000 };
621 ModbusTCPServer::Sessions
sess;
622 std::mutex sessMutex;
623 size_t sessMaxNum = { 5 };
624 std::shared_ptr<ModbusTCPServerSlot> tcpserver;
631 ptTimeout.setTiming(0);
634 std::string iaddr = {
"" };
637 IOController::IOStateList::iterator respond_it;
638 bool invert = {
false };
640 timeout_t tout = { 2000 };
642 long askCount = { 0 };
644 IOController::IOStateList::iterator askcount_it;
646 inline void initIterators(
const std::shared_ptr<SMInterface>& shm )
648 shm->initIterator( respond_it );
649 shm->initIterator( askcount_it );
652 const std::string getShortInfo()
const;
655 typedef std::unordered_map<std::string, ClientInfo> ClientsMap;
659 IOController::IOStateList::iterator sesscount_it;
661 std::atomic_bool tcpCancelled = {
true };
663 bool tcpBreakIfFailRun = {
false };
664 timeout_t tcpRepeatCreateSocketPause = { 30000 };
669 #endif // _MBSlave_H_ Пассивный таймер
Definition: PassiveTimer.h:92
Definition: CommonEventLoop.h:14
std::shared_ptr< BitRegProperty > bitreg
Definition: extensions/ModbusSlave/MBSlave.h:367
ModbusRTU::ModbusData buf[ModbusRTU::MAXLENPACKET/2+1]
Definition: extensions/ModbusSlave/MBSlave.h:596
size_t wnum
Definition: extensions/ModbusSlave/MBSlave.h:365
ModbusRTU::mbErrCode writeOutputSingleRegister(ModbusRTU::WriteSingleOutputMessage &query, ModbusRTU::WriteSingleOutputRetMessage &reply)
Definition: Utilities/MBTester/mbslave.cc:295
virtual bool activateObject() override
Активизация объекта (переопределяется для необходимых действий после активизации)
Definition: extensions/ModbusSlave/mbslave.cc:1151
ModbusRTU::mbErrCode remoteService(ModbusRTU::RemoteServiceMessage &query, ModbusRTU::RemoteServiceRetMessage &reply)
Definition: Utilities/MBTester/mbslave.cc:367
ModbusRTU::mbErrCode setDateTime(ModbusRTU::SetDateTimeMessage &query, ModbusRTU::SetDateTimeRetMessage &reply)
Definition: Utilities/MBTester/mbslave.cc:355
ModbusRTU::mbErrCode forceMultipleCoils(ModbusRTU::ForceCoilsMessage &query, ModbusRTU::ForceCoilsRetMessage &reply)
Definition: Utilities/MBTester/mbslave.cc:272
std::unordered_set< ModbusRTU::ModbusAddr > vaddr
Definition: extensions/ModbusSlave/MBSlave.h:490
ModbusRTU::mbErrCode readOutputRegisters(ModbusRTU::ReadOutputMessage &query, ModbusRTU::ReadOutputRetMessage &reply)
Definition: Utilities/MBTester/mbslave.cc:225
ModbusRTU::ModbusData mbreg
Definition: extensions/ModbusSlave/MBSlave.h:387
Definition: extensions/ModbusSlave/MBSlave.h:626
bool check(const IOController_i::SensorInfo &si)
Definition: extensions/ModbusSlave/mbslave.cc:1497
Definition: MessageType.h:170
Definition: extensions/ModbusSlave/MBSlave.h:359
ModbusRTU::mbErrCode writeOutputRegisters(ModbusRTU::WriteOutputMessage &query, ModbusRTU::WriteOutputRetMessage &reply)
Definition: Utilities/MBTester/mbslave.cc:283
Definition: UniSetObject.h:73
static std::shared_ptr< MBSlave > init_mbslave(int argc, const char *const *argv, uniset::ObjectId shmID, const std::shared_ptr< SharedMemory > &ic=nullptr, const std::string &prefix="mbs")
Definition: extensions/ModbusSlave/mbslave.cc:1616
IOMap iomap
Definition: extensions/ModbusSlave/MBSlave.h:482
const ObjectId DefaultObjectId
Definition: UniSetTypes.h:69
timeout_t sessTimeout
Definition: extensions/ModbusSlave/MBSlave.h:619
ModbusRTU::mbErrCode readCoilStatus(ModbusRTU::ReadCoilMessage &query, ModbusRTU::ReadCoilRetMessage &reply)
Definition: Utilities/MBTester/mbslave.cc:109
Definition: extensions/ModbusSlave/MBSlave.h:383
Definition: MessageType.h:126
VTypes::VType vtype
Definition: extensions/ModbusSlave/MBSlave.h:364
size_t nbyte
Definition: extensions/ModbusSlave/MBSlave.h:366
ModbusRTU::mbErrCode forceSingleCoil(ModbusRTU::ForceSingleCoilMessage &query, ModbusRTU::ForceSingleCoilRetMessage &reply)
Definition: Utilities/MBTester/mbslave.cc:306
ModbusTCPServer::Sessions sess
Definition: extensions/ModbusSlave/MBSlave.h:621
virtual bool deactivateObject() override
Деактивация объекта (переопределяется для необходимых действий при завершении работы)
Definition: extensions/ModbusSlave/mbslave.cc:1168
bool force
Definition: extensions/ModbusSlave/MBSlave.h:583
Definition: MessageType.h:213
Definition: IOController_i.idl:57
Definition: Utilities/MBTester/MBSlave.h:12
Definition: UniSetTypes_i.idl:64
ModbusRTU::ModbusData mbreg
Definition: extensions/ModbusSlave/MBSlave.h:362
ModbusRTU::mbErrCode readInputRegisters(ModbusRTU::ReadInputMessage &query, ModbusRTU::ReadInputRetMessage &reply)
Definition: Utilities/MBTester/mbslave.cc:179
long ObjectId
Definition: UniSetTypes_i.idl:30
Definition: extensions/ModbusSlave/MBSlave.h:332
ModbusRTU::mbErrCode readInputStatus(ModbusRTU::ReadInputStatusMessage &query, ModbusRTU::ReadInputStatusRetMessage &reply)
Definition: Utilities/MBTester/mbslave.cc:135