FB_HVACOptimizedOn

FB_HVACOptimizedOn 1:

Funktionsbaustein zum optimierten Einschalten von Heizkesseln und Klimaanlagen in Verbindung mit Schaltzeitbausteinen.

Die Ausführungen in dieser Dokumentation beziehen sich auf das Heizverhalten. Der Einsatz des Bausteines in Verbindung mit Kühlgeräten erfolgt analog.

Berechnung der Vorstartzeit

Firmengebäude und öffentliche Einrichtungen sind über Nacht und an den Wochenenden meist unbelegt, so dass die Heizkessel dort oft nur in einem Standby-Modus arbeiten. Ziel eines optimierten Einschaltens ist es, den Heizkessel so früh zu starten, dass das Gebäude zu einem bestimmten Zeitpunkt genügend aufgeheizt ist. Umgekehrt gilt dies in den Sommermonaten auch für eine Kühlung des Gebäudes. Diese Vorstartzeit ist freilich nicht konstant, sondern immer abhängig von verschiedenen Faktoren, wie Außentemperatur, Raumtemperaturdifferenz (Ist- zu Sollwert) und baulicher Beschaffenheit wie beispielsweise die Gebäudemasse und die Wärmedämmung. Eine universelle Formel zu entwickeln, welche für alle Gebäude gültig ist, wäre eine sehr komplexe Aufgabe, die alleine schon an der Eingabe unzähliger Parameter scheitern würde. Einfacher und letztendlich absolut ausreichend ist ein selbst lernendes (adaptives) Näherungsverfahren.

Der Vorlauftemperatur des Heizkessels richtet sich nach der Außentemperatur. Damit ergeben sich für unterschiedliche Außentemperaturen verschiedene Aufheizverläufe, die im Wesentlichen einer Exponentialfunktion entsprechen:

FB_HVACOptimizedOn 2:

Die Vorlauftemperatur ist dabei immer deutlich höher als die zu erreichende Raumtemperatur. Zur Ermittlung der Vorstartzeit wird angenommen, dass der Bereich der Funktionen zwischen Raumtemperatur-Startwert und Raumtemperatur-Sollwert linear ist. Damit ergibt sich für jede Außentemperatur eine charakteristische Temperaturänderung ΔT/Δt, welche hier durch die gestrichelte Linie dargestellt wird.

Dem Funktionsbaustein FB_HVACOptimizedOn liegt mit der Strukturvariable stTempChangeFunction eine Tabelle zugrunde, in der für 10 diskrete Außentemperaturen die jeweilig zu erwartende Raumtemperaturänderung zugeordnet ist. Bei Inbetriebnahme bzw. Erststart der Anlage muss die Vorstartfunktion grob vordefiniert sein, zum einen, um den Außentemeraturbereich festzulegen, zum anderen um den Adaptionsvorgang zu beschleunigen. Diese Eingabe geschieht mit dem Baustein FB_HVACTempChangeFunctionEntry. Mit diesen Werten lässt sich näherungsweise die Vorstartzeit ermitteln. Diese Temperaturänderungs-Funktion f(AT) nimmt typischerweise folgenden Verlauf an:

FB_HVACOptimizedOn 3:

Funktionswerte innerhalb dieser 10 Punkte werden über Geradengleichungen definiert, Werte außerhalb entsprechen dem Funktionswert f(AT1) bzw. f(AT10):

Die Ermittlung der Vorstartzeit geschieht dann nach folgendem Ablauf:

FB_HVACOptimizedOn 4:

Rot dargestellt sind hier die Ein- und Ausgabevariablen des Bausteines. Violett dargestellt ist hier der Interne Merker uiActualPrestartTime der zu jedem Zeitpunkt die aktuelle Vorstartzeit enthält. Der Ausgang uiPrestartTime entspricht diesem Merker, wird jedoch während der Vorstartphase "eingefroren". Dieses wird im Folgenden weiter erläutert.

Bausteinverknüpfung und Vorstartphase

Aus diesen Vorgaben wird der Baustein dann kontinuierlich eine Vorstartzeit berechnen, die er dem Schaltuhrbaustein vorgibt. Soll ein Heizkessel dann beispielsweise Montagmorgens um 6 Uhr das Gebäude aufgeheizt haben und der Vorstartbaustein ermittelt um 5 Uhr morgens 60 Minuten Vorstartzeit, so wird die Schaltzeituhr den Kessel umgehend in den entsprechenden Heizmodus versetzen. Das Aufheizverhalten wird dann in einem Referenzraum über die Vorstartphase hinweg beobachtet und die Vorstartkurve entsprechend korrigiert.


FB_HVACOptimizedOn 5:

