Files
secs2-SJ/usr/protocol/proto_modbus_tcp_master.h
2026-09-09 14:54:40 +08:00

120 lines
4.0 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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