Warm tip: This article is reproduced from serverfault.com, please click

plc-如何在 IEC61131-3 结构化文本 (TwinCAT3) 中每 N 秒调用一次函数?

(plc - How to call function every Nth seconds in IEC61131-3 structured text (TwinCAT3)?)

发布于 2021-01-25 13:14:05

我想在代码中做什么?

我想创建一个由 4 个方法组成的功能块:startstopruncalculateStart方法将调用run具有while循环方法,该循环会定期调用calculate方法。run只有在stop调用方法时,方法内的 while 循环才会结束

我已经尝试过的:

  1. 当我调用时,object.start()我希望它开始一个循环,只要我不调用该stop方法,该循环就会继续
timer(IN := triggerTimer, PT := T#0.1S);
trigger(CLK := timer.Q);

workingFlag := TRUE;
run();
  1. 循环将在run方法中。循环将由一个通过workingFlag变量调节的 while 循环组成workingFlagTrue在while循环将不断触发计时器结构,其将每0.1S调用calculate方法。
WHILE workingFlag = TRUE DO
    triggerTimer := TRUE; //Start timer
    
    IF trigger.Q THEN //If timer expired execute code below ...
        calculate();
        triggerTimer := FALSE; //Reset the timer
    END_IF;
END_WHILE
  1. 最后,该stop方法将设置workingFlagFalse,理论上它将结束run方法中的循环
workingFlag := FALSE;

问题是什么?

  • 在我打电话后,object.start()我的整个 PC 崩溃了。因此......我认为我的代码有问题(:

我想用这个实现什么?

  • 该对象将是一个 PID 控制器。而且我希望在主要的情况下programstart在我想要它进行调节和stop需要它关闭时调用该方法
  • 直到今天,我都calculate在我的主程序中手动调用该方法timer,你可以在run上面方法中找到它
  • 我对这种方法的问题是,当我有更多的 PID(或我需要定期调用的其他函数)时,代码很快就会变得混乱。
  • 因此,我想创建一个具有本地功能的功能块,timers并自行管理定期调用。

那么请提出如何解决这个问题的任何建议?

Questioner
Jakub Szlaur
Viewed
0
463 2021-02-07 15:29:36

Jouke 已经告诉过你这WHILE就是原因。这是你重构的代码示例。如果你想要 100 毫秒的脉冲工作,则应该这样做。

timer(IN := TRUE, PT := T#100MS);
IF timer.Q THEN
    calculate();
    timer(IN := FALSE); // reset timer
END_IF;

但请记住,你的主 PLC 周期不应超过 100 毫秒。

该对象将是一个 PID 控制器。我希望在主程序中只在我希望它调节时调用 start 方法,并在我需要它关闭时调用它。

每个PID功能块都有Enable输入参数。你可以使用它来启动和停止 PID。

只需将Start变量设置为 PID 功能块输入即可。