Der Vorstart-Baustein gibt für die Schaltuhr eine Vorstartzeit an. Schaltet die Schaltuhr den Ausgang bOutput, so wird dem Vorstart-Baustein dies über seinen Eingang bSchedulerActive angezeigt. Intern startet der Vorstart-Baustein dann einen Countdown mit der zuvor ausgegebenen Vorstartzeit uiPrestartTime [min]. Der Countdown läuft entweder bis zum Ende durch oder wird mit Erreichen der Raum-Solltemperatur vorzeitig abgeschlossen und stellt die Vorstartphase dar. Während des Countdowns wird der Ausgang bPrestartActive gesetzt, der dann beispielsweise für einen Schnellstart des Kessels genutzt werden kann.
Der Ausgang uiPrestartTime folgt kontinuierlich der oben aufgeführten Berechnung - während eines gestarteten Countdowns jedoch wir er konstant gehalten, damit eine Schwankung in der Außentemperatur nicht eine geringere Vorstartzeit angibt und den Kessel plötzlich abschaltet.

Teilt der Schaltuhrbaustein dem Optimierungsbaustein bei einem Vorstart noch den Adaptionsauftrag als Flanke mit (rote Linie), so wird dieser nach der Vorstartphase entscheiden, ob die zuvor ermittelte Vorstartzeit innerhalb einer Toleranz genau oder zu klein bzw. zu groß bemessen war und die Temperaturänderungs-Funktion entsprechend korrigieren. Dabei wird die Vorstartzeit des Punktes, dessen Außentemperatur der tatsächlichen zu Beginn des Countdowns am nächsten lag, nach oben bzw. nach unten hin korrigiert. Dieser Vorgang wird "Adaption" genannt.

Hinweis: Es werden nur dann Temperaturänderungen korrigiert, wenn die Außentemperatur zu Beginn des Vorstarts innerhalb der Stützstellen, d.h. des Funktionsbereiches gelegen hat, siehe "Adaption".

Bei gewünschter Adaption muss der Eingang bWithAdaption zeitgleich mit dem Eingang bSchedulerActive gesetzt sein. Für bWithApation reicht dabei ein reiner Triggerimpuls. Ein Abfallen des Einganges bSchedulerActive unterbricht einen zuvor gestarteten Countdown sofort. Die Adaption kann durch den Eingang bDisableAdaption unterdrückt werden. Diese Option ist dann zu wählen, wenn nach einer gewissen Anzahl von Adaptionsvorgängen die Temperaturänderungs-Funktion nicht mehr verändert werden soll.

Der folgende Programmablaufplan soll das Verhalten besser veranschaulichen, rot dargestellt sind hier die Ein- und Ausgabevariablen des Bausteines:

Der interne Merker "Aktuelle Vorstartzeit" ist das ständig aktualisierte Ergebnis der Berechnung nach dem oben aufgeführten Diagramm.

FB_HVACOptimizedOn 6:

FB_HVACOptimizedOn 7:

Der Eingang bEnable, dessen Funktionsweise hier nicht dargestellt ist, setzt, wenn er auf FALSE steht, den Baustein faktisch außer Funktion: Als Vorstartzeit uiPrestartTime wird "0" ausgegeben und der oben dargestellte Ablauf wird nicht gestartet bzw. unmittelbar zurückgesetzt.

Adaption

Ist eine Adaption angewählt und die Vorstartphase beendet (Countdown = 0 oder Raumtemperatur erreicht) so können 3 Fälle eintreten:

  1. Der Countdown ist abgelaufen und die Raumtemperatur-Differenz ist unterhalb des Toleranz-Grenzwertes rAdaptionTolerance -> es erfolgt keine Adaption.
  2. Der Countdown ist noch nicht abgelaufen, die Raum-Solltemperatur jedoch ist erreicht -> die Vorstartzeit uiPrestartTime war zu hoch.
  3. Der Countdown ist abgelaufen, es besteht jedoch noch eine positive Temperaturdifferenz -> die Vorstartzeit uiPrestartTime war zu gering.

Anhand der abgelaufenen Countdown-Zeit und der erfolgten Änderung der Raumtemperaturdifferenz kann nun der Wert ΔT/Δt, neu bestimmt werden

  1. keine Änderung.
  2. zu viel Zeit war berechnet - neuer Wert: "Raumtemperaturdifferenz am Anfang" / "bislang abgelaufene Zeit"
  3. zu wenig Zeit war berechnet - neuer Wert: ("Raumtemperaturdifferenz am Anfang" -"Raumtemperaturdifferenz am Ende") / "Countdown-Zeit"

Die Temperaturänderungs-Funktion wird nun an der Stützstelle korrigiert, dessen Außentemperaturwert dem zu Beginn der Vorstopphase am nächsten lag. Der betreffende Punkt hierzu wurde vor Beginn des Countdowns abgespeichert, siehe Programmablaufplan.

