用于 PLC 的时钟脉冲发生器
clock pulse generator for a PLC
我正在与 PLC 合作,尝试设计一个水箱。在设计的一个部分,我被要求创建一个时钟脉冲发生器。我目前正在尝试使用梯形图来做到这一点。
我相信我的逻辑是正确的,只是似乎无法将它们组合在一起。我想要一个计数器来计算我生成的时钟脉冲,然后我将这些脉冲存储在数据存储器中,以确保在系统关闭和打开时保留计数。
问题是如何设计这个时钟脉冲发生器。
亲切的问候
有几种不同的方法可以创建脉冲发生器(或在 plc 世界中通常称为 BLINK 定时器)。事实上,许多 plc 编程软件都将此功能块内置到其功能块库中。但如果他们不这样做,或者你只想自己制作,你可以这样做
VAR
ton1: TON;
ton2: TON;
StartPulse: BOOL;
startPulseTrig: R_TRIG;
LatchPulseInitial: BOOL;
PulseOutput: BOOL;
Timer1Done: BOOL;
Timer2Done: BOOL;
PulseWidth:TIME:=t#500ms;
END_VAR
如果您想计算脉冲数并将此值存储到变量中,您可以使用所有 plc 语言都可用的简单 CTU(计数器)块。
功能审查
StartPulse
变量可以是您想要启动计数器的任何值。在我的例子中,我只是使用了一个我打开的内部 bool
变量。如果你想让这个定时器在 plc 启动时自动启动,那么只需将这个变量初始化为 true
。因为 StartPulse
只在信号的上升沿起作用,所以 LatchPulseInitial
线圈只会被设置一次。
- 当
LatchPulseInitial
变量变为真时,这将启动 ton1
一个 Timer On Delay (TON)
功能块。这将延迟块的输出在 PT
的时间内打开(在我的情况下,我有 500 毫秒)。
- 500 毫秒过后,
ton1
输出将打开。这将打开 Timer1Done
变量并关闭 Timer2Done
和 LatchPulseInitial
。现在 LatchPulseInitial
已经关闭,它再也不会干扰程序,因为它只能在 StartPulse
的上升沿打开。 注意:一旦块达到 PT
,输出将保持打开状态,直到块的输入被移除。
- 由于
Timer1Done
现在 ton2
将开始计数,直到达到 PT
。一旦达到 PT
,该块的输出将打开。这将重置 Timer1Done
并设置 Timer2Done
这将再次启动 ton1
,从而重新开始整个过程。
- 对于
PulseOutput
,这是您正在寻找的实际脉冲输出,当 Timer2Done
为真时,我将其设置为真。这是因为当这个变量为true
时是脉冲发生器的高电平状态。当Timer1Done
为真时是脉冲发生器的低电平状态。
- 当
PulseOutput
变为 true
时,它将触发 CTU
上的输入,这将使 CV (current value)
中的变量计数增加 1。
如果您打算在程序中的许多地方使用此逻辑,或者您计划在将来重复使用它,我会将其放入自己的功能块中,这样您就不必每次都重复此逻辑想做这种计时器。
有一次我不得不创建一个 BLINK FB。它是用结构化文本编写的。但它适合在梯形图逻辑程序中使用,并且 IN/OUT 变量命名为 TON 风格。闪烁以 Q = TRUE 开始。如果您想从 FALSE 开始,只需反转 Q 并切换 Times!
FUNCTION_BLOCK BLINK
VAR_INPUT
IN : BOOL;
PT_ON : TIME;
PT_OFF : TIME;
END_VAR
VAR_OUTPUT
Q : BOOL;
ET : TIME;
END_VAR
VAR
rtIN : R_TRIG;
tonBlink : TON;
END_VAR
rtIN(CLK := IN);
IF tonBlink.Q OR rtIN.Q THEN
(*Toggle Output*)
Q := NOT Q;
(*Timer Reset call, important to call timer twice in same cycle for correct Blink Time*)
tonBlink(IN:= FALSE);
(*Set corresponding Time*)
IF Q THEN
tonBlink.PT := PT_ON;
ELSE
tonBlink.PT := PT_OFF;
END_IF
END_IF
(*Timer Run call*)
tonBlink(IN:= IN);
IF IN THEN
ET := tonBlink.ET;
ELSE
ET := T#0S;
Q := FALSE;
END_IF
在我看来,这是最直接的方法,使用 1 个定时器、递增计数器和模运算符:
另请注意,如果您的 PLC 没有模数,则每次乘以 -1。
我正在与 PLC 合作,尝试设计一个水箱。在设计的一个部分,我被要求创建一个时钟脉冲发生器。我目前正在尝试使用梯形图来做到这一点。
我相信我的逻辑是正确的,只是似乎无法将它们组合在一起。我想要一个计数器来计算我生成的时钟脉冲,然后我将这些脉冲存储在数据存储器中,以确保在系统关闭和打开时保留计数。
问题是如何设计这个时钟脉冲发生器。
亲切的问候
有几种不同的方法可以创建脉冲发生器(或在 plc 世界中通常称为 BLINK 定时器)。事实上,许多 plc 编程软件都将此功能块内置到其功能块库中。但如果他们不这样做,或者你只想自己制作,你可以这样做
VAR
ton1: TON;
ton2: TON;
StartPulse: BOOL;
startPulseTrig: R_TRIG;
LatchPulseInitial: BOOL;
PulseOutput: BOOL;
Timer1Done: BOOL;
Timer2Done: BOOL;
PulseWidth:TIME:=t#500ms;
END_VAR
如果您想计算脉冲数并将此值存储到变量中,您可以使用所有 plc 语言都可用的简单 CTU(计数器)块。
功能审查
StartPulse
变量可以是您想要启动计数器的任何值。在我的例子中,我只是使用了一个我打开的内部bool
变量。如果你想让这个定时器在 plc 启动时自动启动,那么只需将这个变量初始化为true
。因为StartPulse
只在信号的上升沿起作用,所以LatchPulseInitial
线圈只会被设置一次。- 当
LatchPulseInitial
变量变为真时,这将启动ton1
一个Timer On Delay (TON)
功能块。这将延迟块的输出在PT
的时间内打开(在我的情况下,我有 500 毫秒)。 - 500 毫秒过后,
ton1
输出将打开。这将打开Timer1Done
变量并关闭Timer2Done
和LatchPulseInitial
。现在LatchPulseInitial
已经关闭,它再也不会干扰程序,因为它只能在StartPulse
的上升沿打开。 注意:一旦块达到PT
,输出将保持打开状态,直到块的输入被移除。
- 由于
Timer1Done
现在ton2
将开始计数,直到达到PT
。一旦达到PT
,该块的输出将打开。这将重置Timer1Done
并设置Timer2Done
这将再次启动ton1
,从而重新开始整个过程。 - 对于
PulseOutput
,这是您正在寻找的实际脉冲输出,当Timer2Done
为真时,我将其设置为真。这是因为当这个变量为true
时是脉冲发生器的高电平状态。当Timer1Done
为真时是脉冲发生器的低电平状态。 - 当
PulseOutput
变为true
时,它将触发CTU
上的输入,这将使CV (current value)
中的变量计数增加 1。
如果您打算在程序中的许多地方使用此逻辑,或者您计划在将来重复使用它,我会将其放入自己的功能块中,这样您就不必每次都重复此逻辑想做这种计时器。
有一次我不得不创建一个 BLINK FB。它是用结构化文本编写的。但它适合在梯形图逻辑程序中使用,并且 IN/OUT 变量命名为 TON 风格。闪烁以 Q = TRUE 开始。如果您想从 FALSE 开始,只需反转 Q 并切换 Times!
FUNCTION_BLOCK BLINK
VAR_INPUT
IN : BOOL;
PT_ON : TIME;
PT_OFF : TIME;
END_VAR
VAR_OUTPUT
Q : BOOL;
ET : TIME;
END_VAR
VAR
rtIN : R_TRIG;
tonBlink : TON;
END_VAR
rtIN(CLK := IN);
IF tonBlink.Q OR rtIN.Q THEN
(*Toggle Output*)
Q := NOT Q;
(*Timer Reset call, important to call timer twice in same cycle for correct Blink Time*)
tonBlink(IN:= FALSE);
(*Set corresponding Time*)
IF Q THEN
tonBlink.PT := PT_ON;
ELSE
tonBlink.PT := PT_OFF;
END_IF
END_IF
(*Timer Run call*)
tonBlink(IN:= IN);
IF IN THEN
ET := tonBlink.ET;
ELSE
ET := T#0S;
Q := FALSE;
END_IF
在我看来,这是最直接的方法,使用 1 个定时器、递增计数器和模运算符:
另请注意,如果您的 PLC 没有模数,则每次乘以 -1。