
Сообщение от
bangg
Screenshot_2.pngScreenshot_3.pngScreenshot_4.png
Здравствуйте, работаю с ПР225 и есть небольшая проблема. Не могу понять как работать с временем. В симуляторе показывает синхронизированное время с компьютером, но в переменную не записывается. Может кто-то подсказать что делать? Заранее благодарю за ответ!
ПРки нового поколения не умеют в симуляции время из привязанных переменных забирать.
Если очень нужно, используйте свой блок выдачи времени.
Например
Код:
// <Description>Извлечение даты и времени из формата UnixTime от 01.01.2000</Description>
/// <GroupName>Дата и время</GroupName>
function_block UDT_to_DT // от 01.01.2000
var_input
UDT: udint := 0; //дата и время в формате Unix от 01.01.2000 в секундах (если = 0, то берем системное время)
end_var
var_output
day: udint;
month: udint;
year: udint;
hour: udint;
min: udint;
sec: udint;
week: udint;
end_var
var
day_month: array [1..12] of udint := [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
uiDate, uiDay: udint;
days_to_year, days_to_month: udint;
is_leap_year: bool;
end_var
if UDT = 0 then UDT := dt_to_udint(get_date_time()); end_if;
//Дата
uiDate := UDT / 86400; //Общее количество дней
year := uiDate / 365; //Приблизительно определяем год
days_to_year := year * 365 + (year + 3)/4 - (year + 99)/100 + (year + 399)/400; //Количество дней от 01.01.2000 до начала года
if uiDate < days_to_year then //Уточняем год
Year := Year - 1;
days_to_year := year * 365 + (year + 3)/4 - (year + 99)/100 + (year + 399)/400;
end_if
year := year + 2000; //Добавляем эпоху
uiDay := uiDate - days_to_year + 1; //Количество дней от начала года
month := uiDay / 29 + 1; //Приблизительно определяем месяц
if month > 12 then month := 12; end_if //На всякий случай
is_leap_year := (year mod 400 = 0) or ((year mod 4 = 0) and (year mod 100 <> 0)); //Проверяем год на високосность
days_to_month := day_month[month] + bool_to_udint(is_leap_year and month > 2); //Количество дней от нового года до начала месяца
if uiDay <= days_to_month then //Уточняем месяц
Month := Month - 1;
days_to_month := day_month[month] + bool_to_udint(is_leap_year and month > 2);
end_if
Day := uiDay - days_to_month; //Находим день
//Время
hour := (UDT / 3600) mod 24;
min := (UDT / 60) mod 60;
sec := UDT mod 60;
//День недели (1-пн, 2-вт ... 7-вс)
week := ((UDT / 86400 + 5) mod 7) + 1;
end_function_block