我做一個方案,就是做一個小的監控器(帶顯示屏),隨時監控設備運行情況,當設備發生緊急情況時,監控器立即啟動報警,同時顯示屏上顯示對應的故障碼。
緊急情況有兩種,設備過流(對應故障碼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整個的邏輯,因為他一直為真,是這個原因嗎?還是其他什么原因呢?
|