# FanControl

## `FanControl` (FB)

FUNCTION\_BLOCK FanControl

### Kurzbeschreibung

> Regelung eines drehzahlvariablen Ventilators (Regelgrößen z.B. absoluter Druck, Differenzdruck)\
> Zusatzfunktionen: Handübersteuerungen, Reparaturschalter, Betriebsstundenzähler, Betriebsüberwachung, Luftmangelüberwachung, Grenzwertüberwachungen\
> Typische Anwendung: Regelung eines Ventilators mit Frequenzumrichter

### Darstellung

<figure><img src="https://879424349-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FQR4vCFzt6ixgsqlR3pdR%2Fuploads%2Fgit-blob-18597eb1eb097634006ba8b39d22130bfa40f1fa%2FFanControl_FB.png?alt=media" alt=""><figcaption></figcaption></figure>

### Funktionsbeschreibung

#### Allgemeines

Dieser Funktionsbaustein regelt einen drehzahlvariablen Ventilator mittels eines stetigen Stellsignals *rHA*.\
Die generelle Freigabe des Ventilators erfolgt über die Anforderung *xEn* und das Freigabesignal *xHB*.\
Die Drehzahlregelung erfolgt mittels eines frei parametrierbaren PI-Reglers, dem der Sollwert *rSetPoint* und der Istwert *rActValue* zugeführt werden und daraus das Stellsignal des Reglers erzeugt.\
\
Es kommen im Wesentlichen folgende Funktionsbausteine zur Anwendung:

* ControlPI
* ManBin
* ManNum
* TwoPointFun
* Ramp
* CTime
* AirShortage
* OperatingHours

#### Freigabe - Ventilator vor Handübersteuerung *xAB*

Die Freigabe - Ventilator vor Handübersteuerung *xAB* wird aktiviert ( = TRUE ), falls gleichzeitig folgende Bedingungen erfüllt sind:\
\
Fall 1:\
\
\&#xNAN;*xEn* = TRUE\
\&#xNAN;*xMSwitch* = TRUE\
**xAlarmControl** = FALSE\
\
Fall 2:\
\
\&#xNAN;*xEn* = TRUE\
\&#xNAN;*xMSwitch* = TRUE\
**xAlarmControl** = TRUE\
\&#xNAN;*xAlarm* = FALSE\
\
In allen übrigen Situationen ist die Freigabe - Ventilator vor Handübersteuerung *xAB* nicht aktiviert (= FALSE).

#### Freigabe - Ventilator nach Handübersteuerung *xHB*

Die Freigabe - Ventilator nach Handübersteuerung *xHB* entspricht der Freigabe - Ventilator vor Handübersteuerung *xAB*, zusätzlich erweitert um ein Handübersteuermodul.\
Die Freigabe kann generell nur dann erfolgen, falls die Zwangssperrung des Ventilators nach Handübersteuerung nicht aktiv (*xForce* = FALSE)\
und die Sammelstörmeldung 2 nicht aktiv (= FALSE) sind.

| *xAB* | **eManModeB**  | *xHB* | Hinweise                               |
| ----- | -------------- | ----- | -------------------------------------- |
| FALSE | eMANBIN.Auto   | FALSE | Handübersteuermodul in Automatik       |
| TRUE  | eMANBIN.Auto   | TRUE  | Handübersteuermodul in Automatik       |
| X     | eMANBIN.ManOn  | TRUE  | Handübersteuermodul in Handbetrieb Ein |
| X     | eMANBIN.ManOff | FALSE | Handübersteuermodul in Handbetrieb Aus |

Legende: X = beliebig

#### Meldung des Reparaturschalters *xMSwitch*

*xMSwitch* = TRUE: Reparaturschalter wurde nicht ausgelöst (Normalzustand)\
\&#xNAN;*xMSwitch* = FALSE: Reparaturschalter wurde ausgelöst (Fehlerzustand)

#### Zwangssperrung des Ventilators nach Handübersteuerung *xForce*

