上位机与PLC时钟同步简单解决方案(NTP)

客户要求人机界面中显示的报警触发时间要与上位机、客户MES中的时间高度一致,要做到这点就需要将各个设备的时间同步。
如果是联网环境下,电子设备会自动同步时间,不会存在不一致的问题。但在内网环境下,由于不能与外界同步时间,电子设备之间的时钟会随着时间推移误差越来越大,导致报警数据时间不同步。如何解决呢?

0、准备

本解决方案使用到了NTP,请确认PLC是否支持从NTP服务器同步时间

1、修改注册表,开启NTP服务

按下快捷键win+R,输入regedit,点击确定
image
在导航栏输入计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 回车
image
把Enabled设置为1
在导航栏输入计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config回车
image
把AnnounceFlags的值设置为5

2、注册NTP服务

按下快捷键win+R,输入services.msc,点击确定
在服务项中找到Windows Time,双击打开,点击启动按钮,并将启动类型设置为自动
image
点击登录选项卡,将登录身份改为本地系统账户
image
点击恢复选项卡,将后续失败改为重新启动服务
image
这样当下次电脑重启时会自动开启NTP服务

初次设置时有可能不生效,建议重启电脑后在服务项中检查Windows Time服务是否正在运行,启动类型是否为自动,如果不生效则重复步骤,直到重启后Windows Time能自动运行

3、开放NTP服务端口

按下快捷键win+R,输入wf.msc,点击确定
入站规则中点击新建规则
image
关键配置如下
image
image
后续配置默认即可,名称任意填写

4、在PLC中设置NTP服务器

此处以Omron NX1举例,其他品牌的PLC设置大同小异
设置NTP服务器地址为电脑的IP地址,端口为123,其他设置按自己的需求
image

5、测试

右键屏幕右下角的时间,点击调整日期和时间
image
将自动设置时区和自动设置时间关闭,点击更改按钮更改时间为任意时间
image
之后观察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时间都保持一致。

posted @ 2026-07-17 15:03  逸尘上位机分享  阅读(2)  评论(0)    收藏  举报