Expand description
ยงVoltage Modbus - High-Performance Modbus TCP/RTU/ASCII Library
Author: Evan Liu evan.liu@voltageenergy.com
Version: 0.2.0
License: MIT
A comprehensive, high-performance Modbus TCP/RTU/ASCII implementation in pure Rust designed for industrial automation, IoT applications, and smart grid systems.
ยงFeatures
- ๐ High Performance: Async/await support with Tokio for maximum throughput
- ๐ง Complete Protocol Support: Modbus TCP, RTU, and ASCII protocols
- ๐ก๏ธ Memory Safe: Pure Rust implementation with zero unsafe code
- โก Zero-Copy Operations: Optimized for minimal memory allocations
- ๐ Concurrent Processing: Multi-client server support
- ๐ Built-in Monitoring: Comprehensive statistics and metrics
- ๐ญ Production Ready: Extensive testing and error handling
ยงSupported Function Codes
| Code | Function | Client | Server |
|---|---|---|---|
| 0x01 | Read Coils | โ | โ |
| 0x02 | Read Discrete Inputs | โ | โ |
| 0x03 | Read Holding Registers | โ | โ |
| 0x04 | Read Input Registers | โ | โ |
| 0x05 | Write Single Coil | โ | โ |
| 0x06 | Write Single Register | โ | โ |
| 0x0F | Write Multiple Coils | โ | โ |
| 0x10 | Write Multiple Registers | โ | โ |
ยงQuick Start
ยงClient Example
use voltage_modbus::{ModbusTcpClient, ModbusClient, ModbusResult};
use std::time::Duration;
#[tokio::main]
async fn main() -> ModbusResult<()> {
// Connect to Modbus TCP server
let mut client = ModbusTcpClient::with_timeout("127.0.0.1:502", Duration::from_secs(5)).await?;
// Read holding registers
let values = client.read_holding_registers(1, 0, 10).await?;
println!("Read registers: {:?}", values);
// Write single register
client.write_single_register(1, 100, 0x1234).await?;
client.close().await?;
Ok(())
}ยงServer Example
use voltage_modbus::{ModbusTcpServer, ModbusTcpServerConfig, ModbusServer, ModbusRegisterBank};
use std::sync::Arc;
use std::time::Duration;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create server configuration
let config = ModbusTcpServerConfig {
bind_address: "127.0.0.1:502".parse().unwrap(),
max_connections: 50,
request_timeout: Duration::from_secs(30),
register_bank: Some(Arc::new(ModbusRegisterBank::new())),
};
// Start server
let mut server = ModbusTcpServer::with_config(config)?;
server.start().await?;
// Server is now running...
Ok(())
}ยงArchitecture
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ Application โ โ Application โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ Modbus Client โ โ Modbus Server โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ Protocol โ โ Register Bank โ
โ (TCP/RTU) โ โ (Storage) โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ Transport โโโโโบโ Transport โ
โ (Async I/O) โ โ (Async I/O) โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโRe-exportsยง
pub use error::ModbusError;pub use error::ModbusResult;pub use protocol::ModbusRequest;pub use protocol::ModbusResponse;pub use protocol::ModbusFunction;pub use transport::ModbusTransport;pub use transport::TcpTransport;pub use transport::RtuTransport;pub use transport::AsciiTransport;pub use transport::TransportStats;pub use client::ModbusClient;pub use client::ModbusTcpClient;pub use server::ModbusServer;pub use server::ModbusTcpServer;pub use server::ModbusTcpServerConfig;pub use server::ServerStats;pub use register_bank::ModbusRegisterBank;pub use register_bank::RegisterBankStats;pub use utils::PerformanceMetrics;pub use utils::OperationTimer;
Modulesยง
- client
- Modbus client implementations
- error
- Core error types and result handling
- protocol
- Modbus protocol definitions and message handling
- register_
bank - Thread-safe register storage for server applications
- server
- Modbus server implementations
- transport
- Network transport layer for TCP and RTU communication
- utils
- Utility functions and performance monitoring
Constantsยง
- DEFAULT_
TCP_ PORT - Modbus TCP default port
- DEFAULT_
TIMEOUT_ MS - Default timeout for operations (5 seconds)
- MAX_
COILS_ PER_ REQUEST - Maximum number of coils that can be read/written in a single request
- MAX_
REGISTERS_ PER_ REQUEST - Maximum number of registers that can be read/written in a single request
- MAX_
RTU_ FRAME_ SIZE - Maximum Modbus RTU frame size
- MAX_
TCP_ FRAME_ SIZE - Maximum Modbus TCP frame size (MBAP header + PDU)
- VERSION
- Library version
Functionsยง
- info
- Get library information