如何使用主时钟同步Linux工控机

欢迎淘宝搜索飞灵科技,我司相关新产品陆续上线

在一些使用场景中,我们需要使用主时钟来同步工控机或PC机。如下图所示。下面我们介绍一下如何在利用飞灵科技的FlySync 主时钟同步一个Linux 主机。

在工控机安装linuxptp 软件包

使用apt 安装linuxptp:sudo apt-get install linuxptp 或者其他方式。

使用ethtool 工具查看主机网口是否具有硬件时间戳能力

root@pc:~$ ethtool -T eth0
Time stamping parameters for eth0:
Capabilities:
        hardware-transmit     (SOF_TIMESTAMPING_TX_HARDWARE)
        software-transmit     (SOF_TIMESTAMPING_TX_SOFTWARE)
        hardware-receive      (SOF_TIMESTAMPING_RX_HARDWARE)
        software-receive      (SOF_TIMESTAMPING_RX_SOFTWARE)
        software-system-clock (SOF_TIMESTAMPING_SOFTWARE)
        hardware-raw-clock    (SOF_TIMESTAMPING_RAW_HARDWARE)
PTP Hardware Clock: 0
Hardware Transmit Timestamp Modes:
        off                   (HWTSTAMP_TX_OFF)
        on                    (HWTSTAMP_TX_ON)
Hardware Receive Filter Modes:
        none                  (HWTSTAMP_FILTER_NONE)
        all                   (HWTSTAMP_FILTER_ALL)
        ptpv1-l4-sync         (HWTSTAMP_FILTER_PTP_V1_L4_SYNC)
        ptpv1-l4-delay-req    (HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ)
        ptpv2-l4-sync         (HWTSTAMP_FILTER_PTP_V2_L4_SYNC)
        ptpv2-l4-delay-req    (HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ)
        ptpv2-l2-sync         (HWTSTAMP_FILTER_PTP_V2_L2_SYNC)
        ptpv2-l2-delay-req    (HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ)
        ptpv2-event           (HWTSTAMP_FILTER_PTP_V2_EVENT)
        ptpv2-sync            (HWTSTAMP_FILTER_PTP_V2_SYNC)
        ptpv2-delay-req       (HWTSTAMP_FILTER_PTP_V2_DELAY_REQ)

从上面可以看出,网口eth0支持硬件和软件时间戳,并且对应的ptp时钟为/dev/ptp0。

查看主时钟配置的参数

必须确保工控机上运行ptp4l 时, 所使用的参数和主时钟一致。

 

同步工控机上的时间 

如果工控机支持硬件时间戳,假如对应的ptp clock 为/dev/ptp0, 使用如下命令来同步自己的/dev/ptp0到主时钟。注意的是,如果使用硬件时间戳,同步的clock是/dev/ptp0, 而不是系统时间。参考“获取同步后的时间”。

root@pc:~$ sudo ptp4l -i eth0 -p /dev/ptp0 -s -m  -H -E  
ptp4l[8706866.391]: selected /dev/ptp1 as PTP clock
ptp4l[8706866.393]: port 1: INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[8706866.393]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[8706867.209]: port 1: new foreign master 180373.fffe.31a803-1
ptp4l[8706871.209]: selected best master clock 180373.fffe.31a803
ptp4l[8706871.209]: running in a temporal vortex
ptp4l[8706871.209]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE
ptp4l[8706872.214]: master offset       2185 s0 freq   -7043 path delay     13428
ptp4l[8706873.214]: master offset       1977 s2 freq   -7251 path delay     13428
ptp4l[8706873.214]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
ptp4l[8706874.214]: master offset       2384 s2 freq   -4867 path delay     13369
ptp4l[8706875.214]: master offset        364 s2 freq   -6172 path delay     13428
ptp4l[8706876.214]: master offset       -588 s2 freq   -7015 path delay     13579
ptp4l[8706877.214]: master offset       -701 s2 freq   -7304 path delay     13444
ptp4l[8706878.214]: master offset       -139 s2 freq   -6952 path delay     13425
ptp4l[8706879.215]: master offset       -202 s2 freq   -7057 path delay     13428
ptp4l[8706880.215]: master offset       -520 s2 freq   -7436 path delay     13453
ptp4l[8706881.215]: master offset         -9 s2 freq   -7081 path delay     13434
ptp4l[8706882.215]: master offset        127 s2 freq   -6947 path delay     13410
ptp4l[8706883.215]: master offset         62 s2 freq   -6974 path delay  

