通过了解 Codesys 中的日期生成工作日
generating week day by knowing the date in Codesys
Codesys 的新手,请多多包涵。
我知道您可以使用时间选择器,但由于某种原因它没有显示在 Web 可视化上。因此,试图找到一个函数来显示与所选日期相对应的星期几。
例如。 select 15.10.2018 并获得 "Monday"
有一个计算 Wikipedia (German) 星期几的公式。
在 CoDeSys 中:
PROGRAM PLC_PRG
VAR
d : INT:= 15; //day
m : INT:= 10; //month
y: INT:= 2018; //year
w: DINT; //result -> day of the week 1 = monday ...
END_VAR
实施:
w:= ((d + TRUNC(2.6 * ((m + 9) MOD 12 + 1) - 0.2) + y MOD 100 +
TRUNC(y MOD 100 / 4) + TRUNC(y / 400) - 2 * TRUNC(y / 100) - 1) MOD 7
+ 7) MOD 7 + 1;
这 returns 星期几作为数字。 1 是星期一,2 是星期二等等
这取决于您输入的内容。如果您将月、日和年作为单独的 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.
这是我们必须知道的事实
- 内部时间存储从 1970 年 1 月 1 日开始以秒为单位。
- 我们知道 1970 年 1 月 1 日是星期四。
- 一天有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);
Codesys 的新手,请多多包涵。 我知道您可以使用时间选择器,但由于某种原因它没有显示在 Web 可视化上。因此,试图找到一个函数来显示与所选日期相对应的星期几。 例如。 select 15.10.2018 并获得 "Monday"
有一个计算 Wikipedia (German) 星期几的公式。
在 CoDeSys 中:
PROGRAM PLC_PRG
VAR
d : INT:= 15; //day
m : INT:= 10; //month
y: INT:= 2018; //year
w: DINT; //result -> day of the week 1 = monday ...
END_VAR
实施:
w:= ((d + TRUNC(2.6 * ((m + 9) MOD 12 + 1) - 0.2) + y MOD 100 +
TRUNC(y MOD 100 / 4) + TRUNC(y / 400) - 2 * TRUNC(y / 100) - 1) MOD 7
+ 7) MOD 7 + 1;
这 returns 星期几作为数字。 1 是星期一,2 是星期二等等
这取决于您输入的内容。如果您将月、日和年作为单独的 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.
这是我们必须知道的事实
- 内部时间存储从 1970 年 1 月 1 日开始以秒为单位。
- 我们知道 1970 年 1 月 1 日是星期四。
- 一天有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);