有没有办法让PLC程序知道自己的周期时间?
作为一种解决方法,我可以手动添加一个持久变量或常量来告诉它,但这显然很容易出错。
添加到Jakob的答案-您也可以使用GETCURTASKINDEXEX
函数(Infosys)代替GETCURTASKINDEX
FB。这样您就不必实例化它了。
_TaskInfo[GETCURTASKINDEXEX()].CycleTime
将以100ns (UDINT)的倍数返回周期时间
UDINT_TO_LREAL(_TaskInfo[GETCURTASKINDEXEX()].CycleTime) / 10_000_000
将以秒为单位返回周期时间(LREAL)
对于TwinCAT3,这在PlcTaskSystemInfo(变量CycleTime
)中可用。将它与FB GETCURTASKINDEX结合起来,以获得您想要的数据。
在AllTwinCAT上看到一个例子(虽然不是循环时间,但仍然是相同的FB)。
这不是直接回答你的问题,但可以用来确定循环时间。
我喜欢使用Time()
函数。它返回数据类型为TIME
的值。它不表示绝对时间,但可以用来计算两次调用Time()
之间的时间。这样就可以计算出循环时间。
我在时间至关重要的功能块(FB)中使用它。通过这种方式,FB知道它最后被调用的时间,而不是假设每次扫描都在运行它。即使我或我FB的其他用户"忘记了"调用FB每次扫描,FB仍然提供正确的输出。
你可以通过这个链接找到关于Time()
的信息。还有一个名为LTime()
的函数,它返回数据类型为LTIME
的值,但Beckhoff似乎没有费心记录这个函数。