FB_HVAC2PointCtrlSequence

FB_HVAC2PointCtrlSequence 1:

Dieser Funktionsbaustein stellt einen 2-Punkt-Sequenzregler dar. Er dient zur sequenziellen stufigen Regelung von unstetigen Aggregaten. Er kann z.B. bei Kesselkaskaden und bei Sequenzen von Kältemaschine oder Rückkühlwerken zur Regelung der Leistungsstufen verwendet werden. Für jede Leistungsstufe wird eine Instanz des Funktionsbausteins verwendet.

FB_HVAC2PointCtrlSequence 2:

Der FB_HVAC2PointCtrlSequence kann z.B. in einer Reglersequenz mit den anderen Sequenzreglern aus der TcHVAC.lib eingesetzt werden.

Je nach Anwendung kann es vorkommen, dass zum Erreichen einer Regelgröße mehrere Stellglieder (Stufen) verwendet werden, die in einer so genannten Regelsequenz arbeiten. In der unten dargestellten Regelsequenz werden vier Stufen über den jeweiligen Ausgang bOut = TRUE des FB_HVAC2PointCtrlSequence freigegeben. Bei aktiver Regelung ist immer nur einer der 2Punkt-Sequenzregler aktiv. Die Ausgänge der nicht aktiven 2-Punkt Sequenzregler werden fixiert. Das bedeutet in Abhängigkeit des Wirksinns bDirection des einzelnen Reglers entweder das bOut = TRUE oder FALSE ist.

Wenn die Wirkung der aktiven Stufe im eingeschalteten Zustand nicht ausreicht, schaltet der aktive 2Punktregler auf den in der Reglersequenz rechts oder links benachbarten 2Punkt-Sequenzregler über iCurrentSequence um. Dieser übernimmt damit die Regelung/Steuerung der Stufen. Der zuvor aktive Regler verharrt je nach Wirksinn in der Endlage bOut = TRUE oder FALSE.

Übertragungsfunktion des internen I-Übertragungsglied

FB_HVAC2PointCtrlSequence 3:

Mit der internen AND-Verknüpfung des I-Übertragungsglieds bestehend aus (tCtrl_I_Ti_HighLimit, tCtrl_I_Ti_LowLimit, rCtrl_I_HighLimit, rCtrl_I_LowLimit, st2PointCtrlSequence.rCtrl_I_Out) und den Verzögerungszeiten tDelayIncreaseSequence/tDelayDecreaseSequence wird das Umschalten in der Regelsequenz über iCurrentSequence nach rechts oder links gesteuert. Welcher Sequenzregler gerade aktiv ist, wird durch bActiveCtrl = TRUE (iCurrentSequence = iMyNumberInSequence) angezeigt.

Das I-Übertragungsglied und die Zeitglieder der Verzögerungszeiten tDelayIncreaseSequence/tDelayDecreaseSequence werden aktiviert, wenn

bActiveCtrl = TRUE AND
( (*Decrease*)
(
rX
> st2PointCtrlSequence.rW_Max AND ((iMyNumberInSequence <= 1) = FALSE) AND
(
(bDirection = TRUE AND bOut = TRUE) OR
(bDirection = FALSE AND bOut = FALSE)
)
)
OR
( (*Increase*)
rX < st2PointCtrlSequence.rW_Min AND((iMyNumberInSequence >= iNumberOfSequences) = FALSE) AND
(
(bDirection = FALSE AND bOut = TRUE) OR
(bDirection = TRUE AND bOut = FALSE)
)
)
)

Nachdem das I-Übertragungsglied (st2PointCtrlSequence.rCtrl_I_Out Ausgang des internen I-Übertragungsgliedes) UND die Zeitglieder der Verzögerungszeiten tDelayIncreaseSequence/tDelayDecreaseSequence aktiviert wurden, wird das Umschalten in der Regelsequenz über iCurrentSequence nach rechts oder links folgendermaßen gesteuert:

iCurrentSequence = iCurrentSequence - 1 wenn st2PointCtrlSequence.rCtrl_I_Out <= st2PointCtrlSequence.rCtrl_I_LowLimitUNDst2PointCtrlSequence.tRemainingTimeDecreaseSequence = T#0s.

iCurrentSequence = iCurrentSequence + 1 wenn st2PointCtrlSequence.rCtrl_I_Out >= st2PointCtrlSequence.rCtrl_I_HighLimitUNDst2PointCtrlSequence.tRemainingTimeIncreaseSequence = T#0s.

Verhalten der Ausgänge von vier FB_HVAC2PointCtrlSequence in einer Regelsequenz

FB_HVAC2PointCtrlSequence 4:
FB_HVAC2PointCtrlSequence 5:

In der oben dargestellten Regelsequenz von vier FB_HVAC2PointCtrlSequence-Reglern darf es bei der Vergabe von iMyNumberInSequence (1,2,3,4) und iNumberOfSequence (4) keine Lücke in der Folge geben, da ansonsten das automatische Umschalten der Regler vom aktiven auf den in der Regelsequenz rechts oder links benachbarten Regler nicht funktioniert.

FB_HVAC2PointCtrlSequence 6:

Ist bEnable =FALSE ODER bError = TRUE ODER (e2PointCtrlMode =eHVAC2PointCtrlMode_On_BMS ODER eHVAC2PointCtrlMode_On_OP ODER eHVAC2PointCtrlMode_Off_BMS ODER eHVAC2PointCtrlMode_Off_OP), so ist das automatische Umschalten der Regler vom aktiven auf den in der Regelsequenz rechts oder links benachbarten Regler weiterhin in Betrieb. Daher ist der Umschaltbetrieb immer aktiv. Mit bActiveCtrl = TRUE wird der aktive Funktionsbaustein angezeigt. Außerdem wird in Abhängigkeit der Regelabweichung rE das Rauf- oder Runterschalten der Sequenz über iCurrentSequence direkt ausgeführt. Wenn rX >= rW, dann ist iCurrentSequence = iCurrentSequence - 1. Wenn rX < rW, dann ist iCurrentSequence = iCurrentSequence + 1.

VAR_INPUT

eDataSecurityType  : E_HVACDataSecurityType;
bSetDefault        : BOOL;
bEnable            : BOOL;
e2PointCtrlMode    : E_HVAC2PointCtrlMode;
bDirection         : BOOL;
rW                 : REAL;
rX                 : REAL;
iNumberOfSequences : INT;
iMyNumberInSequence: INT;
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 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.

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 ist der 2-Punkt-Sequenzregler deaktiviert. Die Überprüfung der Variablen iNumberOfSequences, iMyNumberInSequence, iCurrentSequence und tTi_Ctrl_I ist dennoch aktiv. Falls dort ein Fehler auftritt, so wird dieses mit bError = TRUE angezeigt und kann nach Behebung des Fehlers mit bReset quittiert werden.

e2PointCtrlMode: Enum, welches die Betriebsart des 2-Punkt-Sequenzreglers vorgibt (siehe E_HVAC2PointCtrlMode). Ist bEnable = TRUE AND bError = FALSE, so kann der Ausgang bOut direkt über das Enum ein- oder ausgeschaltet werden. Beim Starten der PLC ist e2PointCtrlMode = eHVAC2PointCtrlMode_Auto_BMS.
Das Rauf- oder Runterschalten der Sequenz über iCurrentSequence ist nicht abhängig von der Betriebsart e2PointCtrlMode des 2-Punkt-Sequenzreglers.

bDirection: Mit bDirection wird der Wirksinn des internen 2 Punkt Reglers bestimmt. FALSE = Heizbetrieb; TRUE = Kühlbetrieb.

rW: Mit der Variablen rW wird der Sollwert übergeben.

