(* @NESTEDCOMMENTS := 'Yes' *)
(* @PATH := '' *)
(* @OBJECTFLAGS := '0, 8' *)
(* @SYMFILEFLAGS := '2048' *)
FUNCTION_BLOCK MultiZaehler
VAR_INPUT
Impuls: BOOL; (*Zählimpuls - pos.Flanke wird gezählt*)
END_VAR
VAR_OUTPUT RETAIN PERSISTENT
LetzteStundeZw: REAL; (*Zw = Zählerwert*)
HeuteZw: REAL;
GesternZw: REAL;
WocheZw: REAL;
MonatZw: REAL;
JahrZw: REAL;
END_VAR
VAR
AktuelleStundeZw: REAL;
PFlanke: BOOL;
FBSystZeit: CurTimeEx;
SysZeit : SysTime64;
SysZeitDat: SystemTimeDate;
Stunde: UINT; (*Stundenwert aus Systemzeit*)
StundeAlt: UINT; (*Stundenwert beim letzten Zyklus*)
WTag: UINT; (*Wochentag aus Systemzeit*)
Tag: UINT; (*Tag (1..31) aus Systemzeit*)
Monat : UINT; (*Monat aus Systemzeit*)
END_VAR
(* @END_DECLARATION := '0' *)
IF Impuls AND NOT PFlanke THEN (*Zählerwerte erhöhen*)
AktuelleStundeZw := AktuelleStundeZw +0.01;
HeuteZw := HeuteZw +0.01;
WocheZw := WocheZw +0.01;
MonatZw := MonatZw +0.01;
JahrZw := JahrZw +0.01;
END_IF;
PFlanke := Impuls; (*Merken, dass die positive Flanke schon gezählt wurde*)
(* FBSystZeit(SystemTime:= SysZeit , TimeDate:= SysZeitDat ); *)
Stunde := SysZeitDat.Hour;
IF StundeAlt <> Stunde THEN (*Stundenwechsel*)
StundeAlt := Stunde;
LetzteStundeZw := AktuelleStundeZw;
AktuelleStundeZw := 0;
IF Stunde = 1 THEN (*Neuer Tag*)
GesternZw := HeuteZw;
HeuteZw:=0;
WTag := SysZeitDat.DayOfWeek; (*Wochentag 0=So, 6=Sa*)
IF WTag = 1 THEN
WocheZw := 0; (*1=Montag: Wochenzähler Reset *)
END_IF; (*Wochenwechsel*)
Tag := SysZeitDat.Day;
IF Tag = 1 THEN (*Neuer Monat*)
MonatZw := 0;
Monat := SysZeitDat.Month;
IF Monat = 1 THEN JahrZw := 0; END_IF; (*Jahreswechsel*)
END_IF; (*Neuer Monat*)
END_IF; (*Neuer Tag*)
END_IF; (*Stundenwechsel*)
(* Komponente Datentyp Beschreibung
dwLowMSecs DWORD Die Angabe der Echtzeit in Mikrosekunden erfolgt über ein Low DWORD + ein High DWORD, siehe entsprechend die Struktur SysTime64
dwHighMsec DWORD
Year UINT Jahr, z.B. "2002"
Month UINT Monat, z.B. "12"
Day UINT Tag im Monat, z.B. "3"
Hour UINT Stunden des laufenden Tages, z.B. "13"
Minute UINT Minuten der laufenden Stunde, z.B. "43"
Second UINT Sekunden der laufenden Minute, z.B. "15"
Milliseconds UINT Millisekunden der laufenden Sekunde, z.B. "649"
DayOfWeek UINT Wochentag, z.B. "2" (Sonntag=0, Montag = 1...)
*)
END_FUNCTION_BLOCK