初版程序
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user