dev(UML-1462): Доработал передачу датаграмм в одном фрейме и мелкие исправления

This commit is contained in:
algin 2023-05-26 15:09:51 +03:00
parent 3c9a8e40a3
commit 1cb82d9744
4 changed files with 75 additions and 92 deletions

View File

@ -19,28 +19,20 @@ public:
EcatPdoFMMUSlave(ecat_buffer::EcatBufferSlave& buffer_slave) EcatPdoFMMUSlave(ecat_buffer::EcatBufferSlave& buffer_slave)
: buffer_slave_(buffer_slave) { } : buffer_slave_(buffer_slave) { }
template<typename... DataTypes> template<typename DataType>
void write(datagram::EcatTelegram& telegram, DataTypes&... data) { datagram::EcatDatagram<command::LWR, DataType> make_datagram_write(DataType& data) {
ecat_buffer::FMMUProperties& fmmu_properties = buffer_slave_.get_fmmu_properties_write(); ecat_buffer::FMMUProperties& fmmu_properties = buffer_slave_.get_fmmu_properties_write();
address::Logical logical = fmmu_properties.address; address::Logical logical = fmmu_properties.address;
datagram::EcatDatagram<command::LWR, DataTypes...> datagram{ {{logical}}, data... }; return datagram::EcatDatagram<command::LWR, DataType>{ {{logical}}, data };
do {
telegram.transfer(datagram);
} while(datagram.get_wkc() < 0x0001);
} }
template<typename... DataTypes> template<typename DataType>
void read(datagram::EcatTelegram& telegram, DataTypes&... data) { datagram::EcatDatagram<command::LRD, DataType> make_datagram_read(DataType& data) {
ecat_buffer::FMMUProperties& fmmu_properties = buffer_slave_.get_fmmu_properties_read(); ecat_buffer::FMMUProperties& fmmu_properties = buffer_slave_.get_fmmu_properties_read();
address::Logical logical = fmmu_properties.address; address::Logical logical = fmmu_properties.address;
datagram::EcatDatagram<command::LRD, DataTypes...> datagram{ {{logical}}, data... }; return datagram::EcatDatagram<command::LRD, DataType>{ {{logical}}, data };
do {
telegram.transfer(datagram);
} while(datagram.get_wkc() < 0x0001);
} }
private: private:
@ -48,63 +40,34 @@ private:
}; };
class EthEcatPdoFMMU { class EthEcatPdoFMMU {
private:
template<typename... DataTypes>
void write_recursion(datagram::EcatTelegram& telegram, size_t slave_index, DataTypes&... data);
template<typename DataType, typename... DataTypes>
void write_recursion(datagram::EcatTelegram& telegram, size_t slave_index, DataType& head, DataTypes&... tail) {
pdo_fmmu_slaves_[slave_index].write(telegram, head);
slave_index++;
write_recursion(telegram, slave_index, tail...);
}
template<>
void write_recursion(datagram::EcatTelegram& telegram, size_t slave_index) { }
template<typename... DataTypes>
void read_recursion(datagram::EcatTelegram& telegram, size_t slave_index, DataTypes&... data);
template<typename DataType, typename... DataTypes>
void read_recursion(datagram::EcatTelegram& telegram, size_t slave_index, DataType& head, DataTypes&... tail) {
pdo_fmmu_slaves_[slave_index].read(telegram, head);
slave_index++;
read_recursion(telegram, slave_index, tail...);
}
template<>
void read_recursion(datagram::EcatTelegram& telegram, size_t slave_index) { }
public: public:
EthEcatPdoFMMU(ecat_buffer::EthEcatBuffer& ecat_mailbox): ecat_buffer_{ecat_mailbox} { } EthEcatPdoFMMU(ecat_buffer::EthEcatBuffer& ecat_mailbox): ecat_buffer_{ecat_mailbox} { }
void init(); void init();
void process(); void process();
template<typename... DataTypes> template<typename DataType, typename... DataTypes>
void write(DataTypes&... data) { void write(DataType& head, DataTypes&... tail) {
datagram::EcatTelegram& telegram = ecat_buffer_.get_ecat().get_telegram(); if(sizeof...(tail) + 1 > pdo_fmmu_slaves_.size()) {
if(sizeof...(data) > pdo_fmmu_slaves_.size()) {
return; return;
} }
write_recursion(telegram, 0, data...); size_t slave_index = 0;
auto datagram = pdo_fmmu_slaves_[slave_index].make_datagram_write(head);
// Сборка и отправка телеграммы с "головы"
write_recursion(slave_index + 1, datagram, datagram, tail...);
} }
template<typename... DataTypes> template<typename DataType, typename... DataTypes>
void read(DataTypes&... data) { void read(DataType& head, DataTypes&... tail) {
datagram::EcatTelegram& telegram = ecat_buffer_.get_ecat().get_telegram(); if(sizeof...(tail) + 1 > pdo_fmmu_slaves_.size()) {
if(sizeof...(data) > pdo_fmmu_slaves_.size()) {
return; return;
} }
read_recursion(telegram, 0, data...); size_t slave_index = 0;
auto datagram = pdo_fmmu_slaves_[slave_index].make_datagram_read(head);
// Сборка и отправка телеграммы с "головы"
read_recursion(slave_index + 1, datagram, datagram, tail...);
} }
private: private:
@ -112,6 +75,45 @@ private:
std::vector<EcatPdoFMMUSlave> pdo_fmmu_slaves_; std::vector<EcatPdoFMMUSlave> pdo_fmmu_slaves_;
template<typename DatagramTypeFirst, typename DatagramTypePrevious, typename... DataTypes>
void write_recursion(size_t slave_index, DatagramTypeFirst& first, DatagramTypePrevious& previous, DataTypes&... data);
template<typename DatagramTypeFirst, typename DatagramTypePrevious, typename DataType, typename... DataTypes>
void write_recursion(size_t slave_index, DatagramTypeFirst& first, DatagramTypePrevious& previous, DataType& head, DataTypes&... tail) {
auto datagram = pdo_fmmu_slaves_[slave_index].make_datagram_write(head);
write_recursion(slave_index + 1, first, previous + datagram, tail...);
}
template<typename DatagramTypeFirst, typename DatagramTypePrevious>
void write_recursion(size_t slave_index, DatagramTypeFirst& first, DatagramTypePrevious& previous) {
datagram::EcatTelegram& telegram = ecat_buffer_.get_ecat().get_telegram();
do {
telegram.transfer(first);
} while(first.get_wkc() < 0x0001);
}
template<typename DatagramTypeFirst, typename DatagramTypePrevious, typename... DataTypes>
void read_recursion(size_t slave_index, DatagramTypeFirst& first, DatagramTypePrevious& previous, DataTypes&... data);
template<typename DatagramTypeFirst, typename DatagramTypePrevious, typename DataType, typename... DataTypes>
void read_recursion(size_t slave_index, DatagramTypeFirst& first, DatagramTypePrevious& previous, DataType& head, DataTypes&... tail) {
auto datagram = pdo_fmmu_slaves_[slave_index].make_datagram_read(head);
read_recursion(slave_index + 1, first, previous + datagram, tail...);
}
template<typename DatagramTypeFirst, typename DatagramTypePrevious>
void read_recursion(size_t slave_index, DatagramTypeFirst& first, DatagramTypePrevious& previous) {
datagram::EcatTelegram& telegram = ecat_buffer_.get_ecat().get_telegram();
do {
telegram.transfer(first);
} while(first.get_wkc() < 0x0001);
}
void wait_op(); void wait_op();
}; };