rX: Mit der Variablen rX wird der Istwert übergeben.

iNumberOfSequences: Anzahl der Regler in der Sequenz (1..32). Ist iNumberOfSequences <= 0, so wird ein Fehler ausgegeben und mit bError = TRUE angezeigt. Die Anzahl der Teilnehmer in einer Sequenz wird von dem aktiven Sequenzregler über iCurrentSequence nicht überschritten.

iMyNumberInSequence: Die eigene Nummer des 2Punkt-Reglers in der Sequenz (1..32). Ist iMyNumberInSequence > iNumberOfSequencesORiMyNumberInSequence <= 0, so wird ein Fehler ausgegeben und mit bError = TRUE angezeigt.

bReset: Eingang zur Quittierung der Störungen nach deren Behebung. Intern wird auf eine steigende Flanke reagiert.

VAR_OUTPUT

bOut                  : BOOL;
bActiveCtrl           : BOOL;
b_rW_Max              : BOOL;
b_rW_Min              : BOOL;
rE                    : REAL;
e2PointCtrlState      : E_HVAC2PointCtrlMode;
st2PointCtrlSequence  : ST_HVAC2PointCtrlSequence;
bError                : BOOL;
eErrorCode            : E_HVACErrorCodes;

bOut: Ausgang des 2-Punkt-Sequenzreglers.

bOut wird TRUE, wenn

1.
bEnable = TRUE AND bError = FALSE AND
( e2PointCtrlMode = eHVAC2PointCtrlMode_Auto_BMS OR e2PointCtrlMode = eHVAC2PointCtrlMode_Auto_OP ) AND
bActiveCtrl
= TRUE AND
(
(bDirection = TRUE AND ( rX > st2PointCtrlSequence.rW_Max )) OR ( bDirection = FALSE AND ( rX < st2PointCtrlSequence.rW_Min ))
)

2.
bEnable = TRUE AND bError = FALSE AND
( e2PointCtrlMode = eHVAC2PointCtrlMode_Auto_BMS OR e2PointCtrlMode = eHVAC2PointCtrlMode_Auto_OP ) AND
(
( bDirection = TRUE AND ( iCurrentSequence < iMyNumberInSequence )) OR ( bDirection = FALSE AND ( iCurrentSequence > iMyNumberInSequence ))
)

3.
bEnable = TRUE AND bError = FALSE AND
( e2PointCtrlMode = eHVAC2PointCtrlMode_On_BMS OR e2PointCtrlMode = eHVAC2PointCtrlMode_On_OP )

bOut wird FALSE, wenn

1.
bEnable = FALSE OR bError = TRUE

2.
bEnable = TRUE AND bError = FALSE AND
( e2PointCtrlMode = eHVAC2PointCtrlMode_Auto_BMS OR e2PointCtrlMode = eHVAC2PointCtrlMode_Auto_OP ) AND
bActiveCtrl
= TRUE AND
(
( bDirection = TRUE AND ( rX < st2PointCtrlSequence.rW_Min )) OR ( bDirection = FALSE AND ( rX > st2PointCtrlSequence.rW_Max ))
)

3.
bEnable = TRUE AND bError = FALSE AND
( e2PointCtrlMode = eHVAC2PointCtrlMode_Auto_BMS OR e2PointCtrlMode = eHVAC2PointCtrlMode_Auto_OP ) AND
(
( bDirection = TRUE AND ( iCurrentSequence > iMyNumberInSequence )) OR ( bDirection = FALSE AND ( iCurrentSequence < iMyNumberInSequence ))
)

4.
bEnable = TRUE AND bError = FALSE AND
( e2PointCtrlMode = eHVAC2PointCtrlMode_Off_BMS OR e2PointCtrlMode = eHVAC2PointCtrlMode_Off_OP )

