oscat.lib > Modulentwicklung / Module Development

Stromzählerauswertung S0-Bus

(1/2) > >>

TMHEINE:
Gibt es jemand, der im S7 schon eine Stromzählerauswertung macht?
Habe hier mehrere Stromzähler mit S0-Bus (Halbleiter-Schalter mit z.B. 400 imp/kWh).
Zur Zeit mache ich die Auswertung mit einem Zähler, welche die Impulse/Minute zählt und daraus die Energie entsprechend berechnet. Ist leider etwas ungenau.
Schöner wäre es, wenn im Niedrig-Energie-Bereich nicht die Impulse, sondern der Abstand der Impulse zueinander ausgewertet werden. Im Hoch-Energie-Bereich sollten dann die Impulse gezählt werden. Die Umschaltung von Impuls-Abstand auf Impuls-Anzahl sollte natürlich automatisch erfolgen.
Hat jemand sowas schon? Gibt´s sowas in der Bibliothek? Kann jemand das entwickeln?

Danke vorab

Gruß

TMHEINE

shrimps:
Hi,
habe mir vor kurzem einen für meinen Minizähler gebaut, allerdings in ST fürTwincat.

Sollte aber sehr leicht zu konvertieren sein...

Gruss
Shrimps


--- Code: ---FUNCTION_BLOCK _fbStromzaehler
(* Einen S0-Impuls eines Strommessers lesen:
Liefert 1000 Impulse / KWh, 1Imp= 1Wh *)
VAR_INPUT
bSignal : BOOL; (* Unser S0-Impuls *)
END_VAR
VAR_OUTPUT
rLeistung : REAL; (* Die Momentanleistung zw. 2 Messungen *)
dVerbrauch : DWORD; (* Saldierter Verbrauch in Wh *)
dSignalPeriode : DWORD; (* Zeit in ms zwischen zwei Impulsen *)
dSignalDauer : DWORD; (* Laufzeit des Impulses *)
END_VAR
VAR
tx : TIME; (* Aktuelle Systemzeit in ms *)
tStart : TIME; (* Impulsbeginn *)
tEnde1 : TIME; (* Ende einer Periode *)
tEnde2 : TIME; (* Ende eine einzelnen Impulses *)
bInit : BOOL := TRUE; (* Aller Anfang *)
bFlanke : BOOL; (* Flankenmerker als Ersatz für RTRIG *)
END_VAR
(* @END_DECLARATION := '0' *)
tx := TIME(); (* Zeit merken *)

IF bInit  THEN (* Am Anfang: *)
tStart := tx; (* Startzeit einmalig Init *)
bInit := FALSE; (* Init Fertig ! *)
END_IF

IF bSignal AND NOT bFlanke THEN (* Wenn Signal kommt *)

dVerbrauch := dVerbrauch +1; (* Summenverbrauch *)

tEnde1 := tx; (* Periodendauer-Endezeit merken *)
dSignalPeriode := TIME_TO_DWORD(tEnde1) - TIME_TO_DWORD(tStart); (* Delta bilden *)
rLeistung := 3600000.0 / dSignalPeriode; (* Leistung auf WattStunden skalieren *)
rLeistung := DINT_TO_REAL(REAL_TO_DINT(rLeistung * 10)) / 10; (* 1 Stelle nach dem Komma runden *)
tStart := tx; (* Neue Startzeit merken *)

END_IF

IF NOT bSignal AND bFlanke THEN (* Signal fällt ab *)
tEnde2 := tx; (* Endezeit merken *)
dSignalDauer := TIME_TO_DWORD(tEnde2) - TIME_TO_DWORD(tStart);
END_IF

bFlanke := bSignal; (* Merker für Signalflanke *)

END_FUNCTION_BLOCK


--- Ende Code ---

TMHEINE:
Hallo,

soweit ich das erkannt habe, wertest du die Zeit zwischen den Impulsen aus.
Das ergibt bei vielen Impulsen aber eine hohe Fehlerquote (zumindest auf Nicht-Echtzeit-Systemen).
Ich werte es aktuell mit Impulszählern aus, was im hohen Impuls-Bereich genauer ist.
Bei niedrigem Verbrauch und wenig impulsen wäre aber das Impuls-Pausenverhältnis besser und genauer.

Schön wäre es, wenn es einen Baustein geben würde, der beides vereint.
Also bei wenig Verbrauch die Leistung über das Impuls-Pausen-Verhältnis zur rechnen, und bei höherem Verbrauch über die Impulsanzahl/Zeiteinheit.

Daher meine Anfrage...

GRuß

TMHEINE

tobiaslochner:
Den Baustein gibt es direkt von Wago. Er heißt "Fb_ImpulseCounter". Dieser ist zu finden in der Lib Building_HVAC_01.lib.

Viel Erfolg damit.

shrimps:
Hallo,
wäre ja prima, wenn der eine oder andere das zusätzlich implemtiert.
Bei mir kam nur die Impulszeitmessung zum tragen, da mein Testsystem viel zu wenig Impulse pro Minute bringt,
ggf. alle paar Minuten einen Impuls...

Gerne Feedback

PS: Wago-Lib gut und schön aber wenn man (ich) kein Wago hat ist es wenig prickelnd

LG
Shrimps

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln