博图中的定时器你真的会用吗?关于西门子PLC编程软件TIA中使用IEC定时器的陷阱
目录
1 概述
2 编写测试程序
3 测试结果
正文
新建名为TestTimer的FB块,并在Main中调用,并产生其背景数据块InstTimerTest。
打开TestTimer块,在Static区域建立如下静态变量,注意sSetPT的初值为T#30s。
在代码编辑区域,编写如下代码。
(* 测试IEC定时器TON*) //调用定时器,P1IF #sIsCall THEN #instTimer.TON(IN := #sIsEnable, PT := #sSetPT);END_IF; //访问定时器的Q,P2IF #sIsReadQ THEN IF #instTimer.Q THEN RESET_TIMER(#instTimer); END_IF;END_IF; //访问定时器的ET,P3IF #sIsReadET THEN IF #instTimer.ET >= t#20s THEN RESET_TIMER(#instTimer); END_IF;END_IF;
下载程序至仿真PLC并打开InstTimerTest背景数据块,进行在线监测。以下PLC初始运行的状态我们定义为初始状态,以下场景都从初始状态开始。
若仅sIsReadQ置1,则定时器计时30s输出Q,P2中程序复位定时器,定时器重新计时。
若仅sIsReadET置1,则定时器计时20s,P3中程序复位定时器,定时器重新计时。
若sIsReadQ和sIsReadET都置1,则定时器计时20s被P3程序复位后重新计时。
当sIsCall为1,sIsEnable由1变0时,定时器复位。
此场景下,定时器正常工作,可以看到ET值一直在刷新变化,按照程序逻辑正常执行。
初始状态时,sIsReadQ和sIsReadET都不置1,将sIsCall、sIsEnable分别置1,即调用并启动定时器,此时ET值没有刷新变化,一直保持为0。
大约等待10s后,将sIsReadQ和sIsReadET至少一个置1,可以看到ET立即刷新为10s左右的计时值。
初始状态时,先将sIsReadQ和sIsReadET至少一个置1,再将sIsCall、sIsEnable分别置1,即调用并启动定时器。在ET为5s左右时,复位sIsReadQ和sIsReadET,发现ET不再刷新,停留在为复位sIsReadQ和sIsReadET时的值。
等待大约10s以后,再将sIsReadQ和sIsReadET至少一个置1,发现ET值为15s左右。
若在sIsCall被复位期间,sIsEnable也被复位,仍不影响定时器的计时,因为在TON指令未被调用时,IN的状态不会再随连接变量的变化而变化,下图IN仍然为sIsCall复位前的状态TRUE。只要在sIsCall再次被置1前将sIsEnable置1都不不影响定时器的计时。