*xForce* = FALSE: keine Zwangssperrung (Normalzustand)\
\&#xNAN;*xForce* = TRUE: Zwangssperrung (Ausnahmezustand)

#### Betriebsstunden und Einschaltvorgänge *udiOperatingHours* und *udiCountFb*

Die Anzahl der Betriebsstunden und der Einschaltvorgänge werden erfasst (= Zählprozess aktiv), falls die Betriebsmeldung des Ventilators *xFb* aktiv ist und gleichzeitig die Sammelstörmeldung 2 nicht aktiv ist (= FALSE).\
Die Ergebnisse stehen an den Zählerausgängen **udiOperatingHours** und **udiCountFb** zur Verfügung.

> **Schreibzugriff auf die Zählerstände**
>
> Über den Pfad ‘Instanzname.\_OperatingHours.udiOperatingHours’ bzw. ‘Instanzname.\_OperatingHours.udiCountFb’ ist ein Schreibzugriff auf die beide Zählerstände möglich.
>
> **Voraussetzung für den Einsatz des Funktionsbausteins FanControl**
>
> Zur korrekten Funktion ist der Einsatz des Funktionsbausteins TimeRead2 erforderlich.

#### Datum / Uhrzeit des letzten Betriebs des Ventilators *dtLastFb*

Am Ausgang *dtLastFb* steht während des Zählprozesses das aktuelle Datum / die aktuelle Uhrzeit zur Verfügung.\
Am Ausgang *dtLastFb* steht ausserhalb des Zählprozesses das Datum / die Uhrzeit am Ende des letzten Zählprozesses zur Verfügung.\
Am Ausgang *dtLastFb* wird vor dem ersten Zählprozess der Initialisierungswert DT#1970-1-1-0.0.0 ausgegeben.

#### Betriebsüberwachung *xAlarmFb*

Die Betriebsüberwachung kann durch den Sollwert / Parameter **xFbControl** freigegeben (= TRUE) oder gesperrt (= FALSE) werden.\
\
Bei gesperrter Überwachung wird die Störmeldung der Betriebsüberwachung *xAlarmFb* immer gesperrt (= FALSE).\
Bei freigegebener Überwachung wird die Störmeldung der Betriebsüberwachung *xAlarmFb* aktiviert (= TRUE), falls gleichzeitig während einer Mindestzeitdauer **udiFbControlTime** folgende Zustände gegeben sind:\
\
\&#xNAN;*xHB* und *xFb* = ungleich (Freigabezustand und Betriebszustand stimmen nicht überein)\
\&#xNAN;*eAOO* = HVACTYPES.eManBin.Auto (Handübersteuerung - Hardware für die Freigabe in Automatik)\
**xFbControl** = TRUE (Betriebsüberwachung ist freigegeben)\
\
Die Störmeldung der Betriebsüberwachung *xAlarmFb* wird zurück gesetzt (= FALSE), falls mindestens eine der nachfolgenden Bedingungen erfüllt ist:\
\
\&#xNAN;*eAOO* = HVACTYPES.eManBin.Auto (Rückschaltung in den Automatikbetrieb der Handübersteuerung - Hardware)\
\&#xNAN;*xQuit* = TRUE (Rücksetzung der Überwachungen ist aktiv)\
**xFbControl** = FALSE (Betriebsüberwachung gesperrt)

#### Luftmangelüberwachung *xAlarmPFb*

Die Luftmangelüberwachung erfolgt durch die Auswertung der Zustände an den Eingängen *xPFb* bzw. *xFb*.\
\
Die Störmeldung der Luftmangelüberwachung *xAlarmPFb* wird aktiviert (= TRUE), falls bei freigegebener Überwachung (**xPFbControl** = TRUE) während der Meldeverzögerung der Luftmangelüberwachung **udiPFbControlTime** permanent der Eingang *xPFb* nicht aktiv (= FALSE) und der\
Eingang *xFb* aktiv (= TRUE) sind.\
\
Die Störmeldung der Luftmangelüberwachung *xAlarmPFb* wird deaktiviert (= FALSE), falls die Bedingungen zur Aktivierung nicht mehr gegeben sind und gleichzeitig die Überwachung gesperrt ist (**xPFbControl** = FALSE) und / oder die Rücksetzung der Störmeldungen (Überwachungen) aktiv ist (*xQuit* = TRUE).

