上位机与PLC时钟同步简单解决方案(NTP)
客户要求人机界面中显示的报警触发时间要与上位机、客户MES中的时间高度一致,要做到这点就需要将各个设备的时间同步。
如果是联网环境下,电子设备会自动同步时间,不会存在不一致的问题。但在内网环境下,由于不能与外界同步时间,电子设备之间的时钟会随着时间推移误差越来越大,导致报警数据时间不同步。如何解决呢?
0、准备
本解决方案使用到了NTP,请确认PLC是否支持从NTP服务器同步时间
1、修改注册表,开启NTP服务
按下快捷键win+R,输入regedit,点击确定

在导航栏输入计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 回车

把Enabled设置为1
在导航栏输入计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config回车

把AnnounceFlags的值设置为5
2、注册NTP服务
按下快捷键win+R,输入services.msc,点击确定
在服务项中找到Windows Time,双击打开,点击启动按钮,并将启动类型设置为自动

点击登录选项卡,将登录身份改为本地系统账户

点击恢复选项卡,将后续失败改为重新启动服务

这样当下次电脑重启时会自动开启NTP服务
初次设置时有可能不生效,建议重启电脑后在服务项中检查Windows Time服务是否正在运行,启动类型是否为自动,如果不生效则重复步骤,直到重启后Windows Time能自动运行
3、开放NTP服务端口
按下快捷键win+R,输入wf.msc,点击确定
在入站规则中点击新建规则

关键配置如下


后续配置默认即可,名称任意填写
4、在PLC中设置NTP服务器
此处以Omron NX1举例,其他品牌的PLC设置大同小异
设置NTP服务器地址为电脑的IP地址,端口为123,其他设置按自己的需求

5、测试
右键屏幕右下角的时间,点击调整日期和时间

将自动设置时区和自动设置时间关闭,点击更改按钮更改时间为任意时间

之后观察PLC的时间是否能与电脑时间保持同步。
时间同步可能需要等待一段时间,具体时间需要参考PLC的配置
6、上位机电脑与MES系统时间同步
如果需要将电脑时间与客户MES系统时间同步,在上位机代码中可以通过WebApi或其他方式定时获取MES系统时间,之后将电脑时间设置为获取到的时间。设置电脑时间的C#代码如下
using System;
using System.Runtime.InteropServices;
namespace Demo
{
[StructLayout(LayoutKind.Sequential)]
public struct SYSTEMTIME
{
public ushort Year;
public ushort Month;
public ushort DayOfWeek;
public ushort Day;
public ushort Hour;
public ushort Minute;
public ushort Second;
public ushort Milliseconds;
}
public static class TimeHelper
{
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetLocalTime(ref SYSTEMTIME st);
public static bool SetSystemTime(DateTime dateTime)
{
var st = new SYSTEMTIME
{
Year = (ushort)dateTime.Year,
Month = (ushort)dateTime.Month,
Day = (ushort)dateTime.Day,
Hour = (ushort)dateTime.Hour,
Minute = (ushort)dateTime.Minute,
Second = (ushort)dateTime.Second,
Milliseconds = (ushort)dateTime.Millisecond
};
return SetLocalTime(ref st);
}
}
}
调用TimeHelper.SetSystemTime()即可设置电脑时间,之后PLC时间通过NTP服务也会与电脑同步,此时MES,上位机,PLC时间都保持一致。

浙公网安备 33010602011771号