时间校准 时间校准

戳我有惊喜!!!

一般获取精准时间的方式有两种 , 第一种就是从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)

秒懂生活扩展阅读