#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 #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); // 睡眠指定时间 } }