FB_HVACI_CtrlStep
Anwendung
Anwendung
Der Funktionsbaustein dient zur sequentiellen Folgesteuerung von Leistungserzeugern.
In Verbindung mit der Leistungsstufentabelle FB_HVACPowerRangeTable kann der Leistungsstufenregler für die stufige Regelung mehrerer Heizkessel, Kältemaschinen oder Rückkühlwerke eingesetzt werden.
Das Hoch- oder Runterschalten in die nächst höhere oder niedrigere Leistungsstufe erfolgt über ein Integral (rW - rX) und einer Zeitverzögerung. Zuerst muss der Temperaturistwert rX einen Schwellwert rW_High / rW_Low über- oder unterschritten haben. Anschliessend startet das Integral. Wird an dem Ausgang rI_Ctrl der obere oder untere Grenzwert (rIntegralHigh / rIntegralLow) erreicht, so wird ein Zeitglied gestartet, nach dessen Ablauf (udiSecRT_DelayHigh / udiSecRT_DelayLow)der Ausgang iStep in- oder dekrementiert wird, sieheProgrammablaufdarstellung als Diagramm
![]() | Eine eingestellte Integrationszeit udiSecTiHigh/udiSecTiLow = 60 Sekunden heisst, dass das I-Übertragungsglied sich um ein Kelvin pro Minute ändert. Bei einer Regelabweichung rE = 5 hat der Ausgang des I-Übertragungsgliedes rI_Ctrl nach einer Minute den Wert 5. Beispiel: bDirection = FALSE; udiSecTiLow = 60; rE = 2; rIntegralLow = 10 Bei der bleibenden Regelabweichung von 2 und der unteren Integralgrenze von 10 ist nach 5 Minuten rI_Ctrl = rIntegralLow. Dieses hat zur Folge, dass ein Zeitglied mit der Verzögerungszeit udiSecDelayLow gestartet wird. Nach dessen Ablauf (udiSecRT_DelayHigh / udiSecRT_DelayLow) wird der Ausgang iStep um 1 inkrementiert und das I-Übertragungsglied und die Zeitverzögerungen werden zurück gesetzt. |
![]() | iStep wird für einen SPS-Zyklus auf 1 gesetzt, wenn bEnable = TRUE, bError = FALSE, eCtrlMode = eHVACCtrlMode_AutoANDiNumberOfStepInProfile > 0 ist. |
Bedingungen
Das I-Übertragungsglied wird freigegeben, wenn
bEnable = TRUEAND NOTbErrorANDeCtrlMode = eHVACCtrlMode_AutoAND NOTbBlock
(
(rX >= rW_HighAND ((iStep > 0 ANDNOTbDirection) OR (iStep < iNumberOfStepInProfileANDbDirection))
OR
(rX < rW_LowAND ((iStep < iNumberOfStepInProfileANDNOTbDirection) OR (iStep > 0 ANDbDirection))
)
ist. Ist rI_Ctrl =rIntegralHigh / rIntegralLow, so werden die Zeitglieder der Verzögerungszeiten udiSecDelayHigh / udiSecDelayLow aktiviert. Nach Ablauf einer der Verzögerungszeiten udiSecRT_DelayHigh / udiSecRT_DelayLow werden die Stufen der Leistungsstufensequenz folgendermaßen gesteuert:
iStep = iStep + 1 wenn
(rX < rW_LowANDiStep < iNumberOfStepInProfileANDNOTbDirection)
OR
(rX >= rW_HighANDiStep < iNumberOfStepInProfileANDbDirection)
iStep = iStep - 1 wenn
(rX < rW_LowANDiStep > 0 ANDbDirection)
OR
(rX >= rW_HighANDiStep > 0 ANDNOTbDirection)
![]() | Nach jeder Änderung von iStep wird das I-Übertragungsglied und die internen Zeitverzögerungen (udiSecDelayLow, udiSecDelayHigh) zurück gesetzt. |
Übertragungsfunktion des I-Übertragungsglied (I_Ctrl)
Programmablaufplan
Programmablaufplan
Programmablaufdarstellung als Diagramm
Programmablaufdarstellung als Diagramm

Verhalten der verschiedenen Variablen
Verhalten der verschiedenen Variablen
Im Bild ist dargestellt wann welche Variablen wie zum Einsatz kommen.

Das Anwendungsbeispiel zeigt den Funktionsbaustein FB_HVACI_CtrlStep in Verbindung mit der Leistungsstufentabelle FB_HVACPowerRangeTable. Das Beispiel liegt in den Programmiersprachen ST und CFC vor. Das Programmbeispiel P_CFC_I_CtrlStep.PRG in CFC ist im Ordner Language CFC > Controller, das Programmbeispiel P_ST_I_CtrlStep.PRG in ST ist im Ordner Language Structure Text > Controller.
VAR_INPUT
eDataSecurityType : E_HVACDataSecurityType;
bSetDefault : BOOL;
bEnable : BOOL;
rW : REAL;
rX : REAL;
eCtrlMode : E_HVACCtrlMode;
iManualStep : INT; 0..iNumberOfStepInProfile
bStepUp : BOOL;
bStepDown : BOOL;
bDirection : BOOL;
iNumberOfStepInProfile: INT; 0..g_iMaxNumberOfSteps
bBlock : BOOL;
bReset : BOOL;
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 instanzieren. Ansonsten wird der instanzierte 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. |
bSetDefault: Wenn die Variable TRUE ist, werden die Default-Werte der VAR_IN_OUT Variablen übernommen.
bEnable: Über ein TRUE wird der Funktionsbaustein freigegeben. Ist bEnable = FALSE, so wird iStep konstant auf 0 gesetzt. Die Überprüfung der Variable iNumberOfStepInProfile ist weiterhin aktiv. Falls dort ein Fehler auftritt, so wird dieses mit bError = TRUE angezeigt und kann nach Behebung des Fehlers mit bReset quittiert werden.
rW: Mit der Variablen rW wird der Sollwert übergeben.
rX: Mit der Variablen rX wird der Istwert übergeben.
eCtrlMode: Enum, welches die Betriebsart des Funktionsbausteins vorgibt. Ist bEnable = TRUEANDbError = FALSEANDeCtrlMode = eHVACCtrlMode_ManualANDiNumberOfStepInProfile > 0, so kann der Wert des Ausgangs iStep über iManualStep vorgeben werden. Beim Starten der PLC ist eCtrlMode = eHVACCtrlMode_Auto.
iManualStep: Ist die Betriebsart eCtrlMode = eHVACCtrlMode_ManualANDbEnable = TRUEANDbError = FALSEANDiNumberOfStepInProfile > 0, so kann der Wert des Ausgangs iStep über iManualStep vorgeben werden. Der Eingabebereich von iManualStep kann maximal den Wert von iNumberOfStepInProfile haben und minimal 0 sein.
bStepUp: Ist bEnable = TRUEANDbError = FALSEANDeCtrlMode = eHVACCtrlMode_AutoANDbBlock=FALSE, so kann über eine steigende Flanke an dem Eingang bStepUp der Wert des Ausgangs iStep um 1 erhöht werden. Dieses kann so oft wiederholt werden bis iStep = iNumberOfStepInProfile ist.
bStepDown: Ist bEnable = TRUEANDbError = FALSEANDeCtrlMode = eHVACCtrlMode_AutoANDbBlock=FALSE, so kann über eine steigende Flanke an dem Eingang bStepDown der Wert des Ausgangs iStep um 1 erniedrigt werden. Dieses kann so oft wiederholt werden bis iStep = 0 ist.
bDirection: Mit bDirection wird der Wirksinn des Funktionsbausteins bestimmt. FALSE = Heizbetrieb; TRUE = Kühlbetrieb
iNumberOfStepInProfile: Anzahl der Stufen in der Leistungsstufensequenz. iNumberOfStepInProfile kann minimal 0 und maximal g_iMaxNumberOfSteps sein. Werden die Grenzwerte nicht eingehalten, so wird ein Fehler ausgegeben und mit bError = TRUE angezeigt und iStep wird = 0.
bBlock: Mittels der Eingangsvariable bBlock kann die Regelung des Funktionsbausteins entweder frei gegeben werden oder der Ausgang iStep wird auf den Wert der Variablen iNumberOfStepInProfile fixiert.
Ist bEnable = TRUEANDbError = FALSEANDeCtrlMode = eHVACCtrlMode_AutoANDbBlock=FALSE, so ist das I-Übertragungsglied und die internen Zeitglieder zur Steuerung des Ausgangs iStep frei gegeben.
Ist bEnable = TRUEANDbError = FALSEANDeCtrlMode = eHVACCtrlMode_AutoANDbBlock=TRUE, so ist das I-Übertragungsglied und die internen Zeitglieder gesperrt und iStep = iNumberOfStepInProfile.
bReset: Eingang zur Quittierung der Störungen nach deren Behebung. Intern wird auf eine steigende Flanke reagiert.
VAR_OUTPUT
iStep : INT; 0..iNumberOfStepInProfile
rI_Ctrl : REAL;
rE : REAL;
rW_High : REAL;
rW_Low : REAL;
b_rW_High : BOOL;
b_rW_Low : BOOL;
udiSecRT_DelayHigh : UDINT; Second Remaining Time Delay High
udiSecRT_DelayLow : UDINT; Second Remaining Time Delay Low
bError : BOOL;
eErrorCode : E_HVACErrorCodes;
iStep: Mit der Ausgangsvariablen iStep wird die Stufe in einer Leistungsstufensequenz angegeben. Beim Aufstarten des Funktionsbaustein ist iStep = 1, wenn bEnable = TRUE, bError = FALSE,eCtrlMode = eHVACCtrlMode_AutoANDiNumberOfStepInProfile > 0 ist. iStep kann maximal den Wert von iNumberOfStepInProfile erreichen und minimal 0 sein.
Der Wert von iStep kann manuell über iManualStep vorgegeben werden, wenn bEnable = TRUE, bError = FALSEANDeCtrlMode = eHVACCtrlMode_Manual ist.
Über die Eingangsvariablen bStepUp / bStepDown kann der Wert von iStep in- oder dekrementiert werden, wenn bEnable = TRUE, bError = FALSE, eCtrlMode = eHVACCtrlMode_AutoANDbBlock = FALSE ist.
Ist bEnable = TRUE, bError = FALSE, eCtrlMode = eHVACCtrlMode_AutoANDbBlock = FALSE und der Wert von iStep hat sich geändert, so werden die Verzögerungszeitglieder und das I-Übertragungsglied zurück gesetzt.
Ist bEnable = TRUE, bError = FALSE, eCtrlMode = eHVACCtrlMode_Auto, bBlock = FALSEANDiNumberOfStepInProfile > 0, der Ausgang des I-Übertragungsglieds rI_Ctrl =rIntegralHigh oder rIntegralLow und eine der Verzögerungszeiten tRemainingTimeDelayHigh / tRemainingTimeDelayLow =T#0s, so wird der Ausgang iStep folgendermaßen gesteuert:
iStep = iStep + 1 wenn
(rX < rW_LowANDiStep < iNumberOfStepInProfile ANDNOTbDirection)
OR
(rX >= rW_HighANDiStep < iNumberOfStepInProfile ANDbDirection) ist.
iStep = iStep - 1 wenn
(rX < rW_LowANDiStep > 0 ANDbDirection)
OR
(rX >= rW_HighANDiStep > 0 ANDNOTbDirection) ist, siehe Programmablaufplan
Ist bEnable = TRUEANDbError = FALSEANDeCtrlMode = eHVACCtrlMode_AutoANDbBlock=TRUE, so sind die internen Zeitglieder und das I-Übertragungsglied gesperrt und iStep = iNumberOfStepInProfile.
rI_Ctrl: Ausgang des I-Übertragungsgliedes.
Ist rI_Ctrl >= rIntegralHigh oderrIntegralLow und tRemainingTimeDelayHigh oder tRemainingTimeDelayLow = T#0s, so wird über iStep die Nummer der Stufen um eins erhöht oder erniedrigt. Anschliessend wird das I-Übertragungsglied und die Zeitglieder für das Hoch- und Runterschalten zurück gesetzt, so dass das Hoch- oder Runterschalten neu gestartet werden, siehe Programmablaufplan.
rE: Regelabweichung mit der das interne I-Übertragungsglied arbeitet: rE = rW - rX
rW_High: rW_High := rW + rHysteresisHigh - obere Sollwertgrenze nach dessen Überschreitung durch rX zuerst das I-Übertragungsglied aktiviert wird und anschliessend das Zeitglied der Verzögerungszeit udiSecDelayHigh, siehe Anwendung oder Verhalten verschiedener Variablen.
rW_Low: rW_Low := rW - rHysteresisLow - untere Sollwertgrenze nach dessen Unterschreitung durch rX zuerst das I-Übertragungsglied aktiviert wird und anschliessend das Zeitglied der Verzögerungszeit udiSecDelayLow, siehe Anwendung oder Verhalten verschiedener Variablen.
b_rW_High: b_rW_High wird TRUE, wenn rX > rW_High ist.
b_rW_Low: b_rW_Low wird TRUE, wenn rX < rW_Low ist.
udiSecRT_DelayHigh: Verbleibende Zeit der Verzögerungszeit udiSecDelayHigh.
udiSecRT_DelayLow: Verbleibende Zeit der Verzögerungszeit udiSecDelayLow.
bError: Der Ausgang signalisiert mit einem TRUE, dass ein Fehler anliegt und ein falscher Parameter an der Variable iNumberOfStepInProfile anliegt. iStep wird konstant auf 0 gesetzt und das Enum eErrorCode zeigt die Fehlernummer an. Nach Behebung des Fehlers muss die Meldung bError mit bReset quittiert werden.
eErrorCode:Liefert bei einem gesetzten bError-Ausgang die Fehlernummer. Folgender Fehler kann in diesem Funktionsbaustein vorkommen: eHVACErrorCodes_InvalidParam_NumberOfStepInProfile
![]() | Um in der SPS an die Fehlernummern des Enums zu gelangen, kann eErrorCode einer Variablen vom Datentyp WORD zugewiesen werden.eHVACErrorCodes_Error_iNumberOfStepInProfil= 32 |
VAR_IN_OUT
rHysteresisHigh : REAL;
rHysteresisLow : REAL;
udiSecDelayHigh : UDINT;
udiSecDelayLow : UDINT;
udiSecTiHigh : UDINT;
udiSecTiLow : UDINT;
rIntegralHigh : REAL;
rIntegralLow : REAL;
rHysteresisHigh: Positiver Wert der oberen Grenze der Regelabweichung, siehe Anwendung oder Verhalten verschiedener Variablen. rW_High := rW + rHysteresisHigh. Die Variable wird persistent gespeichert. Voreingestellt auf 5.
rHysteresisLow: Positiver Wert der unteren Grenze der Regelabweichung, siehe Anwendung oder Verhalten verschiedener Variablen. rW_Low := rW – rHysteresisLow. Die Variable wird persistent gespeichert. Voreingestellt auf 5.
udiSecDelayHigh: Verzögerungszeit nach deren Ablauf iStep in- oder dekrementiert, siehe Anwendung oder Verhalten verschiedener Variablen. Die Variable wird persistent gespeichert. Voreingestellt auf 300s.
udiSecDelayLow: Verzögerungszeit nach deren Ablauf iStep in- oder dekrementiert, siehe Anwendung oder Verhalten verschiedener Variablen. Die Variable wird persistent gespeichert. Voreingestellt auf 300s.
udiSecTiHigh: Integrationszeit für das obere Limit des I-Übertragungsgliedes in Sekunden, siehe Anwendung oder Verhalten verschiedener Variablen. udiSecTiHigh muss > 0 sein. Ansonsten wird intern mit dem Default-Wert oder dem letzten gültigen Variablenwert gearbeitet. Die Variable wird persistent gespeichert. Voreingestellt auf 60s.
udiSecTiLow: Integrationszeit für das untere Limit des I-Übertragungsgliedes, siehe Anwendung oder Verhalten verschiedener Variablen. udiSecTiLow muss > 0 sein. Ansonsten wird intern mit dem Default-Wert oder dem letzten gültigen Variablenwert gearbeitet. Die Variable wird persistent gespeichert. Voreingestellt auf 60s.
rIntegralHigh: Positiver Wert für das obere Limit an dem die Integration des I-Übertragungsgliedes angehalten wird (ARW-Maßnahme, anti-reset-windup) und eine der Verzögerungszeiten startet, siehe Anwendung oder Verhalten verschiedener Variablen. Die Variable wird persistent gespeichert. Voreingestellt auf 15.
rIntegralLow: Positiver Wert für das untere Limit an dem die Integration des I-Übertragungsgliedes angehalten wird (ARW-Maßnahme, anti-reset-windup) und eine der Verzögerungszeiten startet, siehe Anwendung oder Verhalten verschiedener Variablen. Die Variable wird persistent gespeichert. Voreingestellt auf 15.