Codesys的新手,请多多包涵。 我知道您可以使用时间选择器,但是由于某种原因它不会显示在Web可视化文件中。因此,尝试查找将显示与所选日期对应的星期几的函数。 例如。选择2018年10月15日并获得“星期一”
答案 0 :(得分:2)
有一个公式可以计算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;
这将返回星期几作为数字。 1是星期一,2是星期二,等等。
答案 1 :(得分:1)
这取决于您输入的内容。如果您将月,日和年分别设置为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。
这是我们必须知道的事实
这是一个函数示例。
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);