Создание изолированного NTP-сервера только с 1PPS и без внешнего “временного” ввода (без GPS)

Вопрос или проблема

Я хочу, чтобы небольшой NTP сервер (Chrony) предоставлял время различным компьютерам, расположенным на одном учебном подводном аппарате, подключенном с помощью Ethernet-кабелей. Для нас в первую очередь важно, чтобы различные части аппарата синхронизировались друг с другом с отклонением менее 10 мс на протяжении нескольких дней.

Некоторые электронные устройства синхронизируются напрямую с помощью источника 1PPS, поэтому важно, чтобы NTP сервер и источник 1PPS были синхронизированы.

Синхронизация “системного времени” с реальным временем не обязательна, но было бы хорошо, если бы она была бесплатной.

В настоящее время у нас есть:

  • Источника частоты 1PPS
  • Встроенный компьютер с RTC, который считывается при запуске
  • GPS-приемник, но на него в идеале нельзя полагаться, так как GPS не работает под водой.

В настоящее время мы подаем сигнал 1PPS и GPS-строку в USB-Serial преобразователь (FTDI), затем это считывается gpsd, который правильно берет сигнал 1PPS и GPS-строку для Chrony. Это работает и дает нам около 2 мкс синхронизации с 1PPS и GPS.

Существующая конфигурация имеет ограничения для нашего применения:

  1. gpsd требует действительную GPS-временную строку для инициализации времени, это не всегда доступно, так как у нас плохой прием GPS на воде и совершенно отсутствует под водой.

  2. gpsd также требует непрерывные действительные строки для обработки прерывания 1PPS. Это в основном проблема, если мы хотим отключить GPS-приемник под водой, чтобы сэкономить энергию, но при этом хотим продолжать синхронизацию с 1PPS.

  3. Как только GPS теряется или GPS-устройство выключается, системное время начинает отклоняться от источника 1PPS.

Я понимаю, что “gpsd” сильно зависит от GPS, поэтому я использую неправильный инструмент.

Вопросы:

  1. Возможно ли подать 1PPS напрямую в Chrony?

    1.1 Может ли Chrony использовать этот 1PPS и только системное время, не получая реальный источник времени, кроме RTC?

  2. Существуют ли примеры того, как добавить источник /dev/pps, используя RI или DCD пин преобразителей USB-to-Serial FTDI? Например, что делает gpsd под капотом, но без его использования.

Частично отвечая на свои собственные вопросы на основе нашего опыта и ошибок.

Вопросы: 1. Возможно ли подать 1PPS напрямую в Chrony?

Ответ: 1 Конфигурация Chrony использует 2 метода для получения PPS:

  • Получить его из SHM1 (разделяемой памяти), куда его помещает gpsd
  • Получить его напрямую из устройства /dev/pps

Пример конфигурационных строк:

refclock SHM 1 refid PPS precision 1e-9
refclock PPS /dev/pps1 refid PPS2 precision 1e-9

Некоторые потенциальные подводные камни, касающиеся задержек, также описываются в Часто задаваемых вопросах.

Вопросы: 1.1 Может ли Chrony использовать этот 1PPS и только системное время, не получая реальный источник времени, кроме RTC?

Ответ: 1.1 Да, если вы добавите эту строку:

local stratum 10

Тогда Chrony вернется к локальным часам, если потеряет все свои источники. Это также кажется необходимой строкой для того, чтобы сервер времени продолжал быть работоспособным, если у него есть только источник /dev/pps и нет данных от GPS.

Вопросы: 2. Существуют ли примеры того, как добавить источник /dev/pps, используя RI или DCD пин преобразителей USB-to-Serial FTDI? Например, что делает gpsd под капотом, но без его использования.

Частичный ответ (обходной путь) 2: gpsd будет принимать pps как от RI, так и от DCD и передавать временные данные в SHM1. gpsd также автоматически создает виртуальное устройство /dev/pps1 и связывает его с последовательным портом, это не тот же самый 1PPS, который используется внутри gpsd!

