From 059aaa7f3df8a5102317d7f30cd7ea62acf0bad8 Mon Sep 17 00:00:00 2001 From: algin Date: Fri, 26 May 2023 16:21:27 +0300 Subject: [PATCH] =?UTF-8?q?dev(UML-1462):=20=D0=94=D0=BE=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=D0=BB=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D1=83=20working=20counter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CoE/eth_ecat_pdo_fmmu.hpp | 4 +- .../free_rtos/ethernet_industry/eth_ecat.cpp | 36 +++++----- .../free_rtos/ethernet_industry/eth_ecat.hpp | 65 +++++++++---------- .../ethernet_industry/eth_ecat_buffer.hpp | 8 +-- .../ethernet_industry/eth_ecat_datagram.hpp | 10 ++- 5 files changed, 64 insertions(+), 59 deletions(-) diff --git a/components/free_rtos/ethernet_industry/CoE/eth_ecat_pdo_fmmu.hpp b/components/free_rtos/ethernet_industry/CoE/eth_ecat_pdo_fmmu.hpp index 03c0b42..460768e 100644 --- a/components/free_rtos/ethernet_industry/CoE/eth_ecat_pdo_fmmu.hpp +++ b/components/free_rtos/ethernet_industry/CoE/eth_ecat_pdo_fmmu.hpp @@ -91,7 +91,7 @@ private: do { telegram.transfer(first); - } while(first.get_wkc() < 0x0001); + } while(first.get_all_wkc() < slave_index); } @@ -111,7 +111,7 @@ private: do { telegram.transfer(first); - } while(first.get_wkc() < 0x0001); + } while(first.get_all_wkc() < slave_index); } void wait_op(); diff --git a/components/free_rtos/ethernet_industry/eth_ecat.cpp b/components/free_rtos/ethernet_industry/eth_ecat.cpp index c86e756..0ebc486 100644 --- a/components/free_rtos/ethernet_industry/eth_ecat.cpp +++ b/components/free_rtos/ethernet_industry/eth_ecat.cpp @@ -13,9 +13,7 @@ namespace free_rtos { EthEcat::EthEcat(Eth& eth) - : p_pkt_{&pkt_[e_pktFirst]} - , p_pkt_next_{&pkt_[e_pktSecond]} - , eth_{eth} + : eth_{eth} , tx_flow_{*eth.getTxFlowPtr()} , telegram_{eth} , eeprom_{telegram_} { } @@ -134,8 +132,8 @@ void EthEcat::set_addresses_of_slaves(uint16_t number_of_slaves, uint16_t addres for(uint16_t i = 0; i < number_of_slaves; i++) { address::Position position{static_cast(-i)}; - address::Station node{static_cast(address_base + i)}; - address::SlaveAddresses slave_addresses{position, 0x0000, node, 0x00000000}; + address::Station station{static_cast(address_base + i)}; + address::SlaveAddresses slave_addresses{position, 0x0000, station, 0x00000000}; slaves_.push_back(EcatSlave{std::move(slave_addresses)}); @@ -146,23 +144,28 @@ void EthEcat::set_addresses_of_slaves(uint16_t number_of_slaves, uint16_t addres datagrams[i - 1] + datagrams[i]; } - telegram_.transfer(datagrams[0]); + do { + telegram_.transfer(datagrams[0]); + } while(datagrams[0].get_all_wkc() < number_of_slaves); } void EthEcat::get_addresses_of_slaves() { - std::vector> datagrams; + std::vector> datagrams; + uint16_t number_of_slaves = slaves_.size(); - datagrams.reserve(slaves_.size()); + datagrams.reserve(number_of_slaves); for(EcatSlave& slave : slaves_) { datagrams.push_back({ {{slave.get_slave_address(), ECT_REG_STADR}}, slave.get_slave_address() }); } - for(uint16_t i = 1; i < slaves_.size(); i++) { + for(uint16_t i = 1; i < number_of_slaves; i++) { datagrams[i - 1] + datagrams[i]; } - telegram_.transfer(datagrams[0]); + do { + telegram_.transfer(datagrams[0]); + } while(datagrams[0].get_all_wkc() < number_of_slaves); for(EcatSlave& slave : slaves_) { DebugP_log("Slave %d address = %d\r\n", -slave.get_slave_address(), slave.get_slave_address()); @@ -213,6 +216,7 @@ bool EthEcat::preop_to_safeop() { } bool EthEcat::safeop_to_op() { + uint16_t number_of_slaves = slaves_.size(); bool success; address::Broadcast broadcast{0x0000}; @@ -226,9 +230,9 @@ bool EthEcat::safeop_to_op() { uint16_t data{EC_STATE_OPERATIONAL}; datagram::EcatDatagram datagram{ {{broadcast, ECT_REG_ALCTL}}, data }; - telegram_.transfer(datagram); - - DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc()); + do { + telegram_.transfer(datagram); + } while(datagram.get_wkc() < number_of_slaves); } process_sem_.post(); @@ -237,9 +241,9 @@ bool EthEcat::safeop_to_op() { { datagram::EcatDatagram datagram{ {{broadcast, ECT_REG_ALSTAT}}, stat, zero }; - telegram_.transfer(datagram); - - DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc()); + do { + telegram_.transfer(datagram); + } while(datagram.get_wkc() < number_of_slaves); } success = (stat.state == EC_STATE_OPERATIONAL) && (stat.fault == 0); diff --git a/components/free_rtos/ethernet_industry/eth_ecat.hpp b/components/free_rtos/ethernet_industry/eth_ecat.hpp index a48087f..9f503dc 100644 --- a/components/free_rtos/ethernet_industry/eth_ecat.hpp +++ b/components/free_rtos/ethernet_industry/eth_ecat.hpp @@ -37,9 +37,7 @@ public: } - EcatSlave() { - - } + EcatSlave() { } template void set_slave_address(typename TypeT::TSlaveAddress&& slave_address) { @@ -58,9 +56,9 @@ public: uint8_t data{0x01}; datagram::EcatDatagram datagram{ {{slave_address, ECT_REG_EEPCFG}}, data }; - telegram.transfer(datagram); - - DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc()); + do { + telegram.transfer(datagram); + } while(datagram.get_wkc() < 0x0001); } template @@ -73,9 +71,9 @@ public: uint16_t data{EC_STATE_PRE_OP|EC_STATE_ACK}; datagram::EcatDatagram datagram{ {{slave_address, ECT_REG_ALCTL}}, data }; - telegram.transfer(datagram); - - DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc()); + do { + telegram.transfer(datagram); + } while(datagram.get_wkc() < 0x0001); } ClockP_usleep(5000000ul); @@ -84,9 +82,9 @@ public: using TCommand = command::EcatCommand; datagram::EcatDatagram datagram{ {{slave_address, ECT_REG_ALSTAT}}, stat }; - telegram.transfer(datagram); - - DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc()); + do { + telegram.transfer(datagram); + } while(datagram.get_wkc() < 0x0001); } DebugP_log("stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault); @@ -97,9 +95,9 @@ public: uint16_t stat_code{0x0000}; datagram::EcatDatagram datagram{ {{slave_address, ECT_REG_ALSTATCODE}}, stat_code}; - telegram.transfer(datagram); - - DebugP_log("stat_code = 0x%02x\r\n", stat_code); + do { + telegram.transfer(datagram); + } while(datagram.get_wkc() < 0x0001); } return (stat.state == EC_STATE_PRE_OP) && (stat.fault == 0); @@ -116,9 +114,9 @@ public: uint16_t data{EC_STATE_SAFE_OP}; datagram::EcatDatagram datagram{ {{slave_address, ECT_REG_ALCTL}}, data }; - telegram.transfer(datagram); - - DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc()); + do { + telegram.transfer(datagram); + } while(datagram.get_wkc() < 0x0001); } ClockP_usleep(1000000ul); @@ -127,9 +125,9 @@ public: using TCommand = command::EcatCommand; datagram::EcatDatagram datagram{ {{slave_address, ECT_REG_ALSTAT}}, stat, zero }; - telegram.transfer(datagram); - - DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc()); + do { + telegram.transfer(datagram); + } while(datagram.get_wkc() < 0x0001); } DebugP_log("stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault); @@ -140,7 +138,9 @@ public: uint16_t stat_code{0x0000}; datagram::EcatDatagram datagram{ {{slave_address, ECT_REG_ALSTATCODE}}, stat_code}; - telegram.transfer(datagram); + do { + telegram.transfer(datagram); + } while(datagram.get_wkc() < 0x0001); DebugP_log("stat_code = 0x%02x\r\n", stat_code); } @@ -159,9 +159,9 @@ public: uint16_t data{EC_STATE_OPERATIONAL}; datagram::EcatDatagram datagram{ {{slave_address, ECT_REG_ALCTL}}, data }; - telegram.transfer(datagram); - - DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc()); + do { + telegram.transfer(datagram); + } while(datagram.get_wkc() < 0x0001); } //ClockP_usleep(3000000ul); @@ -170,9 +170,9 @@ public: using TCommand = command::EcatCommand; datagram::EcatDatagram datagram{ {{slave_address, ECT_REG_ALSTAT}}, stat, zero }; - telegram.transfer(datagram); - - DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc()); + do { + telegram.transfer(datagram); + } while(datagram.get_wkc() < 0x0001); } DebugP_log("stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault); @@ -183,7 +183,9 @@ public: uint16_t stat_code{0x0000}; datagram::EcatDatagram datagram{ {{slave_address, ECT_REG_ALSTATCODE}}, stat_code}; - telegram.transfer(datagram); + do { + telegram.transfer(datagram); + } while(datagram.get_wkc() < 0x0001); DebugP_log("stat_code = 0x%02x\r\n", stat_code); } @@ -262,11 +264,6 @@ private: e_pktTotal }; - TEthPkt * p_pkt_; - TEthPkt * p_pkt_next_; - - TEthPkt pkt_[e_pktTotal]; - //Mutex mut_; free_rtos::Semaphore rx_sem_; diff --git a/components/free_rtos/ethernet_industry/eth_ecat_buffer.hpp b/components/free_rtos/ethernet_industry/eth_ecat_buffer.hpp index 7b5969a..a6896a3 100644 --- a/components/free_rtos/ethernet_industry/eth_ecat_buffer.hpp +++ b/components/free_rtos/ethernet_industry/eth_ecat_buffer.hpp @@ -173,10 +173,6 @@ public: template void init_sync_manager(datagram::EcatTelegram& telegram, sync_manager sm_write, sync_manager sm_read) { - using TCommand = command::EcatCommand; - - auto slave_address = slave_.get_slave_address(); - SyncManager sync_manager_write = sync_managers_[static_cast(sm_write)]; auto datagram_write = make_sync_manager_datagram(sync_manager_write, buffer_properties_write_); @@ -187,7 +183,7 @@ public: do { telegram.transfer(datagram_write); - } while((datagram_write.get_wkc() < 0x0001) || (datagram_read.get_wkc() < 0x0001)); + } while(datagram_write.get_all_wkc() < 0x0002); /* do { telegram.transfer(datagram_write); @@ -259,7 +255,7 @@ public: do { telegram.transfer(datagram_write); - } while((datagram_write.get_wkc() < 0x0001) || (datagram_read.get_wkc() < 0x0001)); + } while(datagram_write.get_all_wkc() < 0x0002); /* do { telegram.transfer(datagram_write); diff --git a/components/free_rtos/ethernet_industry/eth_ecat_datagram.hpp b/components/free_rtos/ethernet_industry/eth_ecat_datagram.hpp index b3d8bac..f2ec860 100644 --- a/components/free_rtos/ethernet_industry/eth_ecat_datagram.hpp +++ b/components/free_rtos/ethernet_industry/eth_ecat_datagram.hpp @@ -56,10 +56,18 @@ public: return header_; } - TEcatWkc& get_wkc() { + TEcatWkc get_wkc() { return wkc_; } + TEcatWkc get_all_wkc() { + if(next_ != nullptr) { + return wkc_ + next_->get_all_wkc(); + } else { + return wkc_; + } + } + // установка размера пробела после поля данных до wkc void set_padding(uint16_t padding) { padding_ = padding;