PLC中的定时器 - 结构化文本

时间:2014-09-05 09:43:19

标签: timer plc st

定时器如何在PLC结构化文本(ST)中工作?我们如何申报?

我一直在研究PLC的标准(IEC 61131-3),他们没有谈到ST的计时器。我知道绝大多数PLC程序员都是在梯形逻辑中完成它们,但在这个特殊情况下我真的需要在ST中声明定时器。

我使用的是Rockwell PLC。

6 个答案:

答案 0 :(得分:6)

您可以在IDE的帮助系统中找到有关计时器以及如何使用(声明)计时器的说明。例如,在CODESYS帮助中,您可以阅读标准库的计时器。

通常,您可以将定时器延迟(TON)声明为:

VAR
    MY_TON: TON;
END_VAR
(* standard.library should be added to the project *)

然后你可以使用它:

MY_TON(IN:= IN_VALUE,PT:= TIME_SET);
(*IN_VALUE - is BOOL variable that activates your timer
  TIME_SET - is TIME variable*)

SOME_OUTPUT := MY_TON.Q;
(*Q - is the timer's output, and it can be used as BOOL variable. *)

您还可以使用常量来设置计时器:

MY_TON(IN:= True, PT:= t#5s);

作为BOOL变量,定时器的输出可用于IF和WHILE语句:

IF MY_TON.Q THEN
    (*Some statements...*)
END_IF

WHILE MY_TON.Q DO
    (*Some statements...*)
END_WHILE

所有示例都在CODESYS v3.5 SP5和v2.3中运行。对于其他IDE,可能会有细微差别。

答案 1 :(得分:1)

我在Gx-Works(三菱/ FXCPU)中解决了这个问题:

TON_1(IN:= Enable_Timer,PT:= PresetTime ,Q:= Output,ET:= TimeLeft);

请记住申报TON_1:)

答案 2 :(得分:1)

计时器有效,只有当TON.QTON.IN的持续时间内持续高时,TON.PT才会变高。

如果TON.Q处于稳定的高状态,这可确保TON.IN仅变高。

这可能有助于确保仅在按下按钮至少持续TON.PT的时间才启用输出。

答案 3 :(得分:0)

通常,您可以设置预设时间并启用计时器。当它过去时,将完成某种完成位设置为真。重置启用时,时间也将重置。

答案 4 :(得分:0)

我使用支持ST语言的欧姆龙PLC完成了这项工作。

PLC中有一个定时器中断,我们用它在ST中构建我们自己的定时器,然后我们可以跳过PLC的限制。当PLC上电时,中断任务中的代码每次中断都会执行,你可以在中断处理程序中写“A = A + 1”。

当你开始使用计时器时,只记录A的当前数据。让我们说A1;间隔是:

Interval= Current_Data_Of_A-A1

然后将Interval与您想要的时间进行比较。如果Interval大于您想要的时间,请执行下一个代码。

答案 5 :(得分:0)

我们还使用PLC提供的毫秒计数器构建了自己的计时器结构,因此我们可以在需要时制作计时器数组(施耐德电气),并且超出PLC的限制。

TTIMER
 Count: UINT 
 timclock :INT 
 OUT :BOOL
 IN: BOOL 
END_STRUCT;
TIM_SOD=ARRAY[0..1] OF TTIMER;

(*This part runs every cycle of PLC*)
FOR I:=0 TO 1 DO
  IF TIM_SOD[I].IN (*timer on*)
  THEN
   IF (TIM_SOD[I].Count)>0 (*number of seconds left*)
   THEN
    IF ABS_INT(IN:=timclock-TIM_SOD[I].CLK)>=100 (*timclock -mSec counter*)
    THEN aTIM_SOD[I].Count:=TIM_SOD[I].Count-1;
     TIM_SOD[I].CLK:=TIM_SOD[I].CLK+100;
    END_IF;
   ELSE
    TIM_SOD[I].IN:=0; (*timer off*)
    TIM_SOD[I].Out:=1; (*Timer have run out*)
   END_IF;
  END_IF;
 END_FOR;
(*-------------------------------------------------*)

(*This part runs once when we need start timer*)
  TIM_SOD[0].COUNT:=H690; (*delay in seconds*)
  TIM_SOD[0].CLK:=TIMCLOCK; (*current value of mSec counter*)
  TIM_SOD[0].IN:=True; 
(*-------------------------------------------------*)

(*This part runs once when we need stop timer*)
  TIM_SOD[0].IN:=False;


(*Checking timer*)
IF TIM_SOD[0].OUT
THEN
  (*doing smth......*)
END_IF;