// the find
ethercrab-rs/ethercrab
A pure Rust EtherCAT MainDevice supporting std and no_std environments
EtherCrab is a pure Rust EtherCAT MainDevice implementation — the thing that talks to industrial servo drives, I/O modules, and other field devices over EtherCAT. It runs on both std (Linux, Windows) and no_std (Embassy on STM32), which puts it in a unique position for Rust-based industrial control systems. If you're doing motion control or factory automation and want to avoid the C-based SOEM library, this is the serious alternative.
The async-first design is the right call for EtherCAT — you need tight cycle timing and the ability to run TX/RX in a dedicated task while processing PDI data in another. The replay-based integration tests (pcapng captures fed back through the stack) are clever: they let you test real protocol behavior without hardware on every CI run. Distributed clock support including drift compensation is genuinely hard to get right and it's checked off. The no_std support with zero allocator requirement is real — the Embassy STM32 example exists and works — not a checkbox feature.
The API requires you to size everything at compile time with const generics (MAX_SUBDEVICES, MAX_PDU_DATA, PDI_LEN) — reasonable for embedded, annoying for desktop use where you just want to connect and discover. There's no ESI XML support yet, which means manual SDO configuration for anything beyond basic I/O; see the EL3004 setup code in the README for a taste of what that looks like at scale. DS402 (servo drive profile) support is described as 'basic' and the higher-level torque/velocity API is explicitly unfinished — if you're doing coordinated multi-axis motion, you're writing a lot of glue yourself. LinuxCNC integration is listed as a future goal but not there yet, which limits the audience for anyone already in that ecosystem.