Releases: sergiogallegos/rust-ethernet-ip
v0.6.3
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
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
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
Release v0.6.0: C# wrapper enhancements, connection fixes, and docume…
v0.5.5
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
v0.5.3
🎉 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_LISTservice with correct path structure
❌ Program Tag Reading Failure
- Problem: Reading tags like
Program:LS18_Rewind.CoreDiamMinfailed 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_LISTservice (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
-
Update Dependencies: Update to v0.5.3 for improved stability
[dependencies] rust-ethernet-ip = "0.5.3"
-
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!
-
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
- Update Dependencies: Upgrade to v0.5.3 immediately
- Test Tag Discovery: Verify tag discovery works with your PLCs
- 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
- GitHub Issues: Report bugs or request features
- Documentation: Comprehensive docs
- Examples: Working examples
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
- �� Documentation: docs.rs/rust-ethernet-ip
- 📦 Crate: crates.io/crates/rust-ethernet-ip
- 🐛 Issues: GitHub Issues
- 💬 Discussions: GitHub Discussions
v0.5.2
🚀 Rust EtherNet/IP Library v0.5.2
Code Quality & Documentation Improvements
✨ What's New
- 🔧 Enhanced FFI safety documentation - Comprehensive
# Safetysections 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
🚀 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 letstatements - 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
- Documentation: docs.rs/rust-ethernet-ip/0.5.1
- Crates.io: crates.io/crates/rust-ethernet-ip
- Examples: GitHub Examples
- Discussions: GitHub Discussions
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
Full Changelog: v0.4.0...v0.5.0