Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Синхронизация времени с сервером
- В этой теме 33 ответа, 6 участников, последнее обновление 1 год, 4 месяца назад сделано Seliverstoff.yu.
-
АвторСообщения
-
23.03.2021 в 03:37 #18886Seliverstoff.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.
23.03.2021 в 08:26 #18889a80808УчастникНу для начала надо знать, как устанавливается дата/время в регуляторе, каким запросом. NTP сервер не проще использовать?
23.03.2021 в 08:57 #18890Seliverstoff.yuУчастникДата и время записывается в те же регистры откуда и считывается, то есть, если есть 5 входных каналов Год, Месяц, День, Час, Минута, то можно создать каналы управления на те же регистры регулятора и в них записывать дату и время полученную с сервера.
Время сервера выводится на схеме Дорасчётным ТИ каналом с использованием формулы EncodeDate(DateTime.Now) в формате Дата и время.
Первое наверное как разбить полученное время сервера на составляющие:Год, Месяц, День, Час, Минута.23.03.2021 в 09:06 #18891a80808УчастникПолучите строку текущего времени в «жестком» формате, какой более удобен
https://metanit.com/sharp/tutorial/19.1.php
Затем вытащить из этой строки нужные значения и записать в регистры
https://metanit.com/sharp/tutorial/7.1.php23.03.2021 в 09:28 #18892Seliverstoff.yuУчастникСпасибо! попробую разобраться! классные ссылки, благодарю!)
23.03.2021 в 13:56 #18896manjey73УчастникУ DateTime есть же через точку в int, типа DateTime.Day и так далее.
Надо посмотреть как правильно вытаскивать.
На сервер нужен настроенный NTP сервер. И настроить синхронизацию раз в день. Тут наверное модуль Автоуправления и типа раз в день по каналу отправлять сразу в несколько или с задержкой. Собственно вам же можно не всю дату, а только минуты и секунды писать вовремя, правда может нарисоваться проблемка с переходом на начало новых суток.
23.03.2021 в 14:25 #18898a80808УчастникНа сервер нужен настроенный NTP сервер
NTP клиент. NTP сервер как правило или в Инете или в корпоративной сети выделенный, либо в технологических специальный железный с GPS/GLONAS антенной.Вроде бы у DataTime() есть методы .day, .month, .year — но вот про минуты и секунды что то не помню…
23.03.2021 в 17:04 #18899manjey73УчастникДа, сорри, конечно клиент и не более 3-его уровня, а то и забанить могут 🙂
Есть там и секунды и минуты.23.03.2021 в 17:11 #1890223.03.2021 в 21:22 #18905a80808УчастникДа уж…источник всегда лучше 🙂
Действительно все есть30.11.2022 в 19:00 #26371Seliverstoff.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, но не понимаю, где это указать в этой формуле) Подскажите пожалуйста.30.11.2022 в 20:59 #26372JurasskParkУчастникУ переменной Час сделайте вычитание -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();
}01.12.2022 в 05:37 #26373Seliverstoff.yuУчастникСпасибо! тоже хотел так сделать, по аналогии с формулами excell, но подумал вряд-ли все так просто))) Только я -7 ставил уже в формуле канала там на заработало, а вот в формулу подставил, всё пошло) Спасибо большое!!!
01.12.2022 в 12:52 #26375MikhailМодераторДобрый день!
Ещё можно попробовать... new DateTime(..., DateTimeKind.Utc);
02.12.2022 в 21:30 #26393Seliverstoff.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();
} -
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.