This commit is contained in:
2026-02-25 15:12:13 +08:00
parent 9d69b29eed
commit 090eb335a8
25 changed files with 620 additions and 19973 deletions
+14 -6
View File
@@ -18,7 +18,7 @@
#include "proto_modbus_master_leakage.h"
#include "proto_modbus_slave_ex.h"
#include "proto_modbus_tcp_slave_ex.h"
#include "gui_tjc_hmi.h"
@@ -58,7 +58,7 @@ app_timer_class_t app_timer_task[] =
void app_init(void)
{
/*flash*/
Usr_Flash.Init();
w25q32.init();
/*串口初始化*/
com_uart1.init(&com_uart1);
@@ -81,13 +81,18 @@ void app_init(void)
modbus_leakage[APP_COM2].init(&modbus_leakage[APP_COM2]);
modbus_leakage[APP_COM3].init(&modbus_leakage[APP_COM3]);
modbus_leakage[APP_COM4].init(&modbus_leakage[APP_COM4]);
/*外设通讯*/
/*外设*/
DS1302.Init();
relay.init();
buzzer.init();
led.init();
leakage.init();
/*com口绑定*/
app_com.init();
history.init_history();
/*分时复用,时间片轮询*/
app_timer.init(APP_TIMER_TASK_NUM,app_timer_task);
@@ -115,6 +120,7 @@ void task_idle(void)
com_uart3.rx_task(&com_uart3);
com_uart4.rx_task(&com_uart4);
com_uart6.rx_task(&com_uart6);
W5500.Task();
}
void task_10ms(void)
@@ -139,7 +145,10 @@ void task_200ms(void)
void task_500ms(void)
{
led.task();
//tdlas.tx_task();
modbus_leakage[APP_COM1].tx_task(&modbus_leakage[APP_COM1]);
modbus_leakage[APP_COM2].tx_task(&modbus_leakage[APP_COM2]);
modbus_leakage[APP_COM3].tx_task(&modbus_leakage[APP_COM3]);
// modbus_leakage[APP_COM4].tx_task(&modbus_leakage[APP_COM4]);
}
@@ -147,7 +156,6 @@ void task_1s(void)
{
leakage.task();
DS1302.Task();
buzzer.task();
relay.task();
}
+53 -94
View File
@@ -1,22 +1,15 @@
#include "app_alarm.h"
#include "app_leakage.h"
#include <string.h>
#include "bsp_w25q.h"
#include "bsp_buzzer.h"
#include "bsp_relay.h"
static void history_clear_all(void);
static u8 history_read_record(u32 record_index, app_leakage_history_alarm_t *record);
static void history_init(void);
static void history_save_metadata(void);
app_leakage_t leakage =
{
.region_num = 0,
.sub_device_num = 0,
.init = NULL,
.task = app_leakage_task
};
app_leakage_t *p_leakage = &leakage;
app_hitory_t history =
{
.read_history = history_read_record,
@@ -24,91 +17,75 @@ app_hitory_t history =
.init_history = history_init
};
/*区域分类,将同一区域名的设备划分到一起*/
void app_leakage_region_classify(void)
/*控制 声 光 继电器 报警*/
static void app_leakage_alarm_contorl(void)
{
u16 i,j;
u8 add_region_flag;
/*数量及相关数据清零*/
p_leakage->region_num = 0;
p_leakage->sub_device_num = 0;
memset(p_leakage->region_data,0,sizeof(p_leakage->region_data));
/*遍历子系统*/
for(i=0;i<APP_LEAKAGE_SUB_DEVICE_NUM;i++)
if(0 != leakage.alarm_state)
{
add_region_flag = 1; /*添加新区域*/
/*设备使能*/
if(ENABLE == p_leakage->sub_device_data[i].flash_data.state)
{
p_leakage->sub_device_num++;/*子系统总数量++*/
/*遍历区域*/
for(j=0;j<APP_LEAKAGE_SUB_DEVICE_NUM;j++)
{
if(0 == memcmp(p_leakage->region_data[j].name,p_leakage->sub_device_data[i].flash_data.region_name, APP_LEAKAGE_STRING_NANE_LEN))/*名称相同*/
{
/*添加子设备*/
p_leakage->region_data[j].sub_device_index[p_leakage->region_data[j].leakage_num] = i;/*绑定子设备索引*/
p_leakage->region_data[j].sub_device_num++; /*区域中子系统数据++*/
add_region_flag = 0;/*不添加新区域*/
break;
}
}
/*没有找到相同名称*/
if(add_region_flag)/*添加新区域*/
{
/*复制名称*/
memcpy(p_leakage->region_data[p_leakage->region_num].name,p_leakage->sub_device_data[i].flash_data.region_name, APP_LEAKAGE_STRING_NANE_LEN);
p_leakage->region_data[p_leakage->region_num].sub_device_index[p_leakage->region_data[p_leakage->region_num].leakage_num] = i;/*绑定子设备索引*/
p_leakage->region_data[p_leakage->region_num].sub_device_num++; /*区域中子系统数据++*/
p_leakage->region_num++; /*区域数量++*/
}
}
buzzer.set.on();
relay.set(BSP_RELAY_CH_ERROR_STATE,USR_ON);
}
else
{
buzzer.set.off();
relay.set(BSP_RELAY_CH_ERROR_STATE,USR_OFF);
}
/*漏液状态*/
if(leakage.alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)
{
relay.set(BSP_RELAY_CH_LEAKAGE,USR_ON);
}
else
{
relay.set(BSP_RELAY_CH_LEAKAGE,USR_OFF);
}
/*断带状态*/
if(leakage.alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
{
relay.set(BSP_RELAY_CH_OPEN,USR_ON);
}
else
{
relay.set(BSP_RELAY_CH_OPEN,USR_OFF);
}
/*通讯超时*/
if(leakage.alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT)
{
relay.set(BSP_RELAY_CH_COMMINCAION,USR_ON);
}
else
{
relay.set(BSP_RELAY_CH_COMMINCAION,USR_OFF);
}
}
/*异常状态设备数量统计*/
void app_leakage_task(void)
{
static u16 prev_ch_state[APP_LEAKAGE_SUB_DEVICE_NUM][APP_LEAKAGE_SUB_DEVICE_CH_NUM] = {0};
u16 i, j, k, sub_device_index;
static u8 initialized = 0;
/* 初始化历史模块 */
if(!initialized)
{
history.init_history();
initialized = 1;
}
/* 初始化区域异常统计 */
for(i = 0; i < p_leakage->region_num; i++)
{
p_leakage->region_data[i].leakage_num = 0;
p_leakage->region_data[i].open_num = 0;
p_leakage->region_data[i].time_out_num = 0;
}
/* 检测状态变化并统计异常数量 */
for(i = 0; i < p_leakage->region_num; i++)
for(i = 0; i < leakage.region_num; i++)
{
for(j = 0; j < p_leakage->region_data[i].sub_device_num; j++)
for(j = 0; j < leakage.region_data[i].sub_device_num; j++)
{
sub_device_index = p_leakage->region_data[i].sub_device_index[j];
sub_device_index = leakage.region_data[i].sub_device_index[j];
/* 检查设备是否启用 */
if(p_leakage->sub_device_data[sub_device_index].flash_data.state != ENABLE)
if(leakage.sub_device_data[sub_device_index].flash_data.state != ENABLE)
{
continue;
}
/*历史报警存储*/
for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_CH_NUM; k++)
{
u16 current_state = p_leakage->sub_device_data[sub_device_index].ch_data[k].state;
u16 current_state = leakage.sub_device_data[sub_device_index].ch_data[k].state;
u16 prev_state = prev_ch_state[sub_device_index][k];
u16 leak_distance = p_leakage->sub_device_data[sub_device_index].ch_data[k].distance;
u16 leak_distance = leakage.sub_device_data[sub_device_index].ch_data[k].distance;
/* 检测状态变化并记录历史报警 */
if((current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE) &&
@@ -135,29 +112,11 @@ void app_leakage_task(void)
/* 更新历史状态 */
prev_ch_state[sub_device_index][k] = current_state;
}
/* 统计区域异常设备数量 - 按设备统计 */
for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_CH_NUM; k++)
{
u16 current_state = p_leakage->sub_device_data[sub_device_index].ch_data[k].state;
if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT)
{
p_leakage->region_data[i].time_out_num++;
continue; /* 通讯超时,设备已离线,不再检查其他异常 */
}
if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
{
p_leakage->region_data[i].open_num++;
}
if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)
{
p_leakage->region_data[i].leakage_num++;
}
}
}
}
/*报警控制 声光报警*/
app_leakage_alarm_contorl();
}
/* 获取当前时间 */
+1 -63
View File
@@ -2,57 +2,7 @@
#define _APP_ALARM_H_
#include "main.h"
#define ENABLE (1)
#define DISABLE (0)
#define APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE (0x0001) /*漏液状态*/
#define APP_LEAKAGE_SUB_DEVICE_STATE_OPEN (0x0002) /*断带状态*/
#define APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT (0xf000) /*通讯超时*/
#define APP_LEAKAGE_STRING_NANE_LEN (10)
#define APP_LEAKAGE_SUB_DEVICE_NUM (32)
#define APP_LEAKAGE_SUB_DEVICE_CH_NUM (4)
void app_leakage_task(void);
void app_leakage_region_classify(void);
void history_add_alarm_record(u8 region_idx, u8 device_idx, u8 channel, u16 alarm_type, u16 leak_distance);
/*子设备存储的参数*/
typedef struct
{
u8 state; /*状态 使能 非使能*/
u8 com_port; /*端口*/
u8 modbus_id; /*modbus id*/
u8 device_name[APP_LEAKAGE_STRING_NANE_LEN]; /*设备名*/
u8 region_name[APP_LEAKAGE_STRING_NANE_LEN]; /*区域名*/
}app_leakage_sub_device_flash_data_t;
/*子设备信息*/
typedef struct
{
app_leakage_sub_device_flash_data_t flash_data; /*flash存储数据*/
struct
{
u16 state; /*状态*/
u16 distance; /*漏液距离*/
}ch_data[APP_LEAKAGE_SUB_DEVICE_CH_NUM]; /*通道数据*/
u8 heartbeat; /*心跳包,0-59循环*/
u8 test_mode; /*测试模式,0=正常,1-4=测试对应通道*/
}app_leakage_sub_device_class_t;
/*区域信息*/
typedef struct
{
u8 leakage_num; /*漏液数量*/
u8 open_num; /*断带数量*/
u8 time_out_num; /*通讯超时数量*/
u8 sub_device_num; /*设备总数量*/
u8 name[APP_LEAKAGE_STRING_NANE_LEN]; /*区域名称*/
u8 sub_device_index[APP_LEAKAGE_SUB_DEVICE_NUM]; /*设备的索引*/
}app_leakage_region_data_class_t;
#include "app_leakage.h"
/* 历史报警记录结构 */
typedef struct
@@ -75,18 +25,6 @@ typedef struct
u32 max_records; /* 最大记录数 */
} app_leakage_history_metadata_t;
typedef struct
{
u8 region_num;
u8 sub_device_num;
app_leakage_region_data_class_t region_data[APP_LEAKAGE_SUB_DEVICE_NUM];
app_leakage_sub_device_class_t sub_device_data[APP_LEAKAGE_SUB_DEVICE_NUM];
app_leakage_history_metadata_t history_metadata;
void (*init)(void); /*初始化*/
void (*task)(void); /*执行任务*/
}app_leakage_t;
typedef struct
{
+13 -14
View File
@@ -8,34 +8,33 @@ bsp_uart_t *com_to_uart[APP_COM_NUM] =
&com_uart4,
&com_uart2,
&com_uart3,
&com_uart1,
&com_uart6,
};
static void app_com_uart_baud_rate_set(app_com_class_t * p_com,u16 baud_rate);
static void app_com_uart_class_rate_set(app_com_class_t * p_com,u16 baud_rate);
static void app_com_class_update(void );
static void app_com_init(app_com_class_t * p_com);
static void app_com_init(void);
app_com_t app_com=
{
.init = app_com_init,
.class_update = app_com_class_update,
};
static void app_com_init(app_com_class_t * p_com)
static void app_com_init(void)
{
if(p_com == &app_com.com[APP_COM1])
p_com->com_uart = com_to_uart[APP_COM1];
else if(p_com == &app_com.com[APP_COM2])
p_com->com_uart = com_to_uart[APP_COM2];
else if(p_com == &app_com.com[APP_COM3])
p_com->com_uart = com_to_uart[APP_COM3];
else if(p_com == &app_com.com[APP_COM4])
p_com->com_uart = com_to_uart[APP_COM4];
u8 i;
for(i=0;i<APP_COM_NUM;i++)
{
app_com.com[i].com_uart = com_to_uart[i];
}
app_com_class_update();
}
/*串口配置*/
static void app_com_uart_baud_rate_set(app_com_class_t * p_com,u16 baud_rate)
static void app_com_class_baud_rate_set(app_com_class_t * p_com,u16 baud_rate)
{
p_com->com_uart->set.baud_rate(p_com->com_uart,baud_rate);
}
+3 -2
View File
@@ -26,14 +26,15 @@ struct app_com_class_t
bsp_uart_t *com_uart; /*绑定的实际物理串口*/
struct
{
void (*baud_rate)(app_com_class_t *,u16); /*设置波特率*/
void (*baud_rate)(app_com_class_t *,u16); /*设置波特率*/
}set;
void (*init)(app_com_class_t *); /*初始化*/
//void (*init)(app_com_class_t *); /*初始化*/
};
typedef struct
{
app_com_class_t com[APP_COM_NUM];
void (*init)(void); /*初始化*/
void (*class_update)(void ); /*com区域分类*/
}app_com_t;
+73 -23
View File
@@ -2,18 +2,23 @@
#include <string.h>
#include "bsp_w25q.h"
#include "bsp_buzzer.h"
#include "bsp_relay.h"
static void history_clear_all(void);
static u8 history_read_record(u32 record_index, app_leakage_history_alarm_t *record);
static void history_init(void);
static void history_save_metadata(void);
static void app_leakage_init(void);
app_leakage_t leakage =
{
.region_num = 0,
.region_num = 0,
.sub_device_num = 0,
.init = NULL,
.task = app_leakage_task
.init = app_leakage_init,
.task = app_leakage_task,
.class_update = app_leakage_region_classify,
};
app_leakage_t *p_leakage = &leakage;
@@ -24,6 +29,12 @@ app_hitory_t history =
.init_history = history_init
};
static void app_leakage_init(void)
{
app_leakage_region_classify();
}
/*区域分类,将同一区域名的设备划分到一起*/
void app_leakage_region_classify(void)
{
@@ -66,27 +77,61 @@ void app_leakage_region_classify(void)
p_leakage->region_data[p_leakage->region_num].sub_device_num++; /*区域中子系统数据++*/
p_leakage->region_num++; /*区域数量++*/
}
}
}
}
/*控制 声 光 继电器 报警*/
static void app_leakage_alarm_contorl(void)
{
if(0 != p_leakage->alarm_state)
{
buzzer.set.on();
relay.set(BSP_RELAY_CH_ERROR_STATE,USR_ON);
}
else
{
buzzer.set.off();
relay.set(BSP_RELAY_CH_ERROR_STATE,USR_OFF);
}
/*漏液状态*/
if(p_leakage->alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)
{
relay.set(BSP_RELAY_CH_LEAKAGE,USR_ON);
}
else
{
relay.set(BSP_RELAY_CH_LEAKAGE,USR_OFF);
}
/*断带状态*/
if(p_leakage->alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
{
relay.set(BSP_RELAY_CH_OPEN,USR_ON);
}
else
{
relay.set(BSP_RELAY_CH_OPEN,USR_OFF);
}
/*通讯超时*/
if(p_leakage->alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT)
{
relay.set(BSP_RELAY_CH_COMMINCAION,USR_ON);
}
else
{
relay.set(BSP_RELAY_CH_COMMINCAION,USR_OFF);
}
}
/*异常状态设备数量统计*/
void app_leakage_task(void)
{
static u16 prev_ch_state[APP_LEAKAGE_SUB_DEVICE_NUM][APP_LEAKAGE_SUB_DEVICE_CH_NUM] = {0};
u16 i, j, k, sub_device_index;
static u8 initialized = 0;
/* 初始化历史模块 */
if(!initialized)
{
history.init_history();
initialized = 1;
}
/* 初始化区域异常统计 */
for(i = 0; i < p_leakage->region_num; i++)
{
@@ -94,7 +139,7 @@ void app_leakage_task(void)
p_leakage->region_data[i].open_num = 0;
p_leakage->region_data[i].time_out_num = 0;
}
p_leakage->alarm_state = 0;
/* 检测状态变化并统计异常数量 */
for(i = 0; i < p_leakage->region_num; i++)
{
@@ -108,6 +153,7 @@ void app_leakage_task(void)
continue;
}
/*历史报警存储*/
for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_CH_NUM; k++)
{
u16 current_state = p_leakage->sub_device_data[sub_device_index].ch_data[k].state;
@@ -141,27 +187,31 @@ void app_leakage_task(void)
}
/* 统计区域异常设备数量 - 按设备统计 */
for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_CH_NUM; k++)
{
u16 current_state = p_leakage->sub_device_data[sub_device_index].ch_data[k].state;
if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT)
{
p_leakage->region_data[i].time_out_num++;
continue; /* 通讯超时,设备已离线,不再检查其他异常 */
p_leakage->region_data[i].time_out_num++;
p_leakage->alarm_state |= APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT;
}
if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
else if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
{
p_leakage->region_data[i].open_num++;
p_leakage->region_data[i].open_num++;
p_leakage->alarm_state |= APP_LEAKAGE_SUB_DEVICE_STATE_OPEN;
}
if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)
else if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)
{
p_leakage->region_data[i].leakage_num++;
p_leakage->region_data[i].leakage_num++;
p_leakage->alarm_state |= APP_LEAKAGE_SUB_DEVICE_STATE_OPEN;
}
}
}
}
/*报警控制 声光报警*/
app_leakage_alarm_contorl();
}
/* 获取当前时间 */
+8 -3
View File
@@ -8,7 +8,7 @@
#define APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE (0x0001) /*漏液状态*/
#define APP_LEAKAGE_SUB_DEVICE_STATE_OPEN (0x0002) /*断带状态*/
#define APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT (0xf000) /*通讯超时*/
#define APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT (0x8000) /*通讯超时*/
#define APP_LEAKAGE_STRING_NANE_LEN (10)
#define APP_LEAKAGE_SUB_DEVICE_NUM (32)
@@ -79,13 +79,18 @@ typedef struct
{
u8 region_num;
u8 sub_device_num;
app_leakage_region_data_class_t region_data[APP_LEAKAGE_SUB_DEVICE_NUM];
app_leakage_sub_device_class_t sub_device_data[APP_LEAKAGE_SUB_DEVICE_NUM];
u16 alarm_state; /*系统报警状态*/
/*区域*/
app_leakage_region_data_class_t region_data[APP_LEAKAGE_SUB_DEVICE_NUM];
/*子设备*/
app_leakage_sub_device_class_t sub_device_data[APP_LEAKAGE_SUB_DEVICE_NUM];
/*历史报警*/
app_leakage_history_metadata_t history_metadata;
void (*init)(void); /*初始化*/
void (*task)(void); /*执行任务*/
void (*class_update)(void);
}app_leakage_t;
typedef struct