Skip to content

Releases: sergiogallegos/rust-ethernet-ip

v0.6.3

02 Mar 00:43

Choose a tag to compare

chore: bump to 0.6.3, fix medium bugs, update README and CHANGELOG

- Fix subscription change threshold for all types (was REAL-only)
- Fix unregister_session packet (length 4→0, remove extra payload)
- Add BOOL array read-modify-write doc note
- Bump version to 0.6.3 in Cargo.toml and C# .csproj
- Update CHANGELOG.md with comprehensive 0.6.3 release notes
- Update README.md: version badges, install snippets, test counts,
  0.6.3 highlights, fix duplicate toml block

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

v0.6.2

25 Jan 03:09

Choose a tag to compare

Release v0.6.2: Stream injection API and nested UDT fixes

✨ Added:
- Stream Injection API: connect_with_stream() for custom TCP transport
  - Enables wrapping streams for metrics/observability (bytes in/out)
  - Supports custom socket options (keepalive, timeouts, bind local address)
  - Allows reusing pre-established tunnels/connections
  - Supports in-memory streams for deterministic testing
  - New EtherNetIpStream trait for stream type requirements
- Test Configuration: Environment variable support for PLC testing
  - TEST_PLC_ADDRESS - Set PLC IP address for tests (default: 192.168.0.1:44818)
  - TEST_PLC_SLOT - Set CPU slot number (default: 0)
  - SKIP_PLC_TESTS - Skip all PLC-dependent tests when set
  - Comprehensive test helper functions and documentation

🐛 Fixed:
- Nested UDT Member Access: Fixed reading nested UDT members from array elements
  - Correctly handles complex paths like Cell_NestData[90].PartData.Member
  - Fixed array element detection to use TagPath::parse() for paths with member access
  - Changed from rfind(']') to find('[') + find(']') to use first bracket pair
  - Now correctly builds full CIP paths instead of incorrectly using array workaround
  - Fixes issue where PLC returned entire UDT instead of specific member value

📚 Documentation:
- Added comprehensive documentation for stream injection API
- Added test configuration guides (tests/README.md, tests/TEST_CONFIG.md)
- Updated all version references from v0.6.1 to v0.6.2
- Added examples for stream injection and nested UDT access
- Updated CHANGELOG.md with detailed v0.6.2 changes

🔧 Examples:
- Added stream_injection_example.rs demonstrating custom stream usage
- Updated all example version references to v0.6.2

v0.6.1

18 Jan 03:12

Choose a tag to compare

Update comprehensive_terminal_demo.rs to use actual test tags

- Changed array tag example from 'gArrayTest_DINT' to 'gTestArray_DINT'
- Updated batch operations to use actual test tags:
  * gTestArray_DINT[0], gTestArray_DINT[5]
  * gTestArray_REAL[0], gTestArray_BOOL[0], gTestArray_INT[0]
- Updated performance test default tag to 'gTestArray_DINT[0]'
- Updated program name example from 'MainProgram' to 'TestProgram'
- Updated complex path examples to use actual test tag patterns
- All tag references now match WinForms, WPF, and ASP.NET examples

v0.6.0

12 Jan 19:49

Choose a tag to compare

Release v0.6.0: C# wrapper enhancements, connection fixes, and docume…

v0.5.5

27 Dec 04:37

Choose a tag to compare

docs: Add release notes for v0.5.5

- Document array element read/write support
- Document BOOL array special handling
- Include usage examples and migration guide
- List all new features and bug fixes

v0.5.4

23 Oct 00:55

Choose a tag to compare

What's Changed

Full Changelog: v0.5.3...v0.5.4

v0.5.3

09 Sep 02:33

Choose a tag to compare

🎉 Release v0.5.3 - Critical Bug Fixes

Release Date: January 15, 2025
Type: Bug Fix Release


🐛 Critical Issues Resolved

This release addresses critical issues reported by contributors where tag discovery and reading functionality was not working properly across different PLC types.

Issues Fixed:

Tag Discovery Failure

  • Problem: discover_tags() was returning empty results
  • Root Cause: Incorrect CIP service and response format
  • Solution: Updated to use proper GET_INSTANCE_ATTRIBUTE_LIST service with correct path structure

