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.
This commit is contained in:
Eduard Iten 2025-07-01 14:38:10 +02:00
parent 1067796df4
commit 032ddf2cc0
1 changed files with 23 additions and 1 deletions

View File

@ -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;
}
}