BCU/app/stm32fxxx_app/app/logic_di.c

133 lines
4.0 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 "kit_debug.h"
#include "dido_manager.h"
#include "fault_manager.h"
#include "signal_manager.h"
#include "flash_manager.h"
#include "eeprom_manager.h"
#include "run_status.h"
typedef struct
{
uint16_t step;
uint16_t dly;
}DiParamItem;
DiParamItem di_param_item[kDiType_End];
//辅助触点1
//di_signal->di_item.status, di->di_iteml.type
void ord_di_do_feedback_func(uint32_t base_time, DiStatus di_signal, DiType di)
{
if(di < kDiType_End)
{
if(bms_get_do_status_by_idx(di - kDiType_Do1Feedback) != di_signal)
{
//I don't know what's the meaning of this line.Whatever I change the 5000 to what , it is always enter the " if " and set the fault level.
//di_param_item[di].dly += base_time;
if(di_param_item[di].dly >= 5000)
{
//这里会写进错误--反馈异常,这里的一级代表三级错误
bms_set_fault_level(kFaultCode_Feedback, kFaultLevel_First, kFaultHandle_AlarmIdx);
}
}
else
{
di_param_item[di].dly = 0;
}
}
}
//消防火警 报故障,断继电器
void ord_di_fire_alarm1_func(uint32_t base_time, DiStatus di_signal, DiType di)
{
if((di < kDiType_End) && (di_signal == kDiStatus_Trigger))
{
di_param_item[di].dly += base_time;
bms_set_fault_level(kFaultCode_Fire, kFaultLevel_Third, kFaultHandle_CutNoRelIdx);
}
}
//急停信号
void ord_di_emerge_stop_func(uint32_t base_time, DiStatus di_signal, DiType di)
{
if(di_signal == kDiStatus_Trigger)
{
bms_set_fault_level(kFaultCode_Stop, kFaultLevel_Third, kFaultHandle_CutNoRelIdx);
}
}
//自锁信号-解除休眠
void ord_di_self_lock_func(uint32_t base_time, DiStatus di_signal, DiType di)
{
bool is_lock_enable_off = false;
if(di_signal == kDiStatus_Trigger)
{
bms_set_signal(kSignalIdx_LowVoltSleep,(SignalStatus)is_lock_enable_off);
bms_set_signal(kSignalIdx_StandbySleep,(SignalStatus)is_lock_enable_off);
}
}
//水浸故障1
void ord_di_water1_fun(uint32_t base_time, DiStatus di_signal, DiType di)
{
if((di < kDiType_End) && (di_signal == kDiStatus_Trigger))
{
di_param_item[di].dly += base_time;
bms_set_fault_level(kFaultCode_Water, kFaultLevel_Third, kFaultHandle_CutNoRelIdx);
}
}
//熔断器故障1
void ord_di_fuse1_fun(uint32_t base_time, DiStatus di_signal, DiType di)
{
if((di < kDiType_End) && (di_signal == kDiStatus_Trigger))
{
di_param_item[di].dly += base_time;
bms_set_fault_level(kFaultCode_FuseStatus, kFaultLevel_Third, kFaultHandle_CutNoRelIdx);
}
}
//断路器反馈信号1
void ord_di_breaker1_fun(uint32_t base_time, DiStatus di_signal, DiType di)
{
if((di < kDiType_End) && (di_signal == kDiStatus_Trigger))
{
//这里会写进错误--反馈异常,这里的三级代表一级错误
di_param_item[di].dly += base_time;
bms_set_fault_level(kFaultCode_Feedback, kFaultLevel_Third, kFaultHandle_CutNoRelIdx);
}
}
/*无消防1消防2消防3DO1反馈信号DO2反馈信号DO3反馈信号DO4反馈信号DO5反馈信号
DO6反馈信号门禁水浸保险丝故障信号PCS故障信号空调故障信号隔离开关反馈信号气体检测故障信号
UPS故障信号EMS故障信号*/
//DI策略对应函数注意应与枚举DiStrategy顺序一致
const DiFun di_func[kDiType_End]= {
NULL,
ord_di_emerge_stop_func, //急停,
ord_di_fire_alarm1_func,//消防1
ord_di_fire_alarm1_func,//消防2
ord_di_fire_alarm1_func,//消防3
ord_di_do_feedback_func,//DO1反馈信号
ord_di_do_feedback_func,//DO2反馈信号
ord_di_do_feedback_func,//DO3反馈信号
ord_di_do_feedback_func,//DO4反馈信号
ord_di_do_feedback_func,//DO5反馈信号
ord_di_do_feedback_func,//DO6反馈信号
NULL,//门禁
ord_di_water1_fun,//水浸
ord_di_fuse1_fun,//保险丝故障信号
NULL,//PCS故障信号
NULL,//空调故障信号
NULL,//隔离开关反馈信号
NULL,//气体检测故障信号
NULL,//UPS故障信号
NULL//EMS故障信号
};