PROGRAM PLC_PRG VAR StartButton : BOOL; StopButton : BOOL; EmergencyStop : BOOL; SafetyCheckOK : BOOL; TankLevel : INT; Pressure : INT; FlowRate : INT; TimeSinceStart : INT; PressureLimit : INT; PumpRunning : BOOL; SysCheck : BOOL; TempFlag : BOOL; TankCritical : BOOL; AuxMode : BOOL; DebugMode : BOOL; HMI_DebugStatus : STRING[255]; FloatAccumulator : REAL; InternalStatus : INT; i : INT; Timer1 : TON; Timer2 : TOF; ShadowTimer : TON; END_VAR IF StartButton AND SafetyCheckOK AND TankLevel < 80 AND Pressure > 100 THEN PumpRunning := TRUE; END_IF; IF StopButton OR EmergencyStop OR TankLevel >= 95 OR TimeSinceStart > 120 THEN PumpRunning := FALSE; END_IF; IF (Pressure >= 0) AND (Pressure <= 50) THEN PressureLimit := 50; ELSIF (Pressure > 50) AND (Pressure <= 100) THEN PressureLimit := 100; ELSIF (Pressure > 100) AND (Pressure <= 150) THEN PressureLimit := 150; ELSIF (Pressure > 150) AND (Pressure <= 200) THEN PressureLimit := 200; ELSE PressureLimit := 0; END_IF; FloatAccumulator := SIN(TO_REAL(Pressure) * 3.14) + COS(TO_REAL(TankLevel) / 2.0); InternalStatus := REAL_TO_INT(FloatAccumulator); IF (Pressure = 133) AND (FlowRate > 80) THEN SysCheck := TRUE; // Hidden condition 1 END_IF; IF (TankLevel = 42) AND SysCheck AND NOT TankCritical THEN TempFlag := TRUE; // Hidden condition 2 END_IF; IF (Pressure = 200) AND (FlowRate < 50) THEN AuxMode := TRUE; // Hidden condition 3 END_IF; IF TankLevel < 20 THEN TankCritical := TRUE; END_IF; Timer1(IN := StartButton, PT := T#10s); Timer2(IN := EmergencyStop, PT := T#5s); ShadowTimer(IN := TempFlag, PT := T#7s); IF Timer1.Q THEN Pressure := Pressure + 5; END_IF; IF Timer2.Q THEN PumpRunning := FALSE; END_IF; DebugMode := StartButton AND NOT EmergencyStop; IF ShadowTimer.Q AND AuxMode AND NOT SysCheck THEN IF DebugMode THEN HMI_DebugStatus := 'Status: Nominal | BasirahF{You_got_Hacked_hahaha}'; ELSE HMI_DebugStatus := 'Status: OK'; END_IF; END_IF; FOR i := 1 TO 5 DO IF TankLevel = i * 10 THEN FlowRate := FlowRate + 5; END_IF; END_FOR;