69 std::expected<void, std::string>
init()
override;
78 std::expected<int, std::string>
scan()
override;
85 uint16_t
slaveState(uint16_t position)
const override;
97 std::vector<SlaveConfig>
busConfig()
const override;
107 int exchangeProcessData(std::span<const uint8_t> outputs, std::span<uint8_t> inputs)
override;
110 void stop()
override;
113 std::expected<std::vector<FieldbusDriver::SlaveStateRaw>, std::string>
readStates(
114 const std::vector<uint16_t>& positions)
override;
117 std::expected<std::vector<SlaveDiagnostics>, std::string>
readDiagnostics(
118 const std::vector<uint16_t>& positions)
override;
121 std::expected<std::vector<DcSyncDiagnostics>, std::string>
readDcSync(
122 const std::vector<uint16_t>& positions)
override;
125 std::expected<std::vector<uint8_t>, std::string>
readSdo(uint16_t slavePosition, uint16_t index,
129 std::expected<std::vector<uint8_t>, std::string>
readSdoComplete(uint16_t slavePosition,
130 uint16_t index)
override;
133 std::expected<void, std::string>
writeSdo(uint16_t slavePosition, uint16_t index,
135 std::span<const uint8_t> data)
override;
141 std::expected<std::vector<uint8_t>, std::string>
readSii(uint16_t slavePosition)
override;
144 std::expected<void, std::string>
writeSii(uint16_t slavePosition,
145 std::span<const uint8_t> data)
override;
148 std::expected<std::vector<uint8_t>,
FoeError>
readFile(uint16_t slavePosition,
149 const std::string& filename)
override;
152 std::expected<void, FoeError>
writeFile(uint16_t slavePosition,
const std::string& filename,
153 std::span<const uint8_t> data)
override;
160 std::expected<void, std::string>
readRegister(uint16_t slavePosition, uint16_t address,
161 std::span<uint8_t> data)
override;
168 std::expected<void, std::string>
writeRegister(uint16_t slavePosition, uint16_t address,
169 std::span<const uint8_t> data)
override;
173 uint16_t slavePosition)
override;
177 uint16_t slavePosition, std::chrono::nanoseconds
timeout)
override;
184 const std::vector<uint16_t>& positions, std::optional<EtherCatState> requiredState,
186 std::chrono::steady_clock::duration resendInterval = std::chrono::seconds(2),
187 std::function<
void()> tick =
nullptr, std::function<
bool()> shouldAbort =
nullptr)
override;
199 std::expected<void, std::string> deactivateMailboxStatusFmmus();
216 std::expected<void, std::string> blockLrwOnPruIcssSlaves();
231 void publishSlaveStates();
236 bool mailboxStatusFmmu_ =
false;
239 std::unique_ptr<ecx_context> ctx_;
258 std::unique_ptr<std::atomic<uint16_t>[]> slaveStates_;
260 std::size_t slaveStatesSize_ = 0;
267 std::set<uint16_t> bootMailboxSlaves_;
Abstract interface for an EtherCAT fieldbus driver.
Definition fieldbus_driver.h:404
SOEM-backed EtherCAT fieldbus driver.
Definition soem_fieldbus_driver.h:51
std::expected< void, FoeError > writeFile(uint16_t slavePosition, const std::string &filename, std::span< const uint8_t > data) override
Writes a file to the slave via File over EtherCAT (FoE).
Definition soem_fieldbus_driver.cc:1394
std::expected< void, std::string > writeSdo(uint16_t slavePosition, uint16_t index, uint8_t subindex, std::span< const uint8_t > data) override
Writes an object dictionary entry to a slave (CoE SDO download).
Definition soem_fieldbus_driver.cc:884
void transitionToState(const std::vector< uint16_t > &positions, std::optional< EtherCatState > requiredState, EtherCatState targetState, std::chrono::steady_clock::duration timeout, std::chrono::steady_clock::duration resendInterval=std::chrono::seconds(2), std::function< void()> tick=nullptr, std::function< bool()> shouldAbort=nullptr) override
Commands a set of devices to targetState and blocks until all arrive or timeout elapses.
Definition soem_fieldbus_driver.cc:1702
int exchangeProcessData(std::span< const uint8_t > outputs, std::span< uint8_t > inputs) override
Copies outputs into the IOmap, sends and receives, copies inputs back out.
Definition soem_fieldbus_driver.cc:563
std::expected< void, std::string > writeRegister(uint16_t slavePosition, uint16_t address, std::span< const uint8_t > data) override
Writes bytes to an ESC register via FPWR.
Definition soem_fieldbus_driver.cc:1436
std::expected< OdRead, std::string > readObjectDictionary(uint16_t slavePosition) override
Enumerates the entire CoE object dictionary of a slave via SDO Info.
Definition soem_fieldbus_driver.cc:1130
std::expected< std::vector< SlaveDiagnostics >, std::string > readDiagnostics(const std::vector< uint16_t > &positions) override
Reads live link-quality and watchdog diagnostics for each slave in positions.
Definition soem_fieldbus_driver.cc:676
std::expected< void, std::string > init() override
Opens the NIC and initialises the SOEM master context.
Definition soem_fieldbus_driver.cc:72
std::expected< void, std::string > writeSii(uint16_t slavePosition, std::span< const uint8_t > data) override
Writes a raw SII (EEPROM) image to a slave.
Definition soem_fieldbus_driver.cc:1325
std::expected< std::vector< DcSyncDiagnostics >, std::string > readDcSync(const std::vector< uint16_t > &positions) override
Reads live distributed-clock synchronisation status for each slave in positions.
Definition soem_fieldbus_driver.cc:736
SlaveInfo slaveInfo(uint16_t position) const override
Returns the immutable identity fields for the slave at position.
Definition soem_fieldbus_driver.cc:603
void stop() override
Closes the NIC and releases all driver resources.
Definition soem_fieldbus_driver.cc:582
std::expected< ProcessDataWatchdogConfig, std::string > processDataWatchdog(uint16_t slavePosition) override
Reads the process-data (sync-manager) watchdog configuration of one slave.
Definition soem_fieldbus_driver.cc:1479
SoemFieldbusDriver(const SoemFieldbusDriver &)=delete
~SoemFieldbusDriver() override
Closes the NIC if init() succeeded.
Definition soem_fieldbus_driver.cc:45
std::expected< ProcessDataWatchdogConfig, std::string > setProcessDataWatchdog(uint16_t slavePosition, std::chrono::nanoseconds timeout) override
Sets the process-data (sync-manager) watchdog timeout of one slave.
Definition soem_fieldbus_driver.cc:1509
std::expected< std::vector< FieldbusDriver::SlaveStateRaw >, std::string > readStates(const std::vector< uint16_t > &positions) override
Reads the current AL Status for each slave in positions.
Definition soem_fieldbus_driver.cc:660
std::expected< std::vector< uint8_t >, std::string > readSdoComplete(uint16_t slavePosition, uint16_t index) override
Reads an entire object in one CoE SDO upload using Complete Access.
Definition soem_fieldbus_driver.cc:843
std::expected< int, std::string > scan() override
Scans the bus for slaves and configures their sync managers and FMMUs.
Definition soem_fieldbus_driver.cc:96
uint16_t slaveState(uint16_t position) const override
Returns the last-known AL status for a slave without any bus I/O.
Definition soem_fieldbus_driver.cc:623
std::expected< void, std::string > readRegister(uint16_t slavePosition, uint16_t address, std::span< uint8_t > data) override
Reads bytes from an ESC register via FPRD.
Definition soem_fieldbus_driver.cc:1417
std::expected< std::vector< uint8_t >, FoeError > readFile(uint16_t slavePosition, const std::string &filename) override
Reads a file from the slave via File over EtherCAT (FoE).
Definition soem_fieldbus_driver.cc:1360
int slaveCount() const
Returns the number of discovered slaves, or 0 before discovery.
Definition soem_fieldbus_driver.cc:618
std::expected< std::vector< uint8_t >, std::string > readSdo(uint16_t slavePosition, uint16_t index, uint8_t subindex) override
Reads an object dictionary entry via CoE SDO upload.
Definition soem_fieldbus_driver.cc:794
uint16_t mailboxProtocols(uint16_t position) const override
Returns the slave's advertised mailbox-protocol bits without any bus I/O.
Definition soem_fieldbus_driver.cc:652
SoemFieldbusDriver & operator=(const SoemFieldbusDriver &)=delete
std::vector< SlaveConfig > busConfig() const override
Returns the static ESC configuration of every slave, as last programmed by the master.
Definition soem_fieldbus_driver.cc:493
PdoLayout processDataLayout() override
Returns the current process-data layout established by configureProcessData.
Definition soem_fieldbus_driver.cc:461
std::expected< void, std::string > configureProcessData() override
Maps the process data and lays out the IOmap (one-time, control-plane).
Definition soem_fieldbus_driver.cc:302
std::expected< std::vector< uint8_t >, std::string > readSii(uint16_t slavePosition) override
Reads the raw Slave Information Interface (SII / EEPROM) image of a slave.
Definition soem_fieldbus_driver.cc:1293
uint8_t subindex
Definition esi_entry.cc:283
Definition soem_fieldbus_driver.cc:33
EtherCatState
EtherCAT Application Layer state values.
Definition fieldbus_driver.h:36
constexpr std::size_t kMaxProcessImageBytes
Maximum size in bytes of the combined process-data image (all outputs + all inputs).
Definition fieldbus_driver.h:30
std::chrono::milliseconds timeout
Definition somanet_procedures.cc:438
A structured FoE failure. String-like where a caller only forwards it (operator<<,...
Definition foe_error.h:109
Layout of the process-data images, produced by configureProcessData.
Definition fieldbus_driver.h:173
Immutable identity fields read from a slave's EEPROM during configuration.
Definition fieldbus_driver.h:98
Construction-time configuration for SoemFieldbusDriver.
Definition soem_fieldbus_driver.h:24
std::string ifname
Resolved OS network interface name (e.g. "eth0", "enp3s0").
Definition soem_fieldbus_driver.h:26
bool mailboxStatusFmmu
Definition soem_fieldbus_driver.h:33