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;