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),结果加到新的临时天上去;
      • 临时天的值等于实际的天。
      • 输出处理后的值
posted @ 2025-06-23 11:40  你要去码头整点薯条吗  阅读(41)  评论(0)    收藏  举报