Skip to main content

Crate rust_ethernet_ip

Crate rust_ethernet_ip 

Source
Expand description

EtherNet/IP client library for Allen-Bradley CompactLogix and ControlLogix PLCs.

rust-ethernet-ip provides async Rust APIs for explicit EtherNet/IP and CIP tag operations, plus FFI surfaces used by the repository’s .NET wrapper. The current released crate line is 1.0.0.

§Highlights

  • Async client API via EipClient
  • Symbolic tag addressing, including program-scoped tags, array indexing, and nested UDT paths
  • Batch reads, writes, and mixed execution with BatchOperation
  • Route-path support for backplane and routed topologies via RoutePath
  • UDT discovery, schema export, diagnostics, subscriptions, and tag-group polling

§Quick Start

use rust_ethernet_ip::{EipClient, PlcValue};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut client = EipClient::connect("192.168.1.100:44818").await?;
    let running = client.read_tag("Program:Main.MotorRunning").await?;
    client
        .write_tag("Program:Main.SetPoint", PlcValue::Dint(1500))
        .await?;

    println!("running={running:?}");
    Ok(())
}

Routed example:

use rust_ethernet_ip::{EipClient, RoutePath};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let route = RoutePath::new().add_slot(0);
    let _client = EipClient::with_route_path("192.168.1.100:44818", route).await?;
    Ok(())
}

§Known PLC/Firmware Limits

Real-hardware validation for the 1.0.0 release line confirmed that some direct write shapes are controller/firmware limitations rather than library protocol defects:

  • Direct writes to standalone STRING tags can fail
  • Direct writes to STRING members inside UDTs can fail
  • Direct writes to members of UDT array elements can fail

On the validated CompactLogix 5069-L320ERMS3 firmware 35 and ControlLogix 1756-L81ES firmware 37 targets, these failures surfaced as 0x2107 and, for some batch STRING cases, batch-level 0x1E embedded service errors.

Recommended pattern for restricted cases: read-modify-write the full UDT or UDT array element instead of directly writing the nested restricted member.

Re-exports§

pub use batch::BatchConfig;
pub use batch::BatchError;
pub use batch::BatchOperation;
pub use batch::BatchResult;
pub use client::Backoff;
pub use client::Client;
pub use client::ConnectionEvent;
pub use client::EipClient;
pub use client::RetryClient;
pub use client::RetryPolicy;
pub use config::ConnectionConfig;
pub use config::LogFormat;
pub use config::LogLevel;
pub use config::LogRotationSchedule;
pub use config::LoggingConfig;
pub use config::MonitoringConfig;
pub use config::PerformanceConfig;
pub use config::PlcSpecificConfig;
pub use config::ProductionConfig;
pub use config::SecurityConfig;
pub use error::EtherNetIpError;
pub use error::Result;
pub use fleet::Fleet;
pub use fleet::FleetEvent;
pub use monitoring::ConnectionMetrics;
pub use monitoring::DiagnosticsSnapshot;
pub use monitoring::ErrorCategory;
pub use monitoring::ErrorMetrics;
pub use monitoring::HealthCheckMode;
pub use monitoring::HealthMetrics;
pub use monitoring::HealthStatus;
pub use monitoring::MonitoringMetrics;
pub use monitoring::OperationMetrics;
pub use monitoring::PerformanceMetrics;
pub use monitoring::ProductionMonitor;
pub use plc_manager::PlcConfig;
pub use plc_manager::PlcConnection;
pub use plc_manager::PlcManager;
pub use route::RouteHop;
pub use route::RoutePath;
pub use schema::SchemaCapabilities;
pub use schema::SchemaDataType;
pub use schema::SchemaExport;
pub use schema::SchemaLibraryInfo;
pub use schema::SchemaRoutePath;
pub use schema::SchemaScope;
pub use schema::SchemaTag;
pub use schema::SchemaTargetInfo;
pub use schema::SchemaUdt;
pub use schema::SchemaUdtMember;
pub use subscription::SubscriptionManager;
pub use subscription::SubscriptionManager as RealTimeSubscriptionManager;
pub use subscription::SubscriptionOptions;
pub use subscription::SubscriptionOptions as RealTimeSubscriptionOptions;
pub use subscription::TagSubscription;
pub use subscription::TagSubscription as RealTimeSubscription;
pub use tag_group::TagGroupConfig;
pub use tag_group::TagGroupEvent;
pub use tag_group::TagGroupEventKind;
pub use tag_group::TagGroupFailureCategory;
pub use tag_group::TagGroupFailureDiagnostic;
pub use tag_group::TagGroupSnapshot;
pub use tag_group::TagGroupSubscription;
pub use tag_group::TagGroupValueResult;
pub use tag_manager::TagCache;
pub use tag_manager::TagManager;
pub use tag_manager::TagMetadata;
pub use tag_manager::TagPermissions;
pub use tag_manager::TagScope;

Modules§

batch
client
config
error
fleet
monitoring
plc_manager
route
schema
subscription
tag_group
tag_manager
tag_path
types
udt
version

Structs§

TagAttributes
Tag attributes from PLC
UdtData
UdtDefinition
Definition of a User Defined Type
UdtMember
Member of a UDT
UdtTemplate
UDT Template information from PLC

Enums§

PlcValue
TagPath
Represents different types of tag addressing supported by Allen-Bradley PLCs

Traits§

EtherNetIpStream
Trait for streams that can be used with EipClient

Functions§

init_tracing
Initialize tracing subscriber with environment-based filtering
try_init_tracing
Try to initialize tracing subscriber (non-panicking version)