如果工控机不支持硬件时间戳,只能使用软件时间戳来同步了。与硬件时间戳不同,如果使用软件时间戳,同步的是系统时间。参考“获取同步后的时间”。

root@pc:~$ sudo ptp4l -i eth0 -s -m  -S -E 
ptp4l[5180493.223]: port 1: INITIALIZING to LISTENING on INITIALIZE
ptp4l[5180493.223]: port 0: INITIALIZING to LISTENING on INITIALIZE
ptp4l[5180493.223]: port 1: link up
ptp4l[5180495.117]: port 1: new foreign master bcee7b.fffe.150780-1
ptp4l[5180499.117]: selected best master clock bcee7b.fffe.150780
ptp4l[5180499.117]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE
ptp4l[5180501.117]: master offset      79413 s0 freq   -9404 path delay     80193
ptp4l[5180502.117]: master offset      32367 s0 freq   -9404 path delay     80353
ptp4l[5180503.117]: master offset      41920 s0 freq   -9404 path delay     80193
ptp4l[5180504.117]: master offset      94948 s0 freq   -9404 path delay     62447
ptp4l[5180505.117]: master offset      49663 s0 freq   -9404 path delay     62447
ptp4l[5180506.117]: master offset      69493 s0 freq   -9404 path delay     56030
ptp4l[5180507.117]: master offset     107049 s0 freq   -9404 path delay     56030
ptp4l[5180508.118]: master offset     115592 s0 freq   -9404 path delay     58778
ptp4l[5180509.117]: master offset      69138 s0 freq   -9404 path delay     60612
ptp4l[5180510.118]: master offset      84803 s0 freq   -9404 path delay     60612
ptp4l[5180511.118]: master offset      83921 s0 freq   -9404 path delay     59641
ptp4l[5180512.118]: master offset      90501 s0 freq   -9404 path delay     57627
ptp4l[5180513.118]: master offset     136315 s0 freq   -9404 path delay     57627
ptp4l[5180514.118]: master offset     103501 s0 freq   -9404 path delay     58490
ptp4l[5180515.118]: master offset      91454 s0 freq   -9404 path delay     58490
ptp4l[5180516.118]: master offset     107072 s0 freq   -9404 path delay     60134
ptp4l[5180517.118]: master offset     101767 s1 freq   -8007 path delay     60134
ptp4l[5180518.118]: master offset       8076 s2 freq   -7191 path delay 

通过工控机上的log, 我们可以看出,使用硬件时间戳的话,同步精度可以到100ns之内。但如果使用软件时间戳的话,精度会差很多,会在100us之间。

获取同步后的时间

#include <time.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define CLOCKFD 3
#define FD_TO_CLOCKID(fd)   ((~(clockid_t) (fd) << 3) | CLOCKFD)
#define CLOCKID_TO_FD(clk)  ((unsigned int) ~((clk) >> 3))