Program Tag Reading Failure

  • Problem: Reading tags like Program:LS18_Rewind.CoreDiamMin failed with "Path segment error"
  • Root Cause: Incorrect tag path building for program-scoped tags
  • Solution: Added proper program tag path splitting and segment building

Response Parsing Issues

  • Problem: Tag list response parsing was using wrong format
  • Root Cause: Expected simple format but actual response uses attribute list format
  • Solution: Updated parser to handle [InstanceID(4)][NameLength(2)][Name][Type(2)] format

🔧 Technical Improvements

CIP Protocol Enhancements

  • Updated Tag List Requests: Now uses correct GET_INSTANCE_ATTRIBUTE_LIST service (0x55)
  • Fixed Response Parsing: Properly handles attribute list response format
  • Improved Tag Path Building: Correctly handles program prefixes (Program:ProgramName.TagName)
  • Enhanced Error Handling: Better debugging output for troubleshooting

Compatibility Improvements

  • Aligned with Node.js Implementation: Changes based on working reference implementation
  • Better PLC Compatibility: Works across various PLC manufacturers and models
  • Improved Error Messages: More descriptive error messages for debugging

📊 Testing & Validation

Comprehensive Testing

  • Unit Tests: All 17 unit tests passing
  • Integration Tests: 11 comprehensive tests passing
  • Documentation Tests: 11 doc tests passing
  • Code Quality: Clippy clean with 0 warnings
  • Build Verification: All targets compile successfully

🚀 Performance Characteristics

Optimized Operations

  • Tag Discovery: Now properly discovers and caches tag metadata
  • Program Tag Access: Efficient path building for program-scoped tags
  • Memory Usage: Improved memory management for tag operations
  • Error Recovery: Better error handling and recovery mechanisms

📦 Package Updates

Core Library

  • Rust Library: rust-ethernet-ip = "0.5.3"
  • Python Wrapper: rust_ethernet_ip = "0.5.3"
  • C# Wrapper: RustEtherNetIp = "0.5.3"

Example Applications

  • ✅ Updated Vue.js example to v0.5.3
  • ✅ Updated TypeScript example to v0.5.3
  • ✅ Updated Go backend example to v0.5.3
  • ✅ Updated all C# examples to v0.5.3

🔄 Migration Guide

For Existing Users

  1. Update Dependencies: Update to v0.5.3 for improved stability

    [dependencies]
    rust-ethernet-ip = "0.5.3"
  2. Tag Discovery: Now works correctly across all PLC types

    let mut client = EipClient::connect("192.168.1.100:44818").await?;
    client.discover_tags().await?; // Now works properly!
  3. Program Tags: Can now read program-scoped tags

    let value = client.read_tag("Program:MainProgram.MyTag").await?;

Breaking Changes

  • None: This is a bug fix release with no breaking changes

🐛 Bug Reports Resolved

Contributor Issues Fixed

  • Issue: Tag discovery returning empty results
  • Issue: Program tag reading failing with path segment errors
  • Issue: Inconsistent behavior across different PLC types

Root Cause Analysis

  • CIP Protocol: Incorrect service usage and response parsing
  • Path Building: Missing program tag handling logic
  • Compatibility: Not aligned with standard EtherNet/IP implementations

📈 Quality Metrics

Code Quality

  • Clippy: 0 warnings
  • Tests: 100% pass rate
  • Documentation: Complete and up-to-date
  • Examples: All updated and tested

Compatibility

  • PLC Support: Enhanced compatibility across manufacturers
  • Protocol Compliance: Better adherence to EtherNet/IP standards
  • Cross-Platform: Works on Windows, Linux, macOS

🎯 Next Steps

Immediate Actions

  1. Update Dependencies: Upgrade to v0.5.3 immediately
  2. Test Tag Discovery: Verify tag discovery works with your PLCs
  3. Test Program Tags: Verify program tag reading functionality

Future Improvements

  • Enhanced UDT (User Defined Type) support
  • Improved batch operation performance
  • Additional PLC manufacturer support

📞 Support & Feedback

Getting Help

Contributing

  • Pull Requests: Welcome and appreciated
  • Bug Reports: Help us improve the library
  • Feature Requests: Let us know what you need

