Solaranlage mit Warmwasser vorrangschaltung und Wärmetauscher Poolbereich.

Luzie

Level-1
Beiträge
77
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Gemeinde,

Zuerst Euch allen ein Fröhliches Neues Jahr 2019 Wünsche.

aber da kommt wieder ein kleines Problem wo ich nicht ganz weiterkomme, Daher wollte ich euch Fragen ob mir der ein oder andere bei diesem vieleicht Banalen Problem ein Tipp geben könnte.

Code:
/* Solar Regelung mit Warm Wasser Vorranschaltung
 * 
 * Wenn Solartemp (Kolektor) Soll erreicht dann "Solar_On" True
 * Solar Speicher Soll unterschritten  Pumpe ein
 * Solar Speicher Sollwert erreicht aber W-Wasser Temp soll unterschritten dann Solarspeicher aus W-Wasser einschalten. 
 * Wenn Solar Speicher soll unterschritten WW Pumpe aus und Solar Speicher Pumpe ein.
 * Solar Speicher und Warm Wasser Soll erreicht Poolbecken Temp unter soll Pumpe ein wenn Zustand = 2.
 * Wenn Solar oder W-Wasser soll unterschritten dann WTauscher Pumpe aus.
 * Handbetrieb immer möglich sobald Solar sool erreicht und Poolbetrieb sich im Zustand 2 befindet
 * Solartemp unterschritten alles aus
  */

//Solarregelung für Pool
IF (SolarTemp_ist >= SolarTemp_soll) THEN 
        Solar_ON:= TRUE; // Solar sollwert erreicht Regelung einschalten
     ELSE
         Solar_ON    := FALSE;
END_IF;

IF(Solar_On)THEN
    ELSIF (SolSpTemp_ist <= SolSpTemp_soll - SolSpTemp_fenster ) THEN // wenn Solarkolektor Sollwert erreicht ist Solar Speicherpumpe starten 
          SP_Speicher := TRUE;   // Pumpe Solarspeicher
          WW_Speicher := FALSE;  // Pumpe Warmwasserspeicher
          SP_WT_Pool  := FALSE;  // Pumpe Wärmetauscher Pool
    
    ELSIF (( SolSpTemp_ist >=  SolSpTemp_soll + SolSpTemp_fenster ) AND ( WW_SpTemp_ist <=  WW_SpTemp_soll ) AND ( BeckenTemp_ist <=  r_BeckenTemp_soll - BeckenTemp_fenster ) ) THEN
         SP_Speicher := FALSE;
         WW_Speicher := TRUE;
         SP_WT_Pool  := FALSE;
    
    ELSIF (( SolSpTemp_ist >=  SolSpTemp_soll + SolSpTemp_fenster) AND ( WW_SpTemp_ist >=  WW_SpTemp_soll )    AND 
          ( BeckenTemp_ist <=  r_BeckenTemp_soll - BeckenTemp_fenster ) AND Zustand = 2
    ) THEN
         SP_Speicher := FALSE;
         WW_Speicher := FALSE;
         SP_WT_Pool  := TRUE;
    
    ELSIF (( SolSpTemp_ist <=  SolSpTemp_soll - SolSpTemp_fenster ) AND ( WW_SpTemp_ist >=  WW_SpTemp_soll ) AND 
          ( BeckenTemp_ist >=  r_BeckenTemp_soll - BeckenTemp_fenster )
    ) THEN
         SP_Speicher := TRUE;
         WW_Speicher := FALSE;
         SP_WT_Pool  := FALSE;
    
    ELSIF (( SolSpTemp_ist >=  SolSpTemp_soll + SolSpTemp_fenster ) AND ( WW_SpTemp_ist <=  WW_SpTemp_soll ) AND 
          ( BeckenTemp_ist >=  r_BeckenTemp_soll - BeckenTemp_fenster )
    ) THEN
         SP_Speicher := FALSE;
         WW_Speicher := TRUE;
         SP_WT_Pool  := FALSE;
    
    ELSIF (( SolSpTemp_ist >=  SolSpTemp_soll + SolSpTemp_fenster ) AND ( WW_SpTemp_ist >=  WW_SpTemp_soll ) AND 
          ( BeckenTemp_ist >=  r_BeckenTemp_soll - BeckenTemp_fenster )
    ) THEN
         SP_Speicher := FALSE;
         WW_Speicher := FALSE;
         SP_WT_Pool  := FALSE;
    END_IF;

solarH_rTRIG (CLK := Solar_Hand AND Solar_ON); // Solar Hand ein wenn Solar_On TRUE..
  IF (solarH_rTRIG.Q) THEN
     SP_WT_Pool := NOT SP_WT_Pool;
  ELSIF (Zustand <> 2)THEN // Hand Ausschalten wenn Zustand nicht (= 2)
        SP_WT_Pool := FALSE;
 END_IF;

Das Problem ist das die Pumpe vom Solarspeicher auch auf True ist wenn Solar soll unterschritten und Solar_On auf False steht.
nur er schaltet den Betrieb nicht ab wenn Solar_ON auf False ist.

