如何解决如何在 IEC61131-3 结构化文本 (TwinCAT3) 中每 N 秒调用一次函数?
我想在代码中做什么?
我想创建一个由 4 个方法组成的功能块:start
、stop
、run
、calculate
。 Start
方法将调用具有 run
循环的 while
方法,该循环定期调用 calculate
方法。 run
方法内的 while 循环只有在调用 stop
方法时才会结束。
我已经尝试过的:
timer(IN := triggerTimer,PT := T#0.1S);
trigger(CLK := timer.Q);
workingFlag := TRUE;
run();
- 循环将在
run
方法中。循环将由一个通过workingFlag
变量调节的 while 循环组成。当workingFlag
为True
时,while 循环将不断触发一个计时器结构,该结构将每 0.1 秒调用一次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
workingFlag := FALSE;
有什么问题?
我想通过这个实现什么?
- 对象将是一个 PID 控制器。我希望在主
program
中只在需要调节时调用start
方法,在需要关闭时调用stop
。 - 直到今天,我一直在我的主程序中手动调用
calculate
方法,其中的timer
可以在上面的run
方法中找到。 - 我对这种方法的问题是,当我有更多 PID(或我需要定期调用的其他函数)时,代码很快就会变得混乱。
- 因此,我想创建一个具有本地
timers
并自行管理定期调用的功能块。
请问有什么建议可以解决这个问题吗?
解决方法
它崩溃是因为您指示 PLC 永远运行 while 循环。 PLC 软件已经循环运行(根据您的 PLC 任务)。将 while 循环内的代码放入每个循环调用的方法(或功能块的主体)中会更容易。
PLC 从上到下开始代码。然后 10 毫秒(或其他周期时间)后,它从上到下再次执行相同的代码。所以它本质上已经是一个很大的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 周期不应超过 100 毫秒。
对象将是一个 PID 控制器。我想在主程序中只在我想要它调节时调用 start 方法并在我需要它关闭时停止。
每个 PID 功能块都有 Enable
输入参数。您可以使用它来启动和停止 PID。
只需将 Start
变量设置为 PID 功能块输入即可。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。