Среда разработки Unimod PRO 2 (версия 2.3.40)
 Руководство по программированию
×

TIME_FROM_SERVER - запрос времени


 
Назначение.
Функциональный блок TIME_FROM_SERVER применяется для получения текущего времени удаленного устройства.
 
Входные параметры.
Название
Тип данных
Описание
RUN
BOOLEAN
  • RUN=TRUE - выполнить блок;
  • RUN=FALSE - не выполнять.
ID_DRV
INTEGER
  • 1 - время запрашивается с удаленного NTP-сервера, на мастер-модуле должна быть запущена задача связи NTP.
  • 2 - время поступает с удаленного мастер-модуля, работающего по протоколу МЭК-104 в режиме master, на принимающем устройстве должна быть запущена задача связи МЭК-104 Slave.
PARAM
Ссылка
Если ID_DRV=1 (запрос времени с NTP-сервера), на вход PARAM передается строка с IP-адресом удаленного NTP-сервера в формате Ipv4. Если ID_DRV=2, то на вход PARAM подается порт задачи МЭК-104. В иных случаях вход PARAM игнорируется.
 
Выходные параметры.
Название
Тип данных
Описание
UTC_MSEC
DOOBLE
Выводится полученное от удаленного устройства время в формате UTC.
FAULT
INTEGER
Коды завершения операции:
  • 0 – выполнено успешно, ошибок нет;
  • 1 – ошибка выделения памяти (некорректные параметры);
  • 2 – превышено время ожидания ответа;
  • 3 – системная ошибка при работе с портом;
  • 4 – ошибка инициализации задачи связи;
  • 5 – выполняется запрос;
  • 6 – ошибка принятых данных;
  • 7 – внутренняя ошибка;
  • 8 – локальные часы.
Алгоритм получения времени с NTP-сервера.
  • Установите вход ID_DRV=1, а на вход PARAM передайте строку с IP-адресом удаленного NTP-сервера в формате Ipv4.
  • В дереве конфигурации среды разработки перейдите в раздел «Внешние коммуникации → NTP», включите передачу данных по протоколу NTP, выберите режим работы «Клиент» и укажите время ожидания ответа и время между запросами (периодичность) в миллисекундах. Подробное описание приведено в разделе «Задачи связи NTP» документа «Unimod PRO 2. Руководство пользователя».
  • Для запуска блока установите вход RUN=TRUE.
  • При первом запуске блока запускается задача связи NTP, в рамках которой на NTP-сервер по указанному IP-адресу отправляется первый запрос, до получения первого ответа выход FAULT= 5 (выполняется запрос, ни одного значения времени не получено). После получения первого ответа, значение времени в формате UTC выводится на выход UTC_MSEC функционального блока.
  • После этого, задача связи NTP продолжает выполняться независимо от состояния блока TIME_FROM_SERVER и в автоматическом режиме с заданной в конфигурации периодичностью запрашивать текущее время с NTP-сервера. Последнее полученное время сохраняется в памяти контроллера, и будет выводится на выход UTC_MSEC блока TIME_FROM_SERVER при запущенном состоянии (RUN=TRUE).
Если выход FAULT=7 → от сервера поступил ответ-исключение, значит сервер не может ответить на запрос из-за своего закрытого для доступа (закрытый сервер) или иного нестандартного состояния. При этом необходимо сменить IP-адрес сервера и перезапустить функциональный блок.
Если выход FAULT=8 → NTP-сервер не синхронизируется с более точным источником времени (например, с GPS-приемником) и передает время по своим внутренним (локальным) часам.
Алгоритм получения времени от мастер-модуля по протоколу МЭК-104.
В данном случае текущее устройство не запрашивается время с удаленного мастер-модуля, а ожидает его поступление от удаленного мастер-модуля.
  • Установите вход ID_DRV=2, вход PARAM не используется.
  • В дереве конфигурации среды разработки перейдите в раздел «Внешние коммуникации → МЭК-104 (Slave)», добавьте задачу связи и настройте ее параметры. Подробнее про добавление и настройку задачи связи МЭК-104 в разделе «Задачи связи МЭК-104» документа «Unimod PRO 2. Руководство пользователя».
  • Для запуска блока установите вход RUN=TRUE. На этом настройка блока завершена. На выход UTC_MSEC будет выводится время, полученное в запросе от удаленного мастер-модуля по команде синхронизации часов (идентификатор типа 103).
  • При этом на удаленном мастер-модуле должна быть запущена задача связи МЭК-104 в режиме Master, в рамках которой на Slave-устройства будут отправляться запросы с текущим временем.
 
Пример синтаксиса на языке ST.
//вызов функционального блока
Block.TIME_FROM_SERVER(RUN, ID_DRV, PARAM);
//чтение полученного времени в формате UTC (в миллисекундах)
UTC_MSEC := Block.UTC_MSEC;
//чтение кода завершения операции
FAULT := Blockв.FAULT;