#### Sammelstörmeldung 1 - Ausgang *xAlarm*

Die Sammelstörmeldung wird aktiviert (= TRUE), falls mindestens eine der nachfolgend beschriebenen Bedingungen erfüllt ist.\
\
\&#xNAN;*xAlarmIn* = TRUE (Störmeldung des Ventilators ist aktiv)\
\&#xNAN;*xAlarmFB* = TRUE (Fehler aus der Betriebüberwachung)\
\&#xNAN;*xAlarmPFB* = TRUE (Fehler aus der Luftmangelüberwachung)\
\&#xNAN;*xMSwitch* = FALSE (Reparaturschalter in Stellung Aus)\
\&#xNAN;*xAlarmMaxValue* = TRUE (Maximalwert überschritten)\
\&#xNAN;*xAlarmMinValue* = TRUE (Minimalwert unterschritten)\
\
In allen übrigen Fällen ist die Sammelstörung nicht aktiv (= FALSE).

#### Sammelstörmeldung 2

Die Sammelstörmeldung wird aktiviert (= TRUE), falls mindestens eine der nachfolgend beschriebenen Bedingungen erfüllt ist.\
\
\&#xNAN;*xAlarmIn* = TRUE (Störmeldung des Ventilators ist aktiv)\
\&#xNAN;*xAlarmFB* = TRUE (Fehler aus der Betriebüberwachung)\
\&#xNAN;*xAlarmPFB* = TRUE (Fehler aus der Luftmangelüberwachung)\
\&#xNAN;*xMSwitch* = FALSE (Reparaturschalter in Stellung Aus)\
\&#xNAN;*xAlarmMaxValue* = TRUE (Maximalwert überschritten)\
\
In allen übrigen Fällen ist die Sammelstörung nicht aktiv (= FALSE).

#### Rücksetzung der Störmeldungen *xQuit*

Jede ansteigende Flanke (FALSE > TRUE) am Eingang *xQuit* löscht eventuell vorhandene Störmeldungen der folgenden Überwachungseinrichtungen:\
\
Luftmangelüberwachung\
Betriebsüberwachung\
Minimalwertüberwachung\
Maximalwertüberwachung

#### Regelprozess

