我正在编写一个程序,使用自动化软件来控制油箱。
我有几个报警信号,如果这些信号中的任何一个变为真,则触发报警标志。然后,此警报标志需要点亮警告灯。到目前为止,我很好,但是我试图让灯泡闪烁。
我知道我必须使用定时器,到目前为止已经实现了将灯打开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 :(得分:0)
在不知道PLC的平台或STL的语法和惯例的情况下,我不能给你最有效的例子,但是这里有一些小的伪代码可以得到重点
// 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
其余的将保持不变。
答案 1 :(得分:0)
count:= count +1;
IF计数> 2000 THEN
计数:= 0;
END_IF
IF count> 500 THEN
灯:真;
ELSE 灯:=假;
END_IF
//持续2秒(循环时间= 1ms * 2000)