Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clock PLC的时钟脉冲发生器_Clock_Plc - Fatal编程技术网

Clock PLC的时钟脉冲发生器

Clock PLC的时钟脉冲发生器,clock,plc,Clock,Plc,我正在与PLC合作,试图设计一个水箱。在设计的一部分,我被要求创建一个时钟脉冲发生器。我目前正在尝试使用梯形图来实现这一点 我相信我的逻辑是正确的,只是似乎不能把它放在一起。我需要一个计数器来计算我产生的时钟脉冲,然后我将这些脉冲存储在数据存储器中,以确保在系统关闭和打开时保留计数 问题是我如何设计这个时钟脉冲发生器 有几种不同的方法来创建脉冲发生器(或在plc世界中通常称为闪烁计时器)。事实上,许多plc编程软件都在其功能块库中内置了此功能块。但如果他们不这样做,或者你只是想做你自己的,你可以

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

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

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


有几种不同的方法来创建脉冲发生器(或在plc世界中通常称为闪烁计时器)。事实上,许多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
    a
    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(当前值)
    中变量的计数增加1

  • 如果你打算在你的程序中的许多地方使用这个逻辑,或者你打算在将来重用它,我会把它制作成它自己的功能块,这样你就不必每次都重复这个逻辑来制作这种类型的计时器。

    有几种不同的方法来创建一个脉冲发生器(或在plc世界中通常被称为闪烁计时器)。事实上,许多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
    仅在e信号上升沿
    闭锁脉冲初始
    线圈将只设置一次
  • LatchPulseInitial
    变量变为真时,将启动
    ton1
    a
    Timer On Delay(TON)
    功能块。这将延迟块的输出,使其在
    PT
    时间内不打开(在我的情况下,我有500毫秒)
  • 500毫秒后,
    ton1
    输出将打开。这将打开
    Timer1Done
    变量,并关闭
    Timer2Done
    LatchPulseInitial
    。现在
    LatchPulseInitial
    已关闭,它将不再干扰程序,因为它只能由
    StartPulse的上升沿
    注意:一旦块达到
    PT
    时,输出将保持打开,直到块的输入被删除。
  • 由于
    Timer1Done
    现在处于打开状态,因此
    ton2
    将开始计数,直到达到
    PT
    为止。一旦达到
    PT
    ,该块的输出将打开。这将重置
    Timer1Done
    并设置
    Timer2Done
    这将再次开始
    ton1
    ,从而重新开始整个过程
  • 对于
    PulseOutput
    ,这是您正在寻找的实际脉冲输出,当
    Timer2Done
    为true时,我将其设置为true。这是因为当此变量为
    true
    时,它是脉冲发生器的高电平状态。当
    Timer1Done
    为true时,它是t
    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