FB_HVACOptimizedOff

FB_HVACOptimizedOff 1:

Funktionsbaustein zum optimierten Ausschalten (Vorstopp) 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 Vorstoppzeit

Gebäude und Gebäudeteile, welche zu einem bestimmten und planbarem Zeitpunkt belegt sind, wie beispielsweise Schulen oder Konferenzräume, müssen nicht über die gesamten Belegt-Zeit beheizt werden. Dadurch, dass die Gebäude die Wärme speichern, ist es möglich, die Heizung etwas früher abzuschalten. Die Raumtemperatur fällt dann bis zum Belegungs-Ende auf ein kaum spürbares niedrigeres Temperaturniveau. Es handelt sich hierbei um ein gewolltes Abfallen auf eine Zieltemperatur - die Abfalldifferenz ist ein Eingangsparameter des Bausteines und wird rRequestedTempDeviation genannt.

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

FB_HVACOptimizedOff 2:

Zur Ermittlung der Vorstoppzeit 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_HVACOptimizedOff 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ßentemperaturbereich 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 Vorstoppzeit ermitteln. Diese Temperaturänderungs-Funktion f(AT) nimmt typischerweise folgenden Verlauf an, wobei die Änderung als Betrag, also positiv dargestellt ist:

FB_HVACOptimizedOff 3:

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

Die Ermittlung der Vorstoppzeit geschieht dann nach folgendem Ablauf:

FB_HVACOptimizedOff 4:

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

Bausteinverknüpfung und Vorstoppphase

Aus diesen Vorgaben wird der Baustein dann kontinuierlich eine Vorstoppzeit berechnen, die er dem Schaltuhrbaustein vorgibt. Soll ein Heizkessel dann beispielsweise um 20 Uhr abends abgeschaltet werden und der Vorstoppbaustein ermittelt um 19 Uhr dass bei Abschalten des Kessels in 60 Minuten das Temperaturniveau um den gewünschten Wert rRequestedTempDeviation abfallen würde, so wird der Heizkessel unmittelbar abgeschaltet. Das Abkühlverhalten wird dann in einem Referenzraum über die Vorstopphase hinweg beobachtet und die Temperaturänderungs-Kurve entsprechend korrigiert.


FB_HVACOptimizedOff 5:

Der Vorstopp-Baustein gibt für die Schaltuhr eineVorstoppzeit an. Schaltet die Schaltuhr den Ausgang bOutput auf FALSE zurück, so wird dem Vorstopp-Baustein dies über seinen Eingang bSchedulerOff angezeigt. Intern startet der Vorstopp-Baustein dann einen Countdown mit der zuvor ausgegebenen Vorstoppzeit uiPrestopTime [min]. Der Countdown läuft entweder bis zum Ende durch oder wird mit Erreichen der gewünschten bzw. tolerierten Raumtemperatur vorzeitig abgeschlossen. Während des Countdowns wird der Ausgang bPrestopActive gesetzt.
Der Ausgang uiPrestopTime folgt kontinuierlich der oben aufgeführten Berechnung - während eines gestarteten Countdowns jedoch wird er konstant gehalten, damit eine Schwankung in der Außentemperatur nicht eine geringere Vorstoppzeit angibt und den Kessel plötzlich wieder eingeschaltet wird.

Teilt der Schaltuhrbaustein dem Optimierungsbaustein bei einem Vorstopp noch den Adaptionsauftrag als Flanke mit (rote Linie), so wird dieser nach der Vorstoppphase entscheiden, ob die zuvor ermittelte Vorstoppzeit innerhalb einer Toleranz genau oder zu klein bzw. zu groß bemessen war und die Temperaturänderungs-Funktion entsprechend korrigieren. Dabei wird die Vorstoppzeit 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.

FB_HVACOptimizedOff 6:

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

