【发布时间】:2021-12-14 05:53:26
【问题描述】:
有没有办法让 PLC 程序知道自己的循环时间?
作为一种解决方法,我可以只添加一个持久变量或一个常量来手动告诉它,但这显然容易出错。
【问题讨论】:
有没有办法让 PLC 程序知道自己的循环时间?
作为一种解决方法,我可以只添加一个持久变量或一个常量来手动告诉它,但这显然容易出错。
【问题讨论】:
要添加到 Jakob 的答案 - 您还可以使用 GETCURTASKINDEXEX 函数 (Infosys) 代替 GETCURTASKINDEX FB。这样您就不必实例化它。
_TaskInfo[GETCURTASKINDEXEX()].CycleTime
将返回周期时间为 100ns 的倍数 (UDINT)
UDINT_TO_LREAL(_TaskInfo[GETCURTASKINDEXEX()].CycleTime) / 10_000_000
将以秒为单位返回周期时间 (LREAL)
【讨论】:
_ 作为千位分隔符。如果我没记错的话,我曾经尝试过,但是没有用。现在我试了一下,它确实有效。不知道我上次做错了什么。无论如何,谢谢:D.
对于 TwinCAT3,这在 PlcTaskSystemInfo(变量 CycleTime)中可用。
结合FBGETCURTASKINDEX获取你想要的数据。
在at AllTwinCAT 处查看一个示例(虽然不是循环时间,但仍然是相同的 FB)。
【讨论】:
这不是您问题的直接答案,但可用于确定周期时间。
我喜欢使用Time() 函数。它返回数据类型为TIME 的值。它不代表绝对时间,但可用于计算两次调用Time() 之间的时间。这样就可以计算出Cycle time。
我在时序至关重要的功能块 (FB) 中使用它。通过这种方式,FB 知道最后一次调用它的时间,而不是假设每次扫描都在运行它。即使我或我的 FB 的其他用户“忘记”每次扫描都调用 FB,FB 仍会提供正确的输出。
您可以使用此link 找到有关Time() 的信息。还有一个名为LTime() 的函数,它返回一个数据类型为LTIME 的值,但Beckhoff 似乎没有费心去记录这个函数。
【讨论】: