Beckhoff TwinCAT3.1中的频率计算

时间:2015-05-22 08:18:02

标签: time-frequency twincat structured-text

我正在尝试确定脉冲输入的频率,这是泵的转速计反馈。我试图创建两个定时器,每个定时器都是第二个,并且每次有上升沿时都会计数。根据一秒钟的上升沿数,我可以计算出频率。可悲的是,我无法找到功能或功能块。任何有关生成函数的帮助都太棒了!

此外,我附上了我试图使用的代码,但似乎没有用 - 我认为一些新鲜的眼睛可能能够发现我错过的东西。

    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

1 个答案:

答案 0 :(得分: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