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:
parent
1067796df4
commit
032ddf2cc0
|
|
@ -68,11 +68,33 @@ static int holding_reg_wr(uint16_t addr, uint16_t reg)
|
||||||
return 0;
|
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 = {
|
static struct modbus_user_callbacks mbs_cbs = {
|
||||||
.coil_rd = coil_rd,
|
.coil_rd = coil_rd,
|
||||||
.coil_wr = coil_wr,
|
.coil_wr = coil_wr,
|
||||||
.holding_reg_rd = holding_reg_rd,
|
.holding_reg_rd = holding_reg_rd,
|
||||||
.holding_reg_wr = holding_reg_wr,
|
.holding_reg_wr = holding_reg_wr,
|
||||||
|
.input_reg_rd = input_reg_rd,
|
||||||
};
|
};
|
||||||
|
|
||||||
const static struct modbus_iface_param server_param = {
|
const static struct modbus_iface_param server_param = {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue