【问题标题】:Reading cycle time on a TwinCAT 3 PLC在 TwinCAT 3 PLC 上读取循环时间
【发布时间】:2021-12-14 05:53:26
【问题描述】:

有没有办法让 PLC 程序知道自己的循环时间?

作为一种解决方法,我可以只添加一个持久变量或一个常量来手动告诉它,但这显然容易出错。

【问题讨论】:

    标签: plc twincat


    【解决方案1】:

    要添加到 Jakob 的答案 - 您还可以使用 GETCURTASKINDEXEX 函数 (Infosys) 代替 GETCURTASKINDEX FB。这样您就不必实例化它。

    _TaskInfo[GETCURTASKINDEXEX()].CycleTime
    

    将返回周期时间为 100ns 的倍数 (UDINT)

    UDINT_TO_LREAL(_TaskInfo[GETCURTASKINDEXEX()].CycleTime) / 10_000_000
    

    将以秒为单位返回周期时间 (LREAL)

    【讨论】:

    • 不错。我也不知道您可以使用_ 作为千位分隔符。如果我没记错的话,我曾经尝试过,但是没有用。现在我试了一下,它确实有效。不知道我上次做错了什么。无论如何,谢谢:D.
    • 对我来说也一样,他们一定是有一天添加的。我喜欢python中的这个功能,所以我时不时地尝试:)
    【解决方案2】:

    对于 TwinCAT3,这在 PlcTaskSystemInfo(变量 CycleTime)中可用。 结合FBGETCURTASKINDEX获取你想要的数据。

    at AllTwinCAT 处查看一个示例(虽然不是循环时间,但仍然是相同的 FB)。

    【讨论】:

      【解决方案3】:

      这不是您问题的直接答案,但可用于确定周期时间。

      我喜欢使用Time() 函数。它返回数据类型为TIME 的值。它不代表绝对时间,但可用于计算两次调用Time() 之间的时间。这样就可以计算出Cycle time。

      我在时序至关重要的功能块 (FB) 中使用它。通过这种方式,FB 知道最后一次调用它的时间,而不是假设每次扫描都在运行它。即使我或我的 FB 的其他用户“忘记”每次扫描都调用 FB,FB 仍会提供正确的输出。

      您可以使用此link 找到有关Time() 的信息。还有一个名为LTime() 的函数,它返回一个数据类型为LTIME 的值,但Beckhoff 似乎没有费心去记录这个函数。

      【讨论】:

      • 我喜欢可靠性方面。不幸的是,至少需要两个周期来计算差异。如果这是一个问题,该方法可能会与其他答案中的 PlcTaskSystemInfo 结合使用。
      • @Mikkel 您可以直接链接到 Infosys 页面,方法是右键单击“功能”链接并选择“复制链接地址”(或类似的,如果您使用的浏览器不是 Chrome)。
      猜你喜欢
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      相关资源
      最近更新 更多