ABB PLC/codesys 编程中的SYS_TIME函数返回一个 DWORD,表示自 PLC 开启以来的毫秒数。(或者可能是硬重置/其他事件?找不到这方面的文档。)
Codesys 中 DWORD 的最大大小为 2 32 -1 = 4,294,967,295。
这意味着SYS_TIME 仅在 49.7 天后溢出!
任何人都可以确切地确认 SYS_TIME 函数在 49.7 天后返回的内容吗?它是否整数溢出并再次从零开始计数?
这对于将 SYS_TIME 用于诸如警告某些事件发生多长时间之类的功能具有重要的影响。(例如,通过 modbus 读取远程设备)。
假设它只是一个整数溢出并且 SYS_TIME 重置为零,那么程序员可以通过重置他们用来记录最后已知事件时间的变量来处理这个问题:
(* Assuming now, last_event_time are suitably declared DWORDs *)
now := SYS_TIME(TRUE);
IF last_event_time > now THEN
last_event_time := 0;
END_IF
(* continue, performing check of how long since last event occurred etc.... *)
我希望有一些我错过的东西可以提供另一种方法。
然而 - 这是一个 GOTCHA,它可能会绊倒一个没有想到这一点的 PLC 程序员,导致一个明显功能齐全的 PLC 程序在现场使用 49 天后经过广泛测试而失败。
如果有一个返回 LWORD 的 SYS_TIME 替代方案,这将非常有帮助,这对 50 亿年的不间断服务有好处:-)
注意 - 我相信这个功能可能特定于 ABB AC500 系列 PLC,而不是标准的 Codesys 功能,所以这个问题主要针对 ABB 和 ABB PLC 程序员。