Wo habe ich den Denkfehler.
 
So ganz spontan nach einer oberflächlichen Schnelldurchsicht würde ich sagen:
Such doch bitte mal den Programmzweig der abgearbeitet wird wenn Solar_on=false ist.
In diesem müsste dann der Reset für die Solarpumpe rein.

Textmarker ist in solchen Fällen sehr hilfreich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich mir den Code anschaue, dann weiß ich wieder warum ich solche Dinge in FUP oder CFC programmiere :p

Also ich würd mal auf die Schnelle sagen, dass der Else-Pfad von IF(Solar_On)THEN fehlt.

Gruß
Blockmove
 
Wenn ich mir den Code anschaue, dann weiß ich wieder warum ich solche Dinge in FUP oder CFC programmiere [emoji14]

Also ich würd mal auf die Schnelle sagen, dass der Else-Pfad von IF(Solar_On)THEN fehlt.

Gruß
Blockmove
Genau das hab ich mir auch gerade gedacht [emoji23].

Gruß

Mavorkit

Gesendet von meinem SM-G389F mit Tapatalk
 
Danke für die Anworten

Genau das hab ich mir auch gerade gedacht [emoji23].

Gruß

Mavorkit

Gesendet von meinem SM-G389F mit Tapatalk

das habe ich nun geändert, ELSE nach der letzten ELSIF Anweisung, aber das egebniss bleibt das selbe. es tut sich nichts, es schaltet zwar den Status von True nach False, aber die Pumpen beiben in dem Status wie sie waren..

Code:
    ELSIF (( SolSpTemp_ist >=  SolSpTemp_soll + SolSpTemp_fenster ) AND ( WW_SpTemp_ist >=  WW_SpTemp_soll ) AND 
          ( BeckenTemp_ist >=  r_BeckenTemp_soll - BeckenTemp_fenster )
    ) THEN
// alles aus wenn Solar_On = False ist.
         SP_Speicher := FALSE;
         WW_Speicher := FALSE;
         SP_WT_Pool  := FALSE;
      ELSE
         SP_Speicher := FALSE;
         WW_Speicher := FALSE;
         SP_WT_Pool  := FALSE;
    END_IF;

Auch kann ich es leider nicht Als FUB oder KOP schreiben, da die Software das nicht Unterstützt und ich es nur im ST oder FBS machen kann. Codesys wird leider von der Steuerung nicht unterstützt obwohl es auf der Basis eines Raspberry läuft. Daher kommt nur LogiCals LC3 in betracht.

Ich werde noch eine Weile rumexperimentieren, irgend etwas wird mir schon einfallen. Für ein Profi ist das eher eine Kleinigkeit, aber als Anfänger doh schon etwas Anspruchsvoll*g
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich vermeide eigentlich gern solche geschachtelten If geschichten.
Ich habe nochmal schnell drüberweggesehen und denke im Augenblick das die Struktur mehrdeutig ist.

Code:
wenn bedingung1 dann ??
sonst wenn bedingung2 dann mache dies
sonst wenn bedingung3 dann mache das
...
...
ansonsten mache jenes
ende wenndann

genaugenommen kommt es garnicht zum else zweig (vermutlich)

Kannst Du eine Ablaufkontrolle im Debug-Modus machen?
 
Hallo Oliver,

deshalb hab ich ganz oben schonmal den Textmarker ins Spiel gebracht und etwas später die Ablaufkontrolle.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke aber ich habe es eben noch einmal alles umgestellt und diese ELSIF Anweisungen rausgeschmissen. Nun Funktioniert es.

Code:
//Solarregelung für Pool
IF (SolarTemp_ist >= SolarTemp_soll) THEN 
        Solar_ON:= TRUE; // Solar sollwert erreicht Regelung einschalten
     ELSE
         Solar_ON    := FALSE;
END_IF;

// Solanlage ist ON, Solarspeicher, W-Wasser Speicher sowie Beckentemp. unter Soll, dann Solarspeicher aufladen. Pumpe einschalten
    IF (((Solar_On)AND((SolSpTemp_ist <= SolSpTemp_soll - SolSpTemp_fenster AND WW_SpTemp_ist <= WW_SpTemp_soll AND BeckenTemp_ist <= r_BeckenTemp_soll - BeckenTemp_fenster)
                    OR (SolSpTemp_ist <= SolSpTemp_soll - SolSpTemp_fenster AND WW_SpTemp_ist >= WW_SpTemp_soll AND BeckenTemp_ist <= r_BeckenTemp_soll - BeckenTemp_fenster)
                    OR (SolSpTemp_ist <= SolSpTemp_soll - SolSpTemp_fenster AND WW_SpTemp_ist <= WW_SpTemp_soll AND BeckenTemp_ist >= r_BeckenTemp_soll - BeckenTemp_fenster)
                    OR (SolSpTemp_ist <= SolSpTemp_soll - SolSpTemp_fenster AND WW_SpTemp_ist >= WW_SpTemp_soll AND BeckenTemp_ist >= r_BeckenTemp_soll - BeckenTemp_fenster)))) THEN // wenn Solarkolektor Sollwert erreicht ist Solar Speicherpumpe starten 
        SP_Speicher := TRUE;   // Pumpe Solarspeicher
     ELSE
       SP_Speicher := FALSE;
    END_IF;
