2016-02-18 53 views
-1

我正在編寫一個程序,使用自動化軟件來控制油箱。結構化文本PLC編程。打開和關閉燈光

我有幾個報警信號,如果這些信號中的任何一個變爲真,觸發一個報警標誌。此警報標誌則需要點亮警示燈。到目前爲止,我很好,但是我試圖讓燈閃爍。

我知道我必須使用定時器,並且到目前爲止已經實現了將燈打開2秒然後關閉2秒但我不知道如何循環這個,所以它繼續這樣做直到按下重置按鈕。

這是我的代碼,

PROGRAM _CYCLIC 

    Warning_Lamp; 

    TON_Warning(IN := Alarm_Active_Flag_1 , PT := T#2s); 

    IF(TON_Warning.Q = TRUE)THEN 

     Warning_Lamp := TRUE; 

    END_IF 


    TON_Warning_2(IN := TON_Warning.Q , PT := T#2s); 

    IF(TON_Warning_2.Q = TRUE)THEN 

     Warning_Lamp := FALSE; 

    END_IF 



END_PROGRAM 

回答

0

有一對夫婦的事情,你需要考慮:

  1. 如果報警消失,報警標誌將消失。這會導致你的序列停止。你想要這種行爲嗎?或者您希望操作員在序列停止前確認報警標誌?

  2. 如果有人按下復位但是停止並且報警標誌仍然有效,會發生什麼情況?復位按鈕是否被忽略?

如果你能回答這些問題,我可能會幫助你多一點。

0

不知道PLC或語法和STL爲PLC我不能給你最有效的例子公約的平臺,但這裏有一個小的僞代碼,應在整個

// Set a Bit to indicate an alarm was triggered 
IF(Alarm_State := TRUE) THEN 
    Wait_For_Reset = TRUE; 
END_IF 

// Condition your code off the state of that bit rather than your alarm bit 
IF(Wait_For_Reset := TRUE) THEN 
    //YOUR CODE HERE 

END_IF 

//Reset the bit that controls your code loop when the user presses Reset 
IF(Reset_Pressed := TRUE) THEN 
    Wait_For_Reset = FALSE: 
END_IF 
得到點

我會避免DO/WHILE循環,除非這是PLC的唯一工作,因爲在我遇到的大多數平臺中,DO/WHILE循環會中斷PLC的正常掃描,直到循環完成。

現在很明顯,這並不做任何實際報警位,你的代碼只做什麼,如果它的高,如果報警條件仍然存在,那麼它只會重新設置,並繼續處理您的代碼。如果要防止發生這種情況,最好使用來自Alarm_State的上升沿輸入來設置Wait_For_Reset位。這樣,它只爲Alarm_State的每個LO/HIGH轉換設置一次。我遇到的每個PLC都有一些Rising Edge Bit版本。如果你想在代碼中手動這樣做,那麼你可以做這樣的事情:

IF(Alarm_State := TRUE AND WFR_ONS := FALSE) THEN 
    Wait_For_Reset := TRUE; 
    WFR_ONS := TRUE; //One Shot 
END_IF 

IF(Alarm_State := FALSE) THEN 
    WFR_ONS := FALSE; 
END_IF 

其餘的將保持不變。