131 lines
5.1 KiB
C
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 */ |