Files
Modbus/main/modbus_points.h
2026-06-11 16:51:52 -05:00

106 lines
2.9 KiB
C

#ifndef MODBUS_POINTS_H
#define MODBUS_POINTS_H
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include "modbus_memory.h"
#define MODBUS_MAX_POINTS 384 /* Max amount of registers you allocate per device, base this on the highest register count, also the more you reserve the more memory you need*/
#define MODBUS_MAX_CSV_LINE_LEN 256
typedef enum
{
MB_POINT_COIL = 0,
MB_POINT_DISCRETE_INPUT,
MB_POINT_INPUT_REGISTER,
MB_POINT_HOLDING_REGISTER,
MB_POINT_INVALID
} modbus_point_type_t;
typedef enum
{
MB_DATA_BOOL = 0,
MB_DATA_UINT16,
MB_DATA_UINT32,
MB_DATA_FLOAT,
MB_DATA_DOUBLE,
MB_DATA_INVALID
} modbus_data_type_t;
typedef enum
{
PICS_DATA_NONE = 0,
PICS_DATA_BOOLEAN,
PICS_DATA_INTEGER, /* PICS Integer = 32-bit */
PICS_DATA_FLOAT, /* PICS Float = 64-bit double */
PICS_DATA_STRING,
PICS_DATA_INVALID
} pics_data_type_t;
typedef struct modbus_point
{
modbus_point_type_t type;
uint32_t raw_address;
uint16_t offset;
modbus_data_type_t data_type;
uint8_t reg_span;
bool is_helper;
bool has_control_address;
uint32_t control_raw_address;
modbus_point_type_t control_type;
uint16_t control_offset;
bool has_pics_address;
uint32_t pics_raw_address;
modbus_point_type_t pics_type;
uint16_t pics_offset;
pics_data_type_t pics_data_type;
uint8_t pics_reg_span;
uint16_t pics_words[4];
uint8_t bit_value;
uint16_t reg_value;
} modbus_point_t;
typedef struct modbus_db
{
modbus_point_t *points;
size_t count;
size_t capacity;
} modbus_db_t;
/* Initialize / clear point database */
void modbus_points_init(modbus_db_t *db);
void modbus_points_reset(modbus_db_t *db);
/* Load points from CSV */
bool modbus_points_load(modbus_db_t *db, const char *filename);
/* Lookup helpers */
const modbus_point_t *modbus_points_find_by_type_offset(const modbus_db_t *db,
modbus_point_type_t type,
uint16_t offset);
/* Optional helpers for PICS staging lookup */
const modbus_point_t *modbus_points_find_by_pics_offset(const modbus_db_t *db,
modbus_point_type_t type,
uint16_t offset);
const modbus_point_t *modbus_points_find_by_pics_range(const modbus_db_t *db,
modbus_point_type_t type,
uint16_t offset);
/* Helpers */
modbus_mem_type_t modbus_points_type_to_mem(modbus_point_type_t type);
bool modbus_points_is_bit_type(modbus_point_type_t type);
bool modbus_points_is_reg_type(modbus_point_type_t type);
bool modbus_points_is_writable_type(modbus_point_type_t type);
#endif /* MODBUS_POINTS_H */