400PLC设备运行时长记录的计算方法
- 自我感觉这还是一个笨办法,但暂时没想到更高效的方法。
- 记录在此,以备不时之需。
实现
-
记录开始时间,用脉冲的方式使得开始时间被记录;记忆时间初值不是0,使得开机即可得到开始时间。
-
结束时间实时增加。
-
用
SB_DT_DT
做时间差,得到实时变化的TIME
类型时间。
-
将
TIME
隐式转换为DINT
(转换后变成以ms为基础单位的十进制数),利用DIV
除法,得到取整后的时间。
-
实际调试的时候发现直接转换后出现了不清零的问题,比如原始时间转换为秒为121S,那么此时分钟是2分钟,秒钟仍是121秒。期待的是当分钟是2分钟时,秒钟是1S。所以还需要进一步对时间进行运算。
-
把分钟乘以60得到秒,小时乘以60得到分钟,天乘以24得到小时。把转换后的分钟,小时,天减去转换前的分钟小时天,就能得到差值了,差值就是实时的分钟小时天。
-
输出显示
长期运行中的边界溢出问题
在运行中,发现了上面算法的一个漏洞:
- 在块"SB_DT_DT"中,输出的"RET_VAL"最大值是
16#7fffffff(2147483647ms,约为24.85天)
。也就是说大约在24.85天之后,这个值会保持在16#7fffffff
,整个块将不可用。 - 解决:
- 判断RET_VAL的值是否等于16#7fffffff
- 不是:正常输出
- 是:
- 建立错位标识位
- 记住当前错误时的秒,分,时,天。
- 断开SFC1的使能,短暂延迟后接通SFC1使能(重启SFC1块的意思)。
- 此时秒,分,时,天都将从0开始计算
- 新的秒分时天加上之前累计的秒分时天得到新的临时秒分时天(此时临时秒分时天时错的值,不可直接用)
- 新的临时秒对60取余(MOD),得到实际的秒;
- 新的临时秒对60做除法(DIV),结果加到新的临时分上去;
- 新的临时分对60取余(MOD),得到实际的分;
- 新的临时分对60做除法(DIV),结果加到新的临时时上去;
- 新的临时时对24取余(MOD),得到实际的时;
- 新的临时时对24做除法(DIV),结果加到新的临时天上去;
- 临时天的值等于实际的天。
- 输出处理后的值