dev(UML-1547): Исправил переход в состояние OP и PDO process

This commit is contained in:
algin 2023-05-23 18:41:31 +03:00
parent dea7d4e8d8
commit d356b80aac
9 changed files with 117 additions and 40 deletions

View File

@ -21,6 +21,59 @@ void EthEcatPdoFMMU::init() {
}
}
void EthEcatPdoFMMU::process() {
free_rtos::Semaphore& init_sem = ecat_buffer_.get_ecat().get_init_sem();
free_rtos::Semaphore& process_sem = ecat_buffer_.get_ecat().get_process_sem();
std::array<std::array<uint8_t, 55>, 2> process_data;
process_sem.pend();
process_data[0].fill(0x00);
process_data[1].fill(0x00);
read(0, process_data[0], process_data[1]);
for(uint8_t& byte : process_data[0]) {
DebugP_log("0x%01x", byte);
}
DebugP_log("\r\n");
write(0, process_data[0], process_data[1]);
init_sem.post();
process_sem.pend();
for(uint32_t i = 0; i < 250; i++) {
read(0, process_data[0], process_data[1]);
for(uint8_t& byte : process_data[0]) {
DebugP_log("0x%01x", byte);
}
DebugP_log("\r\n");
write(0, process_data[0], process_data[1]);
//ClockP_usleep(125ul);
}
init_sem.post();
process_sem.pend();
while(1)
{
read(0, process_data[0], process_data[1]);
for(uint8_t& byte : process_data[0]) {
DebugP_log("0x%01x", byte);
}
DebugP_log("\r\n");
write(0, process_data[0], process_data[1]);
//ClockP_usleep(125ul);
}
}
}
}

View File

