Motion Master 6.0.0-alpha.111
Next-generation motion control software
Loading...
Searching...
No Matches
fieldbus_driver.h
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <chrono>
5#include <cstddef>
6#include <cstdint>
7#include <expected>
8#include <functional>
9#include <mutex>
10#include <optional>
11#include <span>
12#include <string>
13#include <string_view>
14#include <vector>
15
16#include "comm/foe_error.h"
17
18namespace mm::comm {
19
30inline constexpr std::size_t kMaxProcessImageBytes = 32768;
31
39inline constexpr std::chrono::milliseconds kFoeReadTimeout{6000};
40
45enum class EtherCatState : uint16_t {
46 Init = 0x01,
47 PreOp = 0x02,
48 Boot = 0x03,
49 SafeOp = 0x04,
50 Op = 0x08,
51};
52
58inline EtherCatState alState(uint16_t alStatus) {
59 return static_cast<EtherCatState>(alStatus & 0x000Fu);
60}
61
63inline bool alHasError(uint16_t alStatus) { return (alStatus & 0x0010u) != 0; }
64
66inline std::string_view toString(EtherCatState state) {
67 switch (state) {
69 return "INIT";
71 return "PRE-OP";
73 return "BOOT";
75 return "SAFE-OP";
77 return "OP";
78 }
79 return "UNKNOWN";
80}
81
91enum class Reachability : uint8_t {
92 Answering,
95};
96
98inline std::string_view toString(Reachability reachability) {
99 switch (reachability) {
101 return "answering";
103 return "addressLost";
105 return "notAnswering";
106 }
107 return "notAnswering";
108}
109
131inline int workingCounterContribution(uint16_t alStatus, bool hasOutputs, bool hasInputs) {
132 if (alHasError(alStatus)) {
133 return 0;
134 }
135 switch (alState(alStatus)) {
138 return (hasOutputs ? 2 : 0) + (hasInputs ? 1 : 0);
139 default:
140 return 0;
141 }
142}
143
153inline bool exchangesProcessData(uint16_t alStatus) {
154 const EtherCatState state = alState(alStatus);
155 return !alHasError(alStatus) && (state == EtherCatState::SafeOp || state == EtherCatState::Op);
156}
157
159struct SlaveInfo {
160 std::string name;
161 uint32_t vendorId = 0;
162 uint32_t productCode = 0;
163 uint32_t revisionNumber = 0;
164 uint32_t serialNumber = 0;
167 std::optional<uint8_t> escType;
171 bool mailboxWriteOnce = false;
172};
173
187struct OdEntry {
188 uint16_t index = 0;
189 uint8_t subindex = 0;
190 uint16_t objectCode = 0;
191 uint16_t dataType = 0;
192 uint16_t bitLength = 0;
193 uint16_t access = 0;
194 std::string name;
195 std::optional<uint32_t> unit;
196 std::optional<std::vector<uint8_t>> defaultValue;
197 std::optional<std::vector<uint8_t>> minValue;
198 std::optional<std::vector<uint8_t>> maxValue;
199};
200
212struct OdRead {
213 std::vector<OdEntry> entries;
215};
216
223struct SlaveIo {
224 uint16_t slavePosition = 0;
225 uint32_t outputOffset = 0;
226 uint32_t outputBytes = 0;
227 uint32_t inputOffset = 0;
228 uint32_t inputBytes = 0;
229};
230
241struct PdoLayout {
242 uint32_t outputBytes = 0;
243 uint32_t inputBytes = 0;
244 std::vector<SlaveIo> slaves;
245 int expectedWkc = 0;
246};
247
253 uint8_t index = 0;
254 uint16_t physicalStart = 0;
255 uint16_t length = 0;
256 uint32_t flags = 0;
257 uint8_t type = 0;
258};
259
266 uint8_t index = 0;
267 uint32_t logicalStart = 0;
268 uint16_t length = 0;
269 uint8_t logicalStartBit = 0;
270 uint8_t logicalEndBit = 0;
271 uint16_t physicalStart = 0;
272 uint8_t physicalStartBit = 0;
273 uint8_t type = 0;
274 uint8_t active = 0;
275};
276
280 static constexpr uint16_t kProtocolCoe = 0x04;
281
282 uint16_t writeLength = 0;
283 uint16_t writeOffset = 0;
284 uint16_t readLength = 0;
285 uint16_t readOffset = 0;
286 uint16_t protocols = 0;
288 // Per-protocol capability detail bytes as advertised in EEPROM (ECT_*DETAILS), refining the
289 // supported-protocol bits above. Raw bytes — the meaning of each bit is decoded by the client
290 // (CoE has a rich flag set; FoE/EoE are essentially an enable bit; SoE is a channel count). An
291 // advertisement, not a guarantee (see the CoE Complete-Access note in the parameter path).
292 uint8_t coeDetails = 0;
293 uint8_t foeDetails = 0;
294 uint8_t eoeDetails = 0;
295 uint8_t soeDetails = 0;
296};
297
303constexpr uint16_t kSyncManagerRegisterBase = 0x0800;
304constexpr uint16_t kSyncManagerRegisterBytes = 8;
305constexpr uint16_t kFmmuRegisterBase = 0x0600;
306constexpr uint16_t kFmmuRegisterBytes = 16;
307
313std::array<uint8_t, kSyncManagerRegisterBytes> encodeSyncManager(const SyncManagerConfig& config);
314
324std::optional<SyncManagerConfig> decodeSyncManager(uint8_t index, std::span<const uint8_t> bytes);
325
327std::array<uint8_t, kFmmuRegisterBytes> encodeFmmu(const FmmuConfig& config);
328
336std::optional<FmmuConfig> decodeFmmu(uint8_t index, std::span<const uint8_t> bytes);
337
343struct DcConfig {
344 bool capable = false;
345 bool active = false;
346 int32_t propagationDelay = 0;
347 int32_t cycleTime = 0;
348 int32_t shift = 0;
349};
350
358 uint16_t slavePosition = 0;
359 uint16_t configuredAddress = 0;
360 uint16_t aliasAddress = 0;
361 uint16_t outputBits = 0;
362 uint16_t inputBits = 0;
365 std::vector<SyncManagerConfig> syncManagers;
366 std::vector<FmmuConfig> fmmus;
367};
368
377 bool linkUp = false;
378 bool loopClosed = false;
379 bool communication = false;
380 uint8_t invalidFrame = 0;
381 uint8_t rxError = 0;
382 uint8_t forwardedError = 0;
384 uint8_t lostLink = 0;
385};
386
395 uint16_t slavePosition = 0;
396 std::array<PortDiagnostics, 4> ports;
399 uint8_t pdiError = 0;
403 uint8_t pdiWatchdog = 0;
404};
405
420 uint16_t slavePosition = 0;
421 bool dcCapable = false;
422 bool referenceClock = false;
423 int32_t propagationDelay = 0;
425 0;
428};
429
439 bool enabled = false;
440 bool running = false;
442 std::chrono::nanoseconds timeout{0};
443 uint16_t divider = 0;
444 uint16_t ticks = 0;
445};
446
475 public:
476 virtual ~FieldbusDriver() = default;
477
483 virtual std::expected<void, std::string> init() = 0;
484
492 virtual std::expected<int, std::string> scan() = 0;
493
496 virtual SlaveInfo slaveInfo(uint16_t position) const = 0;
497
512 virtual uint16_t slaveState(uint16_t position) const = 0;
513
523 virtual uint16_t mailboxProtocols(uint16_t /*position*/) const { return 0; }
524
539 virtual std::expected<void, std::string> configureProcessData() = 0;
540
547
562 virtual std::vector<SlaveConfig> busConfig() const { return {}; }
563
579 virtual int exchangeProcessData(std::span<const uint8_t> outputs, std::span<uint8_t> inputs) = 0;
580
589 virtual void stop() = 0;
590
613
628 virtual std::expected<std::vector<SlaveStateRaw>, std::string> readStates(
629 const std::vector<uint16_t>& positions) = 0;
630
635 virtual std::optional<int> readDevicesOnWire() { return std::nullopt; }
636
653 virtual std::expected<std::vector<SlaveDiagnostics>, std::string> readDiagnostics(
654 const std::vector<uint16_t>& /*positions*/) {
655 return std::unexpected("diagnostics not supported by this transport");
656 }
657
676 virtual std::expected<std::vector<DcSyncDiagnostics>, std::string> readDcSync(
677 const std::vector<uint16_t>& /*positions*/) {
678 return std::unexpected("distributed-clock diagnostics not supported by this transport");
679 }
680
702 virtual std::expected<std::vector<uint8_t>, std::string> readSdo(uint16_t slavePosition,
703 uint16_t index,
704 uint8_t subindex) = 0;
705
723 virtual std::expected<std::vector<uint8_t>, std::string> readSdoComplete(
724 uint16_t /*slavePosition*/, uint16_t /*index*/) {
725 return std::unexpected("complete access not supported by this driver");
726 }
727
741 virtual std::expected<void, std::string> writeSdo(uint16_t slavePosition, uint16_t index,
742 uint8_t subindex,
743 std::span<const uint8_t> data) = 0;
744
761 virtual std::expected<OdRead, std::string> readObjectDictionary(uint16_t slavePosition) = 0;
762
780 virtual std::expected<std::vector<uint8_t>, std::string> readSii(uint16_t /*slavePosition*/) {
781 return std::unexpected("SII (EEPROM) read not supported by this transport");
782 }
783
801 virtual std::expected<void, std::string> writeSii(uint16_t /*slavePosition*/,
802 std::span<const uint8_t> /*data*/) {
803 return std::unexpected("SII (EEPROM) write not supported by this transport");
804 }
805
824 virtual std::expected<std::vector<uint8_t>, FoeError> readFile(
825 uint16_t slavePosition, const std::string& filename, std::chrono::milliseconds timeout) = 0;
826
839 virtual std::expected<void, FoeError> writeFile(uint16_t slavePosition,
840 const std::string& filename,
841 std::span<const uint8_t> data) = 0;
842
853 virtual std::expected<void, std::string> readRegister(uint16_t slavePosition, uint16_t address,
854 std::span<uint8_t> data) = 0;
855
866 virtual std::expected<void, std::string> writeRegister(uint16_t slavePosition, uint16_t address,
867 std::span<const uint8_t> data) = 0;
868
884 virtual std::expected<ProcessDataWatchdogConfig, std::string> processDataWatchdog(
885 uint16_t /*slavePosition*/) {
886 return std::unexpected("process-data watchdog not supported by this transport");
887 }
888
910 virtual std::expected<ProcessDataWatchdogConfig, std::string> setProcessDataWatchdog(
911 uint16_t /*slavePosition*/, std::chrono::nanoseconds /*timeout*/) {
912 return std::unexpected("process-data watchdog not supported by this transport");
913 }
914
941 virtual void transitionToState(
942 const std::vector<uint16_t>& positions, std::optional<EtherCatState> requiredState,
943 EtherCatState targetState, std::chrono::steady_clock::duration timeout,
944 std::chrono::steady_clock::duration resendInterval = std::chrono::seconds(2),
945 std::function<void()> tick = nullptr, std::function<bool()> shouldAbort = nullptr) = 0;
946
952 virtual bool supportsEsc() const { return true; }
953
959 virtual std::string adapter() const { return {}; }
960
965 virtual uint64_t droppedInputFrames() const { return 0; }
966
968 virtual bool supportsLocate() const { return false; }
969
971 virtual std::expected<void, std::string> locate(uint16_t /*slavePosition*/, bool /*on*/) {
972 return std::unexpected("device locate not supported by this transport");
973 }
974
976 enum class FirmwareActivation : uint8_t {
982 };
983
988 virtual std::expected<FirmwareActivation, std::string> activateFirmware(
989 uint16_t /*slavePosition*/, std::chrono::steady_clock::duration /*timeout*/) {
991 }
992
998 virtual std::optional<std::string> stateChangeRefusal() const { return std::nullopt; }
999};
1000
1001} // namespace mm::comm
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