112 lines
3.0 KiB
C
112 lines
3.0 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 130
|
|
#define MODBUS_MAX_NAME_LEN 32
|
|
#define MODBUS_MAX_NOTES_LEN 64
|
|
#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;
|
|
|
|
char name[MODBUS_MAX_NAME_LEN];
|
|
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];
|
|
|
|
char notes[MODBUS_MAX_NOTES_LEN];
|
|
|
|
uint8_t bit_value;
|
|
uint16_t reg_value;
|
|
} modbus_point_t;
|
|
|
|
typedef struct modbus_db
|
|
{
|
|
modbus_point_t points[MODBUS_MAX_POINTS];
|
|
size_t count;
|
|
} 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_name(const modbus_db_t *db,
|
|
const char *name);
|
|
|
|
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 */ |