「技术分享」利用卫星校准系统时间

「技术分享」利用卫星校准系统时间

戳我有惊喜!!!

一般获取精准时间的方式有两种,第一种就是从NTP服务器上获取,第二种则是通过卫星获取UTC时间,对于不能联网的设备若想通过NTP协议获取时间就只能通过外接支持UDP传输的网络模块,比如串口服务器。若设备支持卫星定位则可通过获取卫星的UTC时间来获取准确时间,对于需要使用北京时间的设备则需要通过换算。

UTC就是协调世界时,又称世界统一时间、世界标准时间、国际协调时间,北京位于东八区比UTC时间快8小时的时区。

下面小编将通过Modbus卫星定位模块获取UTC时间并通过MCGS脚本转换东八区时间再通过Modbus协议修改PLC的RTC时钟。

卫星定位模块采用EBYTE的E108-D01,一款支持多模定位并且支持UTC时间查询的Modbus RTU从机,下表为E108-D01寄存器表截取的本案例会使用到的寄存器,寄存器直接存储的UTC时间,需要 8小时换算成北京时间;

图片[1]-「技术分享」利用卫星校准系统时间-一鸣资源网

配置MCGS的设备列表以及寄存器查询表,如下图所示:

图片[2]-「技术分享」利用卫星校准系统时间-一鸣资源网

将从GPS获取的UTC时间分别赋予“当前UTC时间”,并通过字符串格式化函数将数值格式化为YYYY-MM-DD HH:MM:SS格式的字符串,方便直观读取数据和使用;

!StrFormat(“%g-%g-%g %g:%g:%g”,GPS_Year,GPS_Month,GPS_Day,GPS_Hour,GPS_Minute,GPS_Second)

将当前UTC时间转换为时间戳,并将函数服务器控件“UTC时间戳”;

!TimeStr2I(!StrFormat(“%g-%g-%g %g:%g:%g”,GPS_Year,GPS_Month,GPS_Day,GPS_Hour,GPS_Minute,GPS_Second))

将时间戳增加8小时后,转换为对应的北京时间的“年月日时分秒”并服务“北京时间”控件;

!TimeGetYear(!TimeStr2I(!StrFormat(“%g-%g-%g %g:%g:%g”,GPS_Year,GPS_Month,GPS_Day,GPS_Hour,GPS_Minute,GPS_Second)) 28800)

!TimeGetMonth(!TimeStr2I(!StrFormat(“%g-%g-%g %g:%g:%g”,GPS_Year,GPS_Month,GPS_Day,GPS_Hour,GPS_Minute,GPS_Second)) 28800)

!TimeGetDay(!TimeStr2I(!StrFormat(“%g-%g-%g %g:%g:%g”,GPS_Year,GPS_Month,GPS_Day,GPS_Hour,GPS_Minute,GPS_Second)) 28800)

!TimeGetHour(!TimeStr2I(!StrFormat(“%g-%g-%g %g:%g:%g”,GPS_Year,GPS_Month,GPS_Day,GPS_Hour,GPS_Minute,GPS_Second)) 28800)

!TimeGetMinute(!TimeStr2I(!StrFormat(“%g-%g-%g %g:%g:%g”,GPS_Year,GPS_Month,GPS_Day,GPS_Hour,GPS_Minute,GPS_Second)) 28800)

!TimeGetSecond(!TimeStr2I(!StrFormat(“%g-%g-%g %g:%g:%g”,GPS_Year,GPS_Month,GPS_Day,GPS_Hour,GPS_Minute,GPS_Second)) 28800)

“修改”按钮控件,需要先判断UTC时间有效后才能进行校时,具体脚本如下:

图片[3]-「技术分享」利用卫星校准系统时间-一鸣资源网

至此就完成了卫星校时的全部配置,小编从E108-D01如何获取时间到PLC梯形图开放RTC配置接口再到MCGS如何写入时间PLC进行了细化简介,根据这种方法可以对任何支持Modbus RTU协议的设备进行卫星校时。

下图是利用仿真设备演示跨月与跨年时设备自动校准北京时间的过程:

图片[4]-「技术分享」利用卫星校准系统时间-一鸣资源网

© 版权声明
THE END