Advertisement

c语言 北京时间转换utc时间_AB PLC | 将故障时间戳转换为日期时间

阅读量:
c62d05d90dd3653901d533e19c94f9cc.gif

前言: 在发表了《如何避免CPU在发生故障时停机》之后,有朋友在后台留言:如何获取并显示发生故障的时间?在那篇文章中,只提及到了存储故障时间戳是由2个DINT数据组成,无法直观的显示为yyyy-mm-dd hh:mm:ss时间格式。那么,本文来说说如何实现获取并直观显示发生故障的时间。

时间戳定义

由于存储故障发生的时间为时间戳格式,首先了解一下什么是时间戳?

1. 定义:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,如下图所示:
ef75e34383b638b7f099bea925fcc11a.png

2. 时间戳通常是一个字符序列,唯一地标识某一刻的时间,一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据;

3. 广泛的运用在知识产权保护、 合同签字、 金融帐务、 电子报价投标、 股票交易等方面.

故障时间戳

1. 在《如何避免CPU在发生故障时停机》文章中,获取的主故障信息,包括了故障时间戳,由2个DINT数据组成为1个64位的时间戳.
cc0ecc79375db5a0c22893d72c2c0880.png

2. 发生主故障时,将其发生的时间记录下来,如下图,其中:Time_Low为-401804333,Time_High为362541,均为十进制数据,无法直观的显示为日期时间格式。
b2cdccc585ebba1315feaae6adf7c047.png

获取故障时间

在《如何避免CPU在发生故障时停机》的程序里面,继续下面的操作。

1. 新建一个自定义的日期时间数据类型.
776954cab4965c6a2737c22f0043dd84.png

2. 在控制器标签域内新建3个变量,均用于存储发生故障的时间:

(1)FaultDateTime:数据类型UDT_DateTime;

(2)FaultTime_unit_ms:数据类型LINT,类型为Date/Time;

(3)FaultTime_unit_us:数据类型LINT,类型为Date/Time.
8e1e71c9b57998a0c09639fc8b280b32.png

3. 在清除故障的例程Fault里面,编写获取发生故障时间的程序,详见下图.
b5718f37591b79cca3fe3b8adcadc336.png

方法介绍

1. 方法一 :使用COP指令,将Time_Low和Time_High,2个DINT(8个字节)数据复制到1个LINT数据(FaultTime_unit_us)里,这样就能完整的显示发生故障的日期时间了.
567a48249f56fb7b9269ffd9db070a36.png

2. 方法二: 使用GSV指令,获取TimeSynchronize的当前时间CurrentTimeMicrosecond.
c9723d53ecb7130269530c1f407a2dbc.png

3. 方法三 :使用GSV指令,获取WallClockTime的当地日期时间.
0ba816e23376eb5d59e30e4143b980e6.png

模拟故障测试

模拟间接寻址数组维度超过范围,发生故障类型4、代码20的主故障,使用上面介绍的三种方法,均能获取并显示发生故障的精精确间(us级别).
0e9aedd199be1bdf452d1547ea8f3ac6.png

结束语: 本文介绍了获取并显示故障时间的三种方法,这样对控制器发生故障或指令执行出错的时间进行追溯,以便找出问题所在。


【AB PLC工作室】

微信公众号ID:abseme
55e537deab5f649c3970fc81dc70cea7.png

坚持原创 注重实用

全部评论 (0)

还没有任何评论哟~