暂停计时器我会使用以下代码
rEdgeTrig(CLK:=startTimer); IF rEdgeTrig.Q THEN actualTime := actualTime - eTime; END_IF; (* TON timer *) timer(IN:=startTimer,PT:=actualTime); IF startTimer THEN eTime := timer.ET; END_IF; if timer.Q then acutalTime:=initialTime; end_if;
当您的计时器不再被要求运行时,将经过的时间加载到变量。然后从想要重新开始的预设时间中减去。
这是一个TON_Pausable。
TON_Pausable的行为就像普通的TON一样。此外,通过PAUSE输入暂停TON_Pausable,暂停时IN必须保持为真。
FUNCTION_BLOCK TON_Pausable VAR_INPUT IN : BOOL; PT : TIME; PAUSE : BOOL; END_VAR VAR_OUTPUT Q : BOOL; ET : TIME; END_VAR VAR rtPause : R_TRIG; tTimePaused : TIME; ton : TON; END_VAR
IF NOT IN THEN tTimePaused := T#0s; END_IF rtPause(CLK := PAUSE); IF rtPause.Q THEN tTimePaused := tTimePaused + ton.ET; END_IF ton(IN := IN AND NOT PAUSE, PT := PT - tTimePaused); Q := ton.Q; ET := tTimePaused + ton.ET;
这样逻辑就被封装并可重用。
另一种方法是在CASE OF中调用定时器,如果Case没有调用TON,它将被暂停,在CASE和CASE之外小心处理TON的输入和输出
另一种方法可以是手动递增/递减计时器变量,在泵启动时在每次扫描时添加/减去扫描时间。 可以使用必要的输入将此功能隐藏在功能块中。 一个简单的实现如下所示。
VAR tRun: TIME; bResetTimer: BOOL; END_VAR VAR_CONSTANT T_SCAN := t#10ms; END_VAR IF Pump.run AND NOT Proximity.on THEN tRun := tRun + tScan; END_IF; IF tRun >= t#120s THEN ; (* Do something *) END_IF; IF bResetTimer THEN tRun := t#0s; bResetTimer := FALSE; END_IF;