Регистрация | Последние сообщения | Персональный список | Поиск | Настройка конференции | Личные данные | Правила конференции | Список участников | Top 64 | Статистика раздела | faq | Что нового v.2.3 | Чат
Skunk Forum - Техника, Наука, Общество » АСУТП »
Синхронизация системного времени в АСУТП (страница 2)

Версия для печати (настроить)
Страницы: 1 2

Новая тема | Написать ответ

Подписаться

Автор Тема:   Синхронизация системного времени в АСУТП
bezlepkin
Junior Member

Сообщений: 2
Откуда: РФ, Москва
Регистрация: Сентябрь 2003

написано 02 Октября 2003 13:49ИнфоПравкаОтветитьIP

1) Код для синхронизации времени приведен в конце сообщения. Он отлажен для линейки NT/2K/XP, в Windows 9x/Me эти функции отсутствуют (must die!)
2) Что касается программной проверки того, что искомый сервер в данный момент работает, то способов очень много. Самая простой - просто PING. Функции для PING'а из программы находятся в динамической библиотеке ICMP.DLL. Но!... Любая проверка такого рода полагается на запрос/ответ по сети, что чревато (всегда!) задержками. Поэтому, не мудрствуя лукаво, лучше всего такую синхронизацию запустить в отдельном потоке. Все будет хорошо и недорого...


код:

//
// Синхронизация времени
// с удаленным хостом

#include <time.h>
#include <lmcons.h>
#include <lmremutl.h>
#include <lmapibuf.h>

/*
...
...
*/

int iLastError = 0;

//
// Имя запрашиваемого хоста в ЮНИКОДе
//
wchar_t wszServerName[] = L"NOSTROMO"; // для примера
//
// Структура для вызова SetSystemTime
//
SYSTEMTIME sSystemTime;
//
// Указатель на TIME_OF_DAY_INFO для NetRemoteTOD
//
TIME_OF_DAY_INFO * pRemoteTime = NULL;
//
// Код возврата NetAPI
//
NET_API_STATUS dwResult;
//
// Запрашиваем время на удаленном хосте
//
dwResult = NetRemoteTOD( wszServerName, (LPBYTE*)(&pRemoteTime) );
//
// Если сработало, то NetAPI
// распределит память под структуру TIME_OF_DAY_INFO
// и "отдаст" нам указатель на неё
//
if( dwResult == ERROR_SUCCESS && pRemoteTime ) {

//
// Заполняем структуру SYSTEMTIME
// Необходимо учесть возможную разницу в часовых поясах
// (см. описание TIME_OF_DAY_INFO)
//
sSystemTime.wSecond = (WORD)pRemoteTime->tod_secs;
sSystemTime.wMinute = (WORD)pRemoteTime->tod_mins;
sSystemTime.wHour = (WORD)pRemoteTime->tod_hours;
sSystemTime.wDay = (WORD)pRemoteTime->tod_day;
sSystemTime.wMonth = (WORD)pRemoteTime->tod_month;
sSystemTime.wYear = (WORD)pRemoteTime->tod_year;
sSystemTime.wMilliseconds = 0;

//
// Освобождаем память
//
NetApiBufferFree( (LPVOID)pRemoteTime );

//
// Для изменения времени локальной системы
// необходимо запросить привилегию SE_SYSTEMTIME_NAME
// для текущего процесса
//
HANDLE hToken;
TOKEN_PRIVILEGES sNewState;
LUID SetTimeValue;

//
// Получаем HANDLE на текущий процесс
//
if( OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) ) {

//
// Получаем LUID искомой привилегии
//
if ( LookupPrivilegeValue( (LPTSTR)NULL, SE_SYSTEMTIME_NAME, &SetTimeValue) ) {

sNewState.PrivilegeCount = 1;
sNewState.Privileges[0].Luid = SetTimeValue;
sNewState.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

//
// Устанавливаем привилегию
//
AdjustTokenPrivileges(hToken, FALSE, &sNewState, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL);
//
// Если получилось, устанавливаем время
//
if ( GetLastError() == ERROR_SUCCESS )
SetSystemTime(&sSystemTime);
else
iLastError = GetLastError();
}
else
iLastError = GetLastError();
}
else
iLastError = GetLastError();
}
else
iLastError = dwResult;



