我正在尝试设计水箱的PLC。在设计的一个部分,我被要求创建一个时钟脉冲发生器。我目前正在尝试使用梯形图来做到这一点。
我相信我的逻辑是正确的,似乎无法把它放在一起。我想要一个计数器来计算我生成的时钟脉冲,然后我将这些pulese存储在数据存储器中,以确保在系统关闭和打开时保留计数。
问题是如何设计这个时钟脉冲发生器。
亲切的问候
答案 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
如果您想计算脉冲数并将此值存储到变量中,您可以使用所有plc语言中提供的简单CTU(计数器)块。
审核功能
StartPulse
变量可以是您想要启动计数器的任何内容。就我而言,我刚刚使用了一个我打开的内部bool
变量。如果您希望此计时器在plc启动时自动启动,则只需将此变量初始化为true
。由于StartPulse
仅适用于信号的上升沿,因此LatchPulseInitial
线圈只能设置一次。LatchPulseInitial
变量成立时,这将启动ton1
一个Timer On Delay (TON)
功能块。这将导致块的输出延迟PT
的时间(在我的情况下,我有500毫秒)。ton1
输出将开启。这将打开Timer1Done
变量并关闭Timer2Done
和LatchPulseInitial
。现在LatchPulseInitial
已关闭,它将永远不会再干扰程序,因为它只能在StartPulse
的上升沿打开。 注意:一旦块到达PT
,输出将保持开启,直到删除块的输入。 Timer1Done
现在位于ton2
,因此将开始计算,直到达到PT
为止。到达PT
后,该块的输出将打开。这将重置Timer1Done
并设置Timer2Done
这将再次启动ton1
,从而开始整个过程。PulseOutput
,这是您要查找的实际脉冲输出,当Timer2Done
为真时,我将此设置为true。这是因为当此变量为true
时,它是脉冲发生器的高状态。当Timer1Done
为真时,它是脉冲发生器的低状态。PulseOutput
转到true
时,它会触发CTU
上的输入,这会将CV (current value)
中变量的计数增加1。如果你打算在程序的很多地方使用这个逻辑,或者你计划将来重用它,我会把它变成它自己的功能块,所以你不必每次都想重复这个逻辑制作这种类型的计时器。
答案 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)