卫星授时系统错了一秒,利用卫星校准系统时间
戳我有惊喜!!!
一般获取精准时间的方式有两种,第一种就是从NTP服务器上获取,第二种则是通过卫星获取UTC时间,对于不能联网的设备若想通过NTP协议获取时间就只能通过外接支持UDP传输的网络模块,比如串口服务器。若设备支持卫星定位则可通过获取卫星的UTC时间来获取准确时间,对于需要使用北京时间的设备则需要通过换算。
UTC就是协调世界时,又称世界统一时间、世界标准时间、国际协调时间,北京位于东八区比UTC时间快8小时的时区。
下面小编将通过Modbus卫星定位模块获取UTC时间并通过MCGS脚本转换东八区时间再通过Modbus协议修改PLC的RTC时钟。
卫星定位模块采用EBYTE的E108-D01,一款支持多模定位并且支持UTC时间查询的Modbus RTU从机,下表为E108-D01寄存器表截取的本案例会使用到的寄存器,寄存器直接存储的UTC时间,需要 8小时换算成北京时间;
时间运算不能时简单的加8小时,需要考虑大小月与闰年,以及时间计算的进位处理,比较复杂,MCGS脚本支持时间戳转换,则可以将获取的UTC时间转换为时间戳,在加上8小时(时间戳计算需要使用秒,8小时等于28800秒),再转换为其他格式的时间数据,使用时间戳计算可以忽略大小月、闰年等复杂的时间处理过程。
有些PLC也支持通过时间戳配置RTC时间,有些则需要使用BCD或者普通的数值。
TM221可以通过BCD码利用存储字和存储位配置系统字(%SW49-%SW53)结合系统位(%S50),下图就可以看出利用系统字和系统位配置时间比较复杂;
TM221也可以通过PLC组态软件中的“功能块”的RTC功能修改,这里小编就通过这种方式修改PLC的RTC时间;
MCGS使用最便宜的TPC7062TX,该设备具有两个串口,一个RS485(COM2)接口,一个RS232接口(COM2)接口,引脚定义这里就不再说明,不知道的可以到MCGS官网查询。
这里使用官方自带的设备,“所有设备”的“PLC”目录下的“莫迪康-Modbus RTU”驱动,
PLC则使用施耐德的TM221,需要配置下列PLC梯型图,使用了6个保持寄存器存储MCGS发送的“年”“月”“日”“时”“分”“秒”,利用中间寄存器将参数写入RTC功能块实现时间校准。
将TM221使用寄存器格式化为下表,方便MCGS配置寄存器。
配置MCGS的设备列表以及寄存器查询表,如下图所示:
父设备配置,即RS-485总线的波特率参数,这里使用波特率9600,数据位8,停止位1,无校验;
分别配置GPS的寄存器地址,并使用地址1,配置TM221的寄存器地址,并使用地址0;
简单做一个人机交互界面,如下所示:
下图是MCGS的时间戳处理函数,这里只说明了时间字符串转时间戳,以及通过时间戳获取年份的两个函数,其余函数用法类似。
将从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时间有效后才能进行校时,具体脚本如下:
至此就完成了卫星校时的全部配置,小编从E108-D01如何获取时间到PLC梯形图开放RTC配置接口再到MCGS如何写入时间PLC进行了细化简介,根据这种方法可以对任何支持Modbus RTU协议的设备进行卫星校时。
下图是利用仿真设备演示跨月与跨年时设备自动校准北京时间的过程:
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com