定时器如何在PLC结构化文本(ST)中工作?我们如何申报?
我一直在研究PLC的标准(IEC 61131-3),他们没有谈到ST的计时器。我知道绝大多数PLC程序员都是在梯形逻辑中完成它们,但在这个特殊情况下我真的需要在ST中声明定时器。
我使用的是Rockwell PLC。
答案 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.Q
在TON.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;