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

前言: 在发表了《如何避免CPU在发生故障时停机》之后,有朋友在后台留言:如何获取并显示发生故障的时间?在那篇文章中,只提及到了存储故障时间戳是由2个DINT数据组成,无法直观的显示为yyyy-mm-dd hh:mm:ss时间格式。那么,本文来说说如何实现获取并直观显示发生故障的时间。
时间戳定义
由于存储故障发生的时间为时间戳格式,首先了解一下什么是时间戳?
1. 定义:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,如下图所示:

2. 时间戳通常是一个字符序列,唯一地标识某一刻的时间,一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据;
3. 广泛的运用在知识产权保护、 合同签字、 金融帐务、 电子报价投标、 股票交易等方面.
故障时间戳
1. 在《如何避免CPU在发生故障时停机》文章中,获取的主故障信息,包括了故障时间戳,由2个DINT数据组成为1个64位的时间戳.

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

获取故障时间
在《如何避免CPU在发生故障时停机》的程序里面,继续下面的操作。
1. 新建一个自定义的日期时间数据类型.

2. 在控制器标签域内新建3个变量,均用于存储发生故障的时间:
(1)FaultDateTime:数据类型UDT_DateTime;
(2)FaultTime_unit_ms:数据类型LINT,类型为Date/Time;
(3)FaultTime_unit_us:数据类型LINT,类型为Date/Time.

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

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

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

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

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

结束语: 本文介绍了获取并显示故障时间的三种方法,这样对控制器发生故障或指令执行出错的时间进行追溯,以便找出问题所在。
【AB PLC工作室】
微信公众号ID:abseme

坚持原创 注重实用
