317 private USingleProcess,
325 static std::shared_ptr<MBSlave>
init_mbslave(
int argc,
const char*
const* argv,
327 const std::string& prefix =
"mbs" );
329 static void help_print(
int argc,
const char*
const* argv );
331 static const int NoSafetyState = -1;
340 std::string amode2str( AccessMode m );
353 ModbusRTU::RegID regID;
358 vtype(VTypes::vtUnknown),
364 friend std::ostream& operator<<( std::ostream& os,
IOProperty& p );
368 struct BitRegProperty
370 typedef std::vector<IOProperty> BitSensorMap;
375 BitRegProperty():
mbreg(0), bvec(ModbusRTU::BitsPerData) {}
380 friend std::ostream& operator<<( std::ostream& os,
BitRegProperty& p );
381 friend std::ostream& operator<<( std::ostream& os,
BitRegProperty* p );
384 inline long getConnCount()
389 inline std::shared_ptr<LogAgregator> getLogAggregator()
393 inline std::shared_ptr<DebugStream> log()
398 virtual uniset::SimpleInfo* getInfo(
const char* userparam = 0 )
override;
400#ifndef DISABLE_REST_API
402 virtual Poco::JSON::Object::Ptr httpHelp(
const Poco::URI::QueryParameters& p )
override;
403 virtual Poco::JSON::Object::Ptr httpRequest(
const std::string& req,
const Poco::URI::QueryParameters& p )
override;
409 ModbusRTU::mbErrCode
readCoilStatus(
const ModbusRTU::ReadCoilMessage& query,
410 ModbusRTU::ReadCoilRetMessage& reply );
412 ModbusRTU::mbErrCode
readInputStatus(
const ModbusRTU::ReadInputStatusMessage& query,
413 ModbusRTU::ReadInputStatusRetMessage& reply );
417 ModbusRTU::ReadOutputRetMessage& reply );
421 ModbusRTU::ReadInputRetMessage& reply );
424 ModbusRTU::mbErrCode
forceSingleCoil(
const ModbusRTU::ForceSingleCoilMessage& query,
425 ModbusRTU::ForceSingleCoilRetMessage& reply );
429 ModbusRTU::ForceCoilsRetMessage& reply );
434 ModbusRTU::WriteOutputRetMessage& reply );
438 ModbusRTU::WriteSingleOutputRetMessage& reply );
445 ModbusRTU::mbErrCode
setDateTime(
const ModbusRTU::SetDateTimeMessage& query,
446 ModbusRTU::SetDateTimeRetMessage& reply );
449 ModbusRTU::mbErrCode
remoteService(
const ModbusRTU::RemoteServiceMessage& query,
450 ModbusRTU::RemoteServiceRetMessage& reply );
452 ModbusRTU::mbErrCode fileTransfer(
const ModbusRTU::FileTransferMessage& query,
453 ModbusRTU::FileTransferRetMessage& reply );
455 ModbusRTU::mbErrCode diagnostics(
const ModbusRTU::DiagnosticMessage& query,
456 ModbusRTU::DiagnosticRetMessage& reply );
458 ModbusRTU::mbErrCode read4314(
const ModbusRTU::MEIMessageRDI& query,
459 ModbusRTU::MEIMessageRetRDI& reply );
463 typedef std::map<ModbusRTU::RegID, IOProperty> RegMap;
465 typedef std::unordered_map<ModbusRTU::ModbusAddr, RegMap> IOMap;
471 typedef std::list<IOBase> ThresholdList;
472 ThresholdList thrlist;
474 std::shared_ptr<ModbusServerSlot> mbslot;
475 std::unordered_set<ModbusRTU::ModbusAddr>
vaddr;
476 std::string default_mbaddr = {
"" };
478 xmlNode* cnode = { 0 };
479 std::string s_field = {
"" };
480 std::string s_fvalue = {
"" };
481 int default_mbfunc = {0};
483 std::shared_ptr<SMInterface> shm;
485 virtual void sysCommand(
const uniset::SystemMessage* msg )
override;
486 virtual void sensorInfo(
const uniset::SensorMessage* sm )
override;
487 virtual void timerInfo(
const uniset::TimerMessage* tm )
override;
488 void askSensors( UniversalIO::UIOCommand cmd );
490 virtual void execute_rtu();
491 virtual void execute_tcp();
492 virtual void updateStatistics();
493 virtual void updateTCPStatistics();
494 virtual void updateThresholds();
495 virtual void postReceiveEvent( ModbusRTU::mbErrCode res );
502 virtual void finalThread();
509 uniset::timeout_t checkExchangeTime = { 10000 };
511 virtual void initIterators();
512 bool initItem( UniXML::iterator& it );
513 bool readItem(
const std::shared_ptr<UniXML>& xml, UniXML::iterator& it, xmlNode* sec );
515 void readConfiguration();
516 bool check_item( UniXML::iterator& it );
518 ModbusRTU::mbErrCode real_write( RegMap& rmap,
const ModbusRTU::ModbusData reg, ModbusRTU::ModbusData val,
const int fn = 0 );
519 ModbusRTU::mbErrCode real_write( RegMap& rmap,
const ModbusRTU::ModbusData regK,
const ModbusRTU::ModbusData* dat,
size_t& i,
size_t count,
const int fn = 0 );
520 ModbusRTU::mbErrCode real_read( RegMap& rmap,
const ModbusRTU::ModbusData reg, ModbusRTU::ModbusData& val,
const int fn = 0 );
521 ModbusRTU::mbErrCode much_read( RegMap& rmap,
const ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat,
size_t count,
const int fn = 0 );
522 ModbusRTU::mbErrCode much_write(RegMap& rmap,
const ModbusRTU::ModbusData reg,
const ModbusRTU::ModbusData* dat,
size_t count,
const int fn = 0 );
523 ModbusRTU::mbErrCode bits_read( RegMap& rmap,
const ModbusRTU::ModbusData reg, ModbusRTU::BitsBuffer* dat,
size_t count,
const int fn = 0 );
525 ModbusRTU::mbErrCode real_read_it( RegMap& rmap, RegMap::iterator& it, ModbusRTU::ModbusData& val );
526 ModbusRTU::mbErrCode real_bitreg_read_it( std::shared_ptr<BitRegProperty>& bp, ModbusRTU::ModbusData& val );
527 ModbusRTU::mbErrCode real_read_prop(
IOProperty* p, ModbusRTU::ModbusData& val );
529 ModbusRTU::mbErrCode real_write_it(RegMap& rmap, RegMap::iterator& it,
const ModbusRTU::ModbusData* dat,
size_t& i,
size_t count );
530 ModbusRTU::mbErrCode real_bitreg_write_it( std::shared_ptr<BitRegProperty>& bp,
const ModbusRTU::ModbusData val );
531 ModbusRTU::mbErrCode real_write_prop(
IOProperty* p,
const ModbusRTU::ModbusData* dat,
size_t& i,
size_t count );
533#ifndef DISABLE_REST_API
535 Poco::JSON::Object::Ptr request_regs(
const std::string& req,
const Poco::URI::QueryParameters& p );
536 Poco::JSON::Object::Ptr get_regs(ModbusRTU::ModbusAddr addr,
const RegMap& rmap,
const std::vector<std::string>& q_regs );
537 Poco::JSON::Object::Ptr get_reginfo(
const IOProperty& prop );
540 Poco::JSON::Object::Ptr httpGetParam(
const Poco::URI::QueryParameters& p );
541 Poco::JSON::Object::Ptr httpSetParam(
const Poco::URI::QueryParameters& p );
542 Poco::JSON::Object::Ptr httpStatus();
544 bool httpEnabledSetParams = {
false };
547 timeout_t initPause = { 3000 };
548 uniset::uniset_rwmutex mutex_start;
549 std::unique_ptr< ThreadCreator<MBSlave> > thr;
551 std::mutex mutexStartNotify;
552 std::condition_variable startNotifyEvent;
554 PassiveTimer ptHeartBeat;
556 long maxHeartBeat = { 10 };
557 IOController::IOStateList::iterator itHeartBeat;
560 IOController::IOStateList::iterator itAskCount;
563 IOController::IOStateList::iterator itRespond;
565 bool respond_invert = {
false };
567 PassiveTimer ptTimeout;
568 long connCount = { 0 };
569 long restartTCPServerCount = { 0 };
571 std::atomic_bool activated = {
false };
572 std::atomic_bool canceled = {
false };
573 timeout_t activateTimeout = { 20000 };
574 bool smPingOK = {
false };
575 timeout_t wait_msec = { 3000 };
578 bool mbregFromID = {0};
579 bool checkMBFunc = {0};
580 bool noMBFuncOptimize = {0};
582 int getOptimizeWriteFunction(
const int fn );
584 typedef std::unordered_map<int, std::string> FileList;
586 std::string prefix = {
"" };
587 std::string prop_prefix = {
"" };
589 ModbusRTU::ModbusData
buf[ModbusRTU::MAXLENPACKET / 2 + 1];
594 typedef std::unordered_map<int, std::string> MEIValMap;
595 typedef std::unordered_map<int, MEIValMap> MEIObjIDMap;
596 typedef std::unordered_map<int, MEIObjIDMap> MEIDevIDMap;
600 std::shared_ptr<LogAgregator> loga;
601 std::shared_ptr<DebugStream> mblog;
602 std::shared_ptr<LogServer> logserv;
603 std::string logserv_host = {
""};
604 int logserv_port = {0};
606 std::string mbtype = {
"" };
610 void initTCPClients( UniXML::iterator confnode );
614 timeout_t updateStatTime = { 4000 };
615 ModbusTCPServer::Sessions
sess;
616 std::mutex sessMutex;
617 size_t sessMaxNum = { 5 };
618 std::shared_ptr<ModbusTCPServerSlot> tcpserver;
625 ptTimeout.setTiming(0);
628 std::string iaddr = {
"" };
631 IOController::IOStateList::iterator respond_it;
632 bool invert = {
false };
634 timeout_t tout = { 2000 };
636 long askCount = { 0 };
638 IOController::IOStateList::iterator askcount_it;
640 inline void initIterators(
const std::shared_ptr<SMInterface>& shm )
642 shm->initIterator( respond_it );
643 shm->initIterator( askcount_it );
646 const std::string getShortInfo()
const;
649 typedef std::unordered_map<std::string, ClientInfo> ClientsMap;
653 IOController::IOStateList::iterator sesscount_it;
655 std::atomic_bool tcpCancelled = {
true };
657 bool tcpBreakIfFailRun = {
false };
658 timeout_t tcpRepeatCreateSocketPause = { 30000 };