2016-02-18 50 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 

其余的将保持不变。