Bei gewünschter Adaption muss der Eingang bWithAdaption zeitgleich mit dem Eingang bSchedulerOff gesetzt sein. Für bWithApation reicht dabei ein reiner Triggerimpuls. Ein Abfallen des Einganges bSchedulerOff 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 Vorstoppzeit" ist das ständig aktualisierte Ergebnis der Berechnung nach dem oben aufgeführten Diagramm.

FB_HVACOptimizedOff 7:

FB_HVACOptimizedOff 8:

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

Adaption

Ziel der Adaption ist es, die Temperaturänderungsfunktion derart genau anzupassen, dass in der ermittelten Vorstoppzeit die gewünschte bzw. tolerierte Temperaturabsenkung rRequestedTempDeviation erreicht wird (im Kühlbetrieb wäre es die Temperaturanhebung nach Abschalten der Kühlgeräte).

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

  1. Der Countdown ist abgelaufen und die gewünschte Abweichung rRequestedDeviation ist bis auf eine Toleranz rAdaptionTolerance ausgeschöpft -> es erfolgt keine Adaption.
  2. Der Countdown ist noch nicht abgelaufen, die gewünschte Abweichung rRequestedDeviation jedoch ist überschritten -> die Vorstoppzeit uiPrestopTime war zu hoch.
  3. Der Countdown ist abgelaufen, die gewünschte Abweichung rRequestedDeviation jedoch ist noch nicht ganz ausgeschöpft -> die Vorstoppzeit uiPrestopTime war zu gering, es kann also noch früher abgeschaltet werden.

FB_HVACOptimizedOff 9:

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: "gewünschte Abweichung rRequestedDeviation" / "bislang abgelaufene Zeit"
  3. zu wenig Zeit war berechnet - neuer Wert: ("gewünschte Abweichung rRequestedDeviation" -"Abweichung 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_HVACOptimizedOff 10:

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

FB_HVACOptimizedOff 11:

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

VAR_INPUT

eDataSecurityType       : E_HVACDataSecurityType;
eCtrlFct                : E_BARCtrlFct;
bEnable                 : BOOL;
bSchedulerOff           : BOOL;
bWithAdaption           : BOOL;
bDisableAdaption        : BOOL;
rOutsideTemperature     : REAL;
rRoomTemperature        : REAL;
rRequestedTempDeviation : 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 Bewertung der Abweichung rRequestedTempDeviation.

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

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

bWithAdaption: Wird dieser Eingang zeitgleich mit dem Eingang bSchedulerOff gesetzt, so findet nach Ablauf des Countdowns eine Adaption statt. Hierbei reicht ein Triggerimpuls zusammen mit der steigenden Flanke von bSchedulerOff. Dieser Eingang kann nur in Verbindung mit bSchedulerOff 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.

rRequestedTempDeviation: Tolerierte Temperaturabweichung nach unten (Heizbetrieb) oder nach oben (Kühlbetrieb) nach dem Abschalten des Kessels bzw. der Klimaanlage bis zum Verlassen des Raumes.

VAR_OUTPUT

uiPrestopTime      : UINT;
bPrestopActive     : BOOL;
udiCountdownTime   : UDINT;
bError             : BOOL;
udiErrorID         : UDINT;

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

bPrestopActive: Solange der interne Countdown läuft und nicht durch Ablauf der Vorstoppzeit oder Erreichen der Raumsolltemperatur oder Unterbrechung (bSchedulerOff = FALSE) beendet wird, befindet sich der Baustein im Vorstopp-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 Vorstopp-Modus (siehe bPrestopMode), 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.

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

uiMaxPrestopTime: Durch die Adaption werden die Vorstoppzeiten 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_HVACOptimizedOff 12:

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 die gewünschte Abweichung rRequestedDeviation ausgeschöpft, so wird keine Adaption durchgeführt, da die Vorstoppzeit exakt ausreicht. Der Wert rAdaptionTolerance definiert einen zusätzlichen Toleranzbereich:

FB_HVACOptimizedOff 13:

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