bActiveCtrl: bActiveCtrl zeigt mit einem TRUE an, dass der Funktionsbaustein der aktive in der Sequenz ist. bActiveCtrl wird TRUE, wenn bEnable = TRUE, bError = FALSE AND iCurrentSequence = iMyNumberInSequence ist.

b_rW_Max: b_rW_Max wird TRUE, wenn rX > st2PointCtrlSequence.rW_Max ist.

b_rW_Min: b_rW_Min wird TRUE, wenn rX < st2PointCtrlSequence.rW_Min ist.

rE: Regelabweichung: rE = rW - rX

e2PointCtrlState: Enum, welches den Status der Betriebsart e2PointCtrlModedes 2-Punkt-Sequenzreglers anzeigt (siehe E_HVAC2PointCtrlMode).

st2PointCtrlSequence: Die Struktur zeigt diverse Status, Ein- und Ausgänge des Funktionsbausteins an (siehe ST_HVAC2PointCtrlSequence). Außerdem werden die verbleibenden Zeiten der VAR_IN_OUT-Variablen tDelayIncreaseSequence und tDelayDecreaseSequence ausgegeben, wenn deren Funktion aktiv ist. Über st2PointCtrlSequence.rCtrl_I_Out wird das Ausgangssignal des internes I-Übertragungsglied angezeigt.

st2PointCtrlSequence.tRemainingTimeIncreaseSequence: Verbleibende Zeit der Verzögerungszeit tDelayIncreaseSequence.

st2PointCtrlSequence.tRemainingTimeDecreaseSequence: Verbleibende Zeit der Verzögerungszeit tDelayDecreaseSequence.

st2PointCtrlSequence.rX: Status von rX.

st2PointCtrlSequence.rW_Max: st2PointCtrlSequence.rW_Max := rW + rW_HighLimit - obere Sollwertgrenze nach dessen Überschreitung durch rX das interne I-Übertragungsglied und die Zeitglieder der Verzögerungszeiten tDelayIncreaseSequence/tDelayDecreaseSequence aktiviert bzw. deaktiviert werden können, siehe Übertragungsfunktion des internen I-Übertragungsglied in diesem Dokument

st2PointCtrlSequence.rW_Min: st2PointCtrlSequence.rW_Min := rW - rW_LowLimit - untere Sollwertgrenze nach dessen Unterschreitung durch rX das interne I-Übertragungsglied und die Zeitglieder der Verzögerungszeiten tDelayIncreaseSequence/tDelayDecreaseSequence aktiviert bzw. deaktiviert werden können, siehe Übertragungsfunktion des internen I-Übertragungsglied in diesem Dokument

st2PointCtrlSequence.rE: Regelabweichung: rE = rW - rX

st2PointCtrlSequence.rCtrl_I_HighLimit: Oberer Grenzwert an dem die Integration des internen I-Übertragungsgliedes angehalten wird. st2PointCtrlSequence.rCtrl_I_HighLimit = rCtrl_I_HighLimit

st2PointCtrlSequence.rCtrl_I_LowLimit: Unterer Grenzwert an dem die Integration des internen I-Übertragungsgliedes angehalten wird. st2PointCtrlSequence.rCtrl_I_Low = rCtrl_I_LowLimit * (-1)

st2PointCtrlSequence.rCtrl_I_Out: Ausgang des internen I-Übertragungsgliedes.
Ist st2PointCtrlSequence.rCtrl_I_Out = st2PointCtrlSequence.rCtrl_I_HighLimit ODER
st2PointCtrlSequence.rCtrl_I_LowLimit
UND
entweder st2PointCtrlSequence.tRemainingTimeIncreaseSequence ODER
st2PointCtrlSequence.tRemainingTimeDecreaseSequence
= T#0s UND
ist bActive = TRUE, so wird die Nummer des aktiven Reglers iCurrentSequence in Abhängigkeit von bDirection um eins erhöht oder erniedrigt.

st2PointCtrlSequence.e2PointCtrlState: siehe e2PointCtrlState

