#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(); }