Files

822 lines
29 KiB
C

#include "flowctrl/flow_interface.h"
#include "publicdata/publicdata.h"
#include "flowctrl/flowctrl_task.h"
#include "ui/ui_interface.h"
#include "collect_ctrl/yk_ctrl.h"
#include "collect_ctrl/collect_task.h"
#include "meter_calculate/meter_calculate_impl.h"
#include "bms/bms_interface.h"
#include "fault_cheak/fault_interface.h"
#include "flowctrl/insulation_ctrl.h"
#include "plat_comm/impl/bs_public_impl.h"
extern S_FLOW_DATA s_flow_data;
/**
* ************************************************************************
* @brief - 流程控制任务 获取外部数据接口
*
* @param[in] u8_gunNo - 枪号 0-N 对于不分区枪号的数据,无意义
* @param[in] e_dateType - 数据类型标志 详看枚举定义
* @param[in] u16_dataPara - 数据参数 不同数据类型,参数含义不同 对于不分区参数的数据,无意义
*
* @return U16_T - 数据返回值
*
* @author jiankalka
* @date 2025-09-03
* ************************************************************************
*/
U16_T u16_flow_get_sys_data(U8_T u8_gunNo,E_FLOW_GET_DATA_TYPE e_dateType,U16_T u16_dataPara)
{
U16_T u16_ret = 0;
switch (e_dateType)
{
case E_FLOW_GET_DATA_GUN_CNT: //枪数量
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u8_gunCnt;
break;
}
case E_FLOW_GET_DATA_GB_EN: //国标使能标志
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_GBEnable;
break;
}
case E_FLOW_GET_DATA_GUN_FAN_EN: //枪风扇使能 0不使能 1使能
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_gunFanEn;
break;
}
case E_FLOW_GET_DATA_GUNLOCK_EN: //枪锁使能 0不使能 1使能
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_gunLockEna;
break;
}
case E_FLOW_GET_DATA_AUXPOWER_EN: //辅源状态监测使能 0不使能 1使能
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_auxpower;
break;
}
case E_FLOW_GET_DATA_MDU_ZERO_POW_CTRL: //零功控制方式
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_mduzeropowEn;
break;
}
case E_FLOW_GET_DATA_FAULT_FLAG: //获取故障内容存在标志 0不存在 1存在;需要传入 故障代码参数
{
u16_ret = u8_flow_cheak_fault_flag((E_FAULT_INFO)u16_dataPara, (E_FAULT_SITE)u8_gunNo);
break;
}
case E_FLOW_GET_DATA_GUN_TOW_CHR: //双枪同充标志 0单枪充电 1双枪充电且为主枪 2双枪充电且为辅枪
{
u16_ret = 0;
break;
}
case E_FLOW_GET_DATA_GUN_LINK: //枪连接状态 0未连接 1已连接
{
u16_ret = u8_get_gun_yx_data(YX_GUN_LINK,u8_gunNo);
break;
}
case E_FLOW_GET_DATA_GUN_LOCK: //枪锁状态 0未锁 1已锁
{
u16_ret = u8_get_gun_yx_data(YX_GUN_LOCK,u8_gunNo);
break;
}
case E_FLOW_GET_DATA_GUN_AUXPOWER: //辅源闭合状态 0未 1已
{
u16_ret = u8_get_gun_yx_data(YX_GUN_AUXPOWER,u8_gunNo);
break;
}
case E_FLOW_GET_DATA_KM_POS: //正母线直流输出接触器状态 0:断开; 1:闭合
{
u16_ret = u8_get_gun_yx_data(YX_GUN_DC_KM_POS,u8_gunNo);
break;
}
case E_FLOW_GET_DATA_KM_NEG: //负母线直流输出接触器状态 0:断开; 1:闭合
{
u16_ret = u8_get_gun_yx_data(YX_GUN_DC_KM_NEG,u8_gunNo);
break;
}
case E_FLOW_GET_DATA_XF_KM: //泄放接触器状态 0:断开; 1:闭合
{
u16_ret = u8_get_gun_yx_data(YX_GUN_RELIF,u8_gunNo);
break;
}
case E_FLOW_GET_DATA_BUS_KM: //母联接触器状态 0:断开; 1:闭合
{
u16_ret = u8_get_sys_yx_data(YX_PILE_BUS_KM);
break;
}
case E_FLOW_GET_DATA_DC_BUS_EN: //直流母联接触器使能 0 不使能 1使能
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_dcBusEn;
break;
}
case E_FLOW_GET_DATA_GUN_BATT_ADC_VOL: //电池外侧采集电压 精度 0.1V
{
u16_ret = (U16_T)(f32_get_gun_yc_data(ADC_GUN_BAT,u8_gunNo)*10);
break;
}
case E_FLOW_GET_DATA_GUN_MAX_VOL: //充电枪最大数据电压值 精度 0.1V
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u16_max_volt;
break;
}
case E_FLOW_GET_DATA_GUN_MIN_VOL: //充电枪最小数据电压值 精度 0.1V
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u16_min_volt;
break;
}
case E_FLOW_GET_DATA_GUN_MAX_CUR: //充电枪最大数据电流值 精度 0.1V
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u16_max_cur;
break;
}
case E_FLOW_GET_DATA_GUN_MIN_CUR: //充电枪最小数据电流值 精度 0.1V
{
u16_ret = 50; //默认5A
break;
}
case E_FLOW_GET_DATA_GUN_SOC_LIMIT: //充电枪SOC阈值
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u8_soc_limit;
break;
}
case E_FLOW_GET_DATA_GUN_TRICKLE_LIMIT: //充电枪涓流充电停机阈值
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u16_trickle_limit;
break;
}
case E_FLOW_GET_DATA_GUN_BUS_VOL: //充电枪接触器内侧电压值 精度 0.1V
{
u16_ret = (U16_T)((f32_get_gun_yc_data(ADC_GUN_VOLT_PLUS,u8_gunNo) + f32_get_gun_yc_data(ADC_GUN_VOLT_MINUS,u8_gunNo))*10);
//printf("[%d]枪内侧adc %f,%f\n",u8_gunNo,f32_get_gun_yc_data(ADC_GUN_VOLT_PLUS,u8_gunNo) , f32_get_gun_yc_data(ADC_GUN_VOLT_MINUS,u8_gunNo));
break;
}
case E_FLOW_GET_DATA_GUN_FAULT_INFO: //获取整桩和该枪首个故障内容 0无故障 详见E_FAULT_INFO枚举内容 -整桩故障也代表本枪无法使用
{
if(u8_get_fault_sum(0,0) == 0 && u8_get_fault_sum(u8_gunNo+E_GUN,0) == 0) //整桩故障
u16_ret = 0;
else
{
REAL_FAULT_DATA_T rl_data;
v_get_fault_data(&rl_data); //获取故障信息
u16_ret = E_FAULT_13102; //控制器 未知停机故障
for (U8_T i = 0; i < CURR_FAULT_MAX_CNT; i++) //遍历所有故障位置
{
if(rl_data.fault_data[i].e_mag != 0 &&
(rl_data.fault_data[i].e_ingun == E_WHOLE_PILE ||
rl_data.fault_data[i].e_ingun == E_WHOLE_HOST ||
rl_data.fault_data[i].e_ingun == E_GUN+u8_gunNo))
{
u16_ret = rl_data.fault_data[i].e_mag;
}
}
}
break;
}
case E_FLOW_GET_DATA_GUN_POWER_LIMIT: //充电枪的限制功率值 单位kW 0表示不限制
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u8_gun_power_limit[u8_gunNo];
break;
}
case E_FLOW_GET_DATA_BS_VIN_RES: //VIN 鉴权结果 0wu 1成功 2平台鉴权超时 3非法VIN 4车辆识别鉴权帧超时 5即插即充鉴权失败 6鉴权VIN与车辆VIN不一致
{
u16_ret = u8_bs_get_txFlag_autoRwsult(u8_gunNo);
break;
}
case E_FLOW_GET_DATA_METER_VOL: //电表采集电压 精度0.1V
{
u16_ret = (U16_T)(u64_get_meter_data(u8_gunNo,0,E_METER_DATA_VOL)/1000);
break;
}
case E_FLOW_GET_DATA_METER_CUR: //电表采集电流 精度0.1V
{
u16_ret = (U16_T)(u64_get_meter_data(u8_gunNo,0,E_METER_DATA_CUR)/1000);
break;
}
case E_FLOW_GET_DATA_MDU_RATED_POW: //单模块额定功率 单位kw
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u8_mdu_rated_pow;
break;
}
case E_FLOW_GET_DATA_MDU_POWER: //模块额定功率 单位kw
{
u16_ret = g_t_share_data.t_sys_fix_cfg.u8_mdu_rated_pow;
break;
}
case E_FLOW_GET_DATA_PILE_TYPE: //获取桩类型 0一体一枪 1一体双枪 2分体一枪 3分体双枪
{
u16_ret = (U16_T)g_t_share_data.t_sys_fix_cfg.u8_pile_type;
break;
}
case E_FLOW_GET_DATA_MDU_WORK: //获取模块运行状态 0空闲 1工作
{
u16_ret = u16_mdu_put_data(u8_gunNo,E_MDU_PUT_DATA_GROUP_WORK_STATE);
break;
}
case E_FLOW_GET_DATA_MDU_PUT_VOL: //获取模块输出电压值 精度0.1V
{
u16_ret = u16_mdu_put_data(u8_gunNo,E_MDU_PUT_DATA_GROUP_putVol);
break;
}
case E_FLOW_GET_DATA_MDU_PUT_CUR: //获取模块输出电流值 精度0.1A
{
u16_ret = u16_mdu_put_data(u8_gunNo,E_MDU_PUT_DATA_GROUP_putCur);
break;
}
case E_FLOW_GET_DATA_MDU_IN_NUM: //获取模块分配数量
{
u16_ret = u16_mdu_put_data(u8_gunNo,E_MDU_PUT_DATA_GROUP_mduNum);
break;
}
case E_FLOW_GET_DATA_MDU_RUN_NUM: //获取模块运行数量
{
u16_ret = u16_mdu_put_data(u8_gunNo,E_MDU_PUT_DATA_GROUP_RUNING_mduNum);
break;
}
case E_FLOW_GET_DATA_BMS_GB_VER: //BMS 国标协议版本 0 2011版 1 2015版
{
u16_ret = u16_bms_put_data(u8_gunNo,E_BMS_PUT_DATA_BMS_GB_VER,0);
break;
}
case E_FLOW_GET_DATA_BMS_STATE: //BMS 获取BMS状态 0无 1握手完成 2握手失败 3开始预充 4开始充电 5禁止充电 6停止充电 7报文接收超时
{
u16_ret = u16_bms_put_data(u8_gunNo,E_BMS_PUT_DATA_BMS_STATE,0);
break;
}
case E_FLOW_GET_DATA_BMS_SOC: //BMS 获取车辆SOC
{
u16_ret = u16_bms_put_data(u8_gunNo,E_BMS_PUT_DATA_GUN_SOC,0);
break;
}
case E_FLOW_GET_DATA_BMS_MAX_VOL: //BMS 最大充电电压值 精度 0.1V
{
u16_ret = u16_bms_put_data(u8_gunNo,E_BMS_PUT_DATA_BMS_MAX_VOL,0);
break;
}
case E_FLOW_GET_DATA_BMS_MAX_CUR: //BMS 最大充电电流值 精度 0.1V
{
u16_ret = u16_bms_put_data(u8_gunNo,E_BMS_PUT_DATA_BMS_MAX_CUR,0);
break;
}
case E_FLOW_GET_DATA_BMS_REAL_BATT_VOL: //BMS 当前电池电压值 精度 0.1V
{
u16_ret = u16_bms_put_data(u8_gunNo,E_BMS_PUT_DATA_BMS_REAL_BATT_VOL,0);
break;
}
case E_FLOW_GET_DATA_BMS_NEED_VOL: //BMS 需求电压值 精度 0.1V
{
u16_ret = u16_bms_put_data(u8_gunNo,E_BMS_PUT_DATA_BMS_NEED_VOL,0);
break;
}
case E_FLOW_GET_DATA_BMS_NEED_CUR: //BMS 需求电流值 精度 0.1V
{
u16_ret = u16_bms_put_data(u8_gunNo,E_BMS_PUT_DATA_BMS_NEED_CUR,0);
break;
}
case E_FLOW_GET_DATA_BMS_CAN_SEND_CNT: //BMS 报文发送次数 参数值 0代表cem 1代表csd
{
u16_ret = u16_bms_put_data(u8_gunNo,E_BMS_PUT_DATA_BMS_CAN_SEND_CNT,u16_dataPara);
break;
}
case E_FLOW_GET_DATA_BMS_STOP_RES: //BMS 停止原因 详看E_FAULT_INFO枚举内容 BMS部分
{
u16_ret = u16_bms_put_data(u8_gunNo,E_BMS_PUT_DATA_BMS_STOP_RES,0);
break;
}
case E_FLOW_GET_DATA_BMS_RECONN_FLAG: //BMS 重连标志 0不重连 1重连
{
u16_ret = u16_bms_put_data(u8_gunNo,E_BMS_PUT_DATA_BMS_RECONN_FLAG,0);
break;
}
case E_FLOW_GET_DATA_GUN_STOP_REASON_0: //枪停止原因 e_stop_reason[0]
{
if (u8_gunNo < GUN_MAX_CNT)
u16_ret = (U16_T)s_flow_data.s_real_data[u8_gunNo].e_stop_reason[0];
break;
}
case E_FLOW_GET_DATA_METER_CHARGE: //充电金额 u16_dataPara: 0已充合计低16 1高16 2下周期预估低16 3高16 单位0.0001元
{
U32_T u32v;
if (u8_gunNo >= GUN_MAX_CNT)
break;
if (u16_dataPara == 0 || u16_dataPara == 1)
{
u32v = u32_meterlog_put_data(u8_gunNo, E_METERLOG_PUT_LOG_INFO_USED_MONEY, NULL, 0)
+ u32_meterlog_put_data(u8_gunNo, E_METERLOG_PUT_LOG_INFO_USED_SERVICE, NULL, 0);
u16_ret = (u16_dataPara == 0) ? (U16_T)(u32v & 0xFFFFu) : (U16_T)((u32v >> 16) & 0xFFFFu);
}
else if (u16_dataPara == 2 || u16_dataPara == 3)
{
u32v = u32_meterlog_next_cycle_money(u8_gunNo);
u16_ret = (u16_dataPara == 2) ? (U16_T)(u32v & 0xFFFFu) : (U16_T)((u32v >> 16) & 0xFFFFu);
}
break;
}
case E_FLOW_GET_DATA_FLOW_STATE:
{
if (u8_gunNo < GUN_MAX_CNT)
u16_ret = (U16_T)s_flow_data.s_real_data[u8_gunNo].e_flow_state;
break;
}
case E_FLOW_GET_DATA_CHAR_TIME:
{
if (u8_gunNo < GUN_MAX_CNT)
u16_ret = s_flow_data.s_log_data[u8_gunNo].u16_char_time;
break;
}
default:
break;
}
return u16_ret;
}
/**
* ************************************************************************
* @brief - 流程控制任务 对外输出数据
*
* @param[in] u8_gunNo - 枪号 0-N 对于不分区枪号的数据,无意义
* @param[in] e_dateType - 数据类型标志 详看枚举定义
* @param[in] u16_dataPara - 数据参数 不同数据类型,参数含义不同 对于不分区参数的数据,无意义
*
* @return U16_T - 数据返回值
*
* @author jiankalka
* @date 2025-09-03
* ************************************************************************
*/
U16_T u16_flow_put_data(U8_T u8_gunNo,E_FLOW_PUT_DATA_TYPE e_dateType,U16_T u16_dataPara)
{
U16_T u16_ret = 0;
switch (e_dateType)
{
case E_FLOW_PUT_DATA_GUN_REAL_STATE : //对外状态 0空闲 1充电启动 2绝缘启动 3绝缘计算完成 4绝缘检测模块停止 5开始预充 6预充完成 7充电中 8BMS通讯超时 9充电停止 10充电停止完成
u16_ret = s_flow_data.s_real_data[u8_gunNo].e_flow_real_state;
break;
case E_FLOW_PUT_DATA_GUN_RECONN_FLAG: //输出bms重连开始标志 参数:0获取 1清空
if(u16_dataPara == 0)
u16_ret = s_flow_data.s_real_data[u8_gunNo].u8_bms_renew_ctrl;
else
s_flow_data.s_real_data[u8_gunNo].u8_bms_renew_ctrl = 0;
break;
case E_FLOW_PUT_DATA_GUN_NEED_VOL: //BMS 需求电压值 精度 0.1V
{
u16_ret = s_flow_data.s_real_data[u8_gunNo].u16_need_vol;
break;
}
case E_FLOW_PUT_DATA_GUN_NEED_CUR: //BMS 需求电流值 精度 0.1A
{
u16_ret = s_flow_data.s_real_data[u8_gunNo].u16_need_cur;
break;
}
case E_FLOW_PUT_DATA_GUN_START_TIME: //充电开始时间 时间戳
{
u16_ret = s_flow_data.s_log_data[u8_gunNo].u32_satrt_time;
break;
}
case E_FLOW_PUT_DATA_GUN_STOP_TIME: //充电停止时间 时间戳
{
u16_ret = s_flow_data.s_log_data[u8_gunNo].u32_stop_time;
break;
}
case E_FLOW_PUT_DATA_GUN_STOP_RES: //充电停止原因 详看枚举
{
u16_ret = s_flow_data.s_log_data[u8_gunNo].u_stop_res;
break;
}
case E_FLOW_PUT_DATA_USED_ENERGY: //以充电量,精度 0.0001kWh
{
u16_ret = (U16_T)s_flow_data.s_log_data[u8_gunNo].u32_used_energy;
break;
}
case E_FLOW_PUT_DATA_MDU_STAR_FLAG: //模块任务 开始标志
{
u16_ret = (U16_T)s_flow_data.u8_start_flag;
break;
}
case E_FLOW_PUT_DATA_MDU_YK_CMD: //模块遥控命令 0无 1快速启机 2快速启机停(不清空分组) 3软启开机 4充电停止(清空分组)
{
u16_ret = (U16_T)s_flow_data.s_mdu_allocate_ctrl[u8_gunNo].u8_yk_cmd;
break;
}
case E_FLOW_PUT_DATA_MDU_NEED_VOL: //模块需求电压值 精度0.1
{
u16_ret = (U16_T)s_flow_data.s_mdu_allocate_ctrl[u8_gunNo].u16_need_vol;
break;
}
case E_FLOW_PUT_DATA_MDU_ONE_NEED_CUR: //单模块需求电流值 精度0.1
{
u16_ret = (U16_T)s_flow_data.s_mdu_allocate_ctrl[u8_gunNo].u16_one_mdu_need_cur;
break;
}
default:
break;
}
return u16_ret;
}
/**
* ************************************************************************
* @brief - 流程控制任务 对外输出无符号整型数据
*
* @param[in] u8_gunNo -枪号
* @param[in] e_dateType -数据类型标志 详看枚举定义
*
* @return U32_T -数据返回值
*
* @author YZG
* @date 2025-09-29
* ************************************************************************
*/
U32_T u32_flow_put_data(U8_T u8_gunNo,E_FLOW_PUT_DATA_TYPE e_dateType)
{
U32_T u32_ret = 0;
switch (e_dateType)
{
case E_FLOW_PUT_DATA_USED_ENERGY: //以充电量,精度 0.0001kWh
{
u32_ret = s_flow_data.s_log_data[u8_gunNo].u32_used_energy;
break;
}
case E_FLOW_PUT_DATA_USED_MONEY: //以充电费,精度 0.0001元
{
u32_ret = s_flow_data.s_log_data[u8_gunNo].u32_used_money;
break;
}
case E_FLOW_PUT_DATA_USED_SERV_MONEY: //已充服务费,精度 0.0001元
{
u32_ret = s_flow_data.s_log_data[u8_gunNo].u32_used_service_money;
break;
}
default:
break;
}
return u32_ret;
}
/**
* ************************************************************************
* @brief - 流程控制任务 对外控制 -例如枪锁控制 风扇控制等
*
* @param[in] u8_gunNo - 枪号 0-N 对于不分区枪号的数据,无意义
* @param[in] e_dateType - 数据类型标志 详看枚举定义
* @param[in] u16_dataPara1 -数据参数1 不同数据类型,参数含义不同 对于不分区参数的数据,无意义
* @param[in] u16_dataPara2 -数据参数2 不同数据类型,参数含义不同 对于不分区参数的数据,无意义
*
* @return U16_T - 0 执行成功 1执行失败
*
* @author jiankalka
* @date 2025-09-03
* ************************************************************************
*/
U16_T u16_flow_put_ctrl(U8_T u8_gunNo,E_FLOW_CTRL_DATA_TYPE e_dateType,U16_T u16_dataPara1,U16_T u16_dataPara2)
{
U16_T u16_ret = 0;
(void)u16_dataPara2;
switch (e_dateType)
{
case E_FLOW_CTRL_DATA_GUN_LOCK : //枪锁控制 0解锁 1锁枪
{
if(u8_gunNo == 0)
v_yk_ctrl_impl(E_KY_TYPE_GUN_LOCK1 , (E_CMD) u16_dataPara1);
else
v_yk_ctrl_impl(E_KY_TYPE_GUN_LOCK2 , (E_CMD) u16_dataPara1);
break;
}
case E_FLOW_CTRL_DATA_AUXPOWER : //辅源控制 0断开 1闭合
{
if(u8_gunNo == 0)
v_yk_ctrl_impl(E_KY_TYPE_AUX_POWER1 , (E_CMD) u16_dataPara1);
else
v_yk_ctrl_impl(E_KY_TYPE_AUX_POWER2 , (E_CMD) u16_dataPara1);
break;
}
case E_FLOW_CTRL_DATA_K1K2 : //K1K2控制 0断开 1闭合
{
if(u8_gunNo == 0)
v_yk_ctrl_impl(E_KY_TYPE_DC_CONT1 , (E_CMD) u16_dataPara1);
else
v_yk_ctrl_impl(E_KY_TYPE_DC_CONT2 , (E_CMD) u16_dataPara1);
break;
}
case E_FLOW_CTRL_DATA_AC_YK : //交流接触器控制 0断开 1闭合
{
if(u8_gunNo == 1)
v_yk_ctrl_impl(E_KY_TYPE_AC1 , (E_CMD) u16_dataPara1);
else
v_yk_ctrl_impl(E_KY_TYPE_AC2 , (E_CMD) u16_dataPara1);
break;
}
case E_FLOW_CTRL_DATA_BUS_YK : //母联接触器控制 0断开 1闭合
{
v_yk_ctrl_impl(E_KY_TYPE_DC_CONT_BUS , (E_CMD) u16_dataPara1);
break;
}
case E_FLOW_CTRL_DATA_FAN_YK: //风扇
{
v_yk_ctrl_impl(E_KY_TYPE_FAN_CONT , (E_CMD) u16_dataPara1);
break;
}
default:
break;
}
return u16_ret;
}
/**
* ************************************************************************
* @brief - 获取 故障是否存在在列表中
*
* @param[in] e_info - 告警数据
* @param[in] f_site - 故障位置
*
* @return U8_T - 0 未存在 1存在为故障 2存在为告警
*
* @author jiankalka
* @date 2025-09-09
* ************************************************************************
*/
U8_T u8_flow_cheak_fault_flag(E_FAULT_INFO e_info , E_FAULT_SITE f_site)
{
U8_T u8_ret;
if(f_site > 0)
{
f_site += E_GUN; //故障存储枪地址从100开始
}
u8_ret = u8_cheak_fault_flag(e_info,f_site);
return u8_ret;
}
/**
* ************************************************************************
* @brief - 流程控制任务 触发故障告警
*
* @param[in] f_site - 故障位置 0整桩 1A枪 2B枪
* @param[in] e_type - 动作类型 0回复 1故障 2告警
* @param[in] e_info - 故障名称 详看故障枚举
* @param[in] u8_action_type - 拔枪恢复标志 0拔枪不恢复 1拔枪恢复
* @param[in] s16_data1 - 故障参数1 自定义
* @param[in] s16_data2 - 故障参数2 自定义
*
*
* @author jiankalka
* @date 2025-09-03
* ************************************************************************
*/
void v_flow_set_fault_data(E_FAULT_SITE f_site ,E_FAULT_TYPE e_type , E_FAULT_INFO e_info, U8_T u8_action_type, S16_T s16_data1 , S16_T s16_data2)
{
if(f_site > 0)
{
f_site = (E_FAULT_SITE)(f_site - 1);
f_site += E_GUN; //故障存储枪地址从1000开始
}
v_set_fault_data(f_site,e_type,e_info,u8_action_type,s16_data1,s16_data2);
}
/**
* ************************************************************************
* @brief - 流程控制任务 获取故障代码内容 中文
*
* @param[in] e_info - 故障代码
* @param[in] mag - 故障代码对应中文字符
*
*
* @author jiankalka
* @date 2025-09-03
* ************************************************************************
*/
void v_flow_get_fault_mag(E_FAULT_INFO e_info , char *mag,U16_T u16_len)
{
v_get_fault_info(e_info,mag,u16_len);
}
/**
* ************************************************************************
* @brief - 绝缘监测执行函数
*
* @param[in] u8_gunNo - 枪号
* @param[in] u32_insul_Rx - 绝缘监测电阻值 DC正对地
* @param[in] u32_insul_Ry - 绝缘监测电阻值 DC负对地
*
* @return S8_T - -1 未完成 0失败 1成功 2成功但告警
*
* @author jiankalka
* @date 2025-09-04
* ************************************************************************
*/
S8_T s8_flow_gun_insulation(U8_T u8_gunNo,U32_T *u32_insul_Rx,U32_T *u32_insul_Ry)
{
S8_T s8_ret = -1;
F32_T f32_rz, f32_rf;
s8_ret = s8_insulation_action(u8_gunNo ,&f32_rz, &f32_rf);
*u32_insul_Rx = (U32_T)f32_rz;
*u32_insul_Ry = (U32_T)f32_rf;
// printf("flow 绝缘检查结果= %d %d\n",s8_ret,u16_data );
return s8_ret;
}
/**
* ************************************************************************
* @brief - 绝缘监测资源控制
*
* @param[in] u8_gunNo - 枪号 0-N
* @param[in] u8_ctrlType - 控制类型 0绝缘监测资源初始化-绝缘监测开始前调用 1绝缘监测资源释放-绝缘监测结束后调用
*
*
* @author jiankalka
* @date 2025-09-04
* ************************************************************************
*/
void v_flow_gun_insulation_data_ctrl(U8_T u8_gunNo,U8_T u8_ctrlType)
{
if(u8_ctrlType == 1)
v_insulation_stop( u8_gunNo); //设置绝缘检测停止
// printf("flow 绝缘启停= %d %d\n",u8_gunNo,u8_ctrlType );
}
/**
* ************************************************************************
* @brief - 电压泄放执行
*
* @param[in] u8_gunNo - 枪号 0-N
*
* @return S8_T - 泄放执行结果 -1未完成 0泄放失败 1完成且泄放成功
*
* @author jiankalka
* @date 2025-09-04
* ************************************************************************
*/
S8_T s8_flow_volt_relief_do(U8_T u8_gunNo)
{
S8_T s8_ret = 1;
return s8_ret;
}
/**
* ************************************************************************
* @brief - 泄放控制资源操作
*
* @param[in] u8_gunNo - 枪号 0-N
* @param[in] u8_ctrlType - 控制类型 0泄放控制资源初始化-泄放开始前调用 1泄放控制资源释放-泄放控制结束后调用
*
*
* @author jiankalka
* @date 2025-09-04
* ************************************************************************
*/
void v_flow_gun_volt_relief_free(U8_T u8_gunNo ,U8_T u8_ctrlType)
{
}
/**
* ************************************************************************
* @brief - 设置启停命令
*
* @param[in] u8_gunNo - 抢号 0-N
* @param[in] s_charge_ctrl_info - 充电启停控制信息
*
*
* @author jiankalka
* @date 2025-09-08
* ************************************************************************
*/
void v_flow_start_stop_ctrl(U8_T u8_gunNo , S_FLOW_CHARGE_CTRL_INFO *s_charge_ctrl_info )
{
S_FLOW_CTRL_DATA *s_ctrl_data = &s_flow_data.s_ctrl_data[u8_gunNo];
S_FLOW_REAL_DATA *s_real_data = &s_flow_data.s_real_data[u8_gunNo]; //实时数据指针
if(s_charge_ctrl_info->e_cmd == CMD_OFF) //停止充电
{
s_ctrl_data->e_stop_flag = s_charge_ctrl_info->e_stop_res;
s_ctrl_data->s16_fault_stop_cnt = TIMER_NONE; //默认调用此接口停止充电的操作 都是正常停止(异常停止情况在本任务其他地方判断)
FLOWCTRL_LOG("Stop cmd, reason=%d\n",s_ctrl_data->e_stop_flag);
}
else //开始充电
{
if(s_real_data->e_flow_state != E_FLOW_FREE) //不是空闲 直接停止
{
return;
}
memset(s_ctrl_data, 0 , sizeof(S_FLOW_CTRL_DATA)); //清空控制信息
// 防止 s_over_time 初值为0导致首次判定直接超时
{
U32_T now_s = get_current_seconds();
s_ctrl_data->s_over_time.u32_trickle_limit_time = now_s;
s_ctrl_data->s_over_time.u32_dc_km_time = now_s;
s_ctrl_data->s_over_time.u32_mdu_free_time = now_s;
s_ctrl_data->s_over_time.u32_over_vol_time = now_s;
s_ctrl_data->s_over_time.u32_under_vol_time = now_s;
s_ctrl_data->s_over_time.u32_over_curr_time = now_s;
s_ctrl_data->s_over_time.u32_over_needCur_time = now_s;
s_ctrl_data->s_over_time.u32_over_needCur_max_time = now_s;
s_ctrl_data->s_over_time.u32_over_max_vol_time = now_s;
}
s_ctrl_data->s16_fault_stop_cnt = TIMER_NONE;
s_ctrl_data->e_start_flag = s_charge_ctrl_info->e_start_res; //启动原因
s_ctrl_data->e_sdk_chargMode = s_charge_ctrl_info->e_sdk_chargMode;
s_ctrl_data->u32_limit_data = s_charge_ctrl_info->u32_limit_data;
FLOWCTRL_LOG("Start cmd, reason=%d\n",s_ctrl_data->e_start_flag);
}
}
/**
* ************************************************************************
* @brief - 设置充电订单结算信息
*
* @param[in] u8_gunNo - 抢号0-N
* @param[in] u16_res - 结果
*
*
* @author jiankalka
* @date 2025-09-24
* ************************************************************************
*/
void v_flow_set_stop_log_info(U8_T u8_gunNo , U16_T u16_res)
{
//v_pcu_set_gun_char_flag(u8_gunNo,0 ,u16_res);
v_meterlog_set_stop_char_log_info(u8_gunNo, (E_FAULT_INFO)u16_res);
}
/**
* ************************************************************************
* @brief - 设置平台充电鉴权标志
*
* @param[in] u8_gunNo - 0-N
*
*
* @author jiankalka
* @date 2025-12-04
* ************************************************************************
*/
void v_flow_set_plat_vin_up(U8_T u8_gunNo)
{
v_bs_log_txFlag_autoStart(u8_gunNo); //设置充电鉴权上送标志
}
/**
* ************************************************************************
* @brief -充电中,更新充电订单中的充电电量与充电金额
*
* @param[in] u8_gunNo -充电枪号
*
*
* @author YZG
* @date 2025-09-29
* ************************************************************************
*/
void v_flow_log_info_updata(U8_T u8_gunNo)
{
S_FLOW_LOG_DATA *s_flow_log = &s_flow_data.s_log_data[u8_gunNo];
s_flow_log->u32_used_energy = u32_meterlog_put_data(u8_gunNo,E_METERLOG_PUT_LOG_INFO_USED_ENERGY,NULL,0); //获取充电电量
s_flow_log->u32_used_money = u32_meterlog_put_data(u8_gunNo,E_METERLOG_PUT_LOG_INFO_USED_MONEY,NULL,0);//获取充电金额
s_flow_log->u32_used_service_money = u32_meterlog_put_data(u8_gunNo,E_METERLOG_PUT_LOG_INFO_USED_SERVICE,NULL,0); //充电服务金额
s_flow_log->u16_char_time = u32_meterlog_put_data(u8_gunNo,E_METERLOG_PUT_LOG_INFO_CHAR_TIME,NULL,0); //获取充电时间
}
/**
* ************************************************************************
* @brief -设置充电枪流程控制状态初始化
*
* @param[in] u8_gunNo -
*
*
* @author jiankalka
* @date 2026-03-03
* ************************************************************************
*/
void v_flow_set_gun_flow_real_state_init(U8_T u8_gunNo)
{
s_flow_data.s_real_data[u8_gunNo].e_flow_real_state = E_FLOW_REAL_FREE;
}
void v_flow_request_ui_idle_recover(void)
{
v_ui_request_idle_screen_recover();
}