Прибытков Д.Н.
Member

Сообщений: 67
Откуда: Россия, Н.Новгород
Регистрация: Апрель 2003

написано 02 Октября 2003 16:12ИнфоПравкаОтветитьIP

Спасибо!
А как это выполнить для DOS(т.е. для MS/IBM LanManager)? Или эти действия выполняются на уровне протокола Netbios?
Я здесь имею в виду синхронизацию времени в пределах локальной сети.

bezlepkin
Junior Member

Сообщений: 3
Откуда: РФ, Москва
Регистрация: Сентябрь 2003

написано 02 Октября 2003 17:26ИнфоПравкаОтветитьIP

Oops. Боюсь, не знаю... Эти запросы действительно идут через NETBIOS (порт 139, netbios-ssn) и отвечает на них служба lanmanserver. Что касается DOS, то я даже не уверен, что Microsoft всё ещё поддерживает своё DOS API... Во всяком случае, посмотрите в MSDN, может, что и найдёте. Ссылка: http://msdn.microsoft.com/library/default.asp?url=/library/e...netmgmt/network_management.asp . Если раскопаете, дайте знать, pls.

Прибытков Д.Н.
Member

Сообщений: 80
Откуда: Россия, Н.Новгород
Регистрация: Апрель 2003

написано 10 Марта 2004 03:04ИнфоПравкаОтветитьIP

Уважаемые коллеги!
А вот ссылка на еще одну программу для коррекции времени ссылка
Информация взята из журнала CHIP N3 2004 г.

Павел Мощицкий
Member

Сообщений: 110
Откуда: Израиль. Бат-Ям
Регистрация: Январь 2004

написано 10 Марта 2004 19:52ИнфоПравкаОтветитьIP

Прибытков Д.Н.
Вопрос в том, как создать синхронизацию, когда нет доступа в Интернет?

sendto_az@mail.ru
unregistered
написано 31 Марта 2004 02:26  ПравкаОтветитьIP

К вопросу синхронизации компов в сети...

Господа, мои проблемы решила служба синхронизации времени в Windows 2000. Работает в NT/2000/2003

net stop w32time
net time /setsntp:MyComp
net start w32time

Андрей Зайцев
инженер-програмист АСУТП
"НАЗ-СУАЛ"

если хотим синхронизироваться с внешним сервером NTP:
net stop w32time
net time /setntp:<ip-adress>
net start w32time

Подробности в Microsoft Knowledge Base (ищите по слову w32time), там и описан реализованный алгоритм синхронизации, и более тонкие настройки через реестр...

Андрей Зайцев
инженер-программист АСУТП
"НАЗ-СУАЛ"

Alex_negr
Junior Member

Сообщений: 1
Регистрация: Апрель 2007

написано 25 Апреля 2007 10:43ИнфоПравкаОтветитьIP

Уважаемые господа, такой вопросик. Есть синхронизатор времени GPS Acutime2000, имеющий в своем составе GPS приемник, преобразователь RS422 в RS232, он же интерфейсный модуль, и все это подключается к COM порту компьютера. Таккже имеется ПО. Проблема с работой ПО Acutime2000 или железом!?, а именно обновление времени в системе, а также связи с интерфейсным модулем (ошибка протокола TSIP(Trimble Standart Interface Protocol)), если кто имел опыт работы с данным устройством, может что то посоветовать?

Ваш ответ:

Коды форума
Смайлики


Ник:    Пароль       
Отключить смайлики
Страницы: 1 2

Все время MSK

Склеить | Разбить | Закрыть | Переместить | Удалить

Новая тема | Написать ответ
Последние сообщения         
Перейти к:

Свяжитесь с нами | skunksworks.net

Copyright © skunksworks.net, 2000-2018

Разработка и техническая поддержка: skunksworks.net


Рейтинг@Mail.ru Яндекс.Метрика