用于 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(计数器)块。

功能审查

  1. StartPulse 变量可以是您想要启动计数器的任何值。在我的例子中,我只是使用了一个我打开的内部 bool 变量。如果你想让这个定时器在 plc 启动时自动启动,那么只需将这个变量初始化为 true。因为 StartPulse 只在信号的上升沿起作用,所以 LatchPulseInitial 线圈只会被设置一次。
  2. LatchPulseInitial 变量变为真时,这将启动 ton1 一个 Timer On Delay (TON) 功能块。这将延迟块的输出在 PT 的时间内打开(在我的情况下,我有 500 毫秒)。
  3. 500 毫秒过后,ton1 输出将打开。这将打开 Timer1Done 变量并关闭 Timer2DoneLatchPulseInitial。现在 LatchPulseInitial 已经关闭,它再也不会干扰程序,因为它只能在 StartPulse 的上升沿打开。 注意:一旦块达到 PT,输出将保持打开状态,直到块的输入被移除。

  1. 由于 Timer1Done 现在 ton2 将开始计数,直到达到 PT。一旦达到 PT,该块的输出将打开。这将重置 Timer1Done 并设置 Timer2Done 这将再次启动 ton1,从而重新开始整个过程​​。
  2. 对于 PulseOutput,这是您正在寻找的实际脉冲输出,当 Timer2Done 为真时,我将其设置为真。这是因为当这个变量为true时是脉冲发生器的高电平状态。当Timer1Done为真时是脉冲发生器的低电平状态。
  3. 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 个定时器、递增计数器和模运算符:

Blink function in ladder

另请注意,如果您的 PLC 没有模数,则每次乘以 -1。