Der zuvor berechnete Wert ΔT/Δt wird jedoch nicht unbedingt zu 100 Prozent als neuer Wert an der Stützstelle übernommen. Es besteht vielmehr die Möglichkeit den neuen Wert aus einer Gewichtung von altem und berechnetem Wert zu mischen. Diese Gewichtung geschieht mit Hilfe des so genannten Adaptionsfaktors rAdaptionFactor:

FB_HVACOptimizedOn 8:

Bei einem Adaptionsfaktor von 100% wird damit der neu berechnete Wert voll übernommen, bei 0% bleibt der alte Wert erhalten.

FB_HVACOptimizedOn 9:

Hinweis: Dadurch, dass immer die Vorstartzeit des nächst gelegenen Punktes verändert wird, kann eine Adaption nur dann stattfinden, wenn die Außentemperatur zu Beginn der Vorstartphase innerhalb von AT1 bis AT10 liegt.

VAR_INPUT

eDataSecurityType    : E_HVACDataSecurityType;
eCtrlFct             : E_BARCtrlFct;
bEnable              : BOOL;
bSchedulerActive     : BOOL;
bWithAdaption        : BOOL;
bDisableAdaption     : BOOL;
rOutsideTemperature  : REAL;
rRoomTemperature     : REAL;
rRoomSetpointValue   : REAL;

eDataSecurityType:Wenn eDataSecurityType:= eHVACDataSecurityType_Persistent ist, werden die persistenten VAR_IN_OUT-Variablen des Funktionsbausteins bei einer Wertänderung im Flash des Rechners abgelegt. Dafür ist es zwingend erforderlich den Funktionsbaustein FB_HVACPersistentDataHandling einmalig im Hauptprogramm, das zyklisch aufgerufen wird, zu instanziieren. Ansonsten wird der instanziierte FB intern nicht freigegeben.

Eine Wertänderung kann vom Gebäudeleitsystem, einem lokalen Bediengerät oder von einem Schreibzugriff von TwinCAT aus erfolgen. Beim Neustart des Rechners werden die gesicherten Daten automatisch vom Flash in den RAM zurück gelesen.

Anwendungsbeispiel: example_persistent.zip

Bei eDataSecurityType:= eHVACDataSecurityType_Idle werden die persistent deklarierten Variablen nicht spannungsausfallsicher gespeichert.

Hinweis

Eine sich zyklisch ändernde Variable darf niemals mit der IN_OUT-Variablen eines Funktionsbausteins verbunden werden, wenn eDataSecurityType:= eHVACDataSecurityType_Persistent ist. Es würde zu einem frühzeitigen Verschleiß des Flashspeichers führen.

eCtrlFct: Mit eCtrlFct = eBARCtrlFct_Heating wird dem Baustein angezeigt, dass es sich um eine Nutzung im Heizbetrieb handelt (siehe E_BARCtrlFct). Bei eCtrlFct = eBARCtrlFct_Cooling wird der Kühlbetrieb angezeigt. Jede andere Eingabe an diesem Eingang ist nicht zulässig und führt zu einer Fehlermeldung. Die beiden möglichen Eingaben dienen der unterschiedlichen Berechnung der Temperaturdifferenz von Raumist- zu Raumsollwert.

bEnable: Ein FALSE-Signal an diesem Eingang unterdrückt das optimierte Einschalten der angeschlossenen Schaltuhren. Der Ausgabewert der Vorstartzeit wird dazu direkt auf "0" gesetzt. Weder wird ein Countdown gestartet, noch eine Adaption ausgeführt - der Baustein wird zurückgesetzt.

bSchedulerActive: Eine steigende Flanke an diesem Eingang startet den internen Countdown der Vorstartzeit. Während der Countdown einer Vorstartzeit abläuft, wird der Ausgang bPrestartMode auf TRUE gesetzt. Wird im Verlauf des Countdowns der Ausgang bSchedulerActive wieder auf FALSE geschaltet, so wird der Countdown unmittelbar unterbrochen und der Ausgang bPrestartMode auf FALSE gesetzt. Der Countdown wird ebenfalls gestoppt und bPrestartMode auf FALSE gesetzt, wenn der Raumsollwert erreicht ist.

bWithAdaption: Wird dieser Eingang zeitgleich mit dem Eingang bSchedulerActive gesetzt, so findet nach Ablauf des Countdowns eine Adaption statt. Hierbei reicht ein Triggerimpuls zusammen mit der steigenden Flanke von bSchedulerActive. Dieser Eingang kann nur in Verbindung mit bSchedulerActive genutzt werden, ein alleiniges Setzen hat keinerlei Auswirkung.

bDisableAdaption: Ein TRUE-Signal an diesem Eingang unterdrückt lediglich die dem Countdown folgende Adaption.

