Синхронизация времени с сервером

Просмотр 15 сообщений - с 1 по 15 (из 34 всего)
  • Автор
    Сообщения
  • #18886
    Seliverstoff.yu
    Участник

    Здравствуйте! Вопрос в синхронизации даты времени регулятора с датой временем сервера. Дата время регулятора берется из нескольких каналов Год, Месяц, День, Час, Минута, потом по формуле
    GetTime(Val(301), Val(302), Val(303), Val(304), Val(305), 0) собирается в строку и выводится уже в привычном виде (Формулу здесь на форуме подсказали, так она выглядит в справочнике формул:

    public double GetTime (double year, double month, double day, double hour, double minute, double second)
    {
    DateTime dateTime = new DateTime((int)year, (int)month, (int)day, (int)hour, (int)minute, (int)second);
    return dateTime.ToOADate();
    }

    То есть и 5 каналов собирается строка даты и время.
    И вот, чтобы синхронизировать время регулятора с сервером как можно проще изловчиться?
    Разбить время сервера на пять значений и потом их записать в каждый нужный канал?
    Обратная формула той которая выше изложена? или можно как то по другому?

    • Эта тема была изменена 3 года назад от Seliverstoff.yu.
    #18889
    a80808
    Участник

    Ну для начала надо знать, как устанавливается дата/время в регуляторе, каким запросом. NTP сервер не проще использовать?

    #18890
    Seliverstoff.yu
    Участник

    Дата и время записывается в те же регистры откуда и считывается, то есть, если есть 5 входных каналов Год, Месяц, День, Час, Минута, то можно создать каналы управления на те же регистры регулятора и в них записывать дату и время полученную с сервера.
    Время сервера выводится на схеме Дорасчётным ТИ каналом с использованием формулы EncodeDate(DateTime.Now) в формате Дата и время.
    Первое наверное как разбить полученное время сервера на составляющие:Год, Месяц, День, Час, Минута.

    #18891
    a80808
    Участник

    Получите строку текущего времени в «жестком» формате, какой более удобен
    https://metanit.com/sharp/tutorial/19.1.php
    Затем вытащить из этой строки нужные значения и записать в регистры
    https://metanit.com/sharp/tutorial/7.1.php

    #18892
    Seliverstoff.yu
    Участник

    Спасибо! попробую разобраться! классные ссылки, благодарю!)

    #18896
    manjey73
    Участник

    У DateTime есть же через точку в int, типа DateTime.Day и так далее.

    Надо посмотреть как правильно вытаскивать.

    На сервер нужен настроенный NTP сервер. И настроить синхронизацию раз в день. Тут наверное модуль Автоуправления и типа раз в день по каналу отправлять сразу в несколько или с задержкой. Собственно вам же можно не всю дату, а только минуты и секунды писать вовремя, правда может нарисоваться проблемка с переходом на начало новых суток.

    #18898
    a80808
    Участник

    На сервер нужен настроенный NTP сервер
    NTP клиент. NTP сервер как правило или в Инете или в корпоративной сети выделенный, либо в технологических специальный железный с GPS/GLONAS антенной.

    Вроде бы у DataTime() есть методы .day, .month, .year — но вот про минуты и секунды что то не помню…

    #18899
    manjey73
    Участник

    Да, сорри, конечно клиент и не более 3-его уровня, а то и забанить могут 🙂
    Есть там и секунды и минуты.

    #18902
    Mikhail
    Модератор

    Посмотрите DateTime

    #18905
    a80808
    Участник

    Да уж…источник всегда лучше 🙂
    Действительно все есть

    #26371
    Seliverstoff.yu
    Участник

    Здравствуйте! После обновления до 6 версии формула выше
    public double GetTime (double year, double month, double day, double hour, double minute, double second)
    {
    DateTime dateTime = new DateTime((int)year, (int)month, (int)day, (int)hour, (int)minute, (int)second);
    return dateTime.ToOADate();
    }

    Стала возвращать время на семь часов вперед чем мой часовой пояс (+7)
    Понимаю, что нужно применить UTC, но не понимаю, где это указать в этой формуле) Подскажите пожалуйста.

    #26372
    JurasskPark
    Участник

    У переменной Час сделайте вычитание -7 )

    public double GetTime (double year, double month, double day, double hour, double minute, double second)
    {
    DateTime dateTime = new DateTime((int)year, (int)month, (int)day, (int)hour-7, (int)minute, (int)second);
    return dateTime.ToOADate();
    }

    #26373
    Seliverstoff.yu
    Участник

    Спасибо! тоже хотел так сделать, по аналогии с формулами excell, но подумал вряд-ли все так просто))) Только я -7 ставил уже в формуле канала там на заработало, а вот в формулу подставил, всё пошло) Спасибо большое!!!

    #26375
    Mikhail
    Модератор

    Добрый день!
    Ещё можно попробовать ... new DateTime(..., DateTimeKind.Utc);

    #26393
    Seliverstoff.yu
    Участник

    Кажется я что-то делаю не так?

    public double GetTime (double year, double month, double day, double hour, double minute, double second)
    {
    DateTime dateTime = new DateTime((int)year, (int)month, (int)day, (int)hour, (int)minute, (int)second, DateTimeKind.Utc);
    return dateTime.ToOADate();
    }

Просмотр 15 сообщений - с 1 по 15 (из 34 всего)
  • Вы должны авторизироваться для ответа в этой теме.