Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

A pure Rust EtherCAT MainDevice supporting std and no_std environments

NotificationsYou must be signed in to change notification settings

ethercrab-rs/ethercrab

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Build StatusCrates.ioDocs.rsMatrix chat

A performant,async-first EtherCAT MainDevice written in pure Rust.

Crate features

  • std (enabled by default) - exposes thestd module, containing helpers to run the TX/RXloop on desktop operating systems.
  • defmt - enable logging with thedefmt crate.
  • log - enable logging with thelog crate. This is enabled by defaultwhen thestd feature is enabled.
  • serde - enableserde impls for some public items.
  • xdp - enable support for XDP on some (currently only Linux) systems.

Forno_std targets, it is recommended to add this crate with

cargo add --no-default-features --features defmt

Examples

This example increments the output bytes of all detected SubDevices every tick. It is tested on anEK1100 with output modules but may work on other basic SubDevices.

Run with e.g.

Linux

RUST_LOG=debug cargo run --example ek1100 --release -- eth0

Windows

$env:RUST_LOG="debug";cargorun--exampleek1100--release--'\Device\NPF_{FF0ACEE6-E8CD-48D5-A399-619CD2340465}'
use env_logger::Env;use ethercrab::{    error::Error, std::{ethercat_now, tx_rx_task},MainDevice,MainDeviceConfig,PduStorage,Timeouts};use std::{sync::Arc, time::Duration};use tokio::time::MissedTickBehavior;/// Maximum number of SubDevices that can be stored. This must be a power of 2 greater than 1.constMAX_SUBDEVICES:usize =16;/// Maximum PDU data payload size - set this to the max PDI size or higher.constMAX_PDU_DATA:usize =1100;/// Maximum number of EtherCAT frames that can be in flight at any one time.constMAX_FRAMES:usize =16;/// Maximum total PDI length.constPDI_LEN:usize =64;staticPDU_STORAGE:PduStorage<MAX_FRAMES,MAX_PDU_DATA> =PduStorage::new();#[tokio::main]asyncfnmain() ->Result<(),Error>{    env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();let interface = std::env::args().nth(1).expect("Provide network interface as first argument.");    log::info!("Starting EK1100 demo...");    log::info!("Ensure an EK1100 is the first SubDevice, with any number of modules connected after");    log::info!("Run with RUST_LOG=ethercrab=debug or =trace for debug information");let(tx, rx, pdu_loop) =PDU_STORAGE.try_split().expect("can only split once");let maindevice =Arc::new(MainDevice::new(        pdu_loop,Timeouts{wait_loop_delay:Duration::from_millis(2),mailbox_response:Duration::from_millis(1000),            ..Default::default()},MainDeviceConfig::default(),));    tokio::spawn(tx_rx_task(&interface, tx, rx).expect("spawn TX/RX task"));letmut group = maindevice.init_single_group::<MAX_SUBDEVICES,PDI_LEN>(ethercat_now).await.expect("Init");    log::info!("Discovered {} SubDevices", group.len());for subdevicein group.iter(&maindevice){// Special case: if an EL3004 module is discovered, it needs some specific config during// init to function properlyif subdevice.name() =="EL3004"{            log::info!("Found EL3004. Configuring...");            subdevice.sdo_write(0x1c12,0,0u8).await?;            subdevice.sdo_write(0x1c13,0,0u8).await?;            subdevice.sdo_write(0x1c13,1,0x1a00u16).await?;            subdevice.sdo_write(0x1c13,2,0x1a02u16).await?;            subdevice.sdo_write(0x1c13,3,0x1a04u16).await?;            subdevice.sdo_write(0x1c13,4,0x1a06u16).await?;            subdevice.sdo_write(0x1c13,0,4u8).await?;}}letmut group = group.into_op(&maindevice).await.expect("PRE-OP -> OP");for subdevicein group.iter(&maindevice){let io = subdevice.io_raw();        log::info!("-> SubDevice {:#06x} {} inputs: {} bytes, outputs: {} bytes",            subdevice.configured_address(),            subdevice.name(),            io.inputs().len(),            io.outputs().len());}letmut tick_interval = tokio::time::interval(Duration::from_millis(5));    tick_interval.set_missed_tick_behavior(MissedTickBehavior::Skip);loop{        group.tx_rx(&maindevice).await.expect("TX/RX");// Increment every output byte for every SubDevice by oneformut subdevicein group.iter(&maindevice){letmut io = subdevice.io_raw_mut();for bytein io.outputs().iter_mut(){*byte = byte.wrapping_add(1);}}        tick_interval.tick().await;}}

Community

We're on Matrix!

Current and future features

  • async API
  • Usable inno_std contexts with no allocator required, as long as anasync executor is available.
  • Autoconfigure SubDevices from their EEPROM (SII) data during startup
    • Supports configuration using CoE data
  • Safely usable in multi-threaded Linux systems with e.g.smol,tokio orstd::thread andblock_on.
  • Support forio_uring on Linux systems to improve performance and latency
  • Support for SDO read/writes to configure SubDevices
  • Distributed clocks
    • Detection of delays between SubDevices in topology
    • Static drift compensation on startup
    • Cyclic synchronisation during OP
  • Basic support forCiA402/DS402 drives
    • A higher level DS402 API for torque, position and velocity control of common servo drives ina more abstract way.
  • Integration with LinuxCNC as a HAL component usingthelinuxcnc-hal crate.
  • Load SubDevice configurations from ESI XML files

Sponsors

GitHub Sponsors

Thank you to everyone who has donated test equipment, time or money to the EtherCrab project! Wouldyou like to be in this list? Then please considerbecoming a Github sponsor!

  • @nealsjoe generously donated an EK1100 with several IO modules fortesting with.
  • Trisk Bio generously donated some additional Beckhoff modules and someoptical ethernet gear.
  • Smark sent a $200 one time donation. Thank you!

License

Licensed under either of

at your option.

About

A pure Rust EtherCAT MainDevice supporting std and no_std environments

Topics

Resources

Stars

Watchers

Forks

Sponsor this project

  •  

Languages


[8]ページ先頭

©2009-2025 Movatter.jp