Код:
(*****Отдельная благодарность capsar`у за ntp-клиент*****)
IF vis_bright_time.current_time>10800 AND vis_bright_time.current_time<10980 AND gprs_online THEN (*Если текущее время 03:00 выполняем 6 попыток опроса сервера и есть связь с интернетом, либо вручную с панели, при наличии интернета*)
start_bl_ntp:=TRUE;
ELSE
start_bl_ntp:=FALSE;
END_IF
bl_ntp(in:=start_bl_ntp , t_on:= T#5S, t_off:= T#25S, out=> ); //генератор импусьсов, который в течении работы таймера отправляет на панель данные
t_ntp_man(IN:= ntp_man, PT:= T#5S, Q=> , ET=> ); //время опроса ntp-сервера при ручном опросе
IF (bl_ntp.out OR t_ntp_man.Q) AND ntp_yes THEN //если подошло время обновления или синхр. вручную при условии разрешения синхронизации
start_ntp:=TRUE; //запускаем ntp-клиент
IF start_ntp AND start_ntp<>oldstart_ntp THEN //сравнение с передыдущим значением переменной
handle_sock := SocketCreate(13,ip_address, sock_adr); //работа через соккет и получение данных от сервера
data_received:=FALSE;
buff_in:=buff_cln;
ELSIF oldstart_ntp AND start_ntp<>oldstart_ntp THEN
IF handle_sock<>SOCKET_INVALID THEN
SysSockClose(handle_sock);
handle_sock := SOCKET_INVALID;
END_IF
ELSIF start_ntp THEN
IF NOT data_received THEN
result:=SysSockRecv(handle_sock, ADR(buff_in[0]), SIZEOF(buff_in),0,result_recv);
IF result > 0 THEN //если результат > 0, т.е. положителен*)
str:=bytePackStr(ADR(buff_in[0]), __XINT_TO_DINT (result)); //формируется строка данных из буфера*)
data_received:=TRUE; //формирование строки завершено*)
ntp_true:=INT_TO_BOOL (FIND(str,'UTC')); //проверка,что строка не состоит из неопределенных символов (время от времени бывает)
IF ntp_true THEN //соответственно, если данные адекватные - обрабатываем их
hh_ntp:=STRING_TO_INT (MID(str,2,17))+gmt; //получаем значение часа - 18-19 символы и приводим к часовому поясу
mm_ntp:=STRING_TO_INT (MID(str,2,20)); //См. hh_ntp
ss_ntp:=STRING_TO_INT (MID(str,2,23)); //См. hh_ntp
yy_ntp:=STRING_TO_INT (MID(str,2,8)); //См. hh_ntp
mh_ntp:=STRING_TO_INT (MID(str,2,11)); //См. hh_ntp
dd_ntp:=STRING_TO_INT (MID(str,2,14)); //См. hh_ntp
set_ntp:=TRUE; //фронт для установки полученного времени в плк
END_IF
END_IF
END_IF
END_IF
ELSE
start_ntp:=FALSE;
ntp_true:=FALSE;
set_ntp:=FALSE;
END_IF
oldstart_ntp:=start_ntp; (*Присваиваем промежуточную переменную*)