int
main(int argc, char *argv[])
{
    struct timespec ts;
    clockid_t clkid;
#ifndef SOFTSTAMP
    int fd;

    fd = open("/dev/ptp0", O_RDWR);
    clkid = FD_TO_CLOCKID(fd);
#else
    clkid = CLOCK_REALTIME;
#endif
    if (clock_gettime(clkid, &ts) == -1) {
        perror("clock_gettime");
        exit(EXIT_FAILURE);
    }
    printf("Date: %s \n", ctime(&ts.tv_sec));

    exit(EXIT_SUCCESS);
}

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux时钟同步配置可以通过NTP(网络时间协议)实现。具体步骤如下: 1. 安装NTP软件包:在终端中输入命令sudo apt-get install ntp,安装完成后会自动启动NTP服务。 2. 配置NTP服务器:在/etc/ntp.conf文件中添加NTP服务器地址,例如server ntp1.aliyun.com。 3. 启动NTP服务:在终端中输入命令sudo service ntp start,启动NTP服务。 4. 验证时钟同步:在终端中输入命令ntpstat,查看时钟同步状态。 注意:在配置NTP服务器时,应选择可靠的、稳定的NTP服务器地址,以确保时钟同步的准确性。 ### 回答2: Linux时钟同步配置要涉及 Network Time Protocol (NTP) 的设置。NTP 是一种时间同步协议,用于通过网络同步计算机时钟。它使用 UDP 网络传输协议,而且是一个分布式系统,其中有众多的 NTP 服务器可以连接。下面简单介绍如何在 Linux 系统中进行 NTP 设置: 1. 安装 NTP 首先要确保你的系统已经安装了 NTP 。在绝大多数 Linux 发行版中, NTP 软件包都会预装或可通过包管理器下载。 2. 配置 NTP 编辑 /etc/ntp.conf 文件进行 NTP 配置。示例配置如下: ``` server 0.asia.pool.ntp.org server 1.asia.pool.ntp.org server 2.asia.pool.ntp.org server 3.asia.pool.ntp.org ``` 这会告诉 NTP 客户端使用亚洲的 NTP 服务器进行时钟同步。当然,你可以根据自己的需要配置其他更好的 NTP 服务器。 3. 启动 NTP 服务 启动 NTP 服务会自动连接到配置的 NTP 服务器。在大多数 Linux 发行版中,使用以下命令启动服务: ``` sudo systemctl start ntpd ``` 4. 设置开机启动 要确保启动时 NTP 服务自动开启,请使用以下命令: ``` sudo systemctl enable ntpd ``` 5. 检查时间同步状态 运行以下命令,检查时间同步状态: ``` sudo ntpq -p ``` 这会显示当前 NTP 服务器和与其的连接状态。 在以上步骤完成后,你的 Linux 系统就已经成功配置了 NTP 时钟同步。NTP 协议的要功能就是确保计算机时钟与网络同步,避免时钟漂移现象,保证时间高度精准的同步。 ### 回答3: 在使用Linux操作系统时,时钟同步是非常重要的,它可以确保各个系统之间的时间保持一致,同时也可以保证系统的正常运行。本文将讲解Linux系统中时钟同步配置的方法。 一、NTP服务器 NTP(Network Time Protocol)是一种协议,可以实现网络上多台计算机时钟的同步。要使Linux系统的时钟与网络上的其他计算机保持同步,需要设置一个NTP服务器。在Ubuntu操作系统中,可以通过以下命令来安装NTP服务器: sudo apt-get update sudo apt-get install ntp 安装完成后,需要编辑ntp配置文件,将NTP服务器的地址加入进去。可以采用以下命令进行编辑: sudo vi /etc/ntp.conf 在文件中添加以下代码: server ntp.server.com (其中,ntp.server.com为NTP服务器的地址) 保存文件后,需要重启NTP服务,才能使配置生效,可以通过以下命令来重启NTP服务: sudo service ntp restart 二、手动同步时钟 除了通过NTP服务器同步时钟外,也可以手动同步时钟。在Linux系统中,可以使用date命令来设置系统的时间和日期。可以采用以下命令设置时间: sudo date -s "2021-07-28 14:25:00" 以上命令的含义为将系统时间设置为2021年7月28日14点25分00秒。 三、自动同步时钟 除了使用NTP服务器和手动同步时钟外,还可以设置自动同步时钟。在Ubuntu操作系统中,可以通过设置crontab来实现自动同步时钟。 在终端中输入以下命令进入crontab编辑模式: crontab -e 然后添加以下内容: */5 * * * * /usr/sbin/ntpdate -u ntp.server.com > /dev/null 2>&1 其中,上面的代码表示每5分钟同步一次ntp.server.com的时间。 运行以上命令后,设置的自动同步时钟将会自动执行。通过以上的操作,可以帮助Linux系统在时间同步方面更加稳定的运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值