0

我正在尝试确定脉冲输入的频率,即泵的转速反馈。我试图创建两个计时器,每个计时器为一秒,并且每次出现上升沿时计数。根据一秒钟内上升沿的数量,我可以计算出频率。遗憾的是我找不到功能或功能块。任何关于生成函数的帮助都会很棒!

我还附上了我尝试使用但似乎不起作用的代码 - 我认为一些新鲜的眼睛可能能够发现我错过的东西。

    tonPressureTachoFeedback1(IN:=,PT:=T#1S,Q=>,ET=>);  (*Pressure Side Tacho Timer 1*)
    tonPressureTachoFeedback2(IN:=,PT:=T#1S,Q=>,ET=>);  (*Pressure Side Tacho Timer 2*)

    IF stPRessurePump.iTachoFeedbackRAW>900 (*Threshold to cross to be counted as a rising edge*)
    AND tonPressureTachoFeedback1.Q=FALSE 
    AND tonPressureTachoFeedback2.IN=FALSE THEN
        tonPressureTachoFeedback2.IN:=FALSE;
        iPressureRECount1:=iPressureRECount1+1;     (*Increment Counter*)

    ELSIF tonPressureTachoFeedback1.Q THEN
        tonPressureTachoFeedback2.IN:=TRUE;
        rPRessureRPM:=iPressureRECount1*10;         (*Generate RPM*)
    END_IF

    IF stPRessurePump.iTachoFeedbackRAW>900 (*Threshold to cross to be counted as a rising edge*)
    AND tonPressureTachoFeedback2.Q=FALSE 
    AND tonPressureTachoFeedback1.IN=FALSE THEN
        tonPressureTachoFeedback1.IN:=FALSE;
        iPressureRECount2:=iPressureRECount2+1; (*Increment Counter*)
    ELSIF tonPressureTachoFeedback2.Q THEN
        tonPressureTachoFeedback1.IN:=TRUE;
        rPRessureRPM:=iPressureRECount2*10;     (*Calculate RPM*)
   END_IF
4

1 回答 1

0

首先,你的定时器都没有被激活,因为它们的 IN:=TRUE 都依赖于另一个用完的定时器。其次,您似乎将计数器与一个或任何一个计时器用完联系起来,它们至少应该在原始值的正转换时触发。再加上计数器永远不会重置,这意味着如果它们确实触发了,频率将继续增长。

下面的代码就是我会做的,重用你的一些变量加上一个新的计时器和一个新的rising_trigger。正如他们的评论所描述的,这三个部分都有自己相当独立的任务。

我希望这有帮助 :-)

VAR
  tonPulse1s:         TON;
  trigTachoFeedback:  R_TRIG;
END_VAR

tonPulse1s(IN := TRUE, PT := t#1s); (* Always run the timer *)
trigTachoFeedback(CLK := (stPRessurePump.iTachoFeedbackRAW > 900)); (* Always update the trigger on crossed treshold *)

IF trigTachoFeedback.Q THEN
  iPressureRECount1 := iPressureRECount1 + 1; (*Increment Counter*)
END_IF

IF tonPulse1s.Q THEN (* One second elapsed, calc RPM, restart timer and counter *)
  rPRessureRPM := iPressureRECount1 * 10;
  iPressureRECount1 := 0;

  tonPulse1s(IN := FALSE);
  tonPulse1s(IN := TRUE);
END_IF
于 2015-05-27T10:13:51.427 回答