From 85d493f24a2ecf64a2a8ffacd4154c58bfb16a35 Mon Sep 17 00:00:00 2001 From: Eduard Iten Date: Wed, 2 Jul 2025 09:55:42 +0200 Subject: [PATCH] feat: implement modbus reset command and update docs/tool --- docs/modbus-registers.de.md | 1 + software/lib/modbus_server/modbus_server.c | 6 ++++++ software/tools/modbus_tool/modbus_tool.py | 3 +++ 3 files changed, 10 insertions(+) diff --git a/docs/modbus-registers.de.md b/docs/modbus-registers.de.md index 400dd75..7522ea5 100644 --- a/docs/modbus-registers.de.md +++ b/docs/modbus-registers.de.md @@ -49,6 +49,7 @@ Alle Register sind in einer einzigen, durchgehenden Liste pro Register-Typ (`Inp | **0x0002** | `MAX_SCHLIESSZEIT_S` | Ventil | Sicherheits-Timeout in Sekunden für den Schliessen-Vorgang. | | **0x0010** | `DIGITAL_AUSGAENGE_ZUSTAND` | Ausgänge | Bitmaske zum Lesen und Schreiben der Ausgänge. Bit 0: Ausgang 1, Bit 1: Ausgang 2. `1`=AN, `0`=AUS. | | **0x00F0** | `WATCHDOG_TIMEOUT_S` | System | Timeout des Fail-Safe-Watchdogs in Sekunden. `0`=Deaktiviert. | +| **0x00F1** | `DEVICE_RESET` | System | Schreibt `1` um das Gerät neu zu starten. | | **0x0100** | `FWU_COMMAND` | Firmware-Update | `1`: **Verify Chunk**: Der zuletzt übertragene Chunk wurde vom Client als gültig befunden. Der Slave soll ihn nun ins Flash schreiben. `2`: **Finalize Update**: Alle Chunks sind übertragen. Installation abschliessen und neu starten. | | **0x0101** | `FWU_CHUNK_OFFSET_LOW` | Firmware-Update | Untere 16 Bit des 32-Bit-Offsets, an den der nächste Chunk geschrieben werden soll. | | **0x0102** | `FWU_CHUNK_OFFSET_HIGH` | Firmware-Update | Obere 16 Bit des 32-Bit-Offsets. | diff --git a/software/lib/modbus_server/modbus_server.c b/software/lib/modbus_server/modbus_server.c index 9375eed..f73cbdc 100644 --- a/software/lib/modbus_server/modbus_server.c +++ b/software/lib/modbus_server/modbus_server.c @@ -110,6 +110,12 @@ static int holding_reg_wr(uint16_t addr, uint16_t reg) k_timer_stop(&watchdog_timer); } break; + case REG_HOLDING_DEVICE_RESET: + if (reg == 1) { + LOG_WRN("Modbus reset command received. Rebooting..."); + sys_reboot(SYS_REBOOT_WARM); + } + break; default: fwu_handler(addr, reg); break; diff --git a/software/tools/modbus_tool/modbus_tool.py b/software/tools/modbus_tool/modbus_tool.py index ddbd4c2..b03d6fd 100755 --- a/software/tools/modbus_tool/modbus_tool.py +++ b/software/tools/modbus_tool/modbus_tool.py @@ -223,6 +223,9 @@ def main_menu(stdscr, slave_id): except Exception as e: message = f"-> Error: {e}" elif selected_option == "Set Watchdog": input_mode, input_prompt, input_target_reg = True, "Enter Watchdog Timeout (s): ", REG_HOLDING_WATCHDOG_TIMEOUT_S + elif selected_option == "Reset Node": + client.write_register(REG_HOLDING_DEVICE_RESET, 1, slave=slave_id) + message = "-> Sent RESET command" elif selected_option == "Firmware Update": filepath = file_browser(stdscr) if filepath: