63inline bool alHasError(uint16_t alStatus) {
return (alStatus & 0x0010u) != 0; }
99 switch (reachability) {
103 return "addressLost";
105 return "notAnswering";
107 return "notAnswering";
138 return (hasOutputs ? 2 : 0) + (hasInputs ? 1 : 0);
336std::optional<FmmuConfig>
decodeFmmu(uint8_t index, std::span<const uint8_t>
bytes);
396 std::array<PortDiagnostics, 4>
ports;
483 virtual std::expected<void, std::string>
init() = 0;
492 virtual std::expected<int, std::string>
scan() = 0;
562 virtual std::vector<SlaveConfig>
busConfig()
const {
return {}; }
628 virtual std::expected<std::vector<SlaveStateRaw>, std::string>
readStates(
629 const std::vector<uint16_t>& positions) = 0;
654 const std::vector<uint16_t>& ) {
655 return std::unexpected(
"diagnostics not supported by this transport");
676 virtual std::expected<std::vector<DcSyncDiagnostics>, std::string>
readDcSync(
677 const std::vector<uint16_t>& ) {
678 return std::unexpected(
"distributed-clock diagnostics not supported by this transport");
702 virtual std::expected<std::vector<uint8_t>, std::string>
readSdo(uint16_t slavePosition,
724 uint16_t , uint16_t ) {
725 return std::unexpected(
"complete access not supported by this driver");
741 virtual std::expected<void, std::string>
writeSdo(uint16_t slavePosition, uint16_t index,
743 std::span<const uint8_t> data) = 0;
780 virtual std::expected<std::vector<uint8_t>, std::string>
readSii(uint16_t ) {
781 return std::unexpected(
"SII (EEPROM) read not supported by this transport");
801 virtual std::expected<void, std::string>
writeSii(uint16_t ,
802 std::span<const uint8_t> ) {
803 return std::unexpected(
"SII (EEPROM) write not supported by this transport");
825 uint16_t slavePosition,
const std::string& filename, std::chrono::milliseconds
timeout) = 0;
839 virtual std::expected<void, FoeError>
writeFile(uint16_t slavePosition,
840 const std::string& filename,
841 std::span<const uint8_t> data) = 0;
853 virtual std::expected<void, std::string>
readRegister(uint16_t slavePosition, uint16_t address,
854 std::span<uint8_t> data) = 0;
866 virtual std::expected<void, std::string>
writeRegister(uint16_t slavePosition, uint16_t address,
867 std::span<const uint8_t> data) = 0;
886 return std::unexpected(
"process-data watchdog not supported by this transport");
911 uint16_t , std::chrono::nanoseconds ) {
912 return std::unexpected(
"process-data watchdog not supported by this transport");
942 const std::vector<uint16_t>& positions, std::optional<EtherCatState> requiredState,
944 std::chrono::steady_clock::duration resendInterval = std::chrono::seconds(2),
945 std::function<
void()> tick =
nullptr, std::function<
bool()> shouldAbort =
nullptr) = 0;
959 virtual std::string
adapter()
const {
return {}; }
971 virtual std::expected<void, std::string>
locate(uint16_t ,
bool ) {
972 return std::unexpected(
"device locate not supported by this transport");
989 uint16_t , std::chrono::steady_clock::duration ) {
Abstract interface for an EtherCAT fieldbus driver.
Definition fieldbus_driver.h:474
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:780
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::optional< int > readDevicesOnWire()
Counts the devices on the wire, or returns nothing when the transport cannot.
Definition fieldbus_driver.h:635
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 std::expected< FirmwareActivation, std::string > activateFirmware(uint16_t, std::chrono::steady_clock::duration)
Makes a device apply the firmware files written to it in BOOT.
Definition fieldbus_driver.h:988
virtual bool supportsEsc() const
True when the devices have an EtherCAT Slave Controller: SII, ESC registers, DC and the ESC diagnosti...
Definition fieldbus_driver.h:952
virtual std::string adapter() const
The network adapter the bus is on, as the OS names it, or empty for a transport that sends no EtherCA...
Definition fieldbus_driver.h:959
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 std::expected< std::vector< uint8_t >, FoeError > readFile(uint16_t slavePosition, const std::string &filename, std::chrono::milliseconds timeout)=0
Reads a file from the slave via File over EtherCAT (FoE).
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 uint64_t droppedInputFrames() const
Input frames dropped since the process data was configured, summed over all devices.
Definition fieldbus_driver.h:965
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:676
virtual uint16_t mailboxProtocols(uint16_t) const
Returns the slave's advertised mailbox-protocol bits without any bus I/O.
Definition fieldbus_driver.h:523
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 bool supportsLocate() const
True when locate can blink a device's LEDs. No bus I/O.
Definition fieldbus_driver.h:968
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:801
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::vector< SlaveConfig > busConfig() const
Returns the static ESC configuration of every slave, as last programmed by the master.
Definition fieldbus_driver.h:562
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:723
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:910
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::optional< std::string > stateChangeRefusal() const
Returns why this driver refuses every state change, or nullopt when it accepts them.
Definition fieldbus_driver.h:998
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).
FirmwareActivation
What activateFirmware did.
Definition fieldbus_driver.h:976
@ kRestarted
The device restarted into the new firmware and answers again.
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:653
virtual std::expected< ProcessDataWatchdogConfig, std::string > processDataWatchdog(uint16_t)
Reads the process-data (sync-manager) watchdog configuration of one slave.
Definition fieldbus_driver.h:884
virtual PdoLayout processDataLayout()=0
Returns the current process-data layout established by configureProcessData.
virtual std::expected< void, std::string > locate(uint16_t, bool)
Starts or stops blinking the LEDs of a device, so that someone can find it.
Definition fieldbus_driver.h:971
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:63
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
constexpr uint16_t kFmmuRegisterBase
FMMU entity 0 (Table 57).
Definition fieldbus_driver.h:305
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:304
EtherCatState
EtherCAT Application Layer state values.
Definition fieldbus_driver.h:45
@ 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 — outputs are received but not applied.
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
Reachability
Whether a slave answers at the station address the master gave it.
Definition fieldbus_driver.h:91
@ Answering
It answers at its configured station address.
@ AddressLost
It answers at its wire position only. A scan gives it an address again.
@ NotAnswering
Nothing answers at its address or at its wire position.
EtherCatState alState(uint16_t alStatus)
Extracts the AL state (bits 3:0) from a raw AL Status register value (0x0130).
Definition fieldbus_driver.h:58
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:303
bool exchangesProcessData(uint16_t alStatus)
Returns whether a slave with this AL status exchanges process data: SAFE-OP or OP,...
Definition fieldbus_driver.h:153
int workingCounterContribution(uint16_t alStatus, bool hasOutputs, bool hasInputs)
Working-counter contribution of one slave for a given AL status and PDO presence.
Definition fieldbus_driver.h:131
constexpr std::chrono::milliseconds kFoeReadTimeout
How long a file read waits for the slave's answer, unless the caller asks for longer.
Definition fieldbus_driver.h:39
std::string_view toString(EtherCatState state)
Human-readable name of an AL state, for log and error messages.
Definition fieldbus_driver.h:66
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:306
std::chrono::milliseconds timeout
Definition somanet_procedures.cc:464
std::size_t bytes
Definition spoe_connection.cc:24
Distributed-clock configuration for a slave.
Definition fieldbus_driver.h:343
int32_t propagationDelay
Measured propagation delay (ns).
Definition fieldbus_driver.h:346
bool active
SYNC0 generation enabled.
Definition fieldbus_driver.h:345
int32_t cycleTime
DC cycle time (ns).
Definition fieldbus_driver.h:347
bool capable
Slave has distributed-clock hardware.
Definition fieldbus_driver.h:344
int32_t shift
Shift from the cycle-modulus boundary (ns).
Definition fieldbus_driver.h:348
Live distributed-clock synchronisation status for one slave, read from its ESC.
Definition fieldbus_driver.h:419
uint16_t slavePosition
1-based bus position.
Definition fieldbus_driver.h:420
int32_t propagationDelay
System-time delay / propagation delay (0x0928), ns.
Definition fieldbus_driver.h:423
bool referenceClock
This slave is the DC reference clock (first DC-capable).
Definition fieldbus_driver.h:422
int32_t systemTimeDifference
Definition fieldbus_driver.h:424
bool dcCapable
Slave has distributed-clock hardware (cached hasdc).
Definition fieldbus_driver.h:421
One slave's AL Status and AL Status Code registers — the "where" and the "why".
Definition fieldbus_driver.h:608
Reachability reachability
Whether the two values are live.
Definition fieldbus_driver.h:611
uint16_t alStatusCode
AL Status Code register 0x0134: error reason; 0 when no error.
Definition fieldbus_driver.h:610
uint16_t alStatus
AL Status register 0x0130: state (bits 3:0) + error bit 4.
Definition fieldbus_driver.h:609
One FMMU's configuration as programmed on a slave's ESC.
Definition fieldbus_driver.h:265
uint8_t logicalStartBit
Start bit within the first logical byte.
Definition fieldbus_driver.h:269
uint16_t physicalStart
Physical ESC start address (ties the FMMU to a Sync Manager).
Definition fieldbus_driver.h:271
uint8_t index
FMMU number (0..3).
Definition fieldbus_driver.h:266
uint8_t logicalEndBit
End bit within the last logical byte.
Definition fieldbus_driver.h:270
uint8_t active
Non-zero when the FMMU is active.
Definition fieldbus_driver.h:274
uint16_t length
Mapped length in bytes.
Definition fieldbus_driver.h:268
uint8_t type
ESC FMMU type: 1=read (inputs/TxPDO), 2=write (outputs/RxPDO).
Definition fieldbus_driver.h:273
uint32_t logicalStart
Logical (bus-wide) start address.
Definition fieldbus_driver.h:267
uint8_t physicalStartBit
Start bit within the first physical byte.
Definition fieldbus_driver.h:272
A structured FoE failure. String-like where a caller only forwards it (operator<<,...
Definition foe_error.h:110
Mailbox configuration for a slave (the CoE/FoE/EoE/SoE transport windows).
Definition fieldbus_driver.h:278
uint8_t coeDetails
CoE details (ECT_COEDET_*: SDO/Info/PDO-Assign/Config/Upload/CA).
Definition fieldbus_driver.h:292
uint16_t readOffset
Read mailbox physical ESC offset.
Definition fieldbus_driver.h:285
uint16_t writeLength
Write (master→slave) mailbox length in bytes; 0 if no mailbox.
Definition fieldbus_driver.h:282
uint8_t soeDetails
SoE details / channel count.
Definition fieldbus_driver.h:295
uint8_t foeDetails
FoE details (bit 0 = enabled).
Definition fieldbus_driver.h:293
uint16_t protocols
Definition fieldbus_driver.h:286
uint8_t eoeDetails
EoE details (bit 0 = enabled).
Definition fieldbus_driver.h:294
uint16_t readLength
Read (slave→master) mailbox length in bytes.
Definition fieldbus_driver.h:284
static constexpr uint16_t kProtocolCoe
Supported-protocol bit for CoE within protocols (matches SOEM's ECT_MBXPROT_COE).
Definition fieldbus_driver.h:280
uint16_t writeOffset
Write mailbox physical ESC offset.
Definition fieldbus_driver.h:283
Schema of a single object dictionary entry uploaded from a slave.
Definition fieldbus_driver.h:187
std::optional< std::vector< uint8_t > > defaultValue
Raw default-value bytes, if available.
Definition fieldbus_driver.h:196
uint16_t access
ObjAccess bitfield (read/write per AL state).
Definition fieldbus_driver.h:193
std::optional< std::vector< uint8_t > > maxValue
Raw maximum-value bytes, if available.
Definition fieldbus_driver.h:198
uint16_t index
CoE object index.
Definition fieldbus_driver.h:188
std::optional< std::vector< uint8_t > > minValue
Raw minimum-value bytes, if available.
Definition fieldbus_driver.h:197
uint16_t objectCode
OTYPE_VAR / OTYPE_ARRAY / OTYPE_RECORD (ETG.1000.6 §5).
Definition fieldbus_driver.h:190
std::optional< uint32_t > unit
ETG.1004 unit code, if available.
Definition fieldbus_driver.h:195
uint8_t subindex
CoE object subindex.
Definition fieldbus_driver.h:189
uint16_t dataType
ETG.1020 data type code (e.g. 0x0007 = UNSIGNED32).
Definition fieldbus_driver.h:191
std::string name
Textual description.
Definition fieldbus_driver.h:194
uint16_t bitLength
Bit length of the entry.
Definition fieldbus_driver.h:192
One device's object dictionary as read from the bus, and what the read did not get.
Definition fieldbus_driver.h:212
int missingEntries
Entries asked for and never answered. Above zero, do not cache.
Definition fieldbus_driver.h:214
std::vector< OdEntry > entries
One per (index, subindex) pair the device answered for.
Definition fieldbus_driver.h:213
Layout of the process-data images, produced by configureProcessData.
Definition fieldbus_driver.h:241
int expectedWkc
Working counter when every slave exchanges (outputs×2 + inputs).
Definition fieldbus_driver.h:245
std::vector< SlaveIo > slaves
Per-slave windows, in bus order.
Definition fieldbus_driver.h:244
uint32_t inputBytes
Size of the input image (slave→master).
Definition fieldbus_driver.h:243
uint32_t outputBytes
Size of the output image (master→slave).
Definition fieldbus_driver.h:242
Per-port link state and error counters decoded from a slave's ESC.
Definition fieldbus_driver.h:376
bool loopClosed
Loop closed on this port (no downstream slave, or port disabled).
Definition fieldbus_driver.h:378
bool communication
Stable communication established on this port (DL Status).
Definition fieldbus_driver.h:379
bool linkUp
Physical link detected on this port (DL Status link bit).
Definition fieldbus_driver.h:377
uint8_t lostLink
Lost-link counter: link-down events on this port (0x0310+).
Definition fieldbus_driver.h:384
uint8_t forwardedError
Definition fieldbus_driver.h:382
uint8_t rxError
Physical-layer RX error counter: RX_ER from the PHY (0x0301+).
Definition fieldbus_driver.h:381
uint8_t invalidFrame
Invalid-frame counter: frames with a bad FCS/structure (0x0300+).
Definition fieldbus_driver.h:380
Process-data (sync-manager) watchdog configuration of one slave.
Definition fieldbus_driver.h:438
std::chrono::nanoseconds timeout
Decoded timeout: ticks × 40 ns × (divider + 2).
Definition fieldbus_driver.h:442
uint16_t divider
Raw 0x0400 divider (shared with the PDI watchdog).
Definition fieldbus_driver.h:443
uint16_t ticks
Raw 0x0420 process-data watchdog time register.
Definition fieldbus_driver.h:444
bool enabled
False when the time register (0x0420) is zero.
Definition fieldbus_driver.h:439
bool running
Definition fieldbus_driver.h:440
Static ESC configuration snapshot for one slave, captured by configureProcessData.
Definition fieldbus_driver.h:357
uint16_t configuredAddress
Station (configured) address assigned during scan.
Definition fieldbus_driver.h:359
std::vector< FmmuConfig > fmmus
Configured FMMUs, by index.
Definition fieldbus_driver.h:366
std::vector< SyncManagerConfig > syncManagers
Configured Sync Managers, by index.
Definition fieldbus_driver.h:365
uint16_t aliasAddress
Configured station alias from EEPROM.
Definition fieldbus_driver.h:360
uint16_t outputBits
Mapped output (master→slave) bits.
Definition fieldbus_driver.h:361
DcConfig dc
Distributed-clock configuration.
Definition fieldbus_driver.h:364
MailboxConfig mailbox
Mailbox transport windows + advertised protocol details.
Definition fieldbus_driver.h:363
uint16_t inputBits
Mapped input (slave→master) bits.
Definition fieldbus_driver.h:362
uint16_t slavePosition
1-based bus position.
Definition fieldbus_driver.h:358
Decoded health diagnostics for one slave, read live from its ESC registers.
Definition fieldbus_driver.h:394
uint8_t pdiError
Definition fieldbus_driver.h:399
uint16_t slavePosition
1-based bus position.
Definition fieldbus_driver.h:395
uint8_t processingUnitError
Definition fieldbus_driver.h:397
std::array< PortDiagnostics, 4 > ports
Per-port link state and error counters (ports 0–3).
Definition fieldbus_driver.h:396
uint8_t processDataWatchdog
Definition fieldbus_driver.h:401
uint8_t pdiWatchdog
PDI watchdog expirations (0x0443).
Definition fieldbus_driver.h:403
Immutable identity fields read from a slave's EEPROM during configuration.
Definition fieldbus_driver.h:159
std::string name
Human-readable name from SII.
Definition fieldbus_driver.h:160
bool mailboxWriteOnce
Definition fieldbus_driver.h:171
uint32_t revisionNumber
Revision number.
Definition fieldbus_driver.h:163
uint32_t productCode
Product code (EEprom ID field).
Definition fieldbus_driver.h:162
uint32_t vendorId
Vendor ID (EEprom manufacturer field).
Definition fieldbus_driver.h:161
uint32_t serialNumber
Definition fieldbus_driver.h:164
std::optional< uint8_t > escType
Definition fieldbus_driver.h:167
One slave's input and output windows within the process-data images.
Definition fieldbus_driver.h:223
uint32_t inputOffset
Byte offset of this slave's inputs within the input image.
Definition fieldbus_driver.h:227
uint32_t inputBytes
Input byte count for this slave.
Definition fieldbus_driver.h:228
uint16_t slavePosition
1-based bus position.
Definition fieldbus_driver.h:224
uint32_t outputBytes
Output byte count for this slave.
Definition fieldbus_driver.h:226
uint32_t outputOffset
Byte offset of this slave's outputs within the output image.
Definition fieldbus_driver.h:225
One Sync Manager's configuration as programmed on a slave's ESC.
Definition fieldbus_driver.h:252
uint32_t flags
Raw SM control/flags register (buffer mode, direction, watchdog).
Definition fieldbus_driver.h:256
uint16_t length
Length of the guarded window in bytes.
Definition fieldbus_driver.h:255
uint8_t type
0=unused, 1=MbxOut, 2=MbxIn, 3=Outputs, 4=Inputs.
Definition fieldbus_driver.h:257
uint16_t physicalStart
Physical ESC memory start address the SM guards.
Definition fieldbus_driver.h:254
uint8_t index
SM number (0..7).
Definition fieldbus_driver.h:253