//Solanlage ist ON, Solarspeicher Voll , W-Wasser Speicher sowie Beckentemp. unter soll, W-Wasser aufladen. Pumpe einschalten    
    IF ((Solar_On) AND (SolSpTemp_ist >=  SolSpTemp_soll AND WW_SpTemp_ist <= WW_SpTemp_soll + WW_SpTemp_fenster AND BeckenTemp_ist <= r_BeckenTemp_soll - BeckenTemp_fenster)
                    OR (SolSpTemp_ist >=  SolSpTemp_soll AND WW_SpTemp_ist <= WW_SpTemp_soll + WW_SpTemp_fenster AND BeckenTemp_ist >= r_BeckenTemp_soll - BeckenTemp_fenster)) THEN
       WW_Speicher := TRUE;
    ELSE
      WW_Speicher := FALSE;
    END_IF;
//Solanlage ist ON, Solarspeicher Voll , W-Wasser Speicher Voll, Beckentemp. unter soll, Wärmetauscher Pumpe einschalten.     
    IF ((Solar_On) AND( SolSpTemp_ist >= SolSpTemp_soll AND WW_SpTemp_ist >= WW_SpTemp_soll AND BeckenTemp_ist <= r_BeckenTemp_soll - BeckenTemp_fenster)) THEN
       SP_WT_Pool  := TRUE;
    ELSE
       SP_WT_Pool  := FALSE;
    END_IF;

    IF ((Solar_On) AND( SolSpTemp_ist >=  SolSpTemp_soll - SolSpTemp_fenster AND WW_SpTemp_ist >= WW_SpTemp_soll AND BeckenTemp_ist >= r_BeckenTemp_soll)) THEN
         SP_Speicher := FALSE;
    END_IF;
//Solanlage ist ON, Alles OK dann nichts machen.    

solarH_rTRIG (CLK := Solar_Hand AND Solar_ON); // Solar Hand ein wenn Solar_On TRUE..
  IF (solarH_rTRIG.Q) THEN
     SP_WT_Pool := NOT SP_WT_Pool;
  ELSIF (Zustand <> 2)THEN // Hand Ausschalten wenn Zustand nicht (= 2)
        SP_WT_Pool := FALSE;
 END_IF;

Oder kann man das auch anders anstellen was kleiner ist und vieleicht etwas übersichtlicher
 
Also das kann man noch verkürzen:

Anstatt
Code:
IF (SolarTemp_ist >= SolarTemp_soll) THEN 
        Solar_ON := TRUE; // Solar sollwert erreicht Regelung einschalten
     ELSE
         Solar_ON := FALSE;
END_IF;

Code:
Solar_ON := (SolarTemp_ist >= SolarTemp_soll);

Auch die folgenden Netzwerke kannst du auf diese Art verkürzen
 
Am Rande bemerkt:

Ich benutze wie Du einen Differenzschwellwert Speicher gegen Dach um die Solaranlage zu aktivieren.
Um die Pumpen abzuschalten messe ich aber die Differenztemperatur am Solarvorlauf gegen den Rücklauf und schalte erst ab wenn die Differenz VL-RL einen Schwellwert unterschreitet.
Gerade im Herbst/Winter/Frühjahr bin ich da mit der Dachtemperatur oft schon unter der Speichertemperatur. Aber das sind Glaubensfragen und das erfordert IMHO auch eine drehzahlgesteuerte Pumpe. Und natürlich zwei zusätzliche Temperaturfühler nebst Auswertung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Antworten.
Die Optimirung des Code ist soweit abgeschlossen. Sieht auch schon viel besser aus als vorher.

Das glaube ich das dass messen zwishen VL und RL sinn macht. Ich muss aber diesen Punkt schon im Programm mit drinne haben. ich weiss dazu auch noch nicht was dann der oder die kundin für eine Solaranlage in benutzung hat, Vieleicht ist ja auch nur ein Absorber in betrieb wo ich die Heizung ausser acht lassen kann. Aber wer weiss das schon. Aber Danke für den Hinweiss mit der Dachtemperatur.

Gruss und noch ein schönen 1. Januar
 
Ich vermeide eigentlich gern solche geschachtelten If geschichten.
Ich habe nochmal schnell drüberweggesehen und denke im Augenblick das die Struktur mehrdeutig ist.
Also ich weiss nicht, weißnix_, von Dir bin ich deutlich Besseres gewöhnt! :shock:
Die geschachtelten If sind gar nicht geschachtelt (sehen nur so aus, weil die ElseIf eingerückt sind) und wie Du zu der Aussage kommst, die Struktur sei mehrdeutig, kann ich mir nur damit erklären, dass Du noch heftig unter dem Einfluss von Silvester gestanden hast.
Ein gutes Neues und kehr ganz schnell wieder zu Deinem üblichen Niveau zurück!!! ;)

Gruss, Heinileini
 
Zurück
Oben