rOutsideTemperature: Außentemperatur in Grad Celsius.

rRoomTemperature: Raumtemperatur in Grad Celsius.

rRoomSetpointValue: Raumtemperatur-Sollwert in Grad Celsius.

VAR_OUTPUT

uiPrestartTime   : UINT;
bPrestartActive  : BOOL;
udiCountdownTime : UDINT;
bError           : BOOL;
udiErrorID       : UDINT;

uiPrestartTime: Ausgabewert der optimierten Vorstartzeit an die betreffenden Schaltuhren in Minuten. Dieser Wert wird kontinuierlich aus der Außentemperatur-abhängigen Vorstartfunktion gebildet. Steht der Eingang bDisableOptimization hingegen auf TRUE ist, so wird dieser Ausgang auf "0" gesetzt.

bPrestartActive: Solange der interne Countdown läuft und nicht durch Ablauf der Vorstartzeit oder Erreichen der Raumsolltemperatur oder Unterbrechung (bSchedulerActive = FALSE) beendet wird, befindet sich der Baustein im Vorstart-Modus. Dies wird durch ein TRUE-Signal an diesem Ausgang angezeigt.

udiCountdownTime: Dieser Ausgang zeigt das Ablaufen des internen Countdowns in Sekunden an. Ist der Baustein nicht mehr im Vorstart-Modus (siehe bPrestartMode), so wird dieser Ausgang auf "0" gesetzt.

bError: Dieser Ausgang wird auf TRUE geschaltet, wenn die eingetragenen Parameter fehlerhaft sind.

udiErrorId: Enthält den Fehlercode, sollten die eingetragenen Werte fehlerhaft sein. Siehe Fehlercodes.

VAR_IN_OUT

Damit die eingetragenen Parameter über einen Steuerungsausfall hinweg erhalten bleiben ist es erforderlich, sie als In-Out-Variablen zu deklarieren. Im Programm wird ihnen dann eine Referenz-Variable zugewiesen. Jede Änderung des Wertes dieser Referenz-Variablen wird im Funktionsbaustein persistent gespeichert und nach einem Steuerungsausfall und -wiederanlauf zurück in die Referenz-Variable geschrieben. Wären die Parameter nur als Eingangsvariablen deklariert, so könnten sie eine Referenzvariable nicht beschreiben.
Anwendungsbeispiel: example_persistent.zip.

uiMaxPrestartTime     : UINT;
rAdaptionFactor       : REAL;
rAdaptionTolerance    : REAL;
stTempChangeFunction  : ST_HVACTempChangeFunction;

uiMaxPrestartTime: Durch die Adaption werden die Vorstartzeiten innerhalb der Temperaturänderungs-Funktion nach unten und nach oben hin verändert. Während sie nach unten sinngemäß automatisch auf 0 Minuten begrenzt sind, lässt sich durch diesen Eingang die Begrenzung nach oben in Minuten festlegen.

rAdaptionFactor: Im Adaptionsschritt wird für die nächst gelegene Außentemperatur-Stützstelle die erfolgte Temperaturänderung ΔT/Δt berechnet. Diese wird jedoch nicht unbedingt zu 100 Prozent als neuer Wert übernommen. Es besteht vielmehr die Möglichkeit den neuen Wert aus einer Gewichtung von altem und berechnetem Wert zu mischen. Der Adaptionsfaktor (in Prozent) stellt dabei die Gewichtung dar.

FB_HVACOptimizedOn 10:

Bei einem Adaptionsfaktor von 100% wird damit der neu berechnete Wert voll übernommen, bei 0% bleibt der alte Wert erhalten.

rAdaptionTolerance: Ist bei eingeschalteter Adaption der Countdown abgelaufen und der Raumsollwert erreicht, so wird keine Adaption durchgeführt, da die Vorstartzeit exakt ausreicht. Der Wert rAdaptionTolerance definiert einen Toleranzbereich: liegt der Istwert im Bereich von rRoomSetpointValue .. rRoomSetpointValue + rAdaptionTolerance, so wird auch dieses als Erreichen des Sollwertes angesehen.

stTempChangeFunction: Strukturvariable vom Typ ST_HVACTempChangeFunction, welche die 10 Wertepaare (Außentemperatur, Innentemperatur-Änderung) enthält. Diese Wertepaare, welche nach aufsteigender Außentemperatur sortiert in der Feldvariable eingetragen sein müssen, definieren die 9 Teilgeraden der Temperaturänderungs-Funktion. Initialeingabe durch FB_HVACTempChangeFunctionEntry.

Voraussetzungen

Entwicklungsumgebung

erforderliche Bibliothek

Erforderliche Function

TwinCAT 3.1 ab Build 4022.16

Tc2_HVAC V3.3.1.0

TF8000 | TC3 HVAC V1.0.0.0