微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我想在代码中做什么?

我想创建一个由 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.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
  1. 最后,stop 方法会将 workingFlag 设置为 False,理论上它会在 run 方法中结束循环。
workingFlag := FALSE;

有什么问题?

  • 在我调用 object.start() 后,我的整个 PC 都崩溃了。因此......我认为我的代码有问题(:

我想通过这个实现什么?

  • 对象将是一个 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 举报,一经查实,本站将立刻删除。