Allgemeines\
\
Der Istwert rActValue wird durch eine lineare Kennlinie skaliert und dem PI-Regler zugeführt.\
Der Sollwert rSetPoint wird durch eine Signalrampe gefiltert, durch eine lineare Kennlinie skaliert und dem PI-Regler zugeführt.\
Das Ausgangssignal des PI-Reglers wird durch eine weitere Signalrampe gefiltert und dem Ausgang für das Stellsignal rHA zugeführt.\
\
\
Freigabe\
\
Die Freigabe des Regelprozesses erfolgt mit einer Zeitverzögerung von udiWaitControl nach der aktiven Betriebsmeldung des Ventilators (xFb = TRUE).\
Die Sperrung des Regelprozesses erfolgt ohne Zeitverzögerung nach der inaktiven Betriebsmeldung des Ventilators (xFb = FALSE).\
\
\
Sollwert\
\
Der Sollwert wird auf Wert 0.0 fixiert, falls die Freigabe des Ventilators nicht aktiv ist (xHB = FALSE).\
Der Sollwert wird vom Eingang rSetPoint übernommen, durch eine Signalrampe gefiltert und durch eine durch 2 Punkte definierte lineare Funktion skaliert (Voraussetzung: xHB = TRUE).\
Die relevanten Parameter der Signalrampe sind individuell einstellbar (Maximale Variation = (rMaxValue / 5) pro 10s).\
Die relevanten Parameter der linearen Funktion sind individuell einstellbar (Eingangsbereich in Pa: 0.0 - rMaxValue, Ausgangsbereich in %: 0.0 - 100.0).\
\
\
Istwert\
\
Der Istwert wird vom Eingang rActValue übernommen und durch eine durch 2 Punkte definierte lineare Funktion skaliert.\
Die relevanten Parameter der linearen Funktion sind individuell einstellbar (Eingangsbereich in Pa: 0.0 - rMaxValue, Ausgangsbereich in %: 0.0 - 100.0).\
\
\
Begrenzung des Stellsignals des PI-Reglers rYMin und rYMax\
\
Das Stellsignal des Reglers (PI-Regler) wird durch die einstellbaren Grenzwerte rYMin und rYMax (Minimalwertüberwachung nicht aktiv) bzw. rSubstitueHA (Minimalwertüberwachung aktiv) begrenzt.\
\
\
Signalrampe des Stellsignals aus dem PI-Regler\
\
Das Stellsignal aus dem PI-Regler wird durch eine Signalrampe gefiltert.\
Die relevanten Parameter der Signalrampe sind individuell einstellbar (Maximale Variation = rYRampVariation pro rYRampTime).\
\
\
Parameter des PI-Reglers\
\
Die für das Regelverhalten wesentlichen Parameter können von außen vorgegeben werden. Sie müssen je nach Regelstrecke angepasst werden.\
Es wurde bereits eine sinnvolle Basisparametrierung vorgenommen, die in vielen Anwendungsfällen ausreichend ist.\
\
rYMin = Unterer absoluter Grenzwert des Regler-Ausgangssignals\
rYMax = Oberer absoluter Grenzwert des Regler-Ausgangssignals\
rOffset = Sollwertversatz - Regler\
rKp = Verstärkungsfaktor - Regler\
rTn = Nachstellzeit - Regler in s\
eAction = Wirksinnn des Reglers (Invertiert, Direkt)\
rInitValue = Initialisierungswert für das Stellsignal\
rYDisabled = Stellsgnal bei inaktivem Regler\
\
\
Signale des PI-Reglers\
\
Die während des Regelprozesses errechneten Signale (vor der Signalrampe) stehen zur Kontrolle des Regelvorgangs zur Verfügung.\
\
rPiDiff = Regelabweichung am Regler\
rPiPartP = Proportionalanteil am Stellsignal\
rPiPartI = Integralanteil am Stellsignal\
xPiLimitActiv = Status - Grenzwertüberschreitung - Stellsignal (FALSE = Aus, TRUE = Ein)\
\
\
Stellsignal des Reglers\
\
Bei nicht freigegebenem Regler wird der Ausschaltwert rYDisabled zum Ausgang Stellsignal des Reglers übertragen (Voraussetzung: ePiManModeN = eMANNUM.Auto) und durch die absoluten Grenzwerte begrenzt.\
Der Integralanteil wird auf 0.0 gesetzt.\
\
Bei freigegebenem Regler wird das Stellsignal des Reglers berechnet (Voraussetzung: ePiManModeN = eMANNUM.Auto) und durch die absoluten Grenzwerte begrenzt.\
\
Mit der Grundeinstellung des Wirksinns eAction (= eControlMode.Inverted) bewirkt ein zu geringer Istwert (Istwert < Sollwert) eine stetige Erhöhung des Wertes des Stellsignals des Reglers.

#### Stellsignal Ventilator vor Handübersteuerung *rAA*

Das Stellsignal des Ventilators vor Handübersteuerung *rAA* wird primär vom Ausgangssignal des Reglers nach der Signalrampe übernommen.\
Dieses Ausgangssignal wird jedoch zusätzlich während der Anforderung des Ventilators (*xHB = TRUE) durch den unteren absoluter Grenzwert rYMin* nach unten begrenzt.\
Im Falle einer Minimalwertunterschreitung (*xAlarmMinValue* = TRUE) wird das Stellsignal vor Handübersteuerung *rAA* durch den Fixwert **rSubstitueHA** ersetzt.

#### Stellsignal Ventilator nach Handübersteuerung *rHA*

