我做一个方案,就是做一个小的监控器(带显示屏),随时监控设备运行情况,当设备发生紧急情况时,监控器立即启动报警,同时显示屏上显示对应的故障码。
紧急情况有两种,设备过流(对应故障码E1),以及设备过载(对应故障码E2).
紧急情况的优先级最高,当程序正常运行时,一旦发生紧急情况,无论当前在运行什么程序,必须无条件跳转到紧急情况程序中,紧急情况结束后,再自动返回到之前运行的程序中。
程序框架如下:
int main(void)
{
uint8_t over_current_flag=1; //过流发生标志位, 当为低时,表示过流发生,下同
uint8_t over_load_flag=1; //设备过载标志位
while(1)
{
normal_run(); //正常运行程序,即时监控
while(!over_current_flag || !over_load_flag) //检测到低电平时,立即跳转到该循环
ErrorCode_DISPALY() ; //根据发生实际情况,显示E1, E2, 或两种同时发生时,组合显示E1,E2
}
}
void ErrorCode_DISPLAY()
{
if(!over_current_flag)
E1_DISPLAY(); //过流时显示E1
if(!over_load_flag)
E2_DISPLAY(); //过载时显示E2
if(!over_current_flag && !over_load_flag)
E12_DISPLAY(); //过流和过载同时发生,显示屏同时显示E1和E2
}
现在的问题是:
如果只发生一种, 比如E1或E2,显示屏可以正常显示,没问题。如果发生了过流,显示屏显示E1, 过了一会,又发生了过载,可是仍然显示的是E1. 并不会同时显示E1,E2, 这是为何呢?
当发生E1时,由于 while循环中while(!over_current_flag || !over_load_flag) 用的是||,只要有一个为真就执行程序,此时!over_current_flag 为真,开始执行程序。后来当!over_load_flag也为真时,并没有改变!over_current_flag || !over_load_flag整个的逻辑,因为他一直为真,是这个原因吗?还是其他什么原因呢?
|