#ifndef FLOWCTRL_TASK_H #define FLOWCTRL_TASK_H #ifdef __cplusplus /*C++编译环境下兼容C语言*/ extern "C" { #endif #include "main.h" #include "flowctrl/flow_interface.h" #include "flowctrl/mdu_swh_ctrl.h" #include "mylog/mylog.h" #define FLOWCTRL_LOG(fmt, ...) MYLOG_MSG(TASK_ID_FlowCtrl, (fmt), ##__VA_ARGS__) #define TIMER_NONE -1 //正常动作 #define TIMER_SPECIAL_2 -2 //状态未恢复 依旧响应结束充电命令 #define TIMER_0ms NUM_0 //计时0ms #define TIMER_20ms NUM_20 //计时20ms #define TIMER_100ms NUM_100 //计时100ms #define TIMER_1s NUM_1000 //计时1s #define TIMER_10s (NUM_1000 * NUM_10) //计时30s #define TIMER_30s (NUM_1000 * NUM_30) //计时30s #define FLOW_TIMEOUT_GUNLOCK 15 //枪锁辅源检查超时时间5秒 #define FLOW_TIMEOUT_PCM_STATE 15 //从发送01快速启机/02停止充电,PCM状态切换 #define FLOW_TIMEOUT_VOLT 10 //接触器内测电压在绝缘检测电压/电池电压(设置电压值)-(1~10V)范围内 #define FLOW_TIMEOUT_INSULATION 30 //绝缘检测30s 27930 #define FLOW_TIMEOUT_PRECHARGE (60+5) //预充60s 自发送BRO-0xAA起60未收到CRO-0xAA 27930 模块输出电压调整15s #define FLOW_TIMEOUT_CHANGE_STOPTIME (60*10+1) //充电暂停 10分钟 测试快了500ms 加一 /*------ Exported struct(结构体定义) --------------------*/ //充电详细过程枚举 typedef enum { e_free = 0 , // 0 正常 e_gunLink , // 1 枪连接检查 e_gunlock , // 2 枪锁动作 e_auxpower , // 3 辅源动作 e_wiat_bms_hand , // 4 获取bms握手完成标志 e_check_bms_vol , // 5 检查bms最大允许充电电压 e_battvol_check , // 6 绝缘前电池测电压检查 e_insulmdu_check, // 7 绝缘检测模块启动 e_insulvol_check, // 8 绝缘检测电压达标 e_insul_ing_ok , // 9 绝缘检测完成 e_insul_mdu_stop, // 10 绝缘检测完成 e_insul_relief , // 11 绝缘泄放 e_wiat_bms_pre , // 12 等待bms预充电状态 e_wiat_batt_vol , // 13 检查电压测电压与标准是否符合 e_wiat_pre_mdu , // 14 等待预充模块启动 e_wiat_pre_vol , // 15 等待预充电压达标 e_wiat_bms_change, // 16 等待bms开始进入充电 e_change, // 17 进入充电中 e_change_suspend, // 18 充电暂停 }CHARGE_STATE; typedef enum //充电流程控制状态 { E_FLOW_FREE = 0, //空闲 E_FLOW_START_CHECK, //启动前检查 E_FLOW_START_CHECK_OK, //启动前检查完成 E_FLOW_INSUL_BEFORE, //绝缘检查前准备 E_FLOW_INSUL_RUNING, //绝缘检测中 E_FLOW_INSUL_OK, //绝缘检测完成 E_FLOW_WAIT_PRE_CHARGE, //等待预充 E_FLOW_PRE_CHARGE_BEFORE, //预充前检查 E_FLOW_PRE_CHARGE_RUNING, //预充电中 E_FLOW_PRE_CHARGE_OK, //预充完成 E_FLOW_CHARGE_RUNING, //充电中 E_FLOW_CHARGE_SUSPEND, //充电暂停 E_FLOW_BMS_TIMEOUT, //BMS通讯超时 E_FLOW_STOP_CHARGE, //停止充电 E_FLOW_STOP_CHARGE_OK, //停止充电完成 }E_FLOW_STATE; typedef struct //flow实时运行变量 { E_FLOW_STATE e_flow_state; //流程控制状态 0x0D E_FLOW_REAL_STATE e_flow_real_state; //流程控制对外状态 0x09 CHARGE_STATE e_charge_state; //充电详细步骤 START_REASON e_start_reason; //启动充电原因 E_FAULT_INFO e_stop_reason[5]; //停止原因 U8_T u8_bms_renew_cnt; //bms重连次数 U8_T u8_bms_renew_ctrl; //BMS重连控制标志 U8_T log_stop_flag; //订单停止标志 U32_T ulong_flow_timer; //状态超时计时 U32_T ulong_mdu_stop_timer; //状态超时计时 U16_T u16_anti_shake_cnt; //防抖计数 U16_T u16_anti_shake_cnt2; //防抖计数 //bms状态标志位 U8_T u8_bms_chm_flag; //bms握手辨识标志 0无 1成功 2失败 U8_T u8_bms_pre_flag; //bms开始预充标志 0无 1成功 U8_T u8_bms_charge_flag; //bms进入充电标志 0无 1成功 U8_T u8_bms_suspend_flag; //bms禁止充电标志 0无 1成功 U8_T u8_bms_stop_flag; //bms停止充电标志 0无 1成功 U8_T u8_insul_ret; //绝缘检测结果 U32_T u32_insul_Rx; //绝缘检测正对地电阻 单位 0.1欧姆 U32_T u32_insul_Ry; //绝缘检测负对地电阻 单位 0.1欧姆 U16_T u16_need_vol; //需求电压 精度0.1V U16_T u16_need_cur; //需求电流 精度0.1A U16_T u16_real_put_vol; //实际输出电压 U16_T u16_real_put_cur; //实际输出电流 }S_FLOW_REAL_DATA; typedef struct //故障超时判定起始时间 { U32_T u32_trickle_limit_time; //涓流停机超时起始时间 U32_T u32_dc_km_time; //直流输出接触器超时起始时间 U32_T u32_mdu_free_time; //充电模块空闲超时起始时间 U32_T u32_over_vol_time; //直流输出过压超时起始时间 U32_T u32_under_vol_time; //直流输出欠压超时起始时间 U32_T u32_over_curr_time; //直流输出欠压超时起始时间 U32_T u32_over_needCur_time; //直流输出大于需求超时起始时间 U32_T u32_over_needCur_max_time; //输出大于最高允许超时起始时间 U32_T u32_over_max_vol_time; //直流输出电压超过最高允许超时起始时间 }S_FLOW_OVER_TIME; typedef struct { U8_T u8_twoGun_flag; //双枪同充标志 0不是单枪充电 1双枪同充且是主枪 2双枪同充且是辅助枪 U8_T u8_gunlock_cnt; //枪锁动作次数 START_REASON e_start_flag; //充电启停标志 0不启动 1正常启动 2即插即充 0x05 E_FAULT_INFO e_stop_flag; //外部停止充电标志 S16_T s16_fault_stop_cnt; //异常停止计数 -1 正常动作 0 直接都做 +N需要延时 E_CHRG_LIMIT_MOD e_sdk_chargMode; //充电限制方式 0 不做限制的充电(默认) 1 限制金额 2 限制电量 electricity 3 限制SOC 4 限制充电时长 5 限制功率 S_FLOW_OVER_TIME s_over_time; //故障超时判定起始时间 U32_T u32_limit_data; //限制参数 限制金额默认精度 0.01元 限制电量默认精度0.1kWh }S_FLOW_CTRL_DATA; typedef struct { U32_T u32_satrt_time; //启动充电时间 时间戳 U32_T u32_stop_time; //停止充电时间 时间戳 U16_T u16_char_time; //充电时间 单位秒 U32_T u32_used_energy; //己用电量,单位是0.0001KWh U32_T u32_used_money; //充电金额,,单位是0.0001元 U32_T u32_used_service_money; //充电服务,单位是0.0001元 E_FAULT_INFO u_stop_res; //停止充电原因 }S_FLOW_LOG_DATA; typedef enum { E_PULSE_STATE_IDLE = 0, //脉冲空闲 E_PULSE_STATE_ON, //脉冲闭合阶段 E_PULSE_STATE_OFF, //脉冲断开阶段 E_PULSE_STATE_STOP, //脉冲完成 } E_PULSE_STATE; typedef struct //流程任务变量结构体定义 { U8_T u8_gunCnt; //充电枪数量 U8_T u8_gb_en; //国标使能标志 0不使能 1使能 U8_T u8_gun_type[GUN_MAX_CNT]; //枪类型 U8_T u8_gunlock_num; //枪锁解锁最大次数 U8_T u8_relief_time; //泄放时间 单位 秒 U8_T u8_not_enable_flag; //不允许充电标志 U16_T u16_timer_cnt; //计时计数 U16_T u16_insul_before_vol; //绝缘前电压判断值 精度 0.1V U16_T u16_insul_putvol_range; //绝缘检测输出电压误差值 精度 0.1V U8_T u8_start_flag; //模块任务运行标志 0停止 1运行 U8_T u8_pulse_target_ac; //脉冲目标AC 1=AC1 2=AC2 U8_T u8_pulse_cycle_count; //脉冲周期计数 E_PULSE_STATE e_pulse_state; //脉冲控制状态 U64_T u64_pulse_timer; //脉冲计时器 ms S_FLOW_CTRL_DATA s_ctrl_data[GUN_MAX_CNT]; //控制命令 S_FLOW_REAL_DATA s_real_data[GUN_MAX_CNT]; //充电实时信息 空闲时清零 S_FLOW_LOG_DATA s_log_data[GUN_MAX_CNT]; //充电订单信息 -- 用于显示 S_MDU_ALLOCATE_CTRL s_mdu_allocate_ctrl[GUN_MAX_CNT];//模块控制信息 }S_FLOW_DATA; void v_flowctrl_task(void *arg); U8_T u8_flowctrl_get_gun_num(void); void v_flow_set_stop_charge(U8_T u8_gunNo , E_FAULT_INFO e_stop_reason , S16_T s16_fault_stop_cnt); #endif