
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(i0;iERR_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};