st2PointCtrlSequence.iNumberOfSequences: siehe iNumberOfSequences

st2PointCtrlSequence.iMyNumberInSequence: siehe iMyNumberInSequence

st2PointCtrlSequence.iCurrentSequence: siehe iCurrentSequence

st2PointCtrlSequence.bEnable: siehe bEnable

st2PointCtrlSequence.bError: siehe bError

st2PointCtrlSequence.bOut: siehe bOut

st2PointCtrlSequence.bActiveCtrl: siehe bActiveCtrl

st2PointCtrlSequence.b_rW_Max: siehe b_rW_Max

st2PointCtrlSequence.b_rW_Min: siehe b_rW_Min

bError: Der Ausgang signalisiert mit einem TRUE, dass ein Fehler anliegt und ein falscher Parameter an einer der Variablen iNumberOfSequences, iMyNumberInSequence oder iCurrentSequence anliegt. Nach Behebung des Fehlers muss die Meldung bError mit bReset quittiert werden. Das Enum eErrorCode zeigt die Fehlernummer an. Ist bError = TRUE, so wird der Ausgang bOut = FALSE.

eErrorCode:Liefert bei einem gesetzten bError-Ausgang die Fehlernummer (siehe E_HVACErrorCodes). Folgende Fehler können in diesem Funktionsbaustein vorkommen: eHVACErrorCodes_Error_iMyNumberInSequence, eHVACErrorCodes_Error_iNumberOfSequences, eHVACErrorCodes_Error_iCurrentSequences

FB_HVAC2PointCtrlSequence 7:

Um in der SPS an die Fehlernummern des Enums zu gelangen, kann eErrorCode einer Variablen vom Datentyp WORD zugewiesen werden.
eHVACErrorCodes_Error_iNumberOfSequences = 27 eHVACErrorCodes_Error_iMyNumberInSequence = 28 eHVACErrorCodes_Error_iCurrentSequences = 29

VAR_IN_OUT

rW_HighLimit            : REAL;
rW_LowLimit             : REAL;
tDelayIncreaseSequence  : TIME;
tDelayDecreaseSequence  : TIME;
tCtrl_I_Ti_HighLimit    : TIME;
tCtrl_I_Ti_LowLimit     : TIME;
rCtrl_I_HighLimit       : REAL;
rCtrl_I_LowLimit        : REAL;
iCurrentSequence        : INT;

rW_HighLimit: Positiver Wert der oberen Grenze der Regelabweichung. st2PointCtrlSequence.rW_Max =rW_Max := rW + rW_HighLimit.
Die Variable wird persistent gespeichert. Voreingestellt auf 5.

rW_LowLimit: Positiver Wert der unteren Grenze der Regelabweichung. st2PointCtrlSequence.rW_Min =rW_Min := rW - rW_LowLimit.
Die Variable wird persistent gespeichert. Voreingestellt auf 5.

tDelayIncreaseSequence: Verzögerungszeit nach deren Ablauf iCurrentSequence um 1 erhöht wird, siehe Übertragungsfunktion des internen I-Übertragungsglied in diesem Dokument.
Die Variable wird persistent gespeichert. Voreingestellt auf 5min.

tDelayDecreaseSequence: Verzögerungszeit nach deren Ablauf iCurrentSequence um 1 erniedrigt wird, siehe Übertragungsfunktion des internen I-Übertragungsglied in diesem Dokument.
Die Variable wird persistent gespeichert. Voreingestellt auf 5min.

tCtrl_I_Ti_HighLimit: Integrationszeit für das obere Limit des internen I-Übertragungsgliedes, siehe Übertragungsfunktion des internen I-Übertragungsglied in diesem Dokument. tCtrl_I_Ti_HighLimit muss > T#0s sein.
Die Variable wird persistent gespeichert. Voreingestellt auf 10min.

