Zählerwerte speichern

mf2000

Level-1
Beiträge
146
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich zähle die Impulse von unserem GAS Anschluss.

Ipmuls = 0,01m³GAS

Die Möchte ich folgt an zeigen.

Vervrauch letzte Stund
Verbrauch Heute
Verbrauch Gerstern
Verbrauch Woche
Verbrauch Monat
Verbrauch Jahr

Das ganze sollte auch nach einem Rest wieder geladen werden.

WAGO 750-880 mit SD Karte

Gruß
 
Zuletzt bearbeitet:
Hallo,
hier ist eine Exportdatei mit einem Zählerbaustein. Ich hab ihn so modifiziert, dass er für deine Problemstellung passen könnte.
Gruss
MP47

Code:
(* @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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

sieh dir auch mal die "Oscat_basic_333" Bibliotheksammlung unter http://www.oscat.de an, ich verwende den Baustein "METER_STAT" für die Zählung der Impulse der Regemenge.
Ich verwende diesen seit mehreren Monaten auf einer WAGO 750-880 und habe schon einige "Reset" hinter mir. Es ist nachträglich möglich, selbst nach einem Reset Ursprung die Werte durch forcen der entsprechenden Variablen wieder herzustellen. Voraussetzung ist natürlich, dir ist noch bekannt was urprünglich angezeigt wurde.
Wenn du die entsprechenden Variablen "RETAIN PERSISTENT" setzt, so sind alle Werte nach einem Reset (Spannungsausfall) noch vorhanden.

Gruß Reinhard Wechsler
 
Hallo und Danke für die Antworten.

Ich habe es jetzt ähnlich gemacht wieMP47. Siehe Exportdatei.

Evtl. kann jemand damit ja etwas anfangen. Geht bestimmt noch besser und schöner :)
 

Anhänge

  • FB_STROMZAEHLER.zip
    3,6 KB · Aufrufe: 43
Zurück
Oben