dev(UML-1547): Исправил переход в состояние OP и PDO process
This commit is contained in:
parent
dea7d4e8d8
commit
d356b80aac
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,8 +29,6 @@ public:
|
|||||||
do {
|
do {
|
||||||
telegram.transfer(datagram);
|
telegram.transfer(datagram);
|
||||||
} while(datagram.get_wkc() < 0x0001);
|
} while(datagram.get_wkc() < 0x0001);
|
||||||
|
|
||||||
DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename... DataTypes>
|
template<typename... DataTypes>
|
||||||
@ -56,19 +54,45 @@ public:
|
|||||||
void init();
|
void init();
|
||||||
|
|
||||||
template<typename... DataTypes>
|
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();
|
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>
|
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();
|
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:
|
private:
|
||||||
ecat_buffer::EthEcatBuffer& ecat_buffer_;
|
ecat_buffer::EthEcatBuffer& ecat_buffer_;
|
||||||
|
|
||||||
|
|||||||
@ -187,8 +187,8 @@ public:
|
|||||||
|
|
||||||
auto slave_address = buffer_slave_.get_slave().get_slave_address<TypeT>();
|
auto slave_address = buffer_slave_.get_slave().get_slave_address<TypeT>();
|
||||||
std::array<address::Offset, 4>& buffer_regs = buffer_slave_.get_buffer_regs();
|
std::array<address::Offset, 4>& buffer_regs = buffer_slave_.get_buffer_regs();
|
||||||
uint16_t sm_status{0x0000};
|
uint8_t sm_status{0x00};
|
||||||
datagram::EcatDatagram<TCommand, uint16_t> datagram{ {{slave_address, buffer_regs[MailboxesRegs::AVAILABLE]}}, sm_status };
|
datagram::EcatDatagram<TCommand, uint8_t> datagram{ {{slave_address, buffer_regs[MailboxesRegs::AVAILABLE]}}, sm_status };
|
||||||
|
|
||||||
do {
|
do {
|
||||||
telegram.transfer(datagram);
|
telegram.transfer(datagram);
|
||||||
@ -215,8 +215,8 @@ public:
|
|||||||
|
|
||||||
auto slave_address = buffer_slave_.get_slave().get_slave_address<TypeT>();
|
auto slave_address = buffer_slave_.get_slave().get_slave_address<TypeT>();
|
||||||
std::array<address::Offset, 4>& buffer_regs = buffer_slave_.get_buffer_regs();
|
std::array<address::Offset, 4>& buffer_regs = buffer_slave_.get_buffer_regs();
|
||||||
uint16_t sm_status{0x0000};
|
uint8_t sm_status{0x00};
|
||||||
datagram::EcatDatagram<TCommand, uint16_t> datagram{ {{slave_address, buffer_regs[MailboxesRegs::AVAILABLE]}}, sm_status };
|
datagram::EcatDatagram<TCommand, uint8_t> datagram{ {{slave_address, buffer_regs[MailboxesRegs::AVAILABLE]}}, sm_status };
|
||||||
|
|
||||||
do {
|
do {
|
||||||
telegram.transfer(datagram);
|
telegram.transfer(datagram);
|
||||||
@ -358,7 +358,7 @@ public:
|
|||||||
|
|
||||||
pdo_data_size += descriptor.size;
|
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.subindex = 0x%01x\r\n", descriptor.subindex);
|
||||||
//DebugP_log("descriptor.index = 0x%02x\r\n", descriptor.index);
|
//DebugP_log("descriptor.index = 0x%02x\r\n", descriptor.index);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -260,6 +260,9 @@ bool EthEcat::safeop_to_op() {
|
|||||||
ALSTAT stat{0x0000, 0x0000};
|
ALSTAT stat{0x0000, 0x0000};
|
||||||
uint16_t zero{0x00000000};
|
uint16_t zero{0x00000000};
|
||||||
|
|
||||||
|
process_sem_.post();
|
||||||
|
init_sem_.pend();
|
||||||
|
|
||||||
{
|
{
|
||||||
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 };
|
||||||
@ -269,7 +272,8 @@ bool EthEcat::safeop_to_op() {
|
|||||||
DebugP_log("datagram.get_wkc() = %d\r\n", datagram.get_wkc());
|
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 };
|
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);
|
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("stat.state = %d, stat.fault = %d\r\n", stat.state, stat.fault);
|
||||||
DebugP_log("success = %d\r\n", success);
|
DebugP_log("success = %d\r\n", success);
|
||||||
|
|||||||
@ -246,6 +246,14 @@ public:
|
|||||||
return slaves_;
|
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_; }
|
bool is_ready() { return ready_; }
|
||||||
|
|
||||||
Statistic getStat() { return stat_;}
|
Statistic getStat() { return stat_;}
|
||||||
@ -265,10 +273,13 @@ private:
|
|||||||
|
|
||||||
TEthPkt pkt_[e_pktTotal];
|
TEthPkt pkt_[e_pktTotal];
|
||||||
|
|
||||||
Mutex mut_;
|
//Mutex mut_;
|
||||||
|
|
||||||
free_rtos::Semaphore rx_sem_;
|
free_rtos::Semaphore rx_sem_;
|
||||||
|
|
||||||
|
free_rtos::Semaphore init_sem_;
|
||||||
|
free_rtos::Semaphore process_sem_;
|
||||||
|
|
||||||
Eth& eth_;
|
Eth& eth_;
|
||||||
EthTxFlowIface& tx_flow_;
|
EthTxFlowIface& tx_flow_;
|
||||||
|
|
||||||
|
|||||||
@ -45,7 +45,6 @@ void EthEcatBuffer::init_fmmu(fmmu fmmu_write, fmmu fmmu_read) {
|
|||||||
|
|
||||||
for(EcatBufferSlave& buffer_slave : buffer_slaves_) {
|
for(EcatBufferSlave& buffer_slave : buffer_slaves_) {
|
||||||
buffer_slave.init_fmmu<command::FP>(telegram, fmmu_write, fmmu_read);
|
buffer_slave.init_fmmu<command::FP>(telegram, fmmu_write, fmmu_read);
|
||||||
//buffer_slave.get_slave().preop_to_safeop<command::FP>(telegram);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -31,8 +31,6 @@ struct FMMUSettings {
|
|||||||
uint8_t phys_start_bit;
|
uint8_t phys_start_bit;
|
||||||
uint8_t direction;
|
uint8_t direction;
|
||||||
uint8_t activate;
|
uint8_t activate;
|
||||||
//uint8_t param1;
|
|
||||||
//uint16_t param2;
|
|
||||||
} __attribute__ ((packed));
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
struct FMMUProperties {
|
struct FMMUProperties {
|
||||||
@ -148,36 +146,23 @@ 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)];
|
||||||
/*
|
|
||||||
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}},
|
datagram::EcatDatagram<TCommand, BufferProperties, uint32_t> datagram_write{ {{slave_address, sync_manager_write.offset}},
|
||||||
buffer_properties_write_,
|
buffer_properties_write_,
|
||||||
sync_manager_write.default_setting };
|
sync_manager_write.default_setting };
|
||||||
//register_sync_manager<TypeT>(telegram, sm_write, buffer_properties_write_, buffer_regs_[MailboxesRegs::EMPTY]);
|
//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)];
|
||||||
/*
|
|
||||||
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}},
|
datagram::EcatDatagram<TCommand, BufferProperties, uint32_t> datagram_read{ {{slave_address, sync_manager_read.offset}},
|
||||||
buffer_properties_read_,
|
buffer_properties_read_,
|
||||||
sync_manager_read.default_setting };
|
sync_manager_read.default_setting };
|
||||||
//register_sync_manager<TypeT>(telegram, sm_read, buffer_properties_read_, buffer_regs_[MailboxesRegs::AVAILABLE]);
|
//register_sync_manager<TypeT>(telegram, sm_read, buffer_properties_read_, buffer_regs_[MailboxesRegs::AVAILABLE]);
|
||||||
/*
|
|
||||||
datagram_write + datagram_read;
|
datagram_write + datagram_read;
|
||||||
|
|
||||||
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_wkc() < 0x0001) || (datagram_read.get_wkc() < 0x0001));
|
||||||
*/
|
/*
|
||||||
|
|
||||||
do {
|
do {
|
||||||
telegram.transfer(datagram_write);
|
telegram.transfer(datagram_write);
|
||||||
} while(datagram_write.get_wkc() < 0x0001);
|
} while(datagram_write.get_wkc() < 0x0001);
|
||||||
@ -185,7 +170,7 @@ public:
|
|||||||
do {
|
do {
|
||||||
telegram.transfer(datagram_read);
|
telegram.transfer(datagram_read);
|
||||||
} while(datagram_read.get_wkc() < 0x0001);
|
} while(datagram_read.get_wkc() < 0x0001);
|
||||||
|
*/
|
||||||
buffer_regs_[MailboxesRegs::EMPTY] = sync_manager_write.offset + 0x05;
|
buffer_regs_[MailboxesRegs::EMPTY] = sync_manager_write.offset + 0x05;
|
||||||
buffer_regs_[MailboxesRegs::AVAILABLE] = sync_manager_read.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_address = buffer_properties_write_.offset,
|
||||||
.phys_start_bit = 0,
|
.phys_start_bit = 0,
|
||||||
.direction = static_cast<uint8_t>(DataDirection::WRITE),
|
.direction = static_cast<uint8_t>(DataDirection::WRITE),
|
||||||
.activate = 0x01,
|
.activate = 0x01
|
||||||
//.param1 = 0x00,
|
|
||||||
//.param2 = 0x00
|
|
||||||
};
|
};
|
||||||
|
|
||||||
datagram::EcatDatagram<TCommand, FMMUSettings> datagram_write{ {{slave_address, fmmu_regs_[static_cast<size_t>(fmmu_write)]}}, settings_write};
|
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_address = buffer_properties_read_.offset,
|
||||||
.phys_start_bit = 0,
|
.phys_start_bit = 0,
|
||||||
.direction = static_cast<uint8_t>(DataDirection::READ),
|
.direction = static_cast<uint8_t>(DataDirection::READ),
|
||||||
.activate = 0x01,
|
.activate = 0x01
|
||||||
//.param1 = 0x00,
|
|
||||||
//.param2 = 0x00
|
|
||||||
};
|
};
|
||||||
|
|
||||||
datagram::EcatDatagram<TCommand, FMMUSettings> datagram_read{ {{slave_address, fmmu_regs_[static_cast<size_t>(fmmu_read)]}}, settings_read};
|
datagram::EcatDatagram<TCommand, FMMUSettings> datagram_read{ {{slave_address, fmmu_regs_[static_cast<size_t>(fmmu_read)]}}, settings_read};
|
||||||
|
|||||||
@ -106,7 +106,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint8_t* pack_padding(uint8_t *raw) {
|
uint8_t* pack_padding(uint8_t *raw) {
|
||||||
std::memset(raw, 0x00, padding_);
|
//std::memset(raw, 0x00, padding_);
|
||||||
|
|
||||||
return raw + padding_;
|
return raw + padding_;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -70,7 +70,7 @@ Usage:
|
|||||||
runAfterLoad = true;
|
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);
|
print("script_path = " + script_path);
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user