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)
: buffer_slave_(buffer_slave) { }
template<typename... DataTypes>
void write(datagram::EcatTelegram& telegram, DataTypes&... data) {
template<typename DataType>
datagram::EcatDatagram<command::LWR, DataType> make_datagram_write(DataType& data) {
ecat_buffer::FMMUProperties& fmmu_properties = buffer_slave_.get_fmmu_properties_write();
address::Logical logical = fmmu_properties.address;
datagram::EcatDatagram<command::LWR, DataTypes...> datagram{ {{logical}}, data... };
do {
telegram.transfer(datagram);
} while(datagram.get_wkc() < 0x0001);
return datagram::EcatDatagram<command::LWR, DataType>{ {{logical}}, data };
}
template<typename... DataTypes>
void read(datagram::EcatTelegram& telegram, DataTypes&... data) {
template<typename DataType>
datagram::EcatDatagram<command::LRD, DataType> make_datagram_read(DataType& data) {
ecat_buffer::FMMUProperties& fmmu_properties = buffer_slave_.get_fmmu_properties_read();
address::Logical logical = fmmu_properties.address;
datagram::EcatDatagram<command::LRD, DataTypes...> datagram{ {{logical}}, data... };
do {
telegram.transfer(datagram);
} while(datagram.get_wkc() < 0x0001);
return datagram::EcatDatagram<command::LRD, DataType>{ {{logical}}, data };
}
private:
@ -48,63 +40,34 @@ private:
};
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:
EthEcatPdoFMMU(ecat_buffer::EthEcatBuffer& ecat_mailbox): ecat_buffer_{ecat_mailbox} { }
void init();
void process();
template<typename... DataTypes>
void write(DataTypes&... data) {
datagram::EcatTelegram& telegram = ecat_buffer_.get_ecat().get_telegram();
if(sizeof...(data) > pdo_fmmu_slaves_.size()) {
template<typename DataType, typename... DataTypes>
void write(DataType& head, DataTypes&... tail) {
if(sizeof...(tail) + 1 > pdo_fmmu_slaves_.size()) {
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>
void read(DataTypes&... data) {
datagram::EcatTelegram& telegram = ecat_buffer_.get_ecat().get_telegram();
if(sizeof...(data) > pdo_fmmu_slaves_.size()) {
template<typename DataType, typename... DataTypes>
void read(DataType& head, DataTypes&... tail) {
if(sizeof...(tail) + 1 > pdo_fmmu_slaves_.size()) {
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:
@ -112,6 +75,45 @@ private:
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();
};

View File

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

View File

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

View File

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