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

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

我想在代码中做什么?

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

我已经尝试过的:

  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 方法只会将 workingFlag 设置为 False 并且理论上它会在 run 方法中结束循环。
workingFlag := FALSE;

有什么问题?

我想用这个实现什么?

请问如何解决这个问题?

它崩溃是因为您指示 PLC 永远 运行 while 循环。 PLC 软件已经 运行s 循环(根据您的 PLCtask)。将 while 循环内的代码放入每个循环调用的方法(或功能块的主体)中会更容易。

一个PLC从上到下开始代码。然后 10ms(或其他周期时间)后,它再次从上到下执行相同的代码。所以它本质上已经是一个很大的 while 循环了。当 运行 像您的示例中那样使用 while 循环时,代码会进入 while 循环,但永远不会退出。然后看门狗某处超时,TwinCAT 崩溃。

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

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

但请记住,您的主 PLC 周期不应超过 100ms。

The object will be a PID controller. And I want in the main program just call the start method when I want it to regulate and stop when I need it to shut down.

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

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