@ -29,8 +29,6 @@ public:
do {
telegram.transfer(datagram);
} while(datagram.get_wkc() < 0x0001);
DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc());
}
template<typename... DataTypes>
@ -56,19 +54,45 @@ public:
void init();
template<typename... DataTypes>
void write(DataTypes&... data) {
void write(size_t slave_index, DataTypes&... data);
template<typename DataType, typename... DataTypes>
void write(size_t slave_index, DataType& head, DataTypes&... tail) {
datagram::EcatTelegram& telegram = ecat_buffer_.get_ecat().get_telegram();
pdo_fmmu_slaves_[0].write(telegram, data...);
pdo_fmmu_slaves_[slave_index].write(telegram, head);
slave_index++;
if(slave_index < pdo_fmmu_slaves_.size()) {
write(slave_index, tail...);
}
}
template<>
void write(size_t slave_index) { }
template<typename... DataTypes>
void read(DataTypes&... data) {
void read(size_t slave_index, DataTypes&... data);
template<typename DataType, typename... DataTypes>
void read(size_t slave_index, DataType& head, DataTypes&... tail) {
datagram::EcatTelegram& telegram = ecat_buffer_.get_ecat().get_telegram();
pdo_fmmu_slaves_[0].read(telegram, data...);
pdo_fmmu_slaves_[slave_index].read(telegram, head);
slave_index++;
if(slave_index < pdo_fmmu_slaves_.size()) {
read(slave_index, tail...);
}
}
template<>
void read(size_t slave_index) { }
void process();
private:
ecat_buffer::EthEcatBuffer& ecat_buffer_;

View File

@ -187,8 +187,8 @@ public:
auto slave_address = buffer_slave_.get_slave().get_slave_address<TypeT>();
std::array<address::Offset, 4>& buffer_regs = buffer_slave_.get_buffer_regs();
uint16_t sm_status{0x0000};
datagram::EcatDatagram<TCommand, uint16_t> datagram{ {{slave_address, buffer_regs[MailboxesRegs::AVAILABLE]}}, sm_status };
uint8_t sm_status{0x00};
datagram::EcatDatagram<TCommand, uint8_t> datagram{ {{slave_address, buffer_regs[MailboxesRegs::AVAILABLE]}}, sm_status };
do {
telegram.transfer(datagram);
@ -215,8 +215,8 @@ public:
auto slave_address = buffer_slave_.get_slave().get_slave_address<TypeT>();
std::array<address::Offset, 4>& buffer_regs = buffer_slave_.get_buffer_regs();
uint16_t sm_status{0x0000};
datagram::EcatDatagram<TCommand, uint16_t> datagram{ {{slave_address, buffer_regs[MailboxesRegs::AVAILABLE]}}, sm_status };
uint8_t sm_status{0x00};
datagram::EcatDatagram<TCommand, uint8_t> datagram{ {{slave_address, buffer_regs[MailboxesRegs::AVAILABLE]}}, sm_status };
do {
telegram.transfer(datagram);
@ -358,7 +358,7 @@ public:
pdo_data_size += descriptor.size;
DebugP_log("descriptor.size = 0x%01x\r\n", descriptor.size);
//DebugP_log("descriptor.size = 0x%01x\r\n", descriptor.size);
//DebugP_log("descriptor.subindex = 0x%01x\r\n", descriptor.subindex);
//DebugP_log("descriptor.index = 0x%02x\r\n", descriptor.index);
}

View File

@ -260,6 +260,9 @@ bool EthEcat::safeop_to_op() {
ALSTAT stat{0x0000, 0x0000};
uint16_t zero{0x00000000};
process_sem_.post();
init_sem_.pend();
{
uint16_t data{EC_STATE_OPERATIONAL};
datagram::EcatDatagram<command::BWR, uint16_t> datagram{ {{broadcast, ECT_REG_ALCTL}}, data };
@ -269,7 +272,8 @@ bool EthEcat::safeop_to_op() {
DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc());
}
//ClockP_usleep(3000000ul);
process_sem_.post();
init_sem_.pend();
{
datagram::EcatDatagram<command::BRD, ALSTAT, uint16_t> datagram{ {{broadcast, ECT_REG_ALSTAT}}, stat, zero };
@ -280,6 +284,11 @@ bool EthEcat::safeop_to_op() {
}
success = (stat.state == EC_STATE_OPERATIONAL) && (stat.fault == 0);
//ClockP_usleep(3000000ul);
if(success == true) {
process_sem_.post();
}
DebugP_log("stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
DebugP_log("success = %d\r\n", success);

View File

@ -246,6 +246,14 @@ public:
return slaves_;
}
free_rtos::Semaphore& get_init_sem() {
return init_sem_;
}
free_rtos::Semaphore& get_process_sem() {
return process_sem_;
}
bool is_ready() { return ready_; }
Statistic getStat() { return stat_;}
@ -265,10 +273,13 @@ private:
TEthPkt pkt_[e_pktTotal];
Mutex mut_;
//Mutex mut_;
free_rtos::Semaphore rx_sem_;
free_rtos::Semaphore init_sem_;
free_rtos::Semaphore process_sem_;
Eth& eth_;
EthTxFlowIface& tx_flow_;

View File

@ -45,7 +45,6 @@ void EthEcatBuffer::init_fmmu(fmmu fmmu_write, fmmu fmmu_read) {
for(EcatBufferSlave& buffer_slave : buffer_slaves_) {
buffer_slave.init_fmmu<command::FP>(telegram, fmmu_write, fmmu_read);
//buffer_slave.get_slave().preop_to_safeop<command::FP>(telegram);
}
}

View File

@ -31,8 +31,6 @@ struct FMMUSettings {
uint8_t phys_start_bit;
uint8_t direction;
uint8_t activate;
//uint8_t param1;
//uint16_t param2;
} __attribute__ ((packed));
struct FMMUProperties {
@ -148,36 +146,23 @@ public:
auto slave_address = slave_.get_slave_address<TypeT>();
SyncManager sync_manager_write = sync_managers_[static_cast<size_t>(sm_write)];
/*
BufferSettings buffer_settings_write{ .control = 0x26,
.status = 0x00,
.activate = 0x01,
.pdi_control = 0x00 };
*/
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]);
SyncManager sync_manager_read = sync_managers_[static_cast<size_t>(sm_read)];
/*
BufferSettings buffer_settings_read{ .control = 0x22,
.status = 0x00,
.activate = 0x01,
.pdi_control = 0x00 };
*/
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]);
/*
datagram_write + datagram_read;
do {
telegram.transfer(datagram_write);
} while((datagram_write.get_wkc() < 0x0001) || (datagram_read.get_wkc() < 0x0001));
*/
/*
do {
telegram.transfer(datagram_write);
} while(datagram_write.get_wkc() < 0x0001);
@ -185,7 +170,7 @@ public:
do {
telegram.transfer(datagram_read);
} while(datagram_read.get_wkc() < 0x0001);
*/
buffer_regs_[MailboxesRegs::EMPTY] = sync_manager_write.offset + 0x05;
buffer_regs_[MailboxesRegs::AVAILABLE] = sync_manager_read.offset + 0x05;
@ -222,9 +207,7 @@ public:
.phys_start_address = buffer_properties_write_.offset,
.phys_start_bit = 0,
.direction = static_cast<uint8_t>(DataDirection::WRITE),
.activate = 0x01,
//.param1 = 0x00,
//.param2 = 0x00
.activate = 0x01
};
datagram::EcatDatagram<TCommand, FMMUSettings> datagram_write{ {{slave_address, fmmu_regs_[static_cast<size_t>(fmmu_write)]}}, settings_write};
@ -243,9 +226,7 @@ public:
.phys_start_address = buffer_properties_read_.offset,
.phys_start_bit = 0,
.direction = static_cast<uint8_t>(DataDirection::READ),
.activate = 0x01,
//.param1 = 0x00,
//.param2 = 0x00
.activate = 0x01
};
datagram::EcatDatagram<TCommand, FMMUSettings> datagram_read{ {{slave_address, fmmu_regs_[static_cast<size_t>(fmmu_read)]}}, settings_read};

View File

@ -106,7 +106,7 @@ private:
}
uint8_t* pack_padding(uint8_t *raw) {
std::memset(raw, 0x00, padding_);
//std::memset(raw, 0x00, padding_);
return raw + padding_;
}

View File

@ -70,7 +70,7 @@ Usage:
runAfterLoad = true;
// Указать путь к текущей папке
var script_path = "/home/algin/workspace_v11/sitara_depot/utils/ddr_init/ccs_files";
var script_path = "/home/sofdev/workspace_v11/sitara_depot/utils/ddr_init/ccs_files";
print("script_path = " + script_path);