1

Codesys 非常新,所以请多多包涵。我知道您可以使用时间选择器,但由于某种原因它不会显示在 Web 可视化上。所以试图找到一个函数来显示与所选日期相对应的星期几。例如。选择 15.10.2018 并获得“星期一”

4

2 回答 2

2

维基百科(德语)上有一个计算星期几的公式。

在 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 是星期二,以此类推。

于 2018-10-17T05:58:56.440 回答
1

这取决于你有什么作为输入。如果您将月、日和年作为单独INT的值,则上述示例可能有效。但是您也可以将其转换DATE为更好的格式。这将使您快速转换为TIMETOD比较日期并做更多事情。

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);

如果你有 type 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);
于 2018-10-19T13:25:53.707 回答