在 TwinCAT 3 PLC 上读取循环时间

Reading cycle time on a TwinCAT 3 PLC

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

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

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

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

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

_TaskInfo[GETCURTASKINDEXEX()].CycleTime

将return循环时间作为100ns的倍数(UDINT)

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

将return循环时间设为秒(LREAL)

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

我喜欢使用 Time() 功能。它 returns 数据类型 TIME 的值。它不代表绝对时间,但可以用来计算两次调用Time()之间的时间。这样就可以计算出周期时间了。

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

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