1. 关于轮询发生三次同种类故障,三种故障分别计时,锁定运行,强制关机
//枚举和数组协作实现故障分类计数发生次数和发生时间
//故障状态设置------首先
typedef enum
{
ERR_NOLOAD,
ERR_OVERLOAD_8A,
ERR_OVERLOAD_1_5,
ERR_LIGHTLOAD,
ERR_MAX_NUM
}ERR_INDEX;
//故障分路计时
// [故障类型][0]=计数 [故障类型][1]=计时
// over_time_buf[i][0] = 当前故障累计次数
// over_time_buf[i][1] = 从第一次故障开始累计的毫秒计时---故障x计时tick
unsigned int over_time_buf[ERR_MAX_NUM][2]={{0}};
for(i=0;i<ERR_MAX_NUM;i++)
{
//有故障才计时
if(over_time_buf[i][0] > 0)
{
over_time_buf[i][1]++;
if(over_time_buf[i][1] >= FAULT_WINDOW_TICK)
{
over_time_buf[i][0] = 0;
over_time_buf[i][1] = 0;
}
}
}
void Fault_Record(ERR_INDEX fault_id)
{
if(motor_stop_flag) return;
over_time_buf[fault_id][0]++;//次数+1
//出发第一次故障计时,如果是其他故障触发则从此清零计时,0→180s
if(over_time_buf[fault_id][0] == 1)
{
over_time_buf[fault_id][1] = 0;
}
//窗口内累计满3次,电机停机自锁
if(over_time_buf[fault_id][0] >= 3)
{
motor_stop_flag = 1;//180s窗口内自锁
//电机停止
sys_state = S_FAULT;
}
}
运用数组来区分故障类型,用定时器来计时。
2. 关于单一错误的计数
// [0]:故障累计次数
// [1]:从第一次故障开始的毫秒计时
unsigned int overload_time_buf[2] = {0};

397

被折叠的 条评论
为什么被折叠?



