From bedff06ec1c524cbf17cbc78fca669d6856497c3 Mon Sep 17 00:00:00 2001 From: kelsoprotein-lab Date: Sat, 2 May 2026 00:16:25 +0800 Subject: [PATCH] =?UTF-8?q?feat(slave-app):=20=E6=B7=BB=E5=8A=A0=20read=5F?= =?UTF-8?q?registers=5Fbulk=20=E5=91=BD=E4=BB=A4=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E5=AF=84=E5=AD=98=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 Tauri 命令 read_registers_bulk,按 register_type 一次性返回当前 slave 所有匹配寄存器的快照值,避免前端逐个 read_register 的 N 次 IPC 往返。 --- crates/modbussim-app/src/commands.rs | 59 ++++++++++++++++++++++++++++ crates/modbussim-app/src/lib.rs | 1 + 2 files changed, 60 insertions(+) diff --git a/crates/modbussim-app/src/commands.rs b/crates/modbussim-app/src/commands.rs index 0a2c01b..0750eaa 100644 --- a/crates/modbussim-app/src/commands.rs +++ b/crates/modbussim-app/src/commands.rs @@ -531,6 +531,65 @@ pub async fn read_register( Ok(RegisterValueInfo { address, value }) } +#[tauri::command] +pub async fn read_registers_bulk( + state: State<'_, AppState>, + connection_id: String, + slave_id: u8, + register_type: String, +) -> Result, String> { + let connections = state.slave_connections.read().await; + let conn = connections + .get(&connection_id) + .ok_or_else(|| format!("connection {} not found", connection_id))?; + + let reg_type = parse_register_type(®ister_type)?; + + let devices = conn.connection.devices.read().await; + let device = devices + .get(&slave_id) + .ok_or_else(|| format!("slave {} not found", slave_id))?; + + let mut out = Vec::with_capacity(device.register_defs.len()); + for def in device + .register_defs + .iter() + .filter(|d| d.register_type == reg_type) + { + let value = match reg_type { + RegisterType::Coil => device + .register_map + .coils + .get(&def.address) + .copied() + .unwrap_or(false) as u16, + RegisterType::DiscreteInput => device + .register_map + .discrete_inputs + .get(&def.address) + .copied() + .unwrap_or(false) as u16, + RegisterType::HoldingRegister => device + .register_map + .holding_registers + .get(&def.address) + .copied() + .unwrap_or(0), + RegisterType::InputRegister => device + .register_map + .input_registers + .get(&def.address) + .copied() + .unwrap_or(0), + }; + out.push(RegisterValueInfo { + address: def.address, + value, + }); + } + Ok(out) +} + #[tauri::command] pub async fn write_register( state: State<'_, AppState>, diff --git a/crates/modbussim-app/src/lib.rs b/crates/modbussim-app/src/lib.rs index d15e462..daca58f 100644 --- a/crates/modbussim-app/src/lib.rs +++ b/crates/modbussim-app/src/lib.rs @@ -22,6 +22,7 @@ pub fn run() { commands::add_register, commands::remove_register, commands::read_register, + commands::read_registers_bulk, commands::write_register, commands::list_registers, commands::export_registers,