首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一种用于PLC的时钟脉冲发生器

一种用于PLC的时钟脉冲发生器
EN

Stack Overflow用户
提问于 2016-01-26 19:33:29
回答 3查看 18.6K关注 0票数 0

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

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

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

亲切的问候

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-26 21:46:29

有几种不同的方法来创建脉冲发生器(或者在plc世界中通常被称为闪烁定时器)。事实上,许多plc编程软件都将此功能块内置于其功能块库中。但是如果他们没有,或者你只是想做你自己的,你可以这样做

代码语言:javascript
复制
VAR
  ton1: TON;
  ton2: TON;
  StartPulse: BOOL;
  startPulseTrig: R_TRIG;
  LatchPulseInitial: BOOL;
  PulseOutput: BOOL;
  Timer1Done: BOOL;
  Timer2Done: BOOL;
  PulseWidth:TIME:=t#500ms;
END_VAR

如果你想要计算脉冲的数量并将这个值存储到一个变量中,你可以使用一个简单的CTU (计数器递增)模块,它在所有的plc语言中都可用。

功能的评审

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

为止

  1. 由于Timer1Done现在在ton2上,因此将开始计数,直到到达PT为止。一旦到达PT,该块的输出就会打开。这将重置Timer1Done并设置Timer2Done这将再次启动ton1,从而重新开始整个过程。
  2. PulseOutput,这是您正在寻找的实际脉冲输出,当Timer2Done为true时,我将其设置为true。这是因为当该变量为true时,它是脉冲发生器的高状态。当Timer1Done为true时,它是脉冲的低状态generator.
  3. When,PulseOutput变为true,它将触发CTU上的输入,从而将CV (current value)中的变量计数递增1。

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

票数 1
EN

Stack Overflow用户

发布于 2016-01-27 05:51:25

有一次我不得不创建一个BLINK FB。它是以结构化文本形式编写的。但它适合在梯形逻辑程序中使用,并且IN/OUT变量的命名方式类似于TON样式。闪烁以Q= TRUE开始。如果你想从FALSE开始,只需倒置q并交换Times!

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-02-19 09:26:21

在我看来,这是最直接的方法,使用1计时器,递增计数器和模运算符:

Blink function in ladder

还要注意的是,如果你的PLC没有模,那么每次都乘以-1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35012891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档