forked from gary/BCU
2
0
Fork 0
BCU/app/stm32fxxx_app/app/logic_do.c

200 lines
5.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "fault_manager.h"
#include "dido_manager.h"
#include "flash_manager.h"
#include "signal_manager.h"
#include "eeprom_manager.h"
#include "logic_ctrl.h"
#include "hv_adc_manager.h"
#include "kit_time.h"
typedef struct
{
uint16_t step;
uint16_t dly;
}DoParamItem;
DoParamItem do_param_item[APP_CFG_RELAY_NUM];
//制冷
void logic_do_cool1_ctrl(uint32_t base_time, uint8_t idx)
{
if(bms_get_signal(kSignalIdx_Cool) == kSignalStatus_High)
{
bms_crtl_do_status_by_idx(idx, kDoCtrlStatus_On, RELAY_CTRL_NO_DLY);
}
else
{
bms_crtl_do_status_by_idx(idx, kDoCtrlStatus_Off, RELAY_CTRL_NO_DLY);
}
}
//加热
void logic_do_heat1_ctrl(uint32_t base_time, uint8_t idx)
{
if(bms_get_signal(kSignalIdx_Heat) == kSignalStatus_High)
{
bms_crtl_do_status_by_idx(idx, kDoCtrlStatus_On, RELAY_CTRL_NO_DLY);
}
else
{
bms_crtl_do_status_by_idx(idx, kDoCtrlStatus_Off, RELAY_CTRL_NO_DLY);
}
}
//运行灯-回路闭合亮
void logic_do_run1_led_ctrl(uint32_t base_time, uint8_t idx)
{
DoCtrlStatus do_status = kDoCtrlStatus_Off;
if(bms_get_circuit_status(kCircuitType_Main) == kCircuitStatus_On)
{
do_status = kDoCtrlStatus_On;
}
bms_crtl_do_status_by_idx(idx, do_status, RELAY_CTRL_NO_DLY);
}
//告警灯-一级故障常亮(严重) 二级故障1s间隔闪烁中等 三级故障2s间隔闪烁轻微 无故障不亮
void logic_do_alarm1_led_ctrl(uint32_t base_time, uint8_t idx)
{
uint16_t dly_beep;
FaultLevel max_level;
DoCtrlStatus do_status;
if(idx < APP_CFG_RELAY_NUM)
{
dly_beep = do_param_item[idx].dly;
max_level = bms_get_max_fault_level();
do_status = kDoCtrlStatus_Off;
if(1)
{
dly_beep += base_time;
if(max_level == kFaultLevel_Third)
{
do_status = kDoCtrlStatus_On;
}
else if(max_level == kFaultLevel_Second)
{
if(dly_beep <= 1000)
{
do_status = kDoCtrlStatus_Off;
}
else if(dly_beep <= 2000)
{
do_status = kDoCtrlStatus_On;
}
else
{
dly_beep = base_time;
}
}
else if(max_level == kFaultLevel_First)
{
if(dly_beep <= 2000)
{
do_status = kDoCtrlStatus_Off;
}
else if(dly_beep <= 4000)
{
do_status = kDoCtrlStatus_On;
}
else
{
dly_beep = base_time;
}
}
else
{
dly_beep = 0;
}
}
else
{
dly_beep = 0;
}
do_param_item[idx].dly = dly_beep;
bms_crtl_do_status_by_idx(idx, do_status, RELAY_CTRL_NO_DLY);
}
}
typedef enum
{
kTripStep_Normal,
kTripStep_Delay,
kTripStep_NoDelay,
kTripStep_Trigger,
kTripStep_Wait,
kTripStep_End,
}TripStep;
//BCU的分励断路器
void logic_do_trip1_ctrl(uint32_t base_time, uint8_t idx)
{
if(idx < APP_CFG_RELAY_NUM)
{
switch(do_param_item[idx].step)
{
case kTripStep_Normal:
if((bms_get_fault_level(kFaultCode_Stop) >= kFaultLevel_Third)
|| (bms_get_fault_level(kFaultCode_Fire) >= kFaultLevel_Third))
{
do_param_item[idx].step = kTripStep_NoDelay;
}
else if(((bms_is_bsu_fault() == true) || (bms_get_fault_relay_off_bit() != 0))
&& (KIT_ABS(bms_get_current() / 10) >= get_eeprom_data(kEep_CutOffCurrent, kEepromDataType_Full))) //满足禁充且禁放且有电流 分辨率1A
{
if(get_eeprom_data(kEep_SwitchOffDly_BcuShuntTrip, kEepromDataType_Low) > 0)
{
do_param_item[idx].step = kTripStep_Delay;
}
else
{
do_param_item[idx].step = kTripStep_Wait;
}
}
break;
case kTripStep_NoDelay:
do_param_item[idx].step = kTripStep_Trigger;
bms_crtl_do_status_by_idx(idx, kDoCtrlStatus_On, RELAY_CTRL_NO_DLY);
break;
case kTripStep_Delay:
do_param_item[idx].dly += base_time;
if(do_param_item[idx].dly >= get_eeprom_data(kEep_SwitchOffDly_BcuShuntTrip, kEepromDataType_Low) * 100)
{
do_param_item[idx].step = kTripStep_Trigger;
do_param_item[idx].dly = 0;
bms_crtl_do_status_by_idx(idx, kDoCtrlStatus_On, RELAY_CTRL_NO_DLY);
}
break;
case kTripStep_Trigger:
do_param_item[idx].dly += base_time;
if(do_param_item[idx].dly >= get_eeprom_data(kEep_TripPulse_DataSavePeriod, kEepromDataType_High) * 100)
{
do_param_item[idx].step = kTripStep_Wait;
bms_crtl_do_status_by_idx(idx, kDoCtrlStatus_Off, RELAY_CTRL_NO_DLY);
}
break;
case kTripStep_Wait:
if((bms_get_fault_level(kFaultCode_Stop) < kFaultLevel_Third)
&& (bms_get_fault_level(kFaultCode_Fire) < kFaultLevel_Third)
&& (bms_is_bsu_fault() == false)
&& (bms_get_fault_relay_off_bit() == 0))
{
do_param_item[idx].step = kTripStep_Normal;
}
break;
default:
break;
}
}
}