This commit is contained in:
anlicheng 2025-06-21 00:40:29 +08:00
parent 1f747f2655
commit 8ef4c9786c

View File

@ -43,7 +43,7 @@ impl ModbusClient {
} }
} }
pub async fn request(&mut self, slave_id: u8, address: u16) -> Result<(), Box<dyn std::error::Error>> { pub async fn request(&mut self, slave_id: u8, address: u16, cnt: u16) -> Result<Vec<u16>, Box<dyn std::error::Error>> {
let slave = Slave(slave_id); let slave = Slave(slave_id);
let mut ctx = rtu::attach_slave(&mut self.stream, slave); let mut ctx = rtu::attach_slave(&mut self.stream, slave);
@ -52,15 +52,31 @@ impl ModbusClient {
// 保持寄存器Holding Registers: 40000-49999 // 保持寄存器Holding Registers: 40000-49999
40000..=49999 => { 40000..=49999 => {
let modbus_addr = address - 40000; // 转换为 Modbus 协议地址0-9999 let modbus_addr = address - 40000; // 转换为 Modbus 协议地址0-9999
let response = ctx.read_holding_registers(modbus_addr, 1).await?; let response = ctx.read_holding_registers(modbus_addr, cnt).await?;
println!("Holding Register {}: {:?}", modbus_addr, response); println!("Holding Register {}: {:?}", modbus_addr, response);
match response {
Ok(bytes) => {
Ok(bytes)
}
Err(e) => {
Err(e.into())
}
}
} }
// 输入寄存器Input Registers: 30000-39999 // 输入寄存器Input Registers: 30000-39999
30000..=39999 => { 30000..=39999 => {
let modbus_addr = address - 30000; let modbus_addr = address - 30000;
let response = ctx.read_input_registers(modbus_addr, 1).await?; let response = ctx.read_input_registers(modbus_addr, cnt).await?;
println!("Input Register {}: {:?}", modbus_addr, response); println!("Input Register {}: {:?}", modbus_addr, response);
match response {
Ok(bytes) => {
Ok(bytes)
}
Err(e) => {
Err(e.into())
}
}
} }
// 离散输入Discrete Inputs: 10000-19999 // 离散输入Discrete Inputs: 10000-19999
@ -68,19 +84,42 @@ impl ModbusClient {
let modbus_addr = address - 10000; let modbus_addr = address - 10000;
let response = ctx.read_discrete_inputs(modbus_addr, 1).await?; let response = ctx.read_discrete_inputs(modbus_addr, 1).await?;
println!("Discrete Input {}: {:?}", modbus_addr, response); println!("Discrete Input {}: {:?}", modbus_addr, response);
match response {
Ok(bytes) => {
Ok(Self::bool_to_u16(bytes[0]))
}
Err(e) => {
Err(e.into())
}
}
} }
// 线圈Coils: 0-9999 // 线圈Coils: 0-9999
0..=9999 => { 0..=9999 => {
let response = ctx.read_coils(address, 1).await?; let response = ctx.read_coils(address, 1).await?;
println!("Coil {}: {:?}", address, response); println!("Coil {}: {:?}", address, response);
match response {
Ok(bytes) => {
Ok(Self::bool_to_u16(bytes[0]))
}
Err(e) => {
Err(e.into())
}
}
} }
_ => { _ => {
return Err("Invalid Modbus address".into()); return Err("Invalid Modbus address".into());
} }
} }
Ok(())
} }
pub fn bool_to_u16(val: bool) -> Vec<u16> {
if val {
vec![1]
} else {
vec![0]
}
}
} }