Heat Meter funktioniert nicht wie erwartet

Begonnen von thommy01, 21. Februar 2009, 13:11:54

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

thommy01

Hallo Alle zusammen,

habe für eine Heizungssteuerung mit Solaranlage den Baustein "Heat_meter" zweimal verwendet und in beiden Fällen stimmt meines Erachtens das berechnete Ergebniss bzw. Funktion nicht.

Fall 1: Wärmemenge Berechnung für Zirkulationspumpe

Heat_Meter Modus: Liter je Stunde ohne Durchflussgeber
TF= 45°C, TR = 25°C, LPH 120, E = Pumpenansteuerung, "CP, Density und Content" = 0, Pulse Mode = False, Return
Meter= False, AVG_time = t#10s
Ergebniss:
Die Pumpe läuft für 360sek, die Angezeigte AVG und Gesamtmenge an Y stimmt
Die Pumpe läuft nach einer Pause wieder an und hier springt nun der AVG Wert im ersten zyklus auf ein paar hundert kwh und Y springt um einen Wert sehr großen Wert nach oben.

Es sieht für mich so aus als würde der Baustein intern weiter rechnen und aufsummieren. Muss ich außer dem Pumpensignal nocht etwas anderes beschalten?


Fall 2:
Wärmemenge Berechnung für Solaranlage
Heat_Meter Modus: 10 Liter je Impuls mit Durchflussgeber im Rücklauf
TF= 61°C, TR = 51°C, LPH 10, E = Impulsgeber Kontakt, CP = 3.58, Density= 1.044, Content=0.453, Pulse Mode = True, Return Meter= true, AVG_time = t#60s
Ergebniss:
Der Baustein berechnet nicht wenn Zählimpulse an "E" ankommen. Nach ändern des Parameters "Return Meter" auf "False" rechnet der Baustein je Impuls 228364.3 Joule aus. Das Erbennis erscheint mir jedoch zu gering und sollten ca. 398097 Joule sein oder berechne ich dies falsch? ( nach meiner Rechnung sollte der Energieertrag für Wasser ca. 228788 J und für den Clykol Anteil ca. 169309 J betragen)

Hat hier jemand eine Idee wo mein Fehler liegt und wie ich ihn korrigieren kann?

Verwendete Komponenten:
Wago 750-841
Codesys 2.3.9.10
OSCAT 3.0.3

Grüße
Thommy

hugo

sorry da war wirklich ein fehler im baustein
bitte versuche es nochmals mit dem gleichen baustein aus der beta7 von release 305
die beta findest du unter ankündigungen

thommy01

Hallo Hugo,

danke für die Info. Nachdem ich nun mit den anderen Sachen fertig war habe ich mir den Heat_meter baustein aus der lib 3.04 heute nochmals genauer angesehen und wollte gerade meine Fehler Analyse eintrage als ich deine Antwort sah.
Kannst du auch noch die Sourcen zur Verfügung stellen damit ich sehen kann welche Änderungen du gemacht hast.

Aber hier noch meine Erkentnisse. Du kannst ja mal vergleichen ob du das selbe entdeckt hast.

Fall 1: Wärmemenge Berechnung für Zirkulationspumpe
Nachdem ich den Integrierer Baustein immer "gestoppt" habe wenn der Eingang "e" "false"  ist war der Effekt weg und die Aufsummierung wie erwartet.

Fall 2: Wärmemenge Berechnung für Solaranlage1
Die Angabe "Wärmekapazität" der zweiten Komponente  muß in Joule erfolgen und nicht in KJ wie in der Dokumentation beschrieben. Dann ist auch das Ergebniss wie erwartet


Durchgeführte Änderungen von mir in dem Baustein:

IF rst THEN
   int1(rst := TRUE);
   int1.rst := FALSE;
   C := Y := 0;
ELSIF e THEN
   X := (WATER_DENSITY(SEL(return_meter, TF, TR), FALSE) * (WATER_ENTHALPY(TF) - WATER_ENTHALPY(TR)) * (1-content) + CP * Density * content*(TF-TR));
   IF pulse_mode THEN
      IF NOT edge THEN Y := Y + X * LPH; END_IF;
   ELSE

(* -----  Eingefügt damit bei "nicht Pulsmode" der integrator gestartet wird.  T.H.
           orginal war "int1(in := X * LPH / 3600.0, out_min := 0, out_max := 3E38);"  ------*)

         int1(in := X * LPH / 3600.0, out_min := 0, out_max := 3E38, run := TRUE);
         Y := int1.Out;
   END_IF;
END_IF;

(* store the value of e *)
edge := e;

(* read system_time *)
tx := T_PLC_MS();

(* only init at startup necessary *)
IF NOT init THEN
   init := TRUE;
   last := tx;
END_IF;

(* -----  Eingefügt damit bei "nicht Pulsmode" der Integrator gestoppt wird T.H. ------*)

IF NOT pulse_mode AND NOT e THEN
         int1(run := FALSE);
         Y := int1.Out;
END_IF;

(* -----  Eingefügt ende ------*)


(* calculate the current consumption *)
IF (tx - last >= TIME_TO_DWORD(AVG_TIME)) AND (avg_time > T#0s) THEN
   last := tx;
   C := (Y - Y_last) * 3.6/DWORD_TO_REAL(TIME_TO_DWORD(AVG_TIME));
   Y_last := Y;
END_IF;



(* revision history
hm   16. nov. 2007   rev 1.0
   original version

hm   24. dec. 2007   rev 1.1
   added config variable return_meter
   added output C for current consumption

hm   6. mar. 2008   rev 1.2
   corrected an error in pulse mode

hm   16. mar. 2008   rev 1.3
   added type conversion to avoid warnings under codesys 3.0

hm   21. oct. 2008   rev 1.4
   improved code

hm   6. nov. 2008   rev 1.5
   changed to FT_INT2 to avoid overrun at hig values

hm   8. feb. 2009   rev 1.6
   changes Y to be I/O
*)