54inline bool alHasError(uint16_t alStatus) {
return (alStatus & 0x0010u) != 0; }
89 return (hasOutputs ? 2 : 0) + (hasInputs ? 1 : 0);
91 return hasInputs ? 1 : 0;
256std::optional<SyncManagerConfig>
decodeSyncManager(uint8_t index, std::span<const uint8_t> bytes);
268std::optional<FmmuConfig>
decodeFmmu(uint8_t index, std::span<const uint8_t> bytes);
328 std::array<PortDiagnostics, 4>
ports;
413 virtual std::expected<void, std::string>
init() = 0;
422 virtual std::expected<int, std::string>
scan() = 0;
492 virtual std::vector<SlaveConfig>
busConfig()
const {
return {}; }
554 virtual std::expected<std::vector<SlaveStateRaw>, std::string>
readStates(
555 const std::vector<uint16_t>& positions) = 0;
574 const std::vector<uint16_t>& ) {
575 return std::unexpected(
"diagnostics not supported by this transport");
596 virtual std::expected<std::vector<DcSyncDiagnostics>, std::string>
readDcSync(
597 const std::vector<uint16_t>& ) {
598 return std::unexpected(
"distributed-clock diagnostics not supported by this transport");
622 virtual std::expected<std::vector<uint8_t>, std::string>
readSdo(uint16_t slavePosition,
644 uint16_t , uint16_t ) {
645 return std::unexpected(
"complete access not supported by this driver");
661 virtual std::expected<void, std::string>
writeSdo(uint16_t slavePosition, uint16_t index,
663 std::span<const uint8_t> data) = 0;
700 virtual std::expected<std::vector<uint8_t>, std::string>
readSii(uint16_t ) {
701 return std::unexpected(
"SII (EEPROM) read not supported by this transport");
721 virtual std::expected<void, std::string>
writeSii(uint16_t ,
722 std::span<const uint8_t> ) {
723 return std::unexpected(
"SII (EEPROM) write not supported by this transport");
741 const std::string& filename) = 0;
755 virtual std::expected<void, FoeError>
writeFile(uint16_t slavePosition,
756 const std::string& filename,
757 std::span<const uint8_t> data) = 0;
769 virtual std::expected<void, std::string>
readRegister(uint16_t slavePosition, uint16_t address,
770 std::span<uint8_t> data) = 0;
782 virtual std::expected<void, std::string>
writeRegister(uint16_t slavePosition, uint16_t address,
783 std::span<const uint8_t> data) = 0;
802 return std::unexpected(
"process-data watchdog not supported by this transport");
827 uint16_t , std::chrono::nanoseconds ) {
828 return std::unexpected(
"process-data watchdog not supported by this transport");
854 const std::vector<uint16_t>& positions, std::optional<EtherCatState> requiredState,
856 std::chrono::steady_clock::duration resendInterval = std::chrono::seconds(2),
857 std::function<
void()> tick =
nullptr, std::function<
bool()> shouldAbort =
nullptr) = 0;
Abstract interface for an EtherCAT fieldbus driver.
Definition fieldbus_driver.h:404
virtual std::expected< std::vector< uint8_t >, std::string > readSii(uint16_t)
Reads the raw Slave Information Interface (SII / EEPROM) image of a slave.
Definition fieldbus_driver.h:700
virtual std::expected< void, std::string > writeRegister(uint16_t slavePosition, uint16_t address, std::span< const uint8_t > data)=0
Writes bytes to an ESC register via a Configured-Address Write (FPWR) datagram.
virtual std::expected< std::vector< SlaveStateRaw >, std::string > readStates(const std::vector< uint16_t > &positions)=0
Reads the current AL Status for each slave in positions.
virtual std::expected< std::vector< uint8_t >, FoeError > readFile(uint16_t slavePosition, const std::string &filename)=0
Reads a file from the slave via File over EtherCAT (FoE).
virtual SlaveInfo slaveInfo(uint16_t position) const =0
Returns the immutable identity fields for the slave at position.
virtual std::expected< void, std::string > writeSdo(uint16_t slavePosition, uint16_t index, uint8_t subindex, std::span< const uint8_t > data)=0
Writes an object dictionary entry to a slave (CoE SDO download).
virtual uint16_t slaveState(uint16_t position) const =0
Returns the last-known AL status for a slave without any bus I/O.
virtual std::expected< void, std::string > readRegister(uint16_t slavePosition, uint16_t address, std::span< uint8_t > data)=0
Reads bytes from an ESC register via a Configured-Address Read (FPRD) datagram.
virtual ~FieldbusDriver()=default
virtual std::expected< std::vector< uint8_t >, std::string > readSdo(uint16_t slavePosition, uint16_t index, uint8_t subindex)=0
Reads an object dictionary entry via CoE SDO upload.
virtual std::expected< std::vector< DcSyncDiagnostics >, std::string > readDcSync(const std::vector< uint16_t > &)
Reads live distributed-clock synchronisation status for each slave in positions.
Definition fieldbus_driver.h:596
virtual uint16_t mailboxProtocols(uint16_t) const
Returns the slave's advertised mailbox-protocol bits without any bus I/O.
Definition fieldbus_driver.h:453
virtual 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)=0
Commands a set of devices to targetState and blocks until all arrive or timeout elapses.
virtual std::expected< void, std::string > configureProcessData()=0
Maps the process data and lays out the IOmap (one-time, control-plane).
virtual void stop()=0
Closes the network interface, releasing the master context.
virtual std::expected< void, std::string > writeSii(uint16_t, std::span< const uint8_t >)
Writes a raw SII (EEPROM) image to a slave.
Definition fieldbus_driver.h:721
virtual int exchangeProcessData(std::span< const uint8_t > outputs, std::span< uint8_t > inputs)=0
Exchanges one cycle of process data: sends outputs, receives into inputs.
std::mutex controlPlaneMutex_
Definition fieldbus_driver.h:877
virtual std::vector< SlaveConfig > busConfig() const
Returns the static ESC configuration of every slave, as last programmed by the master.
Definition fieldbus_driver.h:492
virtual std::expected< std::vector< uint8_t >, std::string > readSdoComplete(uint16_t, uint16_t)
Reads an entire object in one CoE SDO upload using Complete Access.
Definition fieldbus_driver.h:643
virtual std::expected< ProcessDataWatchdogConfig, std::string > setProcessDataWatchdog(uint16_t, std::chrono::nanoseconds)
Sets the process-data (sync-manager) watchdog timeout of one slave.
Definition fieldbus_driver.h:826
virtual std::expected< void, std::string > init()=0
Opens the network interface and initialises the master context.
virtual std::expected< int, std::string > scan()=0
Scans the bus for slaves and configures their sync managers and FMMUs.
virtual std::expected< OdRead, std::string > readObjectDictionary(uint16_t slavePosition)=0
Enumerates the entire CoE object dictionary of a slave via SDO Info.
virtual std::expected< void, FoeError > writeFile(uint16_t slavePosition, const std::string &filename, std::span< const uint8_t > data)=0
Writes a file to the slave via File over EtherCAT (FoE).
virtual std::expected< std::vector< SlaveDiagnostics >, std::string > readDiagnostics(const std::vector< uint16_t > &)
Reads live link-quality and watchdog diagnostics for each slave in positions.
Definition fieldbus_driver.h:573
virtual std::expected< ProcessDataWatchdogConfig, std::string > processDataWatchdog(uint16_t)
Reads the process-data (sync-manager) watchdog configuration of one slave.
Definition fieldbus_driver.h:800
virtual PdoLayout processDataLayout()=0
Returns the current process-data layout established by configureProcessData.
uint8_t subindex
Definition esi_entry.cc:283
Definition al_status_codes.cc:5
bool alHasError(uint16_t alStatus)
Returns whether the AL Status error indicator (bit 4 of register 0x0130) is set.
Definition fieldbus_driver.h:54
std::optional< SyncManagerConfig > decodeSyncManager(uint8_t index, std::span< const uint8_t > bytes)
Decodes a Sync Manager register block — the inverse of encodeSyncManager.
Definition fieldbus_driver.cc:20
int workingCounterContribution(EtherCatState state, bool hasOutputs, bool hasInputs)
Working-counter contribution of one slave for a given AL state and PDO presence.
Definition fieldbus_driver.h:86
constexpr uint16_t kFmmuRegisterBase
FMMU entity 0 (Table 57).
Definition fieldbus_driver.h:237
std::array< uint8_t, kSyncManagerRegisterBytes > encodeSyncManager(const SyncManagerConfig &config)
Encodes a Sync Manager as the eight bytes an FPWR to its register block carries.
Definition fieldbus_driver.cc:7
constexpr uint16_t kSyncManagerRegisterBytes
Width of one channel (Table 58).
Definition fieldbus_driver.h:236
EtherCatState
EtherCAT Application Layer state values.
Definition fieldbus_driver.h:36
@ PreOp
PRE-OPERATIONAL — mailbox communication active.
@ Op
OPERATIONAL — full PDO exchange.
@ Init
INIT — reset state, no communication.
@ Boot
BOOT — firmware download mode.
@ SafeOp
SAFE-OPERATIONAL — inputs only; outputs ignored.
std::array< uint8_t, kFmmuRegisterBytes > encodeFmmu(const FmmuConfig &config)
Encodes an FMMU as the sixteen bytes an FPWR to its register block carries.
Definition fieldbus_driver.cc:33
EtherCatState alState(uint16_t alStatus)
Extracts the AL state (bits 3:0) from a raw AL Status register value (0x0130).
Definition fieldbus_driver.h:49
constexpr std::size_t kMaxProcessImageBytes
Maximum size in bytes of the combined process-data image (all outputs + all inputs).
Definition fieldbus_driver.h:30
constexpr uint16_t kSyncManagerRegisterBase
Register block addresses and widths for the two configurations above (ETG.1000.4 §6).
Definition fieldbus_driver.h:235
std::string_view toString(EtherCatState state)
Human-readable name of an AL state, for log and error messages.
Definition fieldbus_driver.h:57
std::optional< FmmuConfig > decodeFmmu(uint8_t index, std::span< const uint8_t > bytes)
Decodes an FMMU register block — the inverse of encodeFmmu.
Definition fieldbus_driver.cc:55
constexpr uint16_t kFmmuRegisterBytes
Width of one entity (Table 56).
Definition fieldbus_driver.h:238
std::chrono::milliseconds timeout
Definition somanet_procedures.cc:438
Distributed-clock configuration for a slave.
Definition fieldbus_driver.h:275
int32_t propagationDelay
Measured propagation delay (ns).
Definition fieldbus_driver.h:278
bool active
SYNC0 generation enabled.
Definition fieldbus_driver.h:277
int32_t cycleTime
DC cycle time (ns).
Definition fieldbus_driver.h:279
bool capable
Slave has distributed-clock hardware.
Definition fieldbus_driver.h:276
int32_t shift
Shift from the cycle-modulus boundary (ns).
Definition fieldbus_driver.h:280
Live distributed-clock synchronisation status for one slave, read from its ESC.
Definition fieldbus_driver.h:351
uint16_t slavePosition
1-based bus position.
Definition fieldbus_driver.h:352
int32_t propagationDelay
System-time delay / propagation delay (0x0928), ns.
Definition fieldbus_driver.h:355
bool referenceClock
This slave is the DC reference clock (first DC-capable).
Definition fieldbus_driver.h:354
int32_t systemTimeDifference
Definition fieldbus_driver.h:356
bool dcCapable
Slave has distributed-clock hardware (cached hasdc).
Definition fieldbus_driver.h:353
One slave's AL Status and AL Status Code registers — the "where" and the "why".
Definition fieldbus_driver.h:538
uint16_t alStatusCode
AL Status Code register 0x0134: error reason; 0 when no error.
Definition fieldbus_driver.h:540
uint16_t alStatus
AL Status register 0x0130: state (bits 3:0) + error bit 4.
Definition fieldbus_driver.h:539
One FMMU's configuration as programmed on a slave's ESC.
Definition fieldbus_driver.h:197
uint8_t logicalStartBit
Start bit within the first logical byte.
Definition fieldbus_driver.h:201
uint16_t physicalStart
Physical ESC start address (ties the FMMU to a Sync Manager).
Definition fieldbus_driver.h:203
uint8_t index
FMMU number (0..3).
Definition fieldbus_driver.h:198
uint8_t logicalEndBit
End bit within the last logical byte.
Definition fieldbus_driver.h:202
uint8_t active
Non-zero when the FMMU is active.
Definition fieldbus_driver.h:206
uint16_t length
Mapped length in bytes.
Definition fieldbus_driver.h:200
uint8_t type
ESC FMMU type: 1=read (inputs/TxPDO), 2=write (outputs/RxPDO).
Definition fieldbus_driver.h:205
uint32_t logicalStart
Logical (bus-wide) start address.
Definition fieldbus_driver.h:199
uint8_t physicalStartBit
Start bit within the first physical byte.
Definition fieldbus_driver.h:204
A structured FoE failure. String-like where a caller only forwards it (operator<<,...
Definition foe_error.h:109
Mailbox configuration for a slave (the CoE/FoE/EoE/SoE transport windows).
Definition fieldbus_driver.h:210
uint8_t coeDetails
CoE details (ECT_COEDET_*: SDO/Info/PDO-Assign/Config/Upload/CA).
Definition fieldbus_driver.h:224
uint16_t readOffset
Read mailbox physical ESC offset.
Definition fieldbus_driver.h:217
uint16_t writeLength
Write (master→slave) mailbox length in bytes; 0 if no mailbox.
Definition fieldbus_driver.h:214
uint8_t soeDetails
SoE details / channel count.
Definition fieldbus_driver.h:227
uint8_t foeDetails
FoE details (bit 0 = enabled).
Definition fieldbus_driver.h:225
uint16_t protocols
Definition fieldbus_driver.h:218
uint8_t eoeDetails
EoE details (bit 0 = enabled).
Definition fieldbus_driver.h:226
uint16_t readLength
Read (slave→master) mailbox length in bytes.
Definition fieldbus_driver.h:216
static constexpr uint16_t kProtocolCoe
Supported-protocol bit for CoE within protocols (matches SOEM's ECT_MBXPROT_COE).
Definition fieldbus_driver.h:212
uint16_t writeOffset
Write mailbox physical ESC offset.
Definition fieldbus_driver.h:215
Schema of a single object dictionary entry uploaded from a slave.
Definition fieldbus_driver.h:119
std::optional< std::vector< uint8_t > > defaultValue
Raw default-value bytes, if available.
Definition fieldbus_driver.h:128
uint16_t access
ObjAccess bitfield (read/write per AL state).
Definition fieldbus_driver.h:125
std::optional< std::vector< uint8_t > > maxValue
Raw maximum-value bytes, if available.
Definition fieldbus_driver.h:130
uint16_t index
CoE object index.
Definition fieldbus_driver.h:120
std::optional< std::vector< uint8_t > > minValue
Raw minimum-value bytes, if available.
Definition fieldbus_driver.h:129
uint16_t objectCode
OTYPE_VAR / OTYPE_ARRAY / OTYPE_RECORD (ETG.1000.6 §5).
Definition fieldbus_driver.h:122
std::optional< uint32_t > unit
ETG.1004 unit code, if available.
Definition fieldbus_driver.h:127
uint8_t subindex
CoE object subindex.
Definition fieldbus_driver.h:121
uint16_t dataType
ETG.1020 data type code (e.g. 0x0007 = UNSIGNED32).
Definition fieldbus_driver.h:123
std::string name
Textual description.
Definition fieldbus_driver.h:126
uint16_t bitLength
Bit length of the entry.
Definition fieldbus_driver.h:124
One device's object dictionary as read from the bus, and what the read did not get.
Definition fieldbus_driver.h:144
int missingEntries
Entries asked for and never answered. Above zero, do not cache.
Definition fieldbus_driver.h:146
std::vector< OdEntry > entries
One per (index, subindex) pair the device answered for.
Definition fieldbus_driver.h:145
Layout of the process-data images, produced by configureProcessData.
Definition fieldbus_driver.h:173
int expectedWkc
Working counter when every slave exchanges (outputs×2 + inputs).
Definition fieldbus_driver.h:177
std::vector< SlaveIo > slaves
Per-slave windows, in bus order.
Definition fieldbus_driver.h:176
uint32_t inputBytes
Size of the input image (slave→master).
Definition fieldbus_driver.h:175
uint32_t outputBytes
Size of the output image (master→slave).
Definition fieldbus_driver.h:174
Per-port link state and error counters decoded from a slave's ESC.
Definition fieldbus_driver.h:308
bool loopClosed
Loop closed on this port (no downstream slave, or port disabled).
Definition fieldbus_driver.h:310
bool communication
Stable communication established on this port (DL Status).
Definition fieldbus_driver.h:311
bool linkUp
Physical link detected on this port (DL Status link bit).
Definition fieldbus_driver.h:309
uint8_t lostLink
Lost-link counter: link-down events on this port (0x0310+).
Definition fieldbus_driver.h:316
uint8_t forwardedError
Definition fieldbus_driver.h:314
uint8_t rxError
Physical-layer RX error counter: RX_ER from the PHY (0x0301+).
Definition fieldbus_driver.h:313
uint8_t invalidFrame
Invalid-frame counter: frames with a bad FCS/structure (0x0300+).
Definition fieldbus_driver.h:312
Process-data (sync-manager) watchdog configuration of one slave.
Definition fieldbus_driver.h:370
std::chrono::nanoseconds timeout
Decoded timeout: ticks × 40 ns × (divider + 2).
Definition fieldbus_driver.h:374
uint16_t divider
Raw 0x0400 divider (shared with the PDI watchdog).
Definition fieldbus_driver.h:375
uint16_t ticks
Raw 0x0420 process-data watchdog time register.
Definition fieldbus_driver.h:376
bool enabled
False when the time register (0x0420) is zero.
Definition fieldbus_driver.h:371
bool running
Definition fieldbus_driver.h:372
Static ESC configuration snapshot for one slave, captured by configureProcessData.
Definition fieldbus_driver.h:289
uint16_t configuredAddress
Station (configured) address assigned during scan.
Definition fieldbus_driver.h:291
std::vector< FmmuConfig > fmmus
Configured FMMUs, by index.
Definition fieldbus_driver.h:298
std::vector< SyncManagerConfig > syncManagers
Configured Sync Managers, by index.
Definition fieldbus_driver.h:297
uint16_t aliasAddress
Configured station alias from EEPROM.
Definition fieldbus_driver.h:292
uint16_t outputBits
Mapped output (master→slave) bits.
Definition fieldbus_driver.h:293
DcConfig dc
Distributed-clock configuration.
Definition fieldbus_driver.h:296
MailboxConfig mailbox
Mailbox transport windows + advertised protocol details.
Definition fieldbus_driver.h:295
uint16_t inputBits
Mapped input (slave→master) bits.
Definition fieldbus_driver.h:294
uint16_t slavePosition
1-based bus position.
Definition fieldbus_driver.h:290
Decoded health diagnostics for one slave, read live from its ESC registers.
Definition fieldbus_driver.h:326
uint8_t pdiError
Definition fieldbus_driver.h:331
uint16_t slavePosition
1-based bus position.
Definition fieldbus_driver.h:327
uint8_t processingUnitError
Definition fieldbus_driver.h:329
std::array< PortDiagnostics, 4 > ports
Per-port link state and error counters (ports 0–3).
Definition fieldbus_driver.h:328
uint8_t processDataWatchdog
Definition fieldbus_driver.h:333
uint8_t pdiWatchdog
PDI watchdog expirations (0x0443).
Definition fieldbus_driver.h:335
Immutable identity fields read from a slave's EEPROM during configuration.
Definition fieldbus_driver.h:98
std::string name
Human-readable name from SII.
Definition fieldbus_driver.h:99
uint32_t revisionNumber
Revision number.
Definition fieldbus_driver.h:102
uint32_t productCode
Product code (EEprom ID field).
Definition fieldbus_driver.h:101
uint32_t vendorId
Vendor ID (EEprom manufacturer field).
Definition fieldbus_driver.h:100
uint32_t serialNumber
Serial number.
Definition fieldbus_driver.h:103
One slave's input and output windows within the process-data images.
Definition fieldbus_driver.h:155
uint32_t inputOffset
Byte offset of this slave's inputs within the input image.
Definition fieldbus_driver.h:159
uint32_t inputBytes
Input byte count for this slave.
Definition fieldbus_driver.h:160
uint16_t slavePosition
1-based bus position.
Definition fieldbus_driver.h:156
uint32_t outputBytes
Output byte count for this slave.
Definition fieldbus_driver.h:158
uint32_t outputOffset
Byte offset of this slave's outputs within the output image.
Definition fieldbus_driver.h:157
One Sync Manager's configuration as programmed on a slave's ESC.
Definition fieldbus_driver.h:184
uint32_t flags
Raw SM control/flags register (buffer mode, direction, watchdog).
Definition fieldbus_driver.h:188
uint16_t length
Length of the guarded window in bytes.
Definition fieldbus_driver.h:187
uint8_t type
0=unused, 1=MbxOut, 2=MbxIn, 3=Outputs, 4=Inputs.
Definition fieldbus_driver.h:189
uint16_t physicalStart
Physical ESC memory start address the SM guards.
Definition fieldbus_driver.h:186
uint8_t index
SM number (0..7).
Definition fieldbus_driver.h:185