View File

@ -162,21 +162,13 @@ public:
} }
template<typename TypeT> template<typename TypeT>
void init_sync_manager(datagram::EcatTelegram& telegram, sync_manager sm, BufferProperties& buffer, address::Offset& reg) { datagram::EcatDatagram<command::EcatCommand<TypeT, command::WR>, BufferProperties, uint32_t>
using TCommand = command::EcatCommand<TypeT, command::WR>; make_sync_manager_datagram(SyncManager& sync_manager, BufferProperties& buffer) {
auto slave_address = slave_.get_slave_address<TypeT>(); auto slave_address = slave_.get_slave_address<TypeT>();
SyncManager sync_manager = sync_managers_[static_cast<size_t>(sm)]; return datagram::EcatDatagram<command::EcatCommand<TypeT, command::WR>, BufferProperties, uint32_t>{ {{slave_address, sync_manager.offset}},
datagram::EcatDatagram<TCommand, BufferProperties, uint32_t> datagram{ {{slave_address, sync_manager.offset}}, buffer,
buffer, sync_manager.default_setting };
sync_manager.default_setting };
telegram.transfer(datagram);
reg = sync_manager.offset + 0x05;
DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc());
} }
template<typename TypeT> template<typename TypeT>
@ -186,16 +178,10 @@ public:
auto slave_address = slave_.get_slave_address<TypeT>(); 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)];
datagram::EcatDatagram<TCommand, BufferProperties, uint32_t> datagram_write{ {{slave_address, sync_manager_write.offset}}, auto datagram_write = make_sync_manager_datagram<TypeT>(sync_manager_write, buffer_properties_write_);
buffer_properties_write_,
sync_manager_write.default_setting };
//register_sync_manager<TypeT>(telegram, sm_write, buffer_properties_write_, buffer_regs_[MailboxesRegs::EMPTY]);
SyncManager sync_manager_read = sync_managers_[static_cast<size_t>(sm_read)]; SyncManager sync_manager_read = sync_managers_[static_cast<size_t>(sm_read)];
datagram::EcatDatagram<TCommand, BufferProperties, uint32_t> datagram_read{ {{slave_address, sync_manager_read.offset}}, auto datagram_read = make_sync_manager_datagram<TypeT>(sync_manager_read, buffer_properties_read_);
buffer_properties_read_,
sync_manager_read.default_setting };
//register_sync_manager<TypeT>(telegram, sm_read, buffer_properties_read_, buffer_regs_[MailboxesRegs::AVAILABLE]);
datagram_write + datagram_read; datagram_write + datagram_read;
@ -219,23 +205,17 @@ public:
} }
template<typename TypeT> template<typename TypeT>
void init_fmmu( datagram::EcatTelegram& telegram, fmmu fmmu_x, FMMUSettings& settings) { datagram::EcatDatagram<command::EcatCommand<TypeT, command::WR>, FMMUSettings>
using TCommand = command::EcatCommand<TypeT, command::WR>; make_fmmu_datagram(fmmu fmmu_x, FMMUSettings& settings) {
auto slave_address = slave_.get_slave_address<TypeT>(); auto slave_address = slave_.get_slave_address<TypeT>();
datagram::EcatDatagram<TCommand, FMMUSettings> datagram{ {{slave_address, fmmu_regs_[static_cast<size_t>(fmmu_x)]}}, settings};
telegram.transfer(datagram); return datagram::EcatDatagram<command::EcatCommand<TypeT, command::WR>, FMMUSettings>{ {{slave_address, fmmu_regs_[static_cast<size_t>(fmmu_x)]}}, settings};
} }
template<typename TypeT> template<typename TypeT>
void init_fmmu(datagram::EcatTelegram& telegram, fmmu fmmu_write, fmmu fmmu_read) { void init_fmmu(datagram::EcatTelegram& telegram, fmmu fmmu_write, fmmu fmmu_read) {
using TCommand = command::EcatCommand<TypeT, command::WR>;
static address::Logical logical_end_address{logical_start_address_}; static address::Logical logical_end_address{logical_start_address_};
auto slave_address = slave_.get_slave_address<TypeT>();
fmmu_write_ = fmmu_write; fmmu_write_ = fmmu_write;
fmmu_read_ = fmmu_read; fmmu_read_ = fmmu_read;
@ -250,8 +230,7 @@ public:
.activate = 0x01 .activate = 0x01
}; };
datagram::EcatDatagram<TCommand, FMMUSettings> datagram_write{ {{slave_address, fmmu_regs_[static_cast<size_t>(fmmu_write)]}}, settings_write}; auto datagram_write = make_fmmu_datagram<TypeT>(fmmu_write, settings_write);
//init_fmmu<TypeT>(telegram, fmmu_write, settings_write);
fmmu_properties_write_.address = logical_end_address; fmmu_properties_write_.address = logical_end_address;
fmmu_properties_write_.length = buffer_properties_write_.length; fmmu_properties_write_.length = buffer_properties_write_.length;
@ -269,8 +248,7 @@ public:
.activate = 0x01 .activate = 0x01
}; };
datagram::EcatDatagram<TCommand, FMMUSettings> datagram_read{ {{slave_address, fmmu_regs_[static_cast<size_t>(fmmu_read)]}}, settings_read}; auto datagram_read = make_fmmu_datagram<TypeT>(fmmu_read, settings_read);
//init_fmmu<TypeT>(telegram, fmmu_read, settings_read);
fmmu_properties_read_.address = logical_end_address; fmmu_properties_read_.address = logical_end_address;
fmmu_properties_read_.length = buffer_properties_read_.length; fmmu_properties_read_.length = buffer_properties_read_.length;

View File

@ -138,7 +138,6 @@ public:
} }
private: private:
typename TypeT::TAddress address_; typename TypeT::TAddress address_;
}; };

View File

@ -31,6 +31,8 @@ public:
IEcatDatagram() { } IEcatDatagram() { }
virtual ~IEcatDatagram() { };
IEcatDatagram& operator+(IEcatDatagram &next) { IEcatDatagram& operator+(IEcatDatagram &next) {
more_ = ec_moredatagrams::EC_MOREDATAGRAMS_MORE; more_ = ec_moredatagrams::EC_MOREDATAGRAMS_MORE;
next_ = &next; next_ = &next;
@ -85,6 +87,8 @@ public:
EcatDatagram() { } EcatDatagram() { }
~EcatDatagram() { }
virtual uint8_t* pack(uint8_t *raw) override { virtual uint8_t* pack(uint8_t *raw) override {
return pack_header(raw); return pack_header(raw);
} }