Das Stellsignal des Ventilators nach Handübersteuerung *rHA* entspricht dem Stellsignal des Ventilators vor Handübersteuerung *rAA* zusätzlich erweitert um ein Handübersteuermodul.

| *rAA* | **eManModeN** | *rHA*         | Hinweise                           |
| ----- | ------------- | ------------- | ---------------------------------- |
| X     | eMANNUM.Auto  | *rAA*         | Handübersteuermodul in Automatik   |
| X     | eMANNUM.Man   | **eManValue** | Handübersteuermodul in Handbetrieb |

Legende: X = beliebig

#### Betriebsart für das Ausgangssignal des Reglers **ePIManModeN**

Der Parameter **ePiManModeN** erlaubt die Umschaltung des Ausgangssignals des Reglers vom Automatik- in den Handbetrieb und umgekehrt.\
Im Handbetrieb übernimmt das Ausgangssignal des Reglers das Ausgangssignal im Handbetrieb **ePiManValue**.

| **ePiManModeN** | Ausgangssignal                      | Funktion                          |
| --------------- | ----------------------------------- | --------------------------------- |
| eMANNUM.Auto    | Signal gemäß Formel / Ausschaltwert | Automatikbetrieb - Ausgangssignal |
| eMANNUM.Man     | **ePiManValue**                     | Handbetrieb - Ausgangssignal      |

#### Überwachung des Maximaldrucks *xAlarmMaxValue*

Der Ausgang *xAlarmMaxValue* wird aktiviert (= TRUE), falls während einer Mindestzeitdauer von 10s der aktuelle Istwert *rActValue* den einstellbaren Maximalwert **rMaxValue** überschreitet.\
Der Ausgang *xAlarmMaxValue* wird deaktiviert (= FALSE), falls der aktuelle Istwert *rActValue* den einstellbaren Maximalwert **rMaxValue** unterschreitet und gleichzeitig am Eingang *xQuit* eine ansteigende Flanke (FALSE > TRUE) erkannt wird.

#### Überwachung des Minimaldrucks *xAlarmMinValue*

Der Ausgang *xAlarmMinValue* wird aktiviert (= TRUE), falls während einer Mindestzeitdauer **udiWaitMinValue** (1.0 - 600.0 s) folgende Bedingungen gleichzeitig permanent erfüllt sind:\
\
\&#xNAN;*xFb* = TRUE (Ventilator ist in Betrieb)\
\&#xNAN;*eAO* = HVACTYPES.eManNum.Auto (Betriebsart der Handübersteuerung - Hardware für das Stellsignal im Automatikbetrieb)\
\&#xNAN;*rHA* > **rMinHAValue** (Stellsignal ist grösser als der Minimalwert)\
\&#xNAN;*rActValue* < **rMinValue** (Istwert ist kleiuer als der Minimalwert)\
Es wurde keine ansteigende Flanke (FALSE > TRUE) am Eingang *xQuit* erkannt\
Der Ausgang *xAlarmMinValue* wird deaktiviert (= FALSE), falls die Bedingungen für die Aktivierung nicht mehr erfüllt sind und gleichzeitig am Eingang *xQuit* eine ansteigende Flanke (FALSE > TRUE) erkannt wird.

#### Sammelmeldung Automatikbetrieb *xAuto*

Die Sammelmeldung Automatikbetrieb *xAuto* wird aktiviert (= TRUE), falls folgende Bedingungen gleichzeitig erfüllt sind:

* Eingang *eAOO* = HVACTYPES.eManBin.Auto
* Eingang *eAO* = HVACTYPES.eManNum.Auto
* Sollwert / Parameter **eManModeB** = eMANBIN.Auto
* Sollwert / Parameter **eManModeN** = eMANNUM.Auto
* Sollwert / Parameter **ePiManModeN** = eMANNUM.Auto

### CODESYS

InOut:

| Scope       | Name                | Type         | Initial               |
| ----------- | ------------------- | ------------ | --------------------- |
| Input       | `xEn`               | `BOOL`       |                       |
| Input       | `xForce`            | `BOOL`       | FALSE                 |
| Input       | `xFb`               | `BOOL`       |                       |
| Input       | `xPFb`              | `BOOL`       |                       |
| Input       | `xMSwitch`          | `BOOL`       | TRUE                  |
| Input       | `xAlarmIn`          | `BOOL`       |                       |
| Input       | `eAOO`              | eManBin      | eManBin.Auto          |
| Input       | `eAO`               | eManNum      | eManNum.Auto          |
| Input       | `rPoti`             | `REAL`       |                       |
| Input       | `rU`                | `REAL`       |                       |
| Input       | `xQuit`             | `BOOL`       | FALSE                 |
| Input       | `rActValue`         | `REAL`       |                       |
| Input       | `rSetPoint`         | `REAL`       |                       |
| Output      | `xHB`               | `BOOL`       |                       |
| Output      | `xAB`               | `BOOL`       |                       |
| Output      | `rHA`               | `REAL`       |                       |
| Output      | `rAA`               | `REAL`       |                       |
| Output      | `xAlarmFb`          | `BOOL`       |                       |
| Output      | `xAlarmPFb`         | `BOOL`       |                       |
| Output      | `xAlarmMinValue`    | `BOOL`       |                       |
| Output      | `xAlarmMaxValue`    | `BOOL`       |                       |
| Output      | `dtLastFb`          | `DT`         |                       |
| Output      | `udiOperatingHours` | `UDINT`      |                       |
| Output      | `udiCountFb`        | `UDINT`      |                       |
| Output      | `xAlarm`            | `BOOL`       |                       |
| Output      | `xAuto`             | `BOOL`       |                       |
| Output      | `rPiDiff`           | `REAL`       |                       |
| Output      | `rPiPartP`          | `REAL`       |                       |
| Output      | `rPiPartI`          | `REAL`       |                       |
| Output      | `xPiLimitActiv`     | `BOOL`       |                       |
| Input Const | `rMaxValue`         | `REAL`       | 490                   |
| Input Const | `rSubstituteHA`     | `REAL`       | 30                    |
| Input Const | `udiWaitMinValue`   | `UDINT`      | 60                    |
| Input Const | `rMinHAValue`       | `REAL`       | 20                    |
| Input Const | `rMinValue`         | `REAL`       | 20                    |
| Input Const | `tYRampTime`        | `TIME`       | TIME#1m0s0ms          |
| Input Const | `rYRampVariation`   | `REAL`       | 30                    |
| Input Const | `udiWaitControl`    | `UDINT`      | 30                    |
| Input Const | `rYMax`             | `REAL`       | 100                   |
| Input Const | `rYMin`             | `REAL`       | 20                    |
| Input Const | `rTn`               | `REAL`       | 60                    |
| Input Const | `rKp`               | `REAL`       | 1                     |
| Input Const | `rOffset`           | `REAL`       | 0                     |
| Input Const | `rInitValue`        | `REAL`       | 20                    |
| Input Const | `rYDisabled`        | `REAL`       | 0                     |
| Input Const | `eAction`           | eControlMode | eControlMode.Inverted |
| Input Const | `ePiManValue`       | `REAL`       |                       |
| Input Const | `ePiManModeN`       | eMANNUM      | eMANNUM.Auto          |
| Input Const | `udiPFbControlTime` | `UDINT`      | 60                    |
| Input Const | `xPFbControl`       | `BOOL`       | TRUE                  |
| Input Const | `xAlarmControl`     | `BOOL`       | TRUE                  |
| Input Const | `udiFbControlTime`  | `UDINT`      | 60                    |
| Input Const | `xFbControl`        | `BOOL`       | TRUE                  |
| Input Const | `rManValue`         | `REAL`       |                       |
| Input Const | `eManModeN`         | eMANNUM      | eMANNUM.Auto          |
| Input Const | `eManModeB`         | eMANBIN      | eMANBIN.Auto          |

Methods:

> mQuit

> mResetOperatingHours

Structure:

* mQuit (Method)
* mResetOperatingHours (Method)
