From 032ddf2cc0e99aeb091cd33856ff1df5d69a79c3 Mon Sep 17 00:00:00 2001 From: Eduard Iten Date: Tue, 1 Jul 2025 14:38:10 +0200 Subject: [PATCH] feat(slave_node): Implement uptime registers - Add a callback for reading Modbus input registers. - Implement logic to provide the system uptime in seconds, split across two 16-bit registers (UPTIME_SECONDS_LOW at 0x00F3 and UPTIME_SECONDS_HIGH at 0x00F4) as per documentation. - Return 0 for unhandled registers to prevent "Invalid data" errors with certain Modbus masters. --- software/apps/slave_node/src/main.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/software/apps/slave_node/src/main.c b/software/apps/slave_node/src/main.c index 660bfd7..d93a8ee 100644 --- a/software/apps/slave_node/src/main.c +++ b/software/apps/slave_node/src/main.c @@ -68,11 +68,33 @@ static int holding_reg_wr(uint16_t addr, uint16_t reg) return 0; } +static int input_reg_rd(uint16_t addr, uint16_t *reg) +{ + uint32_t uptime_s = k_uptime_get_32() / 1000; + + switch (addr) { + case 0x00F3: + *reg = (uint16_t)(uptime_s & 0xFFFF); + break; + case 0x00F4: + *reg = (uint16_t)(uptime_s >> 16); + break; + default: + *reg = 0; + break; + } + + LOG_INF("Input register read, addr %u, value %u", addr, *reg); + + return 0; +} + static struct modbus_user_callbacks mbs_cbs = { .coil_rd = coil_rd, .coil_wr = coil_wr, .holding_reg_rd = holding_reg_rd, .holding_reg_wr = holding_reg_wr, + .input_reg_rd = input_reg_rd, }; const static struct modbus_iface_param server_param = { @@ -117,4 +139,4 @@ int main(void) } return 0; -} \ No newline at end of file +}