Сообщение от
Минеев Антон
Народ, добрый день... Никак не пойму: Как считать системное время с контроллера ПЛК110(М02)-60. Задача: нужно каждые 10 минут выводить количество деталей с указанием времени этого события.
С помощью библиотеки SysLibTime.lib
Например
Код:
FUNCTION_BLOCK REAL_TIME
VAR_INPUT
END_VAR
VAR_OUTPUT
current_time: TOD; (*Текущее время*)
current_date:DATE; (*Текущая дата*)
current_day: INT; (*Номер дня в году*)
END_VAR
VAR
CurTimeExInst: CurTimeEx;
CurSystemTimeDate: SystemTimeDate;
CurSysTime64: SysTime64;
year: INT;
second: INT;
day: INT;
hour: INT;
minute: INT;
month: INT;
count: INT;
END_VAR
VAR CONSTANT
nulldt: SystemTimeDate;
END_VAR
(*Получить текущее время и дату*)
CurSystemTimeDate:=nulldt;
CurTimeExInst(TimeDate := CurSystemTimeDate, SystemTime := CurSysTime64);
year :=CurSystemTimeDate.Year;
month :=CurSystemTimeDate.Month;
day :=CurSystemTimeDate.Day;
hour :=CurSystemTimeDate.Hour;
minute :=CurSystemTimeDate.Minute;
second :=CurSystemTimeDate.Second;
IF year =0 THEN
year :=1970;
month :=1;
day :=1;
END_IF
(*собираем часы, минуты и секунды в одну кучу - в миллисекунды*)
current_time:=DWORD_TO_TOD((INT_TO_DWORD(Hour) * 3600
+ INT_TO_DWORD(Minute * 60)
+ INT_TO_DWORD(Second))*1000);
(*Вычислить дату с учетом високосных лет*)
IF month > 2 THEN
count := (month - 1) * 30;
IF month > 7 THEN count := count + SHR(month - 3,1);
ELSE count := count + SHR(month - 4,1); END_IF;
(* проверить на високосный год и добавить один день если год високосный *)
IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
ELSE
count := (month - 1) * 31;
END_IF;
current_date:=DWORD_TO_DATE((INT_TO_DWORD(count + day - 1)
+ SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400);
current_day:= DAY_OF_YEAR(current_date);
Вложение 31117
Для вычисления номера дня в году здесь нужна такая функция
Код:
FUNCTION DAY_OF_YEAR : INT
VAR_INPUT
IDATE : DATE;
END_VAR
DAY_OF_YEAR := UDINT_TO_INT((DATE_TO_UDINT(idate) / UDINT#86400) MOD UDINT#1461);
IF DAY_OF_YEAR > 729 THEN
IF DAY_OF_YEAR > 1095 THEN DAY_OF_YEAR := DAY_OF_YEAR - 1095; ELSE DAY_OF_YEAR := DAY_OF_YEAR - 729; END_IF;
ELSIF DAY_OF_YEAR > 364 THEN
DAY_OF_YEAR := DAY_OF_YEAR - 364;
ELSE
DAY_OF_YEAR := DAY_OF_YEAR + 1;
END_IF;