52inline bool alHasError(uint16_t alStatus) {
return (alStatus & 0x0010u) != 0; }
87 return (hasOutputs ? 2 : 0) + (hasInputs ? 1 : 0);
89 return hasInputs ? 1 : 0;
267 std::array<PortDiagnostics, 4>
ports;
352 virtual std::expected<void, std::string>
init() = 0;
361 virtual std::expected<int, std::string>
scan() = 0;
412 virtual std::vector<SlaveConfig>
busConfig()
const {
return {}; }
474 virtual std::expected<std::vector<SlaveStateRaw>, std::string>
readStates(
475 const std::vector<uint16_t>& positions) = 0;
494 const std::vector<uint16_t>& ) {
495 return std::unexpected(
"diagnostics not supported by this transport");
516 virtual std::expected<std::vector<DcSyncDiagnostics>, std::string>
readDcSync(
517 const std::vector<uint16_t>& ) {
518 return std::unexpected(
"distributed-clock diagnostics not supported by this transport");
542 virtual std::expected<std::vector<uint8_t>, std::string>
readSdo(uint16_t slavePosition,
544 uint8_t subindex) = 0;
564 uint16_t , uint16_t ) {
565 return std::unexpected(
"complete access not supported by this driver");
581 virtual std::expected<void, std::string>
writeSdo(uint16_t slavePosition, uint16_t index,
583 std::span<const uint8_t> data) = 0;
598 uint16_t slavePosition) = 0;
617 virtual std::expected<std::vector<uint8_t>, std::string>
readSii(uint16_t ) {
618 return std::unexpected(
"SII (EEPROM) read not supported by this transport");
638 virtual std::expected<void, std::string>
writeSii(uint16_t ,
639 std::span<const uint8_t> ) {
640 return std::unexpected(
"SII (EEPROM) write not supported by this transport");
654 virtual std::expected<std::vector<uint8_t>, std::string>
readFile(
655 uint16_t slavePosition,
const std::string& filename) = 0;
669 virtual std::expected<void, std::string>
writeFile(uint16_t slavePosition,
670 const std::string& filename,
671 std::span<const uint8_t> data) = 0;
683 virtual std::expected<void, std::string>
readRegister(uint16_t slavePosition, uint16_t address,
684 std::span<uint8_t> data) = 0;
696 virtual std::expected<void, std::string>
writeRegister(uint16_t slavePosition, uint16_t address,
697 std::span<const uint8_t> data) = 0;
716 return std::unexpected(
"process-data watchdog not supported by this transport");
741 uint16_t , std::chrono::nanoseconds ) {
742 return std::unexpected(
"process-data watchdog not supported by this transport");
768 const std::vector<uint16_t>& positions, std::optional<EtherCatState> requiredState,
769 EtherCatState targetState, std::chrono::steady_clock::duration timeout,
770 std::chrono::steady_clock::duration resendInterval = std::chrono::seconds(2),
771 std::function<
void()> tick =
nullptr, std::function<
bool()> shouldAbort =
nullptr) = 0;
Abstract interface for an EtherCAT fieldbus driver.
Definition fieldbus_driver.h:343
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:617
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 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:516
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:638
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.
virtual std::expected< void, std::string > 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).
std::mutex controlPlaneMutex_
Definition fieldbus_driver.h:791
virtual std::vector< SlaveConfig > busConfig() const
Returns the static ESC configuration of every slave, as last programmed by the master.
Definition fieldbus_driver.h:412
virtual std::expected< std::vector< uint8_t >, std::string > readFile(uint16_t slavePosition, const std::string &filename)=0
Reads a file from the slave via File over EtherCAT (FoE).
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:563
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:740
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< std::vector< OdEntry >, std::string > readObjectDictionary(uint16_t slavePosition)=0
Enumerates the entire CoE object dictionary of a slave via SDO Info.
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:493
virtual std::expected< ProcessDataWatchdogConfig, std::string > processDataWatchdog(uint16_t)
Reads the process-data (sync-manager) watchdog configuration of one slave.
Definition fieldbus_driver.h:714
virtual PdoLayout processDataLayout()=0
Returns the current process-data layout established by configureProcessData.
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:52
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:84
EtherCatState
EtherCAT Application Layer state values.
Definition fieldbus_driver.h:34
@ 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.
EtherCatState alState(uint16_t alStatus)
Extracts the AL state (bits 3:0) from a raw AL Status register value (0x0130).
Definition fieldbus_driver.h:47
constexpr std::size_t kMaxProcessImageBytes
Maximum size in bytes of the combined process-data image (all outputs + all inputs).
Definition fieldbus_driver.h:28
std::string_view toString(EtherCatState state)
Human-readable name of an AL state, for log and error messages.
Definition fieldbus_driver.h:55
Distributed-clock configuration for a slave.
Definition fieldbus_driver.h:214
int32_t propagationDelay
Measured propagation delay (ns).
Definition fieldbus_driver.h:217
bool active
SYNC0 generation enabled.
Definition fieldbus_driver.h:216
int32_t cycleTime
DC cycle time (ns).
Definition fieldbus_driver.h:218
bool capable
Slave has distributed-clock hardware.
Definition fieldbus_driver.h:215
int32_t shift
Shift from the cycle-modulus boundary (ns).
Definition fieldbus_driver.h:219
Live distributed-clock synchronisation status for one slave, read from its ESC.
Definition fieldbus_driver.h:290
uint16_t slavePosition
1-based bus position.
Definition fieldbus_driver.h:291
int32_t propagationDelay
System-time delay / propagation delay (0x0928), ns.
Definition fieldbus_driver.h:294
bool referenceClock
This slave is the DC reference clock (first DC-capable).
Definition fieldbus_driver.h:293
int32_t systemTimeDifference
Definition fieldbus_driver.h:295
bool dcCapable
Slave has distributed-clock hardware (cached hasdc).
Definition fieldbus_driver.h:292
One slave's AL Status and AL Status Code registers — the "where" and the "why".
Definition fieldbus_driver.h:458
uint16_t alStatusCode
AL Status Code register 0x0134: error reason; 0 when no error.
Definition fieldbus_driver.h:460
uint16_t alStatus
AL Status register 0x0130: state (bits 3:0) + error bit 4.
Definition fieldbus_driver.h:459
One FMMU's configuration as programmed on a slave's ESC.
Definition fieldbus_driver.h:179
uint8_t logicalStartBit
Start bit within the first logical byte.
Definition fieldbus_driver.h:183
uint16_t physicalStart
Physical ESC start address (ties the FMMU to a Sync Manager).
Definition fieldbus_driver.h:185
uint8_t index
FMMU number (0..3).
Definition fieldbus_driver.h:180
uint8_t logicalEndBit
End bit within the last logical byte.
Definition fieldbus_driver.h:184
uint8_t active
Non-zero when the FMMU is active.
Definition fieldbus_driver.h:188
uint16_t length
Mapped length in bytes.
Definition fieldbus_driver.h:182
uint8_t type
ESC FMMU type: 1=read (inputs/TxPDO), 2=write (outputs/RxPDO).
Definition fieldbus_driver.h:187
uint32_t logicalStart
Logical (bus-wide) start address.
Definition fieldbus_driver.h:181
uint8_t physicalStartBit
Start bit within the first physical byte.
Definition fieldbus_driver.h:186
Mailbox configuration for a slave (the CoE/FoE/EoE/SoE transport windows).
Definition fieldbus_driver.h:192
uint8_t coeDetails
CoE details (ECT_COEDET_*: SDO/Info/PDO-Assign/Config/Upload/CA).
Definition fieldbus_driver.h:203
uint16_t readOffset
Read mailbox physical ESC offset.
Definition fieldbus_driver.h:196
uint16_t writeLength
Write (master→slave) mailbox length in bytes; 0 if no mailbox.
Definition fieldbus_driver.h:193
uint8_t soeDetails
SoE details / channel count.
Definition fieldbus_driver.h:206
uint8_t foeDetails
FoE details (bit 0 = enabled).
Definition fieldbus_driver.h:204
uint16_t protocols
Definition fieldbus_driver.h:197
uint8_t eoeDetails
EoE details (bit 0 = enabled).
Definition fieldbus_driver.h:205
uint16_t readLength
Read (slave→master) mailbox length in bytes.
Definition fieldbus_driver.h:195
uint16_t writeOffset
Write mailbox physical ESC offset.
Definition fieldbus_driver.h:194
Schema of a single object dictionary entry uploaded from a slave.
Definition fieldbus_driver.h:117
std::optional< std::vector< uint8_t > > defaultValue
Raw default-value bytes, if available.
Definition fieldbus_driver.h:126
uint16_t access
ObjAccess bitfield (read/write per AL state).
Definition fieldbus_driver.h:123
std::optional< std::vector< uint8_t > > maxValue
Raw maximum-value bytes, if available.
Definition fieldbus_driver.h:128
uint16_t index
CoE object index.
Definition fieldbus_driver.h:118
std::optional< std::vector< uint8_t > > minValue
Raw minimum-value bytes, if available.
Definition fieldbus_driver.h:127
uint16_t objectCode
OTYPE_VAR / OTYPE_ARRAY / OTYPE_RECORD (ETG.1000.6 §5).
Definition fieldbus_driver.h:120
std::optional< uint32_t > unit
ETG.1004 unit code, if available.
Definition fieldbus_driver.h:125
uint8_t subindex
CoE object subindex.
Definition fieldbus_driver.h:119
uint16_t dataType
ETG.1020 data type code (e.g. 0x0007 = UNSIGNED32).
Definition fieldbus_driver.h:121
std::string name
Textual description.
Definition fieldbus_driver.h:124
uint16_t bitLength
Bit length of the entry.
Definition fieldbus_driver.h:122
Layout of the process-data images, produced by configureProcessData.
Definition fieldbus_driver.h:155
int expectedWkc
Working counter when every slave exchanges (outputs×2 + inputs).
Definition fieldbus_driver.h:159
std::vector< SlaveIo > slaves
Per-slave windows, in bus order.
Definition fieldbus_driver.h:158
uint32_t inputBytes
Size of the input image (slave→master).
Definition fieldbus_driver.h:157
uint32_t outputBytes
Size of the output image (master→slave).
Definition fieldbus_driver.h:156
Per-port link state and error counters decoded from a slave's ESC.
Definition fieldbus_driver.h:247
bool loopClosed
Loop closed on this port (no downstream slave, or port disabled).
Definition fieldbus_driver.h:249
bool communication
Stable communication established on this port (DL Status).
Definition fieldbus_driver.h:250
bool linkUp
Physical link detected on this port (DL Status link bit).
Definition fieldbus_driver.h:248
uint8_t lostLink
Lost-link counter: link-down events on this port (0x0310+).
Definition fieldbus_driver.h:255
uint8_t forwardedError
Definition fieldbus_driver.h:253
uint8_t rxError
Physical-layer RX error counter: RX_ER from the PHY (0x0301+).
Definition fieldbus_driver.h:252
uint8_t invalidFrame
Invalid-frame counter: frames with a bad FCS/structure (0x0300+).
Definition fieldbus_driver.h:251
Process-data (sync-manager) watchdog configuration of one slave.
Definition fieldbus_driver.h:309
std::chrono::nanoseconds timeout
Decoded timeout: ticks × 40 ns × (divider + 2).
Definition fieldbus_driver.h:313
uint16_t divider
Raw 0x0400 divider (shared with the PDI watchdog).
Definition fieldbus_driver.h:314
uint16_t ticks
Raw 0x0420 process-data watchdog time register.
Definition fieldbus_driver.h:315
bool enabled
False when the time register (0x0420) is zero.
Definition fieldbus_driver.h:310
bool running
Definition fieldbus_driver.h:311
Static ESC configuration snapshot for one slave, captured by configureProcessData.
Definition fieldbus_driver.h:228
uint16_t configuredAddress
Station (configured) address assigned during scan.
Definition fieldbus_driver.h:230
std::vector< FmmuConfig > fmmus
Configured FMMUs, by index.
Definition fieldbus_driver.h:237
std::vector< SyncManagerConfig > syncManagers
Configured Sync Managers, by index.
Definition fieldbus_driver.h:236
uint16_t aliasAddress
Configured station alias from EEPROM.
Definition fieldbus_driver.h:231
uint16_t outputBits
Mapped output (master→slave) bits.
Definition fieldbus_driver.h:232
DcConfig dc
Distributed-clock configuration.
Definition fieldbus_driver.h:235
MailboxConfig mailbox
Mailbox transport windows + advertised protocol details.
Definition fieldbus_driver.h:234
uint16_t inputBits
Mapped input (slave→master) bits.
Definition fieldbus_driver.h:233
uint16_t slavePosition
1-based bus position.
Definition fieldbus_driver.h:229
Decoded health diagnostics for one slave, read live from its ESC registers.
Definition fieldbus_driver.h:265
uint8_t pdiError
Definition fieldbus_driver.h:270
uint16_t slavePosition
1-based bus position.
Definition fieldbus_driver.h:266
uint8_t processingUnitError
Definition fieldbus_driver.h:268
std::array< PortDiagnostics, 4 > ports
Per-port link state and error counters (ports 0–3).
Definition fieldbus_driver.h:267
uint8_t processDataWatchdog
Definition fieldbus_driver.h:272
uint8_t pdiWatchdog
PDI watchdog expirations (0x0443).
Definition fieldbus_driver.h:274
Immutable identity fields read from a slave's EEPROM during configuration.
Definition fieldbus_driver.h:96
std::string name
Human-readable name from SII.
Definition fieldbus_driver.h:97
uint32_t revisionNumber
Revision number.
Definition fieldbus_driver.h:100
uint32_t productCode
Product code (EEprom ID field).
Definition fieldbus_driver.h:99
uint32_t vendorId
Vendor ID (EEprom manufacturer field).
Definition fieldbus_driver.h:98
uint32_t serialNumber
Serial number.
Definition fieldbus_driver.h:101
One slave's input and output windows within the process-data images.
Definition fieldbus_driver.h:137
uint32_t inputOffset
Byte offset of this slave's inputs within the input image.
Definition fieldbus_driver.h:141
uint32_t inputBytes
Input byte count for this slave.
Definition fieldbus_driver.h:142
uint16_t slavePosition
1-based bus position.
Definition fieldbus_driver.h:138
uint32_t outputBytes
Output byte count for this slave.
Definition fieldbus_driver.h:140
uint32_t outputOffset
Byte offset of this slave's outputs within the output image.
Definition fieldbus_driver.h:139
One Sync Manager's configuration as programmed on a slave's ESC.
Definition fieldbus_driver.h:166
uint32_t flags
Raw SM control/flags register (buffer mode, direction, watchdog).
Definition fieldbus_driver.h:170
uint16_t length
Length of the guarded window in bytes.
Definition fieldbus_driver.h:169
uint8_t type
0=unused, 1=MbxOut, 2=MbxIn, 3=Outputs, 4=Inputs.
Definition fieldbus_driver.h:171
uint16_t physicalStart
Physical ESC memory start address the SM guards.
Definition fieldbus_driver.h:168
uint8_t index
SM number (0..7).
Definition fieldbus_driver.h:167