#ifndef _PROTO_MODBUS_TCP_H_ #define _PROTO_MODBUS_TCP_H_ #include "main.h" #include "bsp_W5500_1.h" /* 默认单元标识符(Unit ID),用于单设备连接 */ #define MODBUS_TCP_DEFAULT_UNIT_ID (01) /* 三个数据块的起始地址(偏移直接使用) */ #define MODBUS_REG_DEVICE_STATUS_START 0x0000 /* 40000 */ #define MODBUS_REG_INSTRUMENT_FLOAT_START 0x0032 /* 40050 */ #define MODBUS_REG_INSTRUMENT_INT_START 0x00FA /* 40250 */ #define MODBUS_REG_INSTRUMENT_SN_START 0x00FD /* 40253 */ /* 对应寄存器数量 */ #define MODBUS_REG_DEVICE_STATUS_NUM 8 /* 40000~40007 */ #define MODBUS_REG_INSTRUMENT_FLOAT_NUM 52 /* 40050~40100 */ #define MODBUS_REG_INSTRUMENT_INT_NUM 3 /* 40250~40252 */ #define MODBUS_REG_INSTRUMENT_SN_NUM 10 /* 40253~40262 */ /*设备控制*/ #define DEVICE_START ("start") /*设备启动*/ #define DEVICE_STOP ("stop") /*设备停止*/ #define DEVICE_IDLE_OPEN ("idle_open") /*设备空闲停止*/ #define DEVICE_IDLE_CLOSE ("idle_close") /*设备空闲停止*/ #define MODBUS_REG_CONTROL_ADDR 0x0007 /* 40007 */ #define CONTROL_BIT_START (1 << 3) /* bit3 */ #define CONTROL_BIT_STOP (1 << 4) /* bit4 */ #define CONTROL_BIT_IDLE_OPEN (1 << 5) /* bit5 */ #define CONTROL_BIT_IDLE_CLOSE (1 << 6) /* bit6 */ #define PROTO_MODBUS_DEVICE_STATUS_RUN (0x08) /*设备启动且没有PM和一级报警*/ #define PROTO_MODBUS_DEVICE_STATUS_PM (0x01) /*设备处于PM*/ #define PROTO_MODBUS_DEVICE_STATUS_ALARM /*设备处于一级报警*/ #define PROTO_MODBUS_DEVICE_STATUS_IDLE (0x10) /*设备停止*/ #define PROTO_MODBUS_DEVICE_STATUS_OFFLINE (5) /*设备离线*/ #define PROTO_MODBUS_MASTER_MODE_RUN 0 /*设备运行*/ #define PROTO_MODBUS_MASTER_MODE_ALARM 1 /*设备报警*/ #define PROTO_MODBUS_MASTER_MODE_PM 2 #define PROTO_MODBUS_MASTER_MODE_IDLE 3 /*设备空闲/停止*/ #define PROTO_MODBUS_MASTER_MODE_OFFLINE 4 /*设备离线*/ #define PROTO_MODBUS_MASTER_MODE_ONLINE 5 /*设备在线*/ typedef struct { //报警开始标志 u8 alarm; // 报警开始时间记录 u32 alarm_start_sec[24]; char alarm_start_str[24][17]; // 警告开始时间记录 u32 warning_start_sec[64]; char warning_start_str[64][17]; // 上次状态缓存(用于变化检测) u64 alarm_status_last; u64 warning_status_last; // 定时器 tick u32 alarm_task_tick; //PM状态 u8 pm_status; // 离线相关 u8 offline; u32 offline_start_sec; char offline_start_str[17]; u8 last_offline_state; } modbus_alarm_context_t; typedef struct { u8 device_status_last; u8 device_status; u32 status_task_tick; }modbus_device_context_t; /* 数据结构:存储解析后的原始值 */ typedef struct { u16 reg_status[8]; /* 40000~40007 原始值 */ float float_values[26]; /* 由40050~40100组成26个浮点 */ u16 int_values[3]; /* 40250~40252 */ u16 sn[10]; /* 40253~40262第一个字节为长度舍弃*/ char sn_str[21]; /* 解析后的 SN 字符串(含 '\0')*/ } modbus_tcp_data_t; /* 设备对象结构 */ typedef struct { u8 req_state; /* 0=空闲,1=等待状态响应,2=等待浮点响应,3=等待整数响应 */ u32 last_req_time; u8 retry_cnt; /*重试次数*/ u16 transaction_id; u8 write_pending; /* 1=等待写响应 */ u16 write_tid; /* 写操作的事务ID */ u8 write_result; /* 0=失败/超时,1=成功 */ u8 no_response_count; /*连续无响应分组计数*/ modbus_tcp_data_t data; modbus_alarm_context_t alarm_ctx; modbus_device_context_t status_ctx; void (*init)(void); void (*task)(void); void (*write)(u16); } proto_modbus_t; /* 位提取函数:从16位寄存器中提取第bit_pos位(0~15) */ static inline u8 modbus_tcp_get_bit(u16 reg_value, u8 bit_pos) { return (reg_value >> bit_pos) & 0x01; } extern proto_modbus_t modbus_tcp; extern char *proto_modbus_master_alarm[24]; extern char *proto_modbus_master_warning[64]; #endif