273bool setSlaveState(ecx_contextt *context, uint16_t slave,
int targetState);
304 const std::vector<mm::comm::base::PdoMappingEntry> &entries);
317void logIoMap(uint8_t *ioMap,
size_t totalBytes);
376 const std::string &iface);
394 explicit Slave(ecx_contextt &context, uint16_t position);
447 int getState(
bool forceRefresh =
true)
const;
468 bool setState(
int targetState,
int timeoutMs = 0,
int intervalMs = 100);
602 template <
typename T = std::vector<u
int8_t>>
605 std::lock_guard<std::mutex> lock(mailboxMutex_);
609 if (state == EC_STATE_INIT || state == EC_STATE_BOOT) {
610 throw std::runtime_error(
611 "To upload object dictionary entries, the device must be in the (2) "
612 "PRE-OPERATIONAL, (4) SAFE-OPERATIONAL, or (8) OPERATIONAL state. "
613 "The current state is " +
622 const std::unique_ptr<std::uint8_t[]> data =
623 std::make_unique<std::uint8_t[]>(parameter.byteLength);
624 auto wkc = ecx_SDOread(&context_, position_, parameter.index,
625 parameter.subindex,
false, ¶meter.byteLength,
626 data.get(), EC_TIMEOUTRXM * 3);
628 LOG_F(ERROR,
"Device %d: SDO read failed for %#04x:%02x! WKC: %d",
629 position_, parameter.index, parameter.subindex, wkc);
632 throw std::runtime_error(
"Device " + std::to_string(position_) +
633 ": SDO read failed for " +
id +
634 "! WKC: " + std::to_string(wkc));
636 std::vector<uint8_t> receivedData(data.get(),
637 data.get() + parameter.byteLength);
638 if (!parameter.trySetValue(receivedData)) {
640 "Device %d: Failed to set the value of parameter %#04x:%02x!",
641 position_, parameter.index, parameter.subindex);
647 if constexpr (std::is_same_v<T, std::vector<uint8_t>>) {
648 return parameter.data;
651 auto value = parameter.getValue();
652 if (
auto ptr = std::get_if<T>(&
value)) {
655 throw std::bad_variant_access();
684 template <
typename T = std::vector<u
int8_t>>
686 std::lock_guard<std::mutex> lock(mailboxMutex_);
690 if (state == EC_STATE_INIT || state == EC_STATE_BOOT) {
691 throw std::runtime_error(
692 "To download object dictionary entries, the device must be in the "
693 "(2) PRE-OPERATIONAL, (4) SAFE-OPERATIONAL, or (8) OPERATIONAL "
694 "state. The current state is " +
701 std::vector<uint8_t> data;
702 if constexpr (std::is_same_v<T, std::vector<uint8_t>>) {
706 if (!parameter.trySetValue(
value)) {
708 "Device %d: Failed to set the value of parameter %#04x:%02x!",
709 position_, parameter.index, parameter.subindex);
712 data = parameter.data;
716 if (data.size() != parameter.byteLength) {
717 LOG_F(ERROR,
"Data size mismatch: expected %d, got %zu",
718 parameter.byteLength, data.size());
719 throw std::runtime_error(
"Data size does not match the parameter size!");
723 auto wkc = ecx_SDOwrite(&context_, position_, parameter.index,
724 parameter.subindex,
false, parameter.byteLength,
725 data.data(), EC_TIMEOUTRXM * 3);
729 LOG_F(ERROR,
"Device %d: SDO write failed for %#04x:%02x! WKC: %d",
730 position_, parameter.index, parameter.subindex, wkc);
825 ecx_contextt &context_;
826 const uint16_t position_;
829 std::mutex mailboxMutex_;
858 explicit Master(
const std::string &iface);
911 void init(
const std::string &iface);
1039 const std::vector<std::unique_ptr<Slave>> &
getSlaves()
const;
1051 return fieldbus_->context.grouplist[fieldbus_->group].outputsWKC * 2 +
1052 fieldbus_->context.grouplist[fieldbus_->group].inputsWKC;
1122 std::unique_ptr<Fieldbus> fieldbus_;
1135 std::vector<std::unique_ptr<Slave>> slaves_;
Represents a device parameter identified by index and subindex.
Definition: base.h:463
std::pair< uint16_t, uint8_t > Address
Alias for a pair of uint16_t and uint8_t representing a parameter address.
Definition: base.h:473
int roundtrip()
Performs a complete send/receive process data cycle on the fieldbus.
Definition: soem.cc:1143
int initSlaves()
Initializes the slave devices on the EtherCAT network.
Definition: soem.cc:1116
Master()
Default constructor for the Master class.
Definition: soem.cc:1075
void exchangeProcessDataAndUpdateParameters()
Exchanges process data with slaves and updates parameters based on the response.
Definition: soem.cc:1148
size_t getIoMapSize() const
Returns the total size of the I/O map for the current group.
Definition: soem.cc:1111
const std::vector< std::unique_ptr< Slave > > & getSlaves() const
Returns a reference to the list of slaves.
Definition: soem.cc:1139
Fieldbus & getFieldbus() const
Returns a reference to the Fieldbus instance.
Definition: soem.cc:1107
void init(const std::string &iface)
Initializes the fieldbus using the specified network interface.
Definition: soem.cc:1082
std::string getInterfaceName() const
Retrieves the interface name used by the fieldbus.
Definition: soem.cc:1109
void deinit()
Deinitializes the fieldbus and releases associated resources.
Definition: soem.cc:1100
bool start()
Initializes and starts the fieldbus master.
Definition: soem.cc:1171
~Master()
Destructor for the Master class.
Definition: soem.cc:1105
int expectedWkc() const
Calculates the expected working counter (WKC) for the current fieldbus group.
Definition: soem.h:1050
Represents a slave in the EtherCAT network.
Definition: soem.h:382
mm::comm::base::PdoMappings readPdoMappings() const
Reads the PDO mappings from the slave device.
Definition: soem.cc:985
void updateOutputs()
Updates the outputs for the slave device.
Definition: soem.cc:1008
void logPdoMappings() const
Logs the PDO (Process Data Object) mappings for the device.
Definition: soem.cc:1000
void loadParameters(bool readValues=false)
Loads the parameters (object dictionary entries) from the EtherCAT slave device.
Definition: soem.cc:769
mm::comm::base::Parameter & findParameter(uint16_t index, uint8_t subindex)
Finds and returns a reference to a Parameter in the parameters map.
Definition: soem.cc:973
T upload(uint16_t index, uint8_t subindex, bool refresh=true)
Uploads a parameter value from the device's object dictionary.
Definition: soem.h:603
int getState(bool forceRefresh=true) const
Retrieves the current state of the slave.
Definition: soem.cc:741
uint32_t getProductCode() const
Gets the Product Code of the slave device.
Definition: soem.cc:733
uint32_t getRevisionNumber() const
Gets the Revision Number of the slave device.
Definition: soem.cc:737
std::unordered_map< mm::comm::base::Parameter::Address, mm::comm::base::Parameter > & getParametersMap()
Returns a reference to the internal parameters map.
Definition: soem.cc:969
void updatePdoMappings()
Updates the PDO mapping entries for the slave.
Definition: soem.cc:992
void clearParameters()
Clears all loaded object dictionary parameters.
Definition: soem.cc:965
void logTxPdoMappedParameters()
Logs all mapped TxPDO parameters with their current values.
Definition: soem.cc:950
void logRxPdoMappedParameters()
Logs all mapped RxPDO parameters with their current values.
Definition: soem.cc:935
uint16_t getPosition() const
Gets the position of the slave.
Definition: soem.cc:727
bool setState(int targetState, int timeoutMs=0, int intervalMs=100)
Attempts to set the slave to the specified EtherCAT state and optionally waits until it is reached.
Definition: soem.cc:745
mm::comm::base::PdoMappings & getPdoMappings()
Returns a reference to the cached PDO mappings.
Definition: soem.cc:1006
void updateParametersFromInputs()
Updates parameters from the received input data.
Definition: soem.cc:1025
void logParameters() const
Logs all loaded object dictionary parameters.
Definition: soem.cc:929
uint32_t getVendorId() const
Gets the Vendor ID of the slave device.
Definition: soem.cc:729
bool download(uint16_t index, uint8_t subindex, const T &value)
Downloads a value to the specified object dictionary entry via SDO.
Definition: soem.h:685
uint8_t * value
Definition: co_dictionary.h:9
uint16_t index
Definition: co_dictionary.h:0
std::string makeParameterId(int index, int subindex)
Formats the given index and subindex into a parameter identifier string.
Definition: base.h:1574
mm::comm::base::PdoMappings readPdoMappings(ecx_contextt *context, uint16_t slave)
Read and parse all mapped PDO entries for a given slave.
Definition: soem.cc:627
void logPdoMappingEntries(const std::vector< mm::comm::base::PdoMappingEntry > &entries)
Logs PDO mapping entries grouped by PDO index.
Definition: soem.cc:693
std::string convertSlaveStateToString(int state)
Converts a numeric EtherCAT state value into a human-readable string.
Definition: soem.cc:329
bool transitionToHigherSlaveState(ecx_contextt *context, uint16_t slave, int targetState)
Transitions a slave to a higher EtherCAT state.
Definition: soem.cc:358
std::string uiConfigWithDefaultPdoMapping
Default UI configuration used for PDO mapping.
Definition: soem.h:48
void initFieldbus(std::unique_ptr< Fieldbus > &fieldbus, const std::string &iface)
Initializes a Fieldbus instance for EtherCAT communication.
Definition: soem.cc:1042
void updateMailboxSyncManagersOnNextState(ecx_contextt *context, uint16_t slave, int targetState)
Updates the mailbox and sync manager (SM) configurations for an EtherCAT slave when transitioning to ...
Definition: soem.cc:420
void logIoMap(uint8_t *ioMap, size_t totalBytes)
Logs the I/O map as a formatted hexadecimal string.
Definition: soem.cc:714
void checkPdoMapping(ecx_contextt *context, uint16 slave)
Diagnoses and prints the PDO mapping for a given slave.
Definition: soem.cc:226
void configureDetectedSmmModule(ecx_contextt *context, uint16_t slave)
Reads the detected SMM module ID from the slave device and configures the module identification objec...
Definition: soem.cc:495
std::map< std::string, std::string > mapMacAddressesToInterfaces()
Maps MAC addresses to their corresponding network interface names.
Definition: soem.cc:28
int setPdoMappingFromUiConfig(ecx_contextt *context, uint16 slave)
Sets PDO mapping for a specified EtherCAT slave using UI configuration.
Definition: soem.cc:131
uint16_t getSlaveState(ecx_contextt *context, uint16_t slave, bool forceRefresh)
Retrieves the current state of a specific EtherCAT slave.
Definition: soem.cc:308
bool setSlaveState(ecx_contextt *context, uint16_t slave, int targetState)
Sets the state of a specified EtherCAT slave.
Definition: soem.cc:525
Represents the mapped PDO entries for a slave device.
Definition: base.h:145
Structure representing the Fieldbus configuration and context for EtherCAT communication.
Definition: soem.h:333
boolean ecaterror
Definition: soem.h:349
ec_idxstackT idxstack
Definition: soem.h:348
ec_eepromFMMUt eepFMMU
Definition: soem.h:355
ec_groupt grouplist[EC_MAXGROUP]
Definition: soem.h:344
std::string iface
Definition: soem.h:335
uint8 group
Definition: soem.h:336
int slavecount
Definition: soem.h:343
uint8 esibuf[EC_MAXEEPBUF]
Definition: soem.h:345
uint32 esimap[EC_MAXEEPBITMAP]
Definition: soem.h:346
int64 DCtime
Definition: soem.h:350
ec_eepromSMt eepSM
Definition: soem.h:354
ec_PDOassignt PDOassign[EC_MAX_MAPT]
Definition: soem.h:352
uint8 map[4096]
Definition: soem.h:340
ecx_contextt context
Definition: soem.h:334
int roundtripTime
Definition: soem.h:337
ec_PDOdesct PDOdesc[EC_MAX_MAPT]
Definition: soem.h:353
ecx_portt port
Definition: soem.h:341
ec_slavet slavelist[EC_MAXSLAVE]
Definition: soem.h:342
ec_SMcommtypet SMcommtype[EC_MAX_MAPT]
Definition: soem.h:351
ec_eringt elist
Definition: soem.h:347