При использовании ppstest на /dev/pps1 вы можете видеть переходы PPS для DCD, но нет перехода для RI. Использование ppscheck на последовательном порте показывает переходы pps как для RI, так и для DCD.

Мы полагаем, что gpsd разрабатывает собственную новую схему обнаружения 1PPS, но виртуальный порт /dev/pps1 использует устаревший ldattach (линейная дисциплина), который жестко закодирован только для DCD. смотрите этот пост.

Ответ или решение

Создание изолированного NTP-сервера с использованием сигналов 1PPS и без внешних источников времени (без GPS)

Ваша задача по созданию изолированного NTP-сервера с использованием сигнала 1PPS, без зависимости от GPS, действительно осуществима. Рассмотрим основные аспекты этого проекта и как его можно реализовать с использованием Chrony.

1. Основные требования

Ваш проект включает следующие элементы:

  • Использование сигнала 1PPS для синхронизации различных компонентов подводного аппарата.
  • Организация NTP-сервера, который будет обеспечивать синхронизацию до 10 мс между компьютерами, связанными через Ethernet.
  • Возможность работать без надежного источника времени, такого как GPS, когда аппарат находится под водой.

2. Взаимодействие Chrony и 1PPS

Chrony предлагает два метода для работы с PPS:

  • Использование SHM (Shared Memory), который, как вы уже заметили, применяется gpsd для передачи данных о 1PPS.
  • Непосредственное использование устройства /dev/pps.

Для вашего сценария рекомендуется использовать прямое подключение к устройству /dev/pps, что позволяет избежать зависимости от gpsd и обеспечивает надежную синхронизацию.

Пример настройки Chrony

В конфигурационном файле Chrony (/etc/chrony/chrony.conf) вы можете добавить следующие строки:

refclock PPS /dev/pps1 refid PPS precision 1e-9
local stratum 10
  • refclock PPS – указывает на использование /dev/pps1 как источника PPS.
  • local stratum 10 – гарантирует, что Chrony будет продолжать работу, даже если все источники времени потеряны, используя локальные часы (RTC).

3. Подключение сигнала 1PPS к Chrony

Чтобы использовать сигнал 1PPS от FTDI USB-to-Serial конвертера, вам нужно использовать один из выводов, таких как DCD или RI. Вы можете настроить систему для считывания PPS через эти линии, но необходимо убедиться, что они правильно конфигурированы в вашем ядре Linux.

Настройка устройства /dev/pps

Для создания виртуального устройства /dev/pps, вам может потребоваться использовать модуль линейной дисциплины (ppsl) в Linux. Это можно сделать командой:

sudo modprobe pps_ldisc

Далее, добавьте строку в файл /etc/modules для автозагрузки:

pps_ldisc

Для того, чтобы перенаправить DCD или RI на /dev/pps, вы можете использовать setserial для настройки вашего последовательного порта и перевод линии с PPS в нужный режим.

4. Примечания к реализации

  • Убедитесь, что все устройства и драйверы, используемые в системах, поддерживают работу с PPS.
  • Отключение устройства GPS для экономии энергии возможно, так как Chrony будет работать на основе только 1PPS и RTC.
  • Механизмы проверки времени (например, ppstest) могут помочь вам проверить правильность работы вашего подключения 1PPS.

Заключение

Создание изолированного NTP-сервера с использованием сигнала 1PPS без GPS возможно и может стать надежным решением для синхронизации ваших подводных систем. Приложив усилия для грамотной настройки Chrony и устройства /dev/pps, вы сможете достичь высокоточной синхронизации даже в условиях, когда доступ к GPS отсутствует.

Если у вас возникнут дополнительные вопросы или потребуется помощь в процессе реализации, не стесняйтесь обращаться за поддержкой.

Оцените материал
Добавить комментарий

Капча загружается...