当前位置:首页 > 技术分析 > 正文内容

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

ruisui882个月前 (04-09)技术分析13

戳我有惊喜!!!

一般获取精准时间的方式有两种,第一种就是从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协议的设备进行卫星校时。

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

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3384.html

分享给朋友:

“「技术分享」利用卫星校准系统时间” 的相关文章

发行版Vanilla OS 2发布稳定版:彻底重写、改变使用Linux的方式

Vanilla OS 是去年崭露头角的 Linux 发行版,最初的 1.0 版本基于 Ubuntu 构建 —— 亮点之一是系统核心“不可变”。后来改用 Debian 测试分支 (Debian Sid),免费且开源,默认桌面环境是 GNOME。什么是不可变 Linux 发行版?不可变发行版确保操作系统...

学会使用Vue JSX,一车老干妈都是你的

作者:子君转发链接:https://mp.weixin.qq.com/s/eAOivpHeowLShfwPfW8-BA?君自前端来,应知前端事。需求时时变,bug改不完。?连续几篇文章,每篇都有女神,被老铁给吐槽了,今天不提了女神了,反正女神都是别人的(扎心了)。这两天小编看了腾讯与老干妈的事情,晚...

Windows 下 Git 拉 Gitlab 代码

读者提问:『阿常你好,Windows 下 Git 拉 Gitlab 代码的操作步骤可以分享一下吗?』阿常回答:好的,总共分为五个步骤。一、Windows 下安装 Git官网下载链接:https://git-scm.com/download/winStandalone Installer(安装版)注意...

30 个纯 HTML5 实现的游戏

浏览器和 JavaScript 的功能逐年不断的变强变大。曾几何时,任何类型的游戏都需要Flash。但随着 HTML5 发展,HTML5 + WebGL 游戏式就慢慢占领着这个舞台。以下是30款流行的游戏,它们可以在所有现代浏览器中运行,并且只使用web技术构建。1. HexGL地址:http://...

js中数组filter方法的使用和实现

定义filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。语法var newArray = arr.filter(callback(element[, index[, selfArr]])[, thisArg])参数callback循环数组每个元素时调用的回调函数。回调函...

三、Uni-app + vue3 页面如何跳转及传参?

Vue 项目往往需要使用 vue-router 插件,刚开始入门 Uni-app + Vue3 项目的同学,会不会想着路由使用 vue-router V4 版本不就可以了吗?不怕大家笑话,我就是这样想的,毕竟我是第一次使用 Uni-app ,由于孕期记性贼差,所以我决定写成笔记,加深记忆。uni-a...