use std::time::Duration;
use voltage_modbus::{
regs_to_f32, ByteOrder, DeviceLimits, ModbusClient, ModbusResult, ModbusTcpClient,
};
#[tokio::main]
async fn main() -> ModbusResult<()> {
let mut client = ModbusTcpClient::from_address("127.0.0.1:502", Duration::from_secs(5)).await?;
let slave_id = 1;
println!("=== Example 1: Default Limits (125 registers/request) ===\n");
let default_limits = DeviceLimits::new();
println!(
"DeviceLimits: max_read_registers={}, delay={}ms",
default_limits.max_read_registers, default_limits.inter_request_delay_ms
);
let registers = client
.read_holding_registers_batch(slave_id, 0, 200, &default_limits)
.await?;
println!("Read {} registers total\n", registers.len());
println!("=== Example 2: Conservative Limits (50 registers/request) ===\n");
let conservative_limits = DeviceLimits::conservative();
println!(
"DeviceLimits: max_read_registers={}, delay={}ms",
conservative_limits.max_read_registers, conservative_limits.inter_request_delay_ms
);
let registers = client
.read_holding_registers_batch(slave_id, 0, 200, &conservative_limits)
.await?;
println!("Read {} registers total\n", registers.len());
println!("=== Example 3: Custom Limits (30 registers/request, 5ms delay) ===\n");
let custom_limits = DeviceLimits::new()
.with_max_read_registers(30) .with_inter_request_delay_ms(5);
println!(
"DeviceLimits: max_read_registers={}, delay={}ms",
custom_limits.max_read_registers, custom_limits.inter_request_delay_ms
);
let registers = client
.read_03_batch(slave_id, 0, 100, &custom_limits)
.await?;
println!("Read {} registers total\n", registers.len());
println!("=== Example 4: Batch Read with Float Decoding ===\n");
let registers = client
.read_03_batch(slave_id, 1000, 20, &default_limits)
.await?;
println!("Decoded Float32 values (BigEndian):");
for i in 0..10 {
let idx = i * 2;
if idx + 1 < registers.len() {
let value = regs_to_f32(&[registers[idx], registers[idx + 1]], ByteOrder::BigEndian);
println!(" Float[{}] @ address {}: {:.4}", i, 1000 + idx, value);
}
}
println!("\n=== Example 5: Batch Read Coils ===\n");
let coil_limits = DeviceLimits::new().with_max_read_coils(500);
println!(
"Reading 1000 coils with max {} per request",
coil_limits.max_read_coils
);
let coils = client
.read_coils_batch(slave_id, 0, 1000, &coil_limits)
.await?;
println!("Read {} coils total", coils.len());
println!("First 16 coils: {:?}", &coils[..coils.len().min(16)]);
let stats = client.get_stats();
println!(
"\nTotal requests: {}, responses: {}",
stats.requests_sent, stats.responses_received
);
client.close().await?;
Ok(())
}