Initial commit: CCU621_M firmware project with BLE debug link support.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,920 @@
|
||||
#include "collect_ctrl/collect_task.h"
|
||||
#include "collect_ctrl/yk_ctrl.h"
|
||||
#include "collect_ctrl/led_ctrl.h"
|
||||
#include "sub_comm/sub_comm_task.h"
|
||||
|
||||
#include "app_init/app_init.h"
|
||||
#include "app_init/task_lock.h"
|
||||
#include "mylog/mylog.h"
|
||||
#include "publicdata/publicdata.h"
|
||||
#include "wdt_task/wdt_task.h"
|
||||
#include <stdio.h>
|
||||
#include "usart.h"
|
||||
#include "adc/adc_temp.h"
|
||||
#include "adc/adc_spi5_batVoltCurr.h"
|
||||
#include "adc/adc_spi3_insuVolt.h"
|
||||
// 数据采集任务ID
|
||||
#define DATACOLL_TASK_ID (TASK_ID_DataColl)
|
||||
// 获取数据采集任务睡眠时间(毫秒)
|
||||
#define DATACOLL_SLEEP_TIME_MS() (MY_GET_SLEEP_TIME(DATACOLL_TASK_ID))
|
||||
// 初始化数据采集任务锁
|
||||
#define DATACOLL_LOCK_INIT() (u8_task_lock_ctrl(DATACOLL_TASK_ID, TASK_LOCK_OP_INIT))
|
||||
// 获取数据采集任务锁
|
||||
#define DATACOLL_LOCK_TAKE() (u8_task_lock_ctrl(DATACOLL_TASK_ID, TASK_LOCK_OP_TAKE))
|
||||
// 释放数据采集任务锁
|
||||
#define DATACOLL_LOCK_GIVE() (u8_task_lock_ctrl(DATACOLL_TASK_ID, TASK_LOCK_OP_GIVE))
|
||||
// 喂狗(数据采集任务)
|
||||
#define DATACOLL_FEED_DOG() (v_wdt_setFlag(DATACOLL_TASK_ID))
|
||||
// 数据采集任务日志记录
|
||||
#define DATACOLL_LOG(fmt, ...) MYLOG_MSG(DATACOLL_TASK_ID, (fmt), ##__VA_ARGS__)
|
||||
|
||||
#define TEMP_MAX_NUM (2000) //温度最大值 超过则为0
|
||||
|
||||
#if 1 //结构定义及变量声明
|
||||
typedef struct
|
||||
{
|
||||
U8_T u8_gunNo; //枪数量
|
||||
U8_T u8_gunLockNeg[GUN_MAX_CNT]; //枪锁取反标志
|
||||
SYS_RT_DATA s_sys_rt_data; //整桩遥信、遥测
|
||||
GUN_RT_DATA s_gun_rt_data[GUN_MAX_CNT]; //充电枪相关遥信、遥测
|
||||
} YXYC_DATA; //系统遥信、遥测结构体
|
||||
typedef struct
|
||||
{
|
||||
U8_T flag_set; //设置标志
|
||||
U8_T flag_read; //读取标志
|
||||
|
||||
U8_T gunLink_exit[2]; //枪连接中断
|
||||
|
||||
U16_T u16_timer_cnt; //周期计时
|
||||
|
||||
float f_adc_data[6]; //4路枪温数据 + 2路温度监测
|
||||
float f_adc_dc_vol[4]; //直流母线adc电压采集值
|
||||
float f_adc_bat_vol[2]; //直流外侧adc电压采集值
|
||||
float f_adc_dc_cur[2]; //直流外侧adc电压采集值
|
||||
float f_adc_gunLink[2]; //枪连接 adc
|
||||
} S_ADC_GUN_CTRL;
|
||||
|
||||
S_ADC_GUN_CTRL s_adc_gun_ctrl;
|
||||
YXYC_DATA sys_yxyc_data; //系统遥信、遥测
|
||||
|
||||
#endif
|
||||
#if 1 //外部参数获取函数
|
||||
/********************************
|
||||
* 函数说明: 获取枪数量
|
||||
* *参数说明:
|
||||
* 输入参数:void
|
||||
* 输出参数:U8_T u8_ret 枪数量
|
||||
* 备注:
|
||||
**********************************/
|
||||
static U8_T u8_coll_get_gun_num()
|
||||
{
|
||||
U8_T u8_ret = 0;
|
||||
|
||||
u8_ret = g_t_share_data.t_sys_fix_cfg.u8_gunCnt; //获取充电枪数量,需调用外部参数
|
||||
return u8_ret;
|
||||
}
|
||||
|
||||
/****************************************************
|
||||
*功能说明: 获取充电桩对应遥信状态或数据(功能框架)
|
||||
*参数说明:
|
||||
* 输入参数: E_YX_SYS sys_yx_type , 要读取的整桩遥信状态或数据
|
||||
* 输出参数: U8_T 遥信状态或数据(当前默认返回 0,待系统集成对接真实数据来源)
|
||||
*备注:
|
||||
****************************************************/
|
||||
static U8_T u8_coll_get_yx_sys(E_YX_SYS sys_yx_type)
|
||||
{
|
||||
U8_T u8_ret = 0;
|
||||
|
||||
/*
|
||||
* 数据来源在此处对接(先给默认值,后续你可以直接改每个 case 的赋值):
|
||||
* - 例如对接 DI:u8_ret = DIxx;
|
||||
* - 或对接共享数据:u8_ret = g_t_share_data.xxx;
|
||||
* - 或对接 CAN 状态:u8_ret = xxx_get();
|
||||
*/
|
||||
switch (sys_yx_type)
|
||||
{
|
||||
case YX_PILE_EMERGENCY: //急停(副板 DI13)
|
||||
u8_ret = u8_sub_comm_yx_get(E_SUB_YX_13);
|
||||
break;
|
||||
|
||||
case YX_PILE_DOOR: //门禁(副板 DI14)
|
||||
u8_ret = u8_sub_comm_yx_get(E_SUB_YX_14);
|
||||
break;
|
||||
|
||||
case YX_PILE_WARTER: //水浸(副板 DI15)
|
||||
u8_ret = u8_sub_comm_yx_get(E_SUB_YX_15);
|
||||
break;
|
||||
|
||||
case YX_PILE_KM: //交流接触器状态(副板 DI16)
|
||||
u8_ret = u8_sub_comm_yx_get(E_SUB_YX_16);
|
||||
break;
|
||||
|
||||
case YX_PILE_SPD: //防雷器状态(副板 DI17)
|
||||
u8_ret = u8_sub_comm_yx_get(E_SUB_YX_17);
|
||||
break;
|
||||
|
||||
case YX_PILE_QF: //交流进线开关状态(副板 DI18)
|
||||
u8_ret = u8_sub_comm_yx_get(E_SUB_YX_18);
|
||||
break;
|
||||
|
||||
case YX_PILE_BUS_KM: //母联直流接触器状态(副板 DI19)
|
||||
u8_ret = u8_sub_comm_yx_get(E_SUB_YX_19);
|
||||
break;
|
||||
|
||||
case YX_PILE_SMOKE: //烟感(
|
||||
u8_ret = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
u8_ret = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return u8_ret;
|
||||
}
|
||||
/****************************************************
|
||||
*功能说明: 获取充电枪对应遥信状态或数据
|
||||
*参数说明:
|
||||
* 输入参数: E_YX_GUN e_yx_gun , 要读取的充电枪状态或数据
|
||||
U8_T u8_gunNo 枪号
|
||||
* 输出参数: -1 失败 u8_ret 充电枪对应遥信遥测状态或数据
|
||||
*备注:
|
||||
****************************************************/
|
||||
static U8_T u8_coll_get_yx_gun(E_YX_GUN gun_yx_type, U8_T u8_gunNo)
|
||||
{
|
||||
U8_T u8_ret;
|
||||
|
||||
switch(gun_yx_type)
|
||||
{
|
||||
case YX_GUN_LINK: //枪连接状态
|
||||
u8_ret = u8_get_gunLink(u8_gunNo);
|
||||
break;
|
||||
|
||||
case YX_GUN_LOCK: //枪电子锁状态
|
||||
u8_ret = u8_gunNo ? DI7 : DI1;
|
||||
break;
|
||||
|
||||
case YX_GUN_DC_KM: //直流输出接触器状态
|
||||
u8_ret = u8_gunNo ? DI6 : DI2;
|
||||
break;
|
||||
|
||||
case YX_GUN_RELIF: //泄放继电器状态
|
||||
u8_ret = u8_gunNo ? DI9 : DI4;;
|
||||
break;
|
||||
|
||||
case YX_GUN_DC_FUSE: //直流熔断器状态
|
||||
u8_ret = u8_gunNo ? DI8 : DI3;
|
||||
break;
|
||||
|
||||
case YX_GUN_AUXPOWER: //低压辅源状态
|
||||
u8_ret = u8_gunNo ? AUX_B : AUX_A;
|
||||
break;
|
||||
|
||||
case YX_GUN_HOMING: //充电枪归位
|
||||
u8_ret = u8_gunNo ? DI10 : DI5;
|
||||
break;
|
||||
}
|
||||
|
||||
return u8_ret;
|
||||
}
|
||||
/****************************************************
|
||||
*功能说明: 获取充电枪对应遥测状态或数据
|
||||
*参数说明:
|
||||
* 输入参数: E_YC_GUN e_yc_gun , 要读取的充电枪状态或数据
|
||||
U8_T u8_gunNo 枪号
|
||||
* 输出参数: F32_T -1 失败 f32_ret 充电枪对应遥信遥测状态或数据
|
||||
*备注:
|
||||
****************************************************/
|
||||
static F32_T f32_coll_get_yc_gun(E_YC_GUN gun_yc_type, U8_T u8_gunNo)
|
||||
{
|
||||
F32_T f32_ret;
|
||||
|
||||
switch(gun_yc_type)
|
||||
{
|
||||
case ADC_GUN_VOLT_PLUS: //直流母线正对地电压
|
||||
f32_ret = ((u8_gunNo == 0) ? f_get_gun_data(E_ADC_TYPE_GUN_DC_VOL_A1) : f_get_gun_data(E_ADC_TYPE_GUN_DC_VOL_B1));
|
||||
break;
|
||||
|
||||
case ADC_GUN_VOLT_MINUS: //直流母线负对地电压
|
||||
f32_ret = ((u8_gunNo == 0) ? f_get_gun_data(E_ADC_TYPE_GUN_DC_VOL_A2) : f_get_gun_data(E_ADC_TYPE_GUN_DC_VOL_B2));
|
||||
break;
|
||||
|
||||
case ADC_GUN_MVI: //直流回路测量电流
|
||||
f32_ret = ((u8_gunNo == 0) ? f_get_gun_data(E_ADC_TYPE_GUN_MVI_A) : f_get_gun_data(E_ADC_TYPE_GUN_MVI_B));
|
||||
break;
|
||||
|
||||
case ADC_GUN_BAT: //接触器外侧电压
|
||||
f32_ret = ((u8_gunNo == 0) ? f_get_gun_data(E_ADC_TYPE_GUN_BAT_VOL_A1) : f_get_gun_data(E_ADC_TYPE_GUN_BAT_VOL_B1));
|
||||
break;
|
||||
|
||||
case ADC_GUN_TEMP_PLUS: //充电枪正极温度
|
||||
f32_ret = ((u8_gunNo == 0) ? f_get_gun_data(E_ADC_TYPE_GUN_TEMP_A1) : f_get_gun_data(E_ADC_TYPE_GUN_TEMP_B1));
|
||||
break;
|
||||
|
||||
case ADC_GUN_TEMP_MINUS: //充电枪负极温度
|
||||
f32_ret = ((u8_gunNo == 0) ? f_get_gun_data(E_ADC_TYPE_GUN_TEMP_A2) : f_get_gun_data(E_ADC_TYPE_GUN_TEMP_B2));
|
||||
break;
|
||||
}
|
||||
|
||||
return f32_ret;
|
||||
}
|
||||
|
||||
/****************************************************
|
||||
*功能说明: 获取充电桩对应遥信遥测状态或数据
|
||||
*参数说明:
|
||||
* 输入参数: E_YX_SYS sys_yc_type , 要读取的整桩遥测状态或数据
|
||||
U8_T u8_gunNo 枪号
|
||||
* 输出参数: F32_T -1 失败 f32_ret 充电枪对应遥测状态或数据
|
||||
*备注:
|
||||
****************************************************/
|
||||
F32_T f32_coll_get_yc_sys(E_YC_SYS sys_yc_type)
|
||||
{
|
||||
F32_T f32_ret;
|
||||
|
||||
switch(sys_yc_type)
|
||||
{
|
||||
case ADC_PILE_TEMP1: //桩温1
|
||||
f32_ret = f_get_gun_data(E_ADC_TYPE_FAN_IN_TEMP);
|
||||
break;
|
||||
|
||||
case ADC_PILE_TEMP2: //桩温2
|
||||
f32_ret = f_get_gun_data(E_ADC_TYPE_FAN_OUT_TEMP);
|
||||
break;
|
||||
}
|
||||
|
||||
return f32_ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if 1 //整桩遥信/遥测更新
|
||||
/****************************************************
|
||||
*功能说明: 更新桩体相关遥信、遥测数据
|
||||
*参数说明:
|
||||
* 输入参数: SYS_RT_DATA* p_sys 整桩遥测遥信结构体
|
||||
* 输出参数: void
|
||||
*备注:
|
||||
****************************************************/
|
||||
static void v_updata_sys_yxyc(SYS_RT_DATA* p_sys)
|
||||
{
|
||||
if (p_sys == NULL)
|
||||
return;
|
||||
|
||||
if (DATACOLL_LOCK_TAKE() != 1U) // 获取数据采集锁
|
||||
return;
|
||||
|
||||
/* 整桩相关遥信状态更新(数据来源当前默认 0,仅保留功能框架) */
|
||||
p_sys->yx_sys_data.bit_yx_sys_data.yx_emergency = u8_coll_get_yx_sys(YX_PILE_EMERGENCY);
|
||||
p_sys->yx_sys_data.bit_yx_sys_data.yx_door = u8_coll_get_yx_sys(YX_PILE_DOOR);
|
||||
p_sys->yx_sys_data.bit_yx_sys_data.yx_water = u8_coll_get_yx_sys(YX_PILE_WARTER);
|
||||
p_sys->yx_sys_data.bit_yx_sys_data.yx_smoke = u8_coll_get_yx_sys(YX_PILE_SMOKE);
|
||||
p_sys->yx_sys_data.bit_yx_sys_data.yx_bus_KM = u8_coll_get_yx_sys(YX_PILE_BUS_KM);
|
||||
p_sys->yx_sys_data.bit_yx_sys_data.yx_spd = u8_coll_get_yx_sys(YX_PILE_SPD);
|
||||
p_sys->yx_sys_data.bit_yx_sys_data.yx_KM = u8_coll_get_yx_sys(YX_PILE_KM);
|
||||
p_sys->yx_sys_data.bit_yx_sys_data.yx_QF = u8_coll_get_yx_sys(YX_PILE_QF);
|
||||
|
||||
/* 整桩相关遥测状态更新 */
|
||||
p_sys->f32_yc_sys_temp1 = f32_coll_get_yc_sys(ADC_PILE_TEMP1);
|
||||
p_sys->f32_yc_sys_temp2 = f32_coll_get_yc_sys(ADC_PILE_TEMP2);
|
||||
|
||||
DATACOLL_LOCK_GIVE(); // 释放数据采集锁
|
||||
}
|
||||
#endif
|
||||
#if 1 //对外接口函数
|
||||
/****************************************************
|
||||
*功能说明: 获取遥信遥测数据结构体
|
||||
*参数说明:
|
||||
* 输入参数: SYS_RT_DATA *pile_data , 桩数据
|
||||
GUN_RT_DATA *gun_data , 枪数据
|
||||
U8_T u8_gunNo 枪号
|
||||
* 输出参数: U8_T 0 失败 1成功
|
||||
*最后修改时间: 20230923
|
||||
****************************************************/
|
||||
U8_T u8_get_yxyc_data(SYS_RT_DATA *pile_data, GUN_RT_DATA *gun_data, U8_T u8_gunNo)
|
||||
{
|
||||
if (DATACOLL_LOCK_TAKE() != 1U) // 获取数据采集锁
|
||||
return 0;
|
||||
|
||||
if(pile_data != NULL)
|
||||
{
|
||||
memset(pile_data, 0, sizeof(SYS_RT_DATA));
|
||||
memcpy(pile_data, &sys_yxyc_data.s_sys_rt_data, sizeof(SYS_RT_DATA));
|
||||
}
|
||||
|
||||
if(gun_data != NULL)
|
||||
{
|
||||
memset(gun_data, 0, sizeof(GUN_RT_DATA));
|
||||
memcpy(gun_data, &sys_yxyc_data.s_gun_rt_data[u8_gunNo], sizeof(GUN_RT_DATA));
|
||||
}
|
||||
|
||||
DATACOLL_LOCK_GIVE(); // 释放数据采集锁
|
||||
return 1;
|
||||
}
|
||||
|
||||
/****************************************************
|
||||
*功能说明: 获取充电枪对应遥信状态或数据
|
||||
*参数说明:
|
||||
* 输入参数: E_YX_GUN gun_yx_type , 要读取的充电枪状态或数据
|
||||
U8_T u8_gunNo 枪号
|
||||
* 输出参数: U8_T -1 失败 u8_ret 充电枪对应遥信状态或数据
|
||||
*备注:
|
||||
****************************************************/
|
||||
U8_T u8_get_gun_yx_data(E_YX_GUN gun_yx_type, U8_T u8_gunNo)
|
||||
{
|
||||
if (DATACOLL_LOCK_TAKE() != 1U) // 获取数据采集锁
|
||||
return 0xFFU;
|
||||
|
||||
GUN_RT_DATA *gun_data = &sys_yxyc_data.s_gun_rt_data[u8_gunNo];
|
||||
U8_T u8_ret;
|
||||
|
||||
switch(gun_yx_type)
|
||||
{
|
||||
case YX_GUN_LINK: //枪连接状态
|
||||
u8_ret = gun_data->u8_gunlink_state;
|
||||
break;
|
||||
|
||||
case YX_GUN_LOCK: //枪电子锁状态
|
||||
u8_ret = gun_data->yx_gun_data.bit_yx_gun_data.yx_gun_lock;
|
||||
break;
|
||||
|
||||
case YX_GUN_DC_KM: //母线直流输出接触器状态
|
||||
case YX_GUN_DC_KM_NEG:
|
||||
u8_ret = gun_data->yx_gun_data.bit_yx_gun_data.yx_switch;
|
||||
break;
|
||||
case YX_GUN_RELIF: //泄放继电器状态
|
||||
u8_ret = gun_data->yx_gun_data.bit_yx_gun_data.yx_relief_swich;
|
||||
break;
|
||||
|
||||
case YX_GUN_DC_FUSE: //直流熔断器状态
|
||||
u8_ret = gun_data->yx_gun_data.bit_yx_gun_data.yx_fuse;
|
||||
break;
|
||||
|
||||
case YX_GUN_AUXPOWER: //低压辅源状态
|
||||
u8_ret = gun_data->yx_gun_data.bit_yx_gun_data.yx_gun_power;
|
||||
break;
|
||||
|
||||
case YX_GUN_HOMING: //充电枪归位
|
||||
u8_ret = gun_data->yx_gun_data.bit_yx_gun_data.yx_gun_homing;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
DATACOLL_LOCK_GIVE(); // 释放数据采集锁
|
||||
return u8_ret;
|
||||
}
|
||||
|
||||
/****************************************************
|
||||
*功能说明: 获取充电枪对应遥测状态或数据
|
||||
*参数说明:
|
||||
* 输入参数: E_YC_GUN gun_yc_type , 要读取的充电枪状态或数据
|
||||
U8_T u8_gunNo 枪号
|
||||
* 输出参数: F32_T -1 失败 f32_ret 充电枪对应遥测状态或数据
|
||||
*备注:
|
||||
****************************************************/
|
||||
F32_T f32_get_gun_yc_data(E_YC_GUN gun_yc_type, U8_T u8_gunNo)
|
||||
{
|
||||
if (DATACOLL_LOCK_TAKE() != 1U) // 获取数据采集锁
|
||||
return -1;
|
||||
|
||||
GUN_RT_DATA *gun_data = &sys_yxyc_data.s_gun_rt_data[u8_gunNo];
|
||||
F32_T f32_ret;
|
||||
|
||||
switch(gun_yc_type)
|
||||
{
|
||||
case ADC_GUN_VOLT_PLUS: //直流母线正对地电压
|
||||
f32_ret = gun_data->f32_yc_gun_vol_pos;
|
||||
break;
|
||||
|
||||
case ADC_GUN_VOLT_MINUS: //直流母线负对地电压
|
||||
f32_ret = gun_data->f32_yc_gun_vol_neg;
|
||||
break;
|
||||
|
||||
case ADC_GUN_MVI: //直流回路测量电流
|
||||
f32_ret = gun_data->f32_yc_gun_curr;
|
||||
break;
|
||||
|
||||
case ADC_GUN_BAT: //接触器外侧正对地电压
|
||||
f32_ret = gun_data->f32_yc_bat_vol_pos;
|
||||
break;
|
||||
|
||||
case ADC_GUN_TEMP_PLUS: //充电枪正极温度
|
||||
f32_ret = gun_data->f32_yc_gun_temp_pos;
|
||||
break;
|
||||
|
||||
case ADC_GUN_TEMP_MINUS: //充电枪负极温度
|
||||
f32_ret = gun_data->f32_yc_gun_temp_neg;
|
||||
break;
|
||||
}
|
||||
|
||||
DATACOLL_LOCK_GIVE(); // 释放数据采集锁
|
||||
return f32_ret;
|
||||
}
|
||||
/****************************************************
|
||||
*功能说明: 外部使用 yk功能接口,使外部不直接进行遥控动作,便于保存遥控状态且确保遥控执行完成
|
||||
*参数说明:
|
||||
* 输入参数: E_YK_CTRL_TYPE e_type 控制数据类型
|
||||
* E_CMD e_cmd 控制数据内容 CMD_OFF = 0, ST_ON = !CMD_OFF
|
||||
* 输出参数: void
|
||||
*备注:
|
||||
****************************************************/
|
||||
/****************************************************
|
||||
*功能说明: 获取充电桩对应遥信状态或数据
|
||||
*参数说明:
|
||||
* 输入参数: E_YX_SYS sys_yx_type , 要读取的整桩遥信状态或数据
|
||||
* 输出参数: U8_T -1 失败 u8_ret 充电桩对应遥信状态或数据
|
||||
*备注:
|
||||
****************************************************/
|
||||
U8_T u8_get_sys_yx_data(E_YX_SYS sys_yx_type)
|
||||
{
|
||||
if (DATACOLL_LOCK_TAKE() != 1U) // 获取数据采集锁
|
||||
return 0xFFU;
|
||||
|
||||
SYS_RT_DATA *sys_data = &sys_yxyc_data.s_sys_rt_data;
|
||||
U8_T u8_ret;
|
||||
|
||||
switch(sys_yx_type)
|
||||
{
|
||||
case YX_PILE_EMERGENCY: //急停
|
||||
u8_ret = sys_data->yx_sys_data.bit_yx_sys_data.yx_emergency;
|
||||
break;
|
||||
|
||||
case YX_PILE_DOOR: //门禁
|
||||
u8_ret = sys_data->yx_sys_data.bit_yx_sys_data.yx_door;
|
||||
break;
|
||||
|
||||
case YX_PILE_WARTER: //水浸
|
||||
u8_ret = sys_data->yx_sys_data.bit_yx_sys_data.yx_water;
|
||||
break;
|
||||
|
||||
case YX_PILE_SPD: //防雷器
|
||||
u8_ret = sys_data->yx_sys_data.bit_yx_sys_data.yx_spd;
|
||||
break;
|
||||
|
||||
case YX_PILE_SMOKE: //烟感
|
||||
u8_ret = sys_data->yx_sys_data.bit_yx_sys_data.yx_smoke;
|
||||
break;
|
||||
|
||||
case YX_PILE_BUS_KM: //母联接触器
|
||||
u8_ret = sys_data->yx_sys_data.bit_yx_sys_data.yx_bus_KM;
|
||||
break;
|
||||
|
||||
case YX_PILE_KM: //交流输入接触器
|
||||
u8_ret = sys_data->yx_sys_data.bit_yx_sys_data.yx_KM;
|
||||
break;
|
||||
|
||||
case YX_PILE_QF: //交流输入断路器
|
||||
u8_ret = sys_data->yx_sys_data.bit_yx_sys_data.yx_QF;
|
||||
break;
|
||||
}
|
||||
|
||||
DATACOLL_LOCK_GIVE(); // 释放数据采集锁
|
||||
return u8_ret;
|
||||
|
||||
}
|
||||
|
||||
/****************************************************
|
||||
*功能说明: 获取充电桩对应遥测状态或数据
|
||||
*参数说明:
|
||||
* 输入参数: E_YC_SYS sys_yc_type , 要读取的整桩遥测状态或数据
|
||||
* 输出参数: F32_T -1 失败 f32_ret 充电桩对应遥测状态或数据
|
||||
*备注:
|
||||
****************************************************/
|
||||
F32_T f32_get_sys_yc_data(E_YC_SYS sys_yc_type)
|
||||
{
|
||||
if (DATACOLL_LOCK_TAKE() != 1U) // 获取数据采集锁
|
||||
return -1;
|
||||
|
||||
SYS_RT_DATA *sys_data = &sys_yxyc_data.s_sys_rt_data;
|
||||
F32_T f32_ret;
|
||||
|
||||
switch(sys_yc_type)
|
||||
{
|
||||
case ADC_PILE_TEMP1: //桩温1
|
||||
f32_ret = sys_data->f32_yc_sys_temp1;
|
||||
break;
|
||||
|
||||
case ADC_PILE_TEMP2: //桩温2
|
||||
f32_ret = sys_data->f32_yc_sys_temp2;
|
||||
break;
|
||||
}
|
||||
|
||||
DATACOLL_LOCK_GIVE(); // 释放数据采集锁
|
||||
return f32_ret;
|
||||
}
|
||||
#endif
|
||||
#if 1 //遥信数据更新
|
||||
/****************************************************
|
||||
*功能说明: 更新充电枪相关遥信、遥测数据
|
||||
*参数说明:
|
||||
* 输入参数: GUN_RT_DATA* p_gun 充电枪遥测遥信结构体
|
||||
U8_T u8_gunNo 枪号
|
||||
* 输出参数: void
|
||||
*备注:
|
||||
****************************************************/
|
||||
void v_update_gun_yxyc(GUN_RT_DATA* p_gun, U8_T u8_gunNo)
|
||||
{
|
||||
if (DATACOLL_LOCK_TAKE() != 1U) // 获取数据采集锁
|
||||
return;
|
||||
|
||||
U8_T gunlockNeg = sys_yxyc_data.u8_gunLockNeg[u8_gunNo]; //获取充电枪电子锁取反状态
|
||||
|
||||
/****充电枪遥信状态更新****/
|
||||
p_gun->u8_gunlink_state = u8_coll_get_yx_gun(YX_GUN_LINK, u8_gunNo); //充电枪连接状态,需调用外部接口
|
||||
|
||||
if(gunlockNeg)
|
||||
p_gun->yx_gun_data.bit_yx_gun_data.yx_gun_lock = (u8_coll_get_yx_gun(YX_GUN_LOCK, u8_gunNo) ? 0 : 1); //电磁锁状态
|
||||
else
|
||||
p_gun->yx_gun_data.bit_yx_gun_data.yx_gun_lock = u8_coll_get_yx_gun(YX_GUN_LOCK, u8_gunNo); //电磁锁状态,需调用外部接口
|
||||
|
||||
p_gun->yx_gun_data.bit_yx_gun_data.yx_switch = u8_coll_get_yx_gun(YX_GUN_DC_KM, u8_gunNo); //直流输出接触器状态,需调用外部接口
|
||||
p_gun->yx_gun_data.bit_yx_gun_data.yx_relief_swich = u8_coll_get_yx_gun(YX_GUN_RELIF, u8_gunNo); //直流回路泄放继电器状态,需调用外部接口
|
||||
p_gun->yx_gun_data.bit_yx_gun_data.yx_fuse = u8_coll_get_yx_gun(YX_GUN_DC_FUSE, u8_gunNo); //直流回路熔断器状态,需调用外部接口
|
||||
p_gun->yx_gun_data.bit_yx_gun_data.yx_gun_power = u8_coll_get_yx_gun(YX_GUN_AUXPOWER, u8_gunNo); //充电枪辅助电源状态,需调用外部接口
|
||||
p_gun->yx_gun_data.bit_yx_gun_data.yx_gun_homing = u8_coll_get_yx_gun(YX_GUN_HOMING, u8_gunNo); //充电枪归位状态,需调用外部接口
|
||||
|
||||
/****充电枪遥测状态更新****/
|
||||
p_gun->f32_yc_gun_vol_pos = f32_coll_get_yc_gun(ADC_GUN_VOLT_PLUS, u8_gunNo); //直流母线正对地电压,需调用外部接口
|
||||
p_gun->f32_yc_gun_vol_neg = f32_coll_get_yc_gun(ADC_GUN_VOLT_MINUS, u8_gunNo); //直流母线负对地电压,需调用外部接口
|
||||
p_gun->f32_yc_gun_curr = f32_coll_get_yc_gun(ADC_GUN_MVI, u8_gunNo); //直流回路测量电流,需调用外部接口
|
||||
p_gun->f32_yc_bat_vol_pos = f32_coll_get_yc_gun(ADC_GUN_BAT, u8_gunNo); //接触器外侧正对地电压,需调用外部接口
|
||||
p_gun->f32_yc_gun_temp_pos = f32_coll_get_yc_gun(ADC_GUN_TEMP_PLUS, u8_gunNo); //充电枪正极温度,需调用外部接口
|
||||
p_gun->f32_yc_gun_temp_neg = f32_coll_get_yc_gun(ADC_GUN_TEMP_MINUS, u8_gunNo); //充电枪负极温度,需调用外部接口
|
||||
|
||||
DATACOLL_LOCK_GIVE(); // 释放数据采集锁
|
||||
}
|
||||
#endif
|
||||
#if 1 //遥测数据更新
|
||||
//枪温采集是使用一个采集口,通过片选的方式控制
|
||||
void v_set_adc()
|
||||
{
|
||||
//温度采集选通,
|
||||
/* 选择温度传感器通道的函数
|
||||
通道0 TEMP5
|
||||
通道1 VOL
|
||||
通道2 VOL
|
||||
通道3 TEMP6
|
||||
通道4 TEMP1
|
||||
通道5 TEMP4
|
||||
通道6 TEMP2
|
||||
通道7 TEMP3
|
||||
*/
|
||||
switch (s_adc_gun_ctrl.flag_set)
|
||||
{
|
||||
case 0: //设置采集A枪正极温度值 2
|
||||
{
|
||||
select_temp_channel(2);
|
||||
s_adc_gun_ctrl.flag_read = s_adc_gun_ctrl.flag_set;
|
||||
s_adc_gun_ctrl.flag_set ++;
|
||||
break;
|
||||
}
|
||||
|
||||
case 1: //设置采集A枪负极温度值 1
|
||||
{
|
||||
select_temp_channel(1);
|
||||
s_adc_gun_ctrl.flag_read = s_adc_gun_ctrl.flag_set;
|
||||
s_adc_gun_ctrl.flag_set ++;
|
||||
break;
|
||||
}
|
||||
|
||||
case 2: //设置采集B枪正极温度值
|
||||
{
|
||||
select_temp_channel(4);
|
||||
s_adc_gun_ctrl.flag_read = s_adc_gun_ctrl.flag_set;
|
||||
s_adc_gun_ctrl.flag_set ++;
|
||||
break;
|
||||
}
|
||||
|
||||
case 3: //设置采集B枪负极温度值
|
||||
{
|
||||
select_temp_channel(6);
|
||||
s_adc_gun_ctrl.flag_read = s_adc_gun_ctrl.flag_set;
|
||||
s_adc_gun_ctrl.flag_set ++;
|
||||
break;
|
||||
}
|
||||
|
||||
case 4: //设置出风口温度检测值
|
||||
{
|
||||
select_temp_channel(5);
|
||||
s_adc_gun_ctrl.flag_read = s_adc_gun_ctrl.flag_set;
|
||||
s_adc_gun_ctrl.flag_set ++;
|
||||
break;
|
||||
}
|
||||
|
||||
case 5: //设置进风口温度检测值
|
||||
{
|
||||
select_temp_channel(7);
|
||||
s_adc_gun_ctrl.flag_read = s_adc_gun_ctrl.flag_set;
|
||||
s_adc_gun_ctrl.flag_set = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
s_adc_gun_ctrl.flag_set = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************
|
||||
*功能说明: 枪温循环处理函数,用于控制片选信号并获取对应位置的温度
|
||||
*参数说明:
|
||||
* 输入参数: U16_T u16_leep_time 执行周期
|
||||
* 输出参数: void
|
||||
*备注:
|
||||
*作者: jiankalka
|
||||
*日期: 2025-08-07
|
||||
****************************************************/
|
||||
void v_gun_temp_loop(U16_T u16_leep_time)
|
||||
{
|
||||
if(s_adc_gun_ctrl.u16_timer_cnt % NUM_500 == 0) //100ms
|
||||
{
|
||||
// s_adc_gun_ctrl.f_adc_data[s_adc_gun_ctrl.flag_read] = adc_readval(); //获取枪温
|
||||
// v_set_adc();
|
||||
}
|
||||
|
||||
/* SPI5:CC1 / 外侧电压 / 回路电流,每次调用实时 SPI 采样 */
|
||||
s_adc_gun_ctrl.f_adc_gunLink[0] = spi5_read_analog_voltage(0); /* A枪 CC1 */
|
||||
s_adc_gun_ctrl.f_adc_gunLink[1] = spi5_read_analog_voltage(1); /* B枪 CC1 */
|
||||
s_adc_gun_ctrl.f_adc_bat_vol[0] = spi5_read_analog_voltage(4); /* A枪外侧电压 */
|
||||
s_adc_gun_ctrl.f_adc_bat_vol[1] = spi5_read_analog_voltage(2); /* B枪外侧电压 */
|
||||
s_adc_gun_ctrl.f_adc_dc_cur[0] = spi5_read_analog_voltage(7); /* A枪回路电流 */
|
||||
s_adc_gun_ctrl.f_adc_dc_cur[1] = spi5_read_analog_voltage(6); /* B枪回路电流 */
|
||||
if((s_adc_gun_ctrl.u16_timer_cnt / u16_leep_time) % NUM_4 == 0) /* 4个周期采一次,10ms 任务约 40ms */
|
||||
{
|
||||
s_adc_gun_ctrl.f_adc_dc_vol[0] = spi3_read_analog_voltage(1, 0); //A枪正极adc电压采集值
|
||||
s_adc_gun_ctrl.f_adc_dc_vol[2] = spi3_read_analog_voltage(2, 0); //B枪正极adc电压采集值
|
||||
s_adc_gun_ctrl.f_adc_dc_vol[1] = spi3_read_analog_voltage(1, 1); //A枪负极adc电压采集值
|
||||
s_adc_gun_ctrl.f_adc_dc_vol[3] = spi3_read_analog_voltage(2, 1); //B枪负极adc电压采集值
|
||||
}
|
||||
|
||||
|
||||
//周期计数
|
||||
if(s_adc_gun_ctrl.u16_timer_cnt < 0xFF00)
|
||||
s_adc_gun_ctrl.u16_timer_cnt += u16_leep_time;
|
||||
else
|
||||
s_adc_gun_ctrl.u16_timer_cnt = 0;
|
||||
}
|
||||
/****************************************************
|
||||
*功能说明: 枪温处理函数初始化
|
||||
*参数说明:
|
||||
* 输入参数: void
|
||||
* 输出参数: void
|
||||
*备注:
|
||||
*作者: jiankalka
|
||||
*日期: 2025-08-07
|
||||
****************************************************/
|
||||
void v_gun_temp_init()
|
||||
{
|
||||
memset(&s_adc_gun_ctrl, 0, sizeof(S_ADC_GUN_CTRL));
|
||||
init_adc();
|
||||
}
|
||||
/****************************************************
|
||||
*功能说明: 充电中( CC1 在 3.2~4.8V )用比较器开关量获取枪连接状态
|
||||
* PF10/PD3 高表示>4.8V断开,PF9/PA15 低表示<3.2V断开
|
||||
*返回值: 0未连接 1已连接
|
||||
****************************************************/
|
||||
U8_T u8_get_gunLink_cmp(U8_T u8_gunNo)
|
||||
{
|
||||
if(u8_gunNo == 0U)
|
||||
{
|
||||
if(GUN1_UBAL_READ_H == SET) //A枪CC1检测(高于4.8V,未连接)
|
||||
return 0U;
|
||||
if(GUN1_UBAL_READ_L == RESET) //A枪CC1检测(低于3.2V,未连接)
|
||||
return 0U;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(GUN2_UBAL_READ_H == SET) //B枪CC1检测(高于4.8V,未连接)
|
||||
return 0U;
|
||||
if(GUN2_UBAL_READ_L == RESET) //B枪CC1检测(低于3.2V,未连接)
|
||||
return 0U;
|
||||
}
|
||||
return 1U;
|
||||
}
|
||||
|
||||
/****************************************************
|
||||
*功能说明: 获取枪连接状态
|
||||
*参数说明:
|
||||
* 输入参数: U8_T u8_gunNo 枪号地址 0-1
|
||||
* 输出参数: U8_T 插枪状态 0未插枪 1插枪
|
||||
*备注:
|
||||
*作者: jiankalka
|
||||
*日期: 2025-08-11
|
||||
****************************************************/
|
||||
U8_T u8_get_gunLink(U8_T u8_gunNo)
|
||||
{
|
||||
//获取枪连接ADC电压值
|
||||
float gunLink = s_adc_gun_ctrl.f_adc_gunLink[u8_gunNo];
|
||||
//根据电压值判断枪连接状态,若在3.2~4.8V范围内
|
||||
if(gunLink >= GUNLINK_CC1_VOLT_LO && gunLink <= GUNLINK_CC1_VOLT_HI)
|
||||
return u8_get_gunLink_cmp(u8_gunNo);
|
||||
|
||||
return 0U;
|
||||
}
|
||||
/****************************************************
|
||||
*功能说明: 获取枪adc采样值
|
||||
*参数说明:
|
||||
* 输入参数: E_ADC_TYPE e_type ADC类型
|
||||
E_ADC_TYPE_GUN_TEMP_A1, //2 A枪温+;
|
||||
E_ADC_TYPE_GUN_TEMP_A2, //3 A枪温-
|
||||
E_ADC_TYPE_GUN_TEMP_B1, //4 B枪温正;
|
||||
E_ADC_TYPE_GUN_TEMP_B2, //5 B枪温-
|
||||
E_ADC_TYPE_FAN_IN_TEMP, //6 进风口温度
|
||||
E_ADC_TYPE_FAN_OUT_TEMP, //7 出风口温度
|
||||
E_ADC_TYPE_GUN_DC_VOL_A1, //8 A枪DC 正极电压采集值
|
||||
E_ADC_TYPE_GUN_DC_VOL_A2, //9 A枪DC 负极电压采集值
|
||||
E_ADC_TYPE_GUN_DC_VOL_B1, //10 B枪DC 正极电压采集值
|
||||
E_ADC_TYPE_GUN_DC_VOL_B2, //11 B枪DC 负极电压采集值
|
||||
* 输出参数: float ADC采样值
|
||||
*备注:
|
||||
****************************************************/
|
||||
float f_get_gun_data(E_ADC_TYPE e_type)
|
||||
{
|
||||
float f_ret = 0;
|
||||
|
||||
switch (e_type)
|
||||
{
|
||||
case E_ADC_TYPE_GUN_TEMP_A1: //2 A枪温+;
|
||||
f_ret = s_adc_gun_ctrl.f_adc_data[0];
|
||||
|
||||
if(f_ret > TEMP_MAX_NUM)
|
||||
f_ret = 0;
|
||||
|
||||
break;
|
||||
|
||||
case E_ADC_TYPE_GUN_TEMP_A2: //3 A枪温-
|
||||
f_ret = s_adc_gun_ctrl.f_adc_data[1];
|
||||
|
||||
if(f_ret > TEMP_MAX_NUM)
|
||||
f_ret = 0;
|
||||
|
||||
break;
|
||||
|
||||
case E_ADC_TYPE_GUN_TEMP_B1: //4 B枪温正;
|
||||
f_ret = s_adc_gun_ctrl.f_adc_data[2];
|
||||
|
||||
if(f_ret > TEMP_MAX_NUM)
|
||||
f_ret = 0;
|
||||
|
||||
break;
|
||||
|
||||
case E_ADC_TYPE_GUN_TEMP_B2: //5 B枪温-
|
||||
f_ret = s_adc_gun_ctrl.f_adc_data[3];
|
||||
|
||||
if(f_ret > TEMP_MAX_NUM)
|
||||
f_ret = 0;
|
||||
|
||||
break;
|
||||
|
||||
case E_ADC_TYPE_FAN_IN_TEMP: //6 进风口温度
|
||||
f_ret = s_adc_gun_ctrl.f_adc_data[4];
|
||||
|
||||
if(f_ret > TEMP_MAX_NUM)
|
||||
f_ret = 0;
|
||||
|
||||
break;
|
||||
|
||||
case E_ADC_TYPE_FAN_OUT_TEMP: //7 出风口温度
|
||||
f_ret = s_adc_gun_ctrl.f_adc_data[5];
|
||||
|
||||
if(f_ret > TEMP_MAX_NUM)
|
||||
f_ret = 0;
|
||||
|
||||
break;
|
||||
|
||||
case E_ADC_TYPE_GUN_DC_VOL_A1: //8 A枪DC 正极电压采集值
|
||||
f_ret = s_adc_gun_ctrl.f_adc_dc_vol[0];
|
||||
|
||||
if(f_ret < 0)
|
||||
f_ret = 0;
|
||||
|
||||
break;
|
||||
|
||||
case E_ADC_TYPE_GUN_DC_VOL_A2: //9 A枪DC 负极电压采集值
|
||||
f_ret = s_adc_gun_ctrl.f_adc_dc_vol[1];
|
||||
|
||||
if(f_ret < 0)
|
||||
f_ret = 0;
|
||||
|
||||
break;
|
||||
|
||||
case E_ADC_TYPE_GUN_DC_VOL_B1: //10 B枪DC 正极电压采集值
|
||||
f_ret = s_adc_gun_ctrl.f_adc_dc_vol[2];
|
||||
|
||||
if(f_ret < 0)
|
||||
f_ret = 0;
|
||||
|
||||
break;
|
||||
|
||||
case E_ADC_TYPE_GUN_DC_VOL_B2: //11 B枪DC 负极电压采集值
|
||||
f_ret = s_adc_gun_ctrl.f_adc_dc_vol[3];
|
||||
|
||||
if(f_ret < 0)
|
||||
f_ret = 0;
|
||||
|
||||
break;
|
||||
|
||||
case E_ADC_TYPE_GUN_MVI_A: //12 A枪直流回路测量电流
|
||||
f_ret = s_adc_gun_ctrl.f_adc_dc_cur[0];
|
||||
if(f_ret < 0)
|
||||
f_ret = 0;
|
||||
break;
|
||||
case E_ADC_TYPE_GUN_MVI_B: //13 B枪直流回路测量电流
|
||||
|
||||
f_ret = s_adc_gun_ctrl.f_adc_dc_cur[1];
|
||||
|
||||
if(f_ret < 0)
|
||||
f_ret = 0;
|
||||
break;
|
||||
|
||||
case E_ADC_TYPE_GUN_BAT_VOL_A1: //14 A枪接触器外侧电压采集值
|
||||
f_ret = s_adc_gun_ctrl.f_adc_bat_vol[0];
|
||||
if (f_ret < 0) {
|
||||
f_ret = 0;
|
||||
}
|
||||
break;
|
||||
;
|
||||
case E_ADC_TYPE_GUN_BAT_VOL_B1: //16 B枪接触器外侧电压采集值
|
||||
f_ret = s_adc_gun_ctrl.f_adc_bat_vol[1];
|
||||
if (f_ret < 0) {
|
||||
f_ret = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return f_ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
void v_init_collect()
|
||||
{
|
||||
v_yk_ctrl_init(); //遥控初始化
|
||||
v_led_init(); //LED状态缓存初始化
|
||||
v_gun_temp_init(); //枪温采集初始化
|
||||
|
||||
memset(&sys_yxyc_data, 0, sizeof(YXYC_DATA)); //初始化清空数据
|
||||
// 外部数据初始化,可以减少系统运行时对外部数据的获取
|
||||
sys_yxyc_data.u8_gunNo = u8_coll_get_gun_num(); //获取系统充电枪数量
|
||||
|
||||
}
|
||||
void v_collect_task(void *arg)
|
||||
{
|
||||
uint16_t sleep_time_ms; // 任务睡眠时间(毫秒)
|
||||
uint32_t last_send_time; // 上次发送时间
|
||||
uint32_t current_time; // 当前时间
|
||||
U8_T i;
|
||||
|
||||
(void)arg; // 忽略未使用的参数
|
||||
(void)DATACOLL_LOCK_INIT(); // 初始化数据采集任务锁
|
||||
sleep_time_ms = DATACOLL_SLEEP_TIME_MS(); // 获取任务睡眠时间
|
||||
last_send_time = get_current_seconds(); // 获取当前时间作为上次发送时间
|
||||
|
||||
v_init_collect(); //初始化
|
||||
|
||||
for (;;)
|
||||
{
|
||||
DATACOLL_FEED_DOG(); // 任务喂狗
|
||||
current_time = get_current_seconds(); // 获取当前时间
|
||||
|
||||
// 检查是否需要打印任务运行信息
|
||||
if ((TASK_RUN_PRINT_TIME != 0U) && (u32_safe_seconds_since(last_send_time) >= TASK_RUN_PRINT_TIME))
|
||||
{
|
||||
// 尝试获取锁
|
||||
if (DATACOLL_LOCK_TAKE() == 1U)
|
||||
{
|
||||
DATACOLL_LOG("data coll task is runing, sleep time is %ums", sleep_time_ms); // 打印任务运行日志
|
||||
(void)DATACOLL_LOCK_GIVE(); // 释放锁
|
||||
|
||||
}
|
||||
|
||||
last_send_time = current_time; // 更新上次发送时间
|
||||
}
|
||||
|
||||
/* 1) 执行遥控缓冲命令(统一在采集任务内下发) */
|
||||
v_yk_ctrl_cheak();
|
||||
|
||||
/* 2) LED状态刷新(供sub_comm读取) */
|
||||
v_led_ctrl(sleep_time_ms);
|
||||
|
||||
/* 3) 采集循环(枪温/环境温度等缓存更新) */
|
||||
v_gun_temp_loop(sleep_time_ms);
|
||||
|
||||
/* 4) 遥信/遥测镜像刷新(按枪循环更新) */
|
||||
for (i = 0; i < sys_yxyc_data.u8_gunNo; i++)
|
||||
{
|
||||
v_update_gun_yxyc(&sys_yxyc_data.s_gun_rt_data[i], i);
|
||||
}
|
||||
|
||||
|
||||
/* 5) 整桩遥信/遥测刷新 */
|
||||
v_gun_temp_loop(sleep_time_ms);
|
||||
v_updata_sys_yxyc(&sys_yxyc_data.s_sys_rt_data);
|
||||
|
||||
mSleep(sleep_time_ms); // 睡眠指定时间
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user