🙏 Acknowledgments

Special thanks to the contributors who reported these issues and provided detailed debugging information. Your feedback helps make this library better for everyone!


📋 Full Changelog

Full Changelog: v0.5.2...v0.5.3


�� Quick Links

v0.5.2

07 Sep 01:00

Choose a tag to compare

🚀 Rust EtherNet/IP Library v0.5.2

Code Quality & Documentation Improvements

✨ What's New

  • 🔧 Enhanced FFI safety documentation - Comprehensive # Safety sections for all unsafe functions
  • 🛠️ Zero clippy warnings - Fixed all code quality issues and linting warnings
  • 📦 Wrapper synchronization - All wrappers updated to v0.5.2 (Python, C#, JS/TS, Go)
  • 🧪 All 47 tests pass - Enhanced test coverage and reliability

�� Security & Safety

  • Enhanced pointer validation and memory safety guarantees
  • Improved error handling in C API layer
  • Better resource cleanup and memory management

🔄 Migration

No breaking changes - All existing code continues to work without modification.

📦 Installation

[dependencies]
rust-ethernet-ip = "0.5.2"

Full Changelog: v0.5.1...v0.5.2

v0.5.1

06 Sep 21:25

Choose a tag to compare

🚀 v0.5.1 - Performance Improvements Release

Major Performance Enhancements

This release delivers significant performance improvements through memory allocation optimizations and code quality enhancements.

🎯 Performance Improvements

  • 20-30% reduction in memory allocation overhead for network operations
  • 20% throughput increase - Single tag operations now achieve 3,000+ ops/sec (up from 2,500+)
  • 20% memory usage reduction per operation
  • Optimized packet building with reduced memory fragmentation

🔧 Technical Improvements

  • Vec::with_capacity() implementation - Pre-allocated buffers for CIP requests and packet building
  • Code quality enhancements - Fixed clippy lints with more idiomatic Rust patterns
  • Network efficiency - Optimized packet construction for better performance
  • Memory management - Strategic capacity allocation for high-frequency operations

📋 Roadmap Updates

  • Phase 4: Industrial Routing Support - Added comprehensive roadmap for routing features
  • Transparent limitations - Clear documentation of current routing limitations
  • Version planning - Routing support planned for v0.6.0 and v0.7.0

🎯 What's New

Memory Allocation Optimizations

  • Smart use of Vec::with_capacity() for network operations
  • Pre-allocated buffers for CIP requests (8-64 bytes capacity)
  • Optimized packet building with appropriate capacity estimates
  • Reduced heap fragmentation in high-throughput scenarios

Code Quality Improvements

  • Fixed single-match patterns with more idiomatic if let statements
  • Eliminated redundant closures in error handling
  • Cleaner, more maintainable Rust code
  • Reduced clippy warnings from 58 to 49

Documentation Enhancements

  • Added current limitations section for transparency
  • Comprehensive routing roadmap for future versions
  • Clear version targets for upcoming features
  • Updated performance metrics and benchmarks

🚀 Performance Impact

Metric Before (v0.5.0) After (v0.5.1) Improvement
Single Tag Read 2,500+ ops/sec 3,000+ ops/sec +20%
Memory per Operation ~1KB ~800B -20%
Allocation Overhead Baseline 20-30% reduction Significant
Network Efficiency Baseline Optimized Improved

�� Installation

Update your Cargo.toml:

[dependencies]
rust-ethernet-ip = "0.5.1"

🔮 What's Next

v0.6.0 - Basic Routing Support (Coming Soon)

  • Support for CPUs in slots 1-31
  • Simple backplane routing
  • CIP route path construction

v0.7.0 - Advanced Routing Support

  • Remote rack support
  • Multi-hop network routing
  • Path validation and error handling

�� Community Impact

This release addresses critical performance bottlenecks identified by the community and sets the foundation for upcoming routing features. The improvements are immediately beneficial for all users, especially those with high-frequency PLC operations.

📚 Resources


Thank you to the community for the valuable feedback and contributions! 🙏

This release continues our commitment to providing high-performance, production-ready EtherNet/IP communication for industrial automation.

v0.5.0

04 Sep 22:46

Choose a tag to compare

Full Changelog: v0.4.0...v0.5.0