用于PLC的时钟脉冲发生器

时间:2016-01-26 11:33:29

标签: clock plc

我正在尝试设计水箱的PLC。在设计的一个部分,我被要求创建一个时钟脉冲发生器。我目前正在尝试使用梯形图来做到这一点。

我相信我的逻辑是正确的,似乎无法把它放在一起。我想要一个计数器来计算我生成的时钟脉冲,然后我将这些pulese存储在数据存储器中,以确保在系统关闭和打开时保留计数。

问题是如何设计这个时钟脉冲发生器。

亲切的问候

3 个答案:

答案 0 :(得分:1)

有几种不同的方法可以创建脉冲发生器(或者在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

enter image description here

如果您想计算脉冲数并将此值存储到变量中,您可以使用所有plc语言中提供的简单CTU(计数器)块。

enter image description here

审核功能

  1. StartPulse变量可以是您想要启动计数器的任何内容。就我而言,我刚刚使用了一个我打开的内部bool变量。如果您希望此计时器在plc启动时自动启动,则只需将此变量初始化为true。由于StartPulse仅适用于信号的上升沿,因此LatchPulseInitial线圈只能设置一次。
  2. LatchPulseInitial变量成立时,这将启动ton1一个Timer On Delay (TON)功能块。这将导致块的输出延迟PT的时间(在我的情况下,我有500毫秒)。
  3. 500ms过期后,ton1输出将开启。这将打开Timer1Done变量并关闭Timer2DoneLatchPulseInitial。现在LatchPulseInitial已关闭,它将永远不会再干扰程序,因为它只能在StartPulse的上升沿打开。 注意:一旦块到达PT,输出将保持开启,直到删除块的输入。
  4. enter image description here

    1. 由于Timer1Done现在位于ton2,因此将开始计算,直到达到PT为止。到达PT后,该块的输出将打开。这将重置Timer1Done并设置Timer2Done这将再次启动ton1,从而开始整个过程​​。
    2. 对于PulseOutput,这是您要查找的实际脉冲输出,当Timer2Done为真时,我将此设置为true。这是因为当此变量为true时,它是脉冲发生器的高状态。当Timer1Done为真时,它是脉冲发生器的低状态。
    3. PulseOutput转到true时,它会触发CTU上的输入,这会将CV (current value)中变量的计数增加1。
    4. 如果你打算在程序的很多地方使用这个逻辑,或者你计划将来重用它,我会把它变成它自己的功能块,所以你不必每次都想重复这个逻辑制作这种类型的计时器。

答案 1 :(得分:0)

我必须创建一个BLINK FB。它是用结构化文本编写的。但它适用于梯形图逻辑程序,IN / OUT变量命名为TON样式。闪烁以Q = TRUE开始。如果你想以FALSE开头,只需反转Q并切换时间!

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_ON;
    END_IF

END_IF

(*Timer Run call*)
tonBlink(IN:= IN);

IF IN THEN
    ET := tonBlink.ET;
ELSE
    ET := T#0S;
    Q := FALSE;
END_IF

答案 2 :(得分:0)

在我看来,这是最简单的方法,使用1个计时器,向上计数器和模运算符:

Blink function in ladder

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