Files
modbus-rtu/main/modbus_memory.h
2026-04-14 15:19:00 -05:00

131 lines
5.1 KiB
C

#ifndef MODBUS_MEMORY_H
#define MODBUS_MEMORY_H
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
typedef enum
{
MB_MEM_COIL = 0,
MB_MEM_DISCRETE_INPUT,
MB_MEM_INPUT_REGISTER,
MB_MEM_HOLDING_REGISTER
} modbus_mem_type_t;
typedef struct modbus_db modbus_db_t;
typedef struct
{
modbus_db_t *db;
} modbus_memory_t;
/* ---------------------------------------------------- */
/* Init / deinit */
/* ---------------------------------------------------- */
bool modbus_memory_init(modbus_memory_t *mem, modbus_db_t *db);
void modbus_memory_deinit(modbus_memory_t *mem);
/* Clear all runtime point values back to 0 */
void modbus_memory_reset(modbus_memory_t *mem);
/* ---------------------------------------------------- */
/* Single-point access helpers */
/* ---------------------------------------------------- */
bool modbus_memory_read_coil(modbus_memory_t *mem, uint16_t offset, uint8_t *value);
bool modbus_memory_write_coil(modbus_memory_t *mem, uint16_t offset, uint8_t value);
bool modbus_memory_read_discrete_input(modbus_memory_t *mem, uint16_t offset, uint8_t *value);
bool modbus_memory_write_discrete_input(modbus_memory_t *mem, uint16_t offset, uint8_t value);
bool modbus_memory_read_input_register(modbus_memory_t *mem, uint16_t offset, uint16_t *value);
bool modbus_memory_write_input_register(modbus_memory_t *mem, uint16_t offset, uint16_t value);
bool modbus_memory_read_holding_register(modbus_memory_t *mem, uint16_t offset, uint16_t *value);
bool modbus_memory_write_holding_register(modbus_memory_t *mem, uint16_t offset, uint16_t value);
/* ---------------------------------------------------- */
/* Generic access helpers */
/* ---------------------------------------------------- */
bool modbus_memory_read_bit(modbus_memory_t *mem,
modbus_mem_type_t type,
uint16_t offset,
uint8_t *value);
bool modbus_memory_write_bit(modbus_memory_t *mem,
modbus_mem_type_t type,
uint16_t offset,
uint8_t value);
bool modbus_memory_read_reg(modbus_memory_t *mem,
modbus_mem_type_t type,
uint16_t offset,
uint16_t *value);
bool modbus_memory_write_reg(modbus_memory_t *mem,
modbus_mem_type_t type,
uint16_t offset,
uint16_t value);
/* ---------------------------------------------------- */
/* Multi-point access helpers */
/* ---------------------------------------------------- */
bool modbus_memory_read_coils(modbus_memory_t *mem,
uint16_t start_offset,
uint16_t quantity,
uint8_t *dest);
bool modbus_memory_write_coils(modbus_memory_t *mem,
uint16_t start_offset,
uint16_t quantity,
const uint8_t *src);
bool modbus_memory_read_discrete_inputs(modbus_memory_t *mem,
uint16_t start_offset,
uint16_t quantity,
uint8_t *dest);
bool modbus_memory_write_discrete_inputs(modbus_memory_t *mem,
uint16_t start_offset,
uint16_t quantity,
const uint8_t *src);
bool modbus_memory_read_input_registers(modbus_memory_t *mem,
uint16_t start_offset,
uint16_t quantity,
uint16_t *dest);
bool modbus_memory_write_input_registers(modbus_memory_t *mem,
uint16_t start_offset,
uint16_t quantity,
const uint16_t *src);
bool modbus_memory_read_holding_registers(modbus_memory_t *mem,
uint16_t start_offset,
uint16_t quantity,
uint16_t *dest);
bool modbus_memory_write_holding_registers(modbus_memory_t *mem,
uint16_t start_offset,
uint16_t quantity,
const uint16_t *src);
/* ---------------------------------------------------- */
/* Utility helpers */
/* ---------------------------------------------------- */
bool modbus_memory_valid_bit_range(modbus_memory_t *mem,
modbus_mem_type_t type,
uint16_t start_offset,
uint16_t quantity);
bool modbus_memory_valid_reg_range(modbus_memory_t *mem,
modbus_mem_type_t type,
uint16_t start_offset,
uint16_t quantity);
#endif /* MODBUS_MEMORY_H */