From 1f747f26552ce3b173b864f71b659e5087fa240c Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Fri, 20 Jun 2025 23:59:06 +0800 Subject: [PATCH] fix request --- src/main.rs | 1 - src/modbus_client.rs | 51 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6c400ef..f444c0a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -34,7 +34,6 @@ async fn main() { println!("port: {:?}", c.port); - loop { // 1. 读取4字节长度前缀 (big-endian) let mut len_bytes = [0u8; 2]; diff --git a/src/modbus_client.rs b/src/modbus_client.rs index 0af9ca2..16f935c 100644 --- a/src/modbus_client.rs +++ b/src/modbus_client.rs @@ -9,7 +9,7 @@ use tokio_modbus::{ }; pub (crate) struct ModbusClient { - ctx: Context + stream: SerialStream } impl ModbusClient { @@ -36,14 +36,51 @@ impl ModbusClient { .timeout(std::time::Duration::from_millis(serial_config.timeout as u64)); // 2. 建立串口连接 - let port = builder.open_native_async().unwrap(); - - // 3. 创建Modbus RTU客户端 (0.16.1新API) - let slave_id = Slave(0x01); // 从站地址 - let ctx = rtu::attach_slave(port, slave_id); + let stream = builder.open_native_async().unwrap(); Self { - ctx + stream } } + + pub async fn request(&mut self, slave_id: u8, address: u16) -> Result<(), Box> { + let slave = Slave(slave_id); + let mut ctx = rtu::attach_slave(&mut self.stream, slave); + + // 根据 address 范围执行不同操作 + match address { + // 保持寄存器(Holding Registers): 40000-49999 + 40000..=49999 => { + let modbus_addr = address - 40000; // 转换为 Modbus 协议地址(0-9999) + let response = ctx.read_holding_registers(modbus_addr, 1).await?; + println!("Holding Register {}: {:?}", modbus_addr, response); + } + + // 输入寄存器(Input Registers): 30000-39999 + 30000..=39999 => { + let modbus_addr = address - 30000; + let response = ctx.read_input_registers(modbus_addr, 1).await?; + println!("Input Register {}: {:?}", modbus_addr, response); + } + + // 离散输入(Discrete Inputs): 10000-19999 + 10000..=19999 => { + let modbus_addr = address - 10000; + let response = ctx.read_discrete_inputs(modbus_addr, 1).await?; + println!("Discrete Input {}: {:?}", modbus_addr, response); + } + + // 线圈(Coils): 0-9999 + 0..=9999 => { + let response = ctx.read_coils(address, 1).await?; + println!("Coil {}: {:?}", address, response); + } + + _ => { + return Err("Invalid Modbus address".into()); + } + } + + Ok(()) + } } \ No newline at end of file