Modbus TCP - Multi Devices
This commit is contained in:
112
main/modbus_points.h
Normal file
112
main/modbus_points.h
Normal file
@@ -0,0 +1,112 @@
|
||||
#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
|
||||
#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 */
|
||||
Reference in New Issue
Block a user