Это зависит от того, что у вас есть на входе.Если у вас есть месяц, день и год как отдельные значения INT
, приведенный выше пример может работать.Но вы также можете преобразовать его в DATE
, который является гораздо лучшим форматом для работы.Это позволит вам быстро конвертировать в TIME
или TOD
, сравнивать даты и делать многое другое.
VAR
DT: DATE;
Str: STRING;
d : INT:= 15; //day
m : INT:= 10; //month
y: INT:= 2018; //year
END_VAR
Str := CONCAT("D#", y);
Str := CONCAT(Str, '-');
Str := CONCAT(Str, m);
Str := CONCAT(Str, '-');
Str := CONCAT(Str, d);
(* Now our string is D#2018-10-15 *)
DT := STRING_TO_DATE(Str);
Если у вас есть тип DATE
, то вычислить день недели - очень тривиальная задача.,Все, что нам нужно знать, это какой был день недели в любой данный день.Затем мы можем вычислить, сколько дней мы находимся с того дня, разделиться на 7 и получить MOD.
Вот факты, которые мы должны знать
- Внутреннее время хранения в секундах от1 января 1970 года.
- Мы знаем, что 1 января 1970 года был четверг.
- 86400 секунд за один день
Вот пример функции.
FUNCTION WeekDay : UINT
VAR_INPUT
DT: DATE;
END_VAR
VAR
NumOfDays: DWORD;
END_VAR
(* How many days from 1 Jan. 1970 *)
NumOfDays := DATE_TO_DWORD(DT) / 86400;
WeekDay := DWORD_TO_UINT((NumOfDays + 3) MOD 7);
END_FUNCTION
+ 3 дают нам 0 - понедельник, потому что в системе, где 0 - этоПонедельник 3 - четверг, и если мы хотим 0 - воскресенье, мы можем использовать +4;
Конечно, вы можете оптимизировать функцию так, чтобы она была только одной строкой
WeekDay := DWORD_TO_UINT(((DATE_TO_DWORD(DT) / 86400) + 3) MOD 7);