我想创建一个由 4 个方法组成的功能块:start
、stop
、run
、calculate
。Start
方法将调用run
具有while
循环的方法,该循环会定期调用calculate
方法。run
只有在stop
调用方法时,方法内的 while 循环才会结束。
object.start()
我希望它开始一个循环,只要我不调用该stop
方法,该循环就会继续。timer(IN := triggerTimer, PT := T#0.1S);
trigger(CLK := timer.Q);
workingFlag := TRUE;
run();
run
方法中。循环将由一个通过workingFlag
变量调节的 while 循环组成。当workingFlag
是True
在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
stop
方法将设置workingFlag
为False
,理论上它将结束run
方法中的循环。workingFlag := FALSE;
object.start()
我的整个 PC 崩溃了。因此......我认为我的代码有问题(:program
只start
在我想要它进行调节和stop
需要它关闭时调用该方法。calculate
在我的主程序中手动调用该方法timer
,你可以在run
上面的方法中找到它。timers
并自行管理定期调用。那么请提出如何解决这个问题的任何建议?
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 功能块输入即可。