1

我想在代码中做什么?

我想创建一个由 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;

问题是什么?

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

我想用这个实现什么?

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

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

4

2 回答 2

2

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

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

于 2021-01-25T15:28:50.983 回答
2

乔克已经告诉过你这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 功能块输入即可。

于 2021-01-26T09:10:49.507 回答