tCtrl_I_Ti_LowLimit: Integrationszeit für das untere Limit des internen I-Übertragungsgliedes, siehe Übertragungsfunktion des internen I-Übertragungsglied in diesem Dokument. tCtrl_I_Ti_LowLimit muss > T#0s sein.
Die Variable wird persistent gespeichert. Voreingestellt auf 10min.

rCtrl_I_HighLimit: Positiver Wert für das obere Limit an dem die Integration des internen I-Übertragungsgliedes angehalten wird (ARW-Maßnahme, anti-reset-windup), siehe Übertragungsfunktion des internen I-Übertragungsglied in diesem Dokument.
Die Variable wird persistent gespeichert. Voreingestellt auf 10.

rCtrl_I_LowLimit: Negativer Wert für das untere Limit an dem die Integration des internen I-Übertragungsgliedes angehalten wird (ARW-Maßnahme, anti-reset-windup), siehe Übertragungsfunktion des internen I-Übertragungsglied in diesem Dokument.
Die Variable wird persistent gespeichert. Voreingestellt auf -10.

iCurrentSequence: Nummer des aktiven Reglers in der Sequenz (0..32). Die Anzahl der Teilnehmer in einer Sequenz iNumberOfSequences wird von dem aktiven Sequenzregler über iCurrentSequence nicht überschritten.
Ist iCurrentSequence > iNumberOfSequences oder iCurrentSequence < 0, so wird mit bError = TRUE ein Fehler angezeigt.
Das Rauf- oder Runterschalten der Sequenz über iCurrentSequence in Abhängigkeit der Regelabweichung rE findet dann statt, wenn der Funktionsbaustein aktiv in der Sequenz ist bActiveCtrl = TRUE.

1. iCurrentSequence = iCurrentSequence - 1 wenn st2PointCtrlSequence.rCtrl_I_Out >= st2PointCtrlSequence.rLimit_Ctrl_I_MinUNDst2PointCtrlSequence.tRemainingTimeDecreaseSequence = T#0sUNDbActiveCtrl = TRUE

2. iCurrentSequence = iCurrentSequence + 1 wenn st2PointCtrlSequence.rCtrl_I_Out >= st2PointCtrlSequence.rLimit_Ctrl_I_MaxUNDst2PointCtrlSequence.tRemainingTimeIncreaseSequence = T#0sUNDbActiveCtrl = TRUE

FB_HVAC2PointCtrlSequence 8:

iCurrentSequence darf in einer Regelsequenz von außen nicht kontinuierlich beschrieben werden damit das automatische Umschalten der Regler vom aktiven auf den in der Regelsequenz rechts oder links benachbarten Regler funktioniert. Beim Starten einer Regelsequenz muss festgelegt werden welcher Sequenzregler aktiv ist. iCurrentSequence muss dazu für einen SPS-Zyklus beschrieben werden und > 0 und <= iNumberOfSequences sein.

FB_HVAC2PointCtrlSequence 9:

Ist bEnable =FALSE ODER bError = TRUE ODER (e2PointCtrlMode =eHVAC2PointCtrlMode_On_BMS ODER eHVAC2PointCtrlMode_On_OP ODER eHVAC2PointCtrlMode_Off_BMS ODER eHVAC2PointCtrlMode_Off_OP), so ist das automatische Umschalten der Regler vom aktiven auf den in der Regelsequenz rechts oder links benachbarten Regler weiterhin in Betrieb. Daher ist der Umschaltbetrieb immer aktiv. Mit bActiveCtrl = TRUE wird der aktive Funktionsbaustein angezeigt. Außerdem wird in Abhängigkeit der Regelabweichung rE das Rauf- oder Runterschalten der Sequenz über iCurrentSequence direkt ausgeführt. Wenn rX >= rW, dann ist iCurrentSequence = iCurrentSequence - 1. Wenn rX < rW, dann ist iCurrentSequence = iCurrentSequence + 1.

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