首页 > 解决方案 > 如何在 IEC61131-3 结构化文本(TwinCAT3)中每隔 N 秒调用一次函数?

问题描述

我想在代码中做什么?

我想创建一个由 4 种方法组成的功能块:start, stop, run, calculate. Start方法将调用具有周期性调用方法run的循环的方法。只有当方法被调用时,方法内的 while 循环才会结束。whilecalculaterunstop

我已经尝试过的:

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

workingFlag := TRUE;
run();
  1. 循环将在run方法中。循环将包含一个以workingFlag变量为条件的 while 循环。while 循环何时workingFlagTrue不断触发一个计时器结构,该结构将每 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;

问题是什么?

我想用这个实现什么?

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

标签: plctwincatststructured-textiec61131-3

解决方案


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

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


推荐阅读