dev(UML-1462): Доработал проверку working counter
This commit is contained in:
parent
1cb82d9744
commit
059aaa7f3d
@ -91,7 +91,7 @@ private:
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
telegram.transfer(first);
|
telegram.transfer(first);
|
||||||
} while(first.get_wkc() < 0x0001);
|
} while(first.get_all_wkc() < slave_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -111,7 +111,7 @@ private:
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
telegram.transfer(first);
|
telegram.transfer(first);
|
||||||
} while(first.get_wkc() < 0x0001);
|
} while(first.get_all_wkc() < slave_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wait_op();
|
void wait_op();
|
||||||
|
|||||||
@ -13,9 +13,7 @@
|
|||||||
namespace free_rtos {
|
namespace free_rtos {
|
||||||
|
|
||||||
EthEcat::EthEcat(Eth& eth)
|
EthEcat::EthEcat(Eth& eth)
|
||||||
: p_pkt_{&pkt_[e_pktFirst]}
|
: eth_{eth}
|
||||||
, p_pkt_next_{&pkt_[e_pktSecond]}
|
|
||||||
, eth_{eth}
|
|
||||||
, tx_flow_{*eth.getTxFlowPtr()}
|
, tx_flow_{*eth.getTxFlowPtr()}
|
||||||
, telegram_{eth}
|
, telegram_{eth}
|
||||||
, eeprom_{telegram_} { }
|
, 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++) {
|
for(uint16_t i = 0; i < number_of_slaves; i++) {
|
||||||
address::Position position{static_cast<int16_t>(-i)};
|
address::Position position{static_cast<int16_t>(-i)};
|
||||||
address::Station node{static_cast<uint16_t>(address_base + i)};
|
address::Station station{static_cast<uint16_t>(address_base + i)};
|
||||||
address::SlaveAddresses slave_addresses{position, 0x0000, node, 0x00000000};
|
address::SlaveAddresses slave_addresses{position, 0x0000, station, 0x00000000};
|
||||||
|
|
||||||
slaves_.push_back(EcatSlave{std::move(slave_addresses)});
|
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];
|
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() {
|
void EthEcat::get_addresses_of_slaves() {
|
||||||
std::vector<datagram::EcatDatagram<command::APWR, address::Station>> datagrams;
|
std::vector<datagram::EcatDatagram<command::APRD, address::Station>> datagrams;
|
||||||
|
uint16_t number_of_slaves = slaves_.size();
|
||||||
|
|
||||||
datagrams.reserve(slaves_.size());
|
datagrams.reserve(number_of_slaves);
|
||||||
|
|
||||||
for(EcatSlave& slave : slaves_) {
|
for(EcatSlave& slave : slaves_) {
|
||||||
datagrams.push_back({ {{slave.get_slave_address<command::AP>(), ECT_REG_STADR}}, slave.get_slave_address<command::FP>() });
|
datagrams.push_back({ {{slave.get_slave_address<command::AP>(), ECT_REG_STADR}}, slave.get_slave_address<command::FP>() });
|
||||||
}
|
}
|
||||||
|
|
||||||
for(uint16_t i = 1; i < slaves_.size(); i++) {
|
for(uint16_t i = 1; i < number_of_slaves; i++) {
|
||||||
datagrams[i - 1] + datagrams[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_) {
|
for(EcatSlave& slave : slaves_) {
|
||||||
DebugP_log("Slave %d address = %d\r\n", -slave.get_slave_address<command::AP>(), slave.get_slave_address<command::FP>());
|
DebugP_log("Slave %d address = %d\r\n", -slave.get_slave_address<command::AP>(), slave.get_slave_address<command::FP>());
|
||||||
@ -213,6 +216,7 @@ bool EthEcat::preop_to_safeop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool EthEcat::safeop_to_op() {
|
bool EthEcat::safeop_to_op() {
|
||||||
|
uint16_t number_of_slaves = slaves_.size();
|
||||||
bool success;
|
bool success;
|
||||||
|
|
||||||
address::Broadcast broadcast{0x0000};
|
address::Broadcast broadcast{0x0000};
|
||||||
@ -226,9 +230,9 @@ bool EthEcat::safeop_to_op() {
|
|||||||
uint16_t data{EC_STATE_OPERATIONAL};
|
uint16_t data{EC_STATE_OPERATIONAL};
|
||||||
datagram::EcatDatagram<command::BWR, uint16_t> datagram{ {{broadcast, ECT_REG_ALCTL}}, data };
|
datagram::EcatDatagram<command::BWR, uint16_t> datagram{ {{broadcast, ECT_REG_ALCTL}}, data };
|
||||||
|
|
||||||
telegram_.transfer(datagram);
|
do {
|
||||||
|
telegram_.transfer(datagram);
|
||||||
DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc());
|
} while(datagram.get_wkc() < number_of_slaves);
|
||||||
}
|
}
|
||||||
|
|
||||||
process_sem_.post();
|
process_sem_.post();
|
||||||
@ -237,9 +241,9 @@ bool EthEcat::safeop_to_op() {
|
|||||||
{
|
{
|
||||||
datagram::EcatDatagram<command::BRD, ALSTAT, uint16_t> datagram{ {{broadcast, ECT_REG_ALSTAT}}, stat, zero };
|
datagram::EcatDatagram<command::BRD, ALSTAT, uint16_t> datagram{ {{broadcast, ECT_REG_ALSTAT}}, stat, zero };
|
||||||
|
|
||||||
telegram_.transfer(datagram);
|
do {
|
||||||
|
telegram_.transfer(datagram);
|
||||||
DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc());
|
} while(datagram.get_wkc() < number_of_slaves);
|
||||||
}
|
}
|
||||||
|
|
||||||
success = (stat.state == EC_STATE_OPERATIONAL) && (stat.fault == 0);
|
success = (stat.state == EC_STATE_OPERATIONAL) && (stat.fault == 0);
|
||||||
|
|||||||
@ -37,9 +37,7 @@ public:
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EcatSlave() {
|
EcatSlave() { }
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename TypeT>
|
template<typename TypeT>
|
||||||
void set_slave_address(typename TypeT::TSlaveAddress&& slave_address) {
|
void set_slave_address(typename TypeT::TSlaveAddress&& slave_address) {
|
||||||
@ -58,9 +56,9 @@ public:
|
|||||||
uint8_t data{0x01};
|
uint8_t data{0x01};
|
||||||
datagram::EcatDatagram<TCommand, uint8_t> datagram{ {{slave_address, ECT_REG_EEPCFG}}, data };
|
datagram::EcatDatagram<TCommand, uint8_t> datagram{ {{slave_address, ECT_REG_EEPCFG}}, data };
|
||||||
|
|
||||||
telegram.transfer(datagram);
|
do {
|
||||||
|
telegram.transfer(datagram);
|
||||||
DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc());
|
} while(datagram.get_wkc() < 0x0001);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename TypeT>
|
template<typename TypeT>
|
||||||
@ -73,9 +71,9 @@ public:
|
|||||||
uint16_t data{EC_STATE_PRE_OP|EC_STATE_ACK};
|
uint16_t data{EC_STATE_PRE_OP|EC_STATE_ACK};
|
||||||
datagram::EcatDatagram<TCommand, uint16_t> datagram{ {{slave_address, ECT_REG_ALCTL}}, data };
|
datagram::EcatDatagram<TCommand, uint16_t> datagram{ {{slave_address, ECT_REG_ALCTL}}, data };
|
||||||
|
|
||||||
telegram.transfer(datagram);
|
do {
|
||||||
|
telegram.transfer(datagram);
|
||||||
DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc());
|
} while(datagram.get_wkc() < 0x0001);
|
||||||
}
|
}
|
||||||
|
|
||||||
ClockP_usleep(5000000ul);
|
ClockP_usleep(5000000ul);
|
||||||
@ -84,9 +82,9 @@ public:
|
|||||||
using TCommand = command::EcatCommand<TypeT, command::RD>;
|
using TCommand = command::EcatCommand<TypeT, command::RD>;
|
||||||
datagram::EcatDatagram<TCommand, ALSTAT> datagram{ {{slave_address, ECT_REG_ALSTAT}}, stat };
|
datagram::EcatDatagram<TCommand, ALSTAT> datagram{ {{slave_address, ECT_REG_ALSTAT}}, stat };
|
||||||
|
|
||||||
telegram.transfer(datagram);
|
do {
|
||||||
|
telegram.transfer(datagram);
|
||||||
DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc());
|
} while(datagram.get_wkc() < 0x0001);
|
||||||
}
|
}
|
||||||
|
|
||||||
DebugP_log("stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
|
DebugP_log("stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
|
||||||
@ -97,9 +95,9 @@ public:
|
|||||||
uint16_t stat_code{0x0000};
|
uint16_t stat_code{0x0000};
|
||||||
datagram::EcatDatagram<TCommand, uint16_t> datagram{ {{slave_address, ECT_REG_ALSTATCODE}}, stat_code};
|
datagram::EcatDatagram<TCommand, uint16_t> datagram{ {{slave_address, ECT_REG_ALSTATCODE}}, stat_code};
|
||||||
|
|
||||||
telegram.transfer(datagram);
|
do {
|
||||||
|
telegram.transfer(datagram);
|
||||||
DebugP_log("stat_code = 0x%02x\r\n", stat_code);
|
} while(datagram.get_wkc() < 0x0001);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (stat.state == EC_STATE_PRE_OP) && (stat.fault == 0);
|
return (stat.state == EC_STATE_PRE_OP) && (stat.fault == 0);
|
||||||
@ -116,9 +114,9 @@ public:
|
|||||||
uint16_t data{EC_STATE_SAFE_OP};
|
uint16_t data{EC_STATE_SAFE_OP};
|
||||||
datagram::EcatDatagram<TCommand, uint16_t> datagram{ {{slave_address, ECT_REG_ALCTL}}, data };
|
datagram::EcatDatagram<TCommand, uint16_t> datagram{ {{slave_address, ECT_REG_ALCTL}}, data };
|
||||||
|
|
||||||
telegram.transfer(datagram);
|
do {
|
||||||
|
telegram.transfer(datagram);
|
||||||
DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc());
|
} while(datagram.get_wkc() < 0x0001);
|
||||||
}
|
}
|
||||||
|
|
||||||
ClockP_usleep(1000000ul);
|
ClockP_usleep(1000000ul);
|
||||||
@ -127,9 +125,9 @@ public:
|
|||||||
using TCommand = command::EcatCommand<TypeT, command::RD>;
|
using TCommand = command::EcatCommand<TypeT, command::RD>;
|
||||||
datagram::EcatDatagram<TCommand, ALSTAT, uint32_t> datagram{ {{slave_address, ECT_REG_ALSTAT}}, stat, zero };
|
datagram::EcatDatagram<TCommand, ALSTAT, uint32_t> datagram{ {{slave_address, ECT_REG_ALSTAT}}, stat, zero };
|
||||||
|
|
||||||
telegram.transfer(datagram);
|
do {
|
||||||
|
telegram.transfer(datagram);
|
||||||
DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc());
|
} while(datagram.get_wkc() < 0x0001);
|
||||||
}
|
}
|
||||||
|
|
||||||
DebugP_log("stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
|
DebugP_log("stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
|
||||||
@ -140,7 +138,9 @@ public:
|
|||||||
uint16_t stat_code{0x0000};
|
uint16_t stat_code{0x0000};
|
||||||
datagram::EcatDatagram<TCommand, uint16_t> datagram{ {{slave_address, ECT_REG_ALSTATCODE}}, stat_code};
|
datagram::EcatDatagram<TCommand, uint16_t> 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);
|
DebugP_log("stat_code = 0x%02x\r\n", stat_code);
|
||||||
}
|
}
|
||||||
@ -159,9 +159,9 @@ public:
|
|||||||
uint16_t data{EC_STATE_OPERATIONAL};
|
uint16_t data{EC_STATE_OPERATIONAL};
|
||||||
datagram::EcatDatagram<TCommand, uint16_t> datagram{ {{slave_address, ECT_REG_ALCTL}}, data };
|
datagram::EcatDatagram<TCommand, uint16_t> datagram{ {{slave_address, ECT_REG_ALCTL}}, data };
|
||||||
|
|
||||||
telegram.transfer(datagram);
|
do {
|
||||||
|
telegram.transfer(datagram);
|
||||||
DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc());
|
} while(datagram.get_wkc() < 0x0001);
|
||||||
}
|
}
|
||||||
|
|
||||||
//ClockP_usleep(3000000ul);
|
//ClockP_usleep(3000000ul);
|
||||||
@ -170,9 +170,9 @@ public:
|
|||||||
using TCommand = command::EcatCommand<TypeT, command::RD>;
|
using TCommand = command::EcatCommand<TypeT, command::RD>;
|
||||||
datagram::EcatDatagram<TCommand, ALSTAT, uint16_t> datagram{ {{slave_address, ECT_REG_ALSTAT}}, stat, zero };
|
datagram::EcatDatagram<TCommand, ALSTAT, uint16_t> datagram{ {{slave_address, ECT_REG_ALSTAT}}, stat, zero };
|
||||||
|
|
||||||
telegram.transfer(datagram);
|
do {
|
||||||
|
telegram.transfer(datagram);
|
||||||
DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc());
|
} while(datagram.get_wkc() < 0x0001);
|
||||||
}
|
}
|
||||||
|
|
||||||
DebugP_log("stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
|
DebugP_log("stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
|
||||||
@ -183,7 +183,9 @@ public:
|
|||||||
uint16_t stat_code{0x0000};
|
uint16_t stat_code{0x0000};
|
||||||
datagram::EcatDatagram<TCommand, uint16_t> datagram{ {{slave_address, ECT_REG_ALSTATCODE}}, stat_code};
|
datagram::EcatDatagram<TCommand, uint16_t> 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);
|
DebugP_log("stat_code = 0x%02x\r\n", stat_code);
|
||||||
}
|
}
|
||||||
@ -262,11 +264,6 @@ private:
|
|||||||
e_pktTotal
|
e_pktTotal
|
||||||
};
|
};
|
||||||
|
|
||||||
TEthPkt * p_pkt_;
|
|
||||||
TEthPkt * p_pkt_next_;
|
|
||||||
|
|
||||||
TEthPkt pkt_[e_pktTotal];
|
|
||||||
|
|
||||||
//Mutex mut_;
|
//Mutex mut_;
|
||||||
|
|
||||||
free_rtos::Semaphore rx_sem_;
|
free_rtos::Semaphore rx_sem_;
|
||||||
|
|||||||
@ -173,10 +173,6 @@ public:
|
|||||||
|
|
||||||
template<typename TypeT>
|
template<typename TypeT>
|
||||||
void init_sync_manager(datagram::EcatTelegram& telegram, sync_manager sm_write, sync_manager sm_read) {
|
void init_sync_manager(datagram::EcatTelegram& telegram, sync_manager sm_write, sync_manager sm_read) {
|
||||||
using TCommand = command::EcatCommand<TypeT, command::WR>;
|
|
||||||
|
|
||||||
auto slave_address = slave_.get_slave_address<TypeT>();
|
|
||||||
|
|
||||||
SyncManager sync_manager_write = sync_managers_[static_cast<size_t>(sm_write)];
|
SyncManager sync_manager_write = sync_managers_[static_cast<size_t>(sm_write)];
|
||||||
auto datagram_write = make_sync_manager_datagram<TypeT>(sync_manager_write, buffer_properties_write_);
|
auto datagram_write = make_sync_manager_datagram<TypeT>(sync_manager_write, buffer_properties_write_);
|
||||||
|
|
||||||
@ -187,7 +183,7 @@ public:
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
telegram.transfer(datagram_write);
|
telegram.transfer(datagram_write);
|
||||||
} while((datagram_write.get_wkc() < 0x0001) || (datagram_read.get_wkc() < 0x0001));
|
} while(datagram_write.get_all_wkc() < 0x0002);
|
||||||
/*
|
/*
|
||||||
do {
|
do {
|
||||||
telegram.transfer(datagram_write);
|
telegram.transfer(datagram_write);
|
||||||
@ -259,7 +255,7 @@ public:
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
telegram.transfer(datagram_write);
|
telegram.transfer(datagram_write);
|
||||||
} while((datagram_write.get_wkc() < 0x0001) || (datagram_read.get_wkc() < 0x0001));
|
} while(datagram_write.get_all_wkc() < 0x0002);
|
||||||
/*
|
/*
|
||||||
do {
|
do {
|
||||||
telegram.transfer(datagram_write);
|
telegram.transfer(datagram_write);
|
||||||
|
|||||||
@ -56,10 +56,18 @@ public:
|
|||||||
return header_;
|
return header_;
|
||||||
}
|
}
|
||||||
|
|
||||||
TEcatWkc& get_wkc() {
|
TEcatWkc get_wkc() {
|
||||||
return wkc_;
|
return wkc_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEcatWkc get_all_wkc() {
|
||||||
|
if(next_ != nullptr) {
|
||||||
|
return wkc_ + next_->get_all_wkc();
|
||||||
|
} else {
|
||||||
|
return wkc_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// установка размера пробела после поля данных до wkc
|
// установка размера пробела после поля данных до wkc
|
||||||
void set_padding(uint16_t padding) {
|
void set_padding(uint16_t padding) {
|
||||||
padding_ = padding;
|
padding_ = padding;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user