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 )
320 static std::shared_ptr<MBSlave>
init_mbslave(
int argc,
const char*
const* argv,
322 const std::string& prefix =
"mbs" );
324 static void help_print(
int argc,
const char*
const* argv );
326 static const int NoSafetyState = -1;
335 std::string amode2str( AccessMode m );
348 ModbusRTU::RegID regID;
353 vtype(VTypes::vtUnknown),
359 friend std::ostream& operator<<( std::ostream& os,
IOProperty& p );
365 typedef std::vector<IOProperty> BitSensorMap;
375 friend std::ostream& operator<<( std::ostream& os,
BitRegProperty& p );
376 friend std::ostream& operator<<( std::ostream& os,
BitRegProperty* p );
379 inline long getConnCount()
384 inline std::shared_ptr<LogAgregator> getLogAggregator()
388 inline std::shared_ptr<DebugStream> log()
395 #ifndef DISABLE_REST_API
397 virtual Poco::JSON::Object::Ptr httpHelp(
const Poco::URI::QueryParameters& p )
override;
398 virtual Poco::JSON::Object::Ptr httpRequest(
const std::string& req,
const Poco::URI::QueryParameters& p )
override;
404 ModbusRTU::mbErrCode
readCoilStatus( ModbusRTU::ReadCoilMessage& query,
405 ModbusRTU::ReadCoilRetMessage& reply );
407 ModbusRTU::mbErrCode
readInputStatus( ModbusRTU::ReadInputStatusMessage& query,
408 ModbusRTU::ReadInputStatusRetMessage& reply );
412 ModbusRTU::ReadOutputRetMessage& reply );
416 ModbusRTU::ReadInputRetMessage& reply );
419 ModbusRTU::mbErrCode
forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query,
420 ModbusRTU::ForceSingleCoilRetMessage& reply );
424 ModbusRTU::ForceCoilsRetMessage& reply );
429 ModbusRTU::WriteOutputRetMessage& reply );
433 ModbusRTU::WriteSingleOutputRetMessage& reply );
440 ModbusRTU::mbErrCode
setDateTime( ModbusRTU::SetDateTimeMessage& query,
441 ModbusRTU::SetDateTimeRetMessage& reply );
444 ModbusRTU::mbErrCode
remoteService( ModbusRTU::RemoteServiceMessage& query,
445 ModbusRTU::RemoteServiceRetMessage& reply );
447 ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query,
448 ModbusRTU::FileTransferRetMessage& reply );
450 ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query,
451 ModbusRTU::DiagnosticRetMessage& reply );
453 ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query,
454 ModbusRTU::MEIMessageRetRDI& reply );
458 typedef std::map<ModbusRTU::RegID, IOProperty> RegMap;
460 typedef std::unordered_map<ModbusRTU::ModbusAddr, RegMap> IOMap;
466 typedef std::list<IOBase> ThresholdList;
467 ThresholdList thrlist;
469 std::shared_ptr<ModbusServerSlot> mbslot;
470 std::unordered_set<ModbusRTU::ModbusAddr>
vaddr;
471 std::string default_mbaddr = {
"" };
473 xmlNode* cnode = { 0 };
474 std::string s_field = {
"" };
475 std::string s_fvalue = {
"" };
476 int default_mbfunc = {0};
478 std::shared_ptr<SMInterface> shm;
483 void askSensors( UniversalIO::UIOCommand cmd );
485 virtual void execute_rtu();
486 virtual void execute_tcp();
487 virtual void updateStatistics();
488 virtual void updateTCPStatistics();
489 virtual void updateThresholds();
490 virtual void postReceiveEvent( ModbusRTU::mbErrCode res );
497 virtual void finalThread();
504 uniset::timeout_t checkExchangeTime = { 10000 };
506 virtual void initIterators();
507 bool initItem( UniXML::iterator& it );
508 bool readItem(
const std::shared_ptr<UniXML>& xml, UniXML::iterator& it, xmlNode* sec );
510 void readConfiguration();
511 bool check_item( UniXML::iterator& it );
513 ModbusRTU::mbErrCode real_write( RegMap& rmap,
const ModbusRTU::ModbusData regOKOK, ModbusRTU::ModbusData val,
const int fn = 0 );
514 ModbusRTU::mbErrCode real_write( RegMap& rmap,
const ModbusRTU::ModbusData regOKOK, ModbusRTU::ModbusData* dat,
size_t& i,
size_t count,
const int fn = 0 );
515 ModbusRTU::mbErrCode real_read( RegMap& rmap,
const ModbusRTU::ModbusData regOKOK, ModbusRTU::ModbusData& val,
const int fn = 0 );
516 ModbusRTU::mbErrCode much_real_read( RegMap& rmap,
const ModbusRTU::ModbusData regOKOK, ModbusRTU::ModbusData* dat,
size_t count,
const int fn = 0 );
517 ModbusRTU::mbErrCode much_real_write(RegMap& rmap,
const ModbusRTU::ModbusData regOKOK, ModbusRTU::ModbusData* dat,
size_t count,
const int fn = 0 );
519 ModbusRTU::mbErrCode real_read_it( RegMap& rmap, RegMap::iterator& it, ModbusRTU::ModbusData& val );
520 ModbusRTU::mbErrCode real_bitreg_read_it( std::shared_ptr<BitRegProperty>& bp, ModbusRTU::ModbusData& val );
521 ModbusRTU::mbErrCode real_read_prop( IOProperty* p, ModbusRTU::ModbusData& val );
523 ModbusRTU::mbErrCode real_write_it(RegMap& rmap, RegMap::iterator& it, ModbusRTU::ModbusData* dat,
size_t& i,
size_t count );
524 ModbusRTU::mbErrCode real_bitreg_write_it( std::shared_ptr<BitRegProperty>& bp,
const ModbusRTU::ModbusData val );
525 ModbusRTU::mbErrCode real_write_prop(IOProperty* p, ModbusRTU::ModbusData* dat,
size_t& i,
size_t count );
527 #ifndef DISABLE_REST_API
529 Poco::JSON::Object::Ptr request_regs(
const std::string& req,
const Poco::URI::QueryParameters& p );
530 Poco::JSON::Object::Ptr get_regs(ModbusRTU::ModbusAddr addr,
const RegMap& rmap,
const std::vector<std::string>& q_regs );
531 Poco::JSON::Object::Ptr get_reginfo(
const IOProperty& prop );
534 timeout_t initPause = { 3000 };
536 std::unique_ptr< ThreadCreator<MBSlave> > thr;
538 std::mutex mutexStartNotify;
539 std::condition_variable startNotifyEvent;
541 PassiveTimer ptHeartBeat;
543 long maxHeartBeat = { 10 };
544 IOController::IOStateList::iterator itHeartBeat;
547 IOController::IOStateList::iterator itAskCount;
550 IOController::IOStateList::iterator itRespond;
552 bool respond_invert = {
false };
554 PassiveTimer ptTimeout;
555 long connCount = { 0 };
556 long restartTCPServerCount = { 0 };
558 std::atomic_bool activated = {
false };
559 std::atomic_bool cancelled = {
false };
560 timeout_t activateTimeout = { 20000 };
561 bool smPingOK = {
false };
562 timeout_t wait_msec = { 3000 };
565 bool mbregFromID = {0};
566 bool checkMBFunc = {0};
567 bool noMBFuncOptimize = {0};
569 int getOptimizeWriteFunction(
const int fn );
571 typedef std::unordered_map<int, std::string> FileList;
573 std::string prefix = {
"" };
574 std::string prop_prefix = {
"" };
576 ModbusRTU::ModbusData
buf[ModbusRTU::MAXLENPACKET / 2 + 1];
581 typedef std::unordered_map<int, std::string> MEIValMap;
582 typedef std::unordered_map<int, MEIValMap> MEIObjIDMap;
583 typedef std::unordered_map<int, MEIObjIDMap> MEIDevIDMap;
587 std::shared_ptr<LogAgregator> loga;
588 std::shared_ptr<DebugStream> mblog;
589 std::shared_ptr<LogServer> logserv;
590 std::string logserv_host = {
""};
591 int logserv_port = {0};
593 std::string mbtype = {
"" };
597 void initTCPClients( UniXML::iterator confnode );
601 timeout_t updateStatTime = { 4000 };
602 ModbusTCPServer::Sessions
sess;
603 std::mutex sessMutex;
604 size_t sessMaxNum = { 5 };
605 std::shared_ptr<ModbusTCPServerSlot> tcpserver;
612 ptTimeout.setTiming(0);
615 std::string iaddr = {
"" };
618 IOController::IOStateList::iterator respond_it;
619 bool invert = {
false };
621 timeout_t tout = { 2000 };
623 long askCount = { 0 };
625 IOController::IOStateList::iterator askcount_it;
627 inline void initIterators(
const std::shared_ptr<SMInterface>& shm )
629 shm->initIterator( respond_it );
630 shm->initIterator( askcount_it );
633 const std::string getShortInfo()
const;
636 typedef std::unordered_map<std::string, ClientInfo> ClientsMap;
640 IOController::IOStateList::iterator sesscount_it;
642 std::atomic_bool tcpCancelled = {
true };
644 bool tcpBreakIfFailRun = {
false };
645 timeout_t tcpRepeatCreateSocketPause = { 30000 };
Definition: Utilities/MBTester/MBSlave.h:13
Definition: extensions/ModbusSlave/MBSlave.h:314
ModbusRTU::mbErrCode readInputRegisters(ModbusRTU::ReadInputMessage &query, ModbusRTU::ReadInputRetMessage &reply)
Definition: Utilities/MBTester/MBSlave.cc:179
virtual bool activateObject() override
Активизация объекта (переопределяется для необходимых действий после активизации)
Definition: extensions/ModbusSlave/MBSlave.cc:1173
IOMap iomap
Definition: extensions/ModbusSlave/MBSlave.h:462
ModbusRTU::mbErrCode writeOutputSingleRegister(ModbusRTU::WriteSingleOutputMessage &query, ModbusRTU::WriteSingleOutputRetMessage &reply)
Definition: Utilities/MBTester/MBSlave.cc:295
ModbusRTU::ModbusData buf[ModbusRTU::MAXLENPACKET/2+1]
Definition: extensions/ModbusSlave/MBSlave.h:576
ModbusRTU::mbErrCode writeOutputRegisters(ModbusRTU::WriteOutputMessage &query, ModbusRTU::WriteOutputRetMessage &reply)
Definition: Utilities/MBTester/MBSlave.cc:283
ModbusRTU::mbErrCode readOutputRegisters(ModbusRTU::ReadOutputMessage &query, ModbusRTU::ReadOutputRetMessage &reply)
Definition: Utilities/MBTester/MBSlave.cc:225
ModbusRTU::mbErrCode readInputStatus(ModbusRTU::ReadInputStatusMessage &query, ModbusRTU::ReadInputStatusRetMessage &reply)
Definition: Utilities/MBTester/MBSlave.cc:135
ModbusTCPServer::Sessions sess
Definition: extensions/ModbusSlave/MBSlave.h:602
ModbusRTU::mbErrCode readCoilStatus(ModbusRTU::ReadCoilMessage &query, ModbusRTU::ReadCoilRetMessage &reply)
Definition: Utilities/MBTester/MBSlave.cc:109
timeout_t sessTimeout
Definition: extensions/ModbusSlave/MBSlave.h:600
ModbusRTU::mbErrCode setDateTime(ModbusRTU::SetDateTimeMessage &query, ModbusRTU::SetDateTimeRetMessage &reply)
Definition: Utilities/MBTester/MBSlave.cc:355
ModbusRTU::mbErrCode remoteService(ModbusRTU::RemoteServiceMessage &query, ModbusRTU::RemoteServiceRetMessage &reply)
Definition: Utilities/MBTester/MBSlave.cc:367
virtual bool deactivateObject() override
Деактивация объекта (переопределяется для необходимых действий при завершении работы)
Definition: extensions/ModbusSlave/MBSlave.cc:1190
std::unordered_set< ModbusRTU::ModbusAddr > vaddr
Definition: extensions/ModbusSlave/MBSlave.h:470
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:1644
bool force
Definition: extensions/ModbusSlave/MBSlave.h:563
timeout_t sockTimeout
Definition: extensions/ModbusSlave/MBSlave.h:599
ModbusRTU::mbErrCode forceMultipleCoils(ModbusRTU::ForceCoilsMessage &query, ModbusRTU::ForceCoilsRetMessage &reply)
Definition: Utilities/MBTester/MBSlave.cc:272
ModbusRTU::mbErrCode forceSingleCoil(ModbusRTU::ForceSingleCoilMessage &query, ModbusRTU::ForceSingleCoilRetMessage &reply)
Definition: Utilities/MBTester/MBSlave.cc:306
Пассивный таймер
Definition: PassiveTimer.h:94
Definition: MessageType.h:127
Definition: MessageType.h:171
Definition: MessageType.h:214
Definition: UniSetObject.h:80
Definition: CommonEventLoop.h:15
const ObjectId DefaultObjectId
Definition: UniSetTypes.h:70
long ObjectId
Definition: UniSetTypes_i.idl:30
Definition: IOController_i.idl:58
Definition: extensions/ModbusSlave/MBSlave.h:364
ModbusRTU::ModbusData mbreg
Definition: extensions/ModbusSlave/MBSlave.h:367
bool check(const IOController_i::SensorInfo &si)
Definition: extensions/ModbusSlave/MBSlave.cc:1519
Definition: extensions/ModbusSlave/MBSlave.h:608
Definition: extensions/ModbusSlave/MBSlave.h:341
size_t wnum
Definition: extensions/ModbusSlave/MBSlave.h:345
ModbusRTU::ModbusData mbreg
Definition: extensions/ModbusSlave/MBSlave.h:342
std::shared_ptr< BitRegProperty > bitreg
Definition: extensions/ModbusSlave/MBSlave.h:347
VTypes::VType vtype
Definition: extensions/ModbusSlave/MBSlave.h:344
size_t nbyte
Definition: extensions/ModbusSlave/MBSlave.h:346
Definition: UniSetTypes_i.idl:65