# Redundance8

## `Redundance8` (FB)

FUNCTION\_BLOCK Redundance8

### Kurzbeschreibung

> Redundante Steuerung von 0 - 8 gleichartigen Geräten\
> Einflussfaktoren: Anforderungen, Betriebsstunden, Betriebs- und Störzustände\
> Typische Anwendung: Festlegung der Führungs- und Folgegeräte

### Darstellung

<figure><img src="/files/h0ax3sbuZOhQEv0SuERt" alt=""><figcaption></figcaption></figure>

### Schnittstellen

#### Eingänge

| Name                     | Datentyp | Wertebereich | Initialwert | Funktion                                                              |
| ------------------------ | -------- | ------------ | ----------- | --------------------------------------------------------------------- |
| *wTotalNumberOfDevices*  | WORD     |              | 2           | Gesamtanzahl an Geräten (0 - *cwMaxMumberOfDevices*)                  |
| *wActiveNumberOfDevices* | WORD     |              | 0           | Anzahl der aktiven Geräte (0 - *wTotalNumberOfDevices*)               |
| *xFb1*                   | BOOL     |              | FALSE       | Betrieb - Gerät 1 (TRUE = Betrieb)                                    |
| *xFb2*                   | BOOL     |              | FALSE       | Betrieb - Gerät 2 (TRUE = Betrieb)                                    |
| *xFb3*                   | BOOL     |              | FALSE       | Betrieb - Gerät 3 (TRUE = Betrieb)                                    |
| *xFb4*                   | BOOL     |              | FALSE       | Betrieb - Gerät 4 (TRUE = Betrieb)                                    |
| *xFb5*                   | BOOL     |              | FALSE       | Betrieb - Gerät 5 (TRUE = Betrieb)                                    |
| *xFb6*                   | BOOL     |              | FALSE       | Betrieb - Gerät 6 (TRUE = Betrieb)                                    |
| *xFb7*                   | BOOL     |              | FALSE       | Betrieb - Gerät 7 (TRUE = Betrieb)                                    |
| *xFb8*                   | BOOL     |              | FALSE       | Betrieb - Gerät 8 (TRUE = Betrieb)                                    |
| *xAlarm1*                | BOOL     |              | TRUE        | Störung - Gerät 1 (TRUE = Störung)                                    |
| *xAlarm2*                | BOOL     |              | TRUE        | Störung - Gerät 2 (TRUE = Störung)                                    |
| *xAlarm3*                | BOOL     |              | TRUE        | Störung - Gerät 3 (TRUE = Störung)                                    |
| *xAlarm4*                | BOOL     |              | TRUE        | Störung - Gerät 4 (TRUE = Störung)                                    |
| *xAlarm5*                | BOOL     |              | TRUE        | Störung - Gerät 5 (TRUE = Störung)                                    |
| *xAlarm6*                | BOOL     |              | TRUE        | Störung - Gerät 6 (TRUE = Störung)                                    |
| *xAlarm7*                | BOOL     |              | TRUE        | Störung - Gerät 7 (TRUE = Störung)                                    |
| *xAlarm8*                | BOOL     |              | TRUE        | Störung - Gerät 8 (TRUE = Störung)                                    |
| *uiOperatingHours1*      | UDINT    |              | 0           | Betriebsstunden - Gerät 1                                             |
| *uiOperatingHours2*      | UDINT    |              | 0           | Betriebsstunden - Gerät 2                                             |
| *uiOperatingHours3*      | UDINT    |              | 0           | Betriebsstunden - Gerät 3                                             |
| *uiOperatingHours4*      | UDINT    |              | 0           | Betriebsstunden - Gerät 4                                             |
| *uiOperatingHours5*      | UDINT    |              | 0           | Betriebsstunden - Gerät 5                                             |
| *uiOperatingHours6*      | UDINT    |              | 0           | Betriebsstunden - Gerät 6                                             |
| *uiOperatingHours7*      | UDINT    |              | 0           | Betriebsstunden - Gerät 7                                             |
| *uiOperatingHours8*      | UDINT    |              | 0           | Betriebsstunden - Gerät 8                                             |
| *xUpdate*                | BOOL     |              |             | Auslösung der Neuberechnung der Sequenz bei jeder ansteigenden Flanke |

#### Ausgänge

| Name                          | Datentyp                      | Wertebereich | Initialwert | Funktion                                                                 |
| ----------------------------- | ----------------------------- | ------------ | ----------- | ------------------------------------------------------------------------ |
| *udiCurrentSequence*          | UDINT                         |              | 0           | Aktuelle Gerätefolge als Integer                                         |
| *sCurrentSequence*            | STRING                        |              | ‘’          | Aktuelle Gerätefolge als String                                          |
| *wNumberOfOperationalDevices* | WORD                          |              | 0           | Anzahl der betriebsbereiten Geräte                                       |
| *xCmd1*                       | BOOL                          |              | FALSE       | Freigabe - Gerät 1 (TRUE = Freigabe)                                     |
| *xCmd2*                       | BOOL                          |              | FALSE       | Freigabe - Gerät 2 (TRUE = Freigabe)                                     |
| *xCmd3*                       | BOOL                          |              | FALSE       | Freigabe - Gerät 3 (TRUE = Freigabe)                                     |
| *xCmd4*                       | BOOL                          |              | FALSE       | Freigabe - Gerät 4 (TRUE = Freigabe)                                     |
| *xCmd5*                       | BOOL                          |              | FALSE       | Freigabe - Gerät 5 (TRUE = Freigabe)                                     |
| *xCmd6*                       | BOOL                          |              | FALSE       | Freigabe - Gerät 6 (TRUE = Freigabe)                                     |
| *xCmd7*                       | BOOL                          |              | FALSE       | Freigabe - Gerät 7 (TRUE = Freigabe)                                     |
| *xCmd8*                       | BOOL                          |              | FALSE       | Freigabe - Gerät 8 (TRUE = Freigabe)                                     |
| *wPrio1*                      | WORD                          |              | 0           | Aktuelle Priorität des Geräts 1 (0 = keine, 1 - *wTotalNumberOfDevices*) |
| *wPrio2*                      | WORD                          |              | 0           | Aktuelle Priorität des Geräts 2 (0 = keine, 1 - *wTotalNumberOfDevices*) |
| *wPrio3*                      | WORD                          |              | 0           | Aktuelle Priorität des Geräts 3 (0 = keine, 1 - *wTotalNumberOfDevices*) |
| *wPrio4*                      | WORD                          |              | 0           | Aktuelle Priorität des Geräts 4 (0 = keine, 1 - *wTotalNumberOfDevices*) |
| *wPrio5*                      | WORD                          |              | 0           | Aktuelle Priorität des Geräts 5 (0 = keine, 1 - *wTotalNumberOfDevices*) |
| *wPrio6*                      | WORD                          |              | 0           | Aktuelle Priorität des Geräts 6 (0 = keine, 1 - *wTotalNumberOfDevices*) |
| *wPrio7*                      | WORD                          |              | 0           | Aktuelle Priorität des Geräts 7 (0 = keine, 1 - *wTotalNumberOfDevices*) |
| *wPrio8*                      | WORD                          |              | 0           | Aktuelle Priorität des Geräts 8 (0 = keine, 1 - *wTotalNumberOfDevices*) |
| *xErr*                        | BOOL                          |              | FALSE       | Ausgang - Störung                                                        |
| *eOperationalCondition*       | eRedundance3\_OperationalMode |              |             | Nummer / Name des aktuelle Betriebszustands                              |

#### Sollwerte / Parameter

| Name                   | Datentyp | Wertebereich | Initialwert | Funktion                                                                                                          |
| ---------------------- | -------- | ------------ | ----------- | ----------------------------------------------------------------------------------------------------------------- |
| **xConOperatingHours** | BOOL     |              | TRUE        | FALSE = Freigabe Folgeschaltung nur durch Eingang xUpdate, TRUE = Folgeschaltung automatisch nach Betriebsstunden |
| **xEnFb**              | BOOL     |              | TRUE        | FALSE = Umschaltung nach Freigabe (xCmdX), TRUE = Umschaltung nach Betriebsmeldung (xFbX)                         |
| **wTolerance**         | WORD     |              | 100         | Grenzwert - Betriebsstundendifferenz für direkten Folgewechsel im Teillastbetrieb                                 |

### Funktionsbeschreibung

#### Allgemeines

Dieser Funktionsbaustein dient zur redundanten Steuerung von 0 - 8 gleichartigen Geräten in Abhängigkeit von den Einflussgrößen.\
Anforderungen (*wActiveNumberOfDevices*), Betriebstunden (*uiOperatingHours*), Betriebszuständen (*xFb*) und\
Störzuständen (*xAlarm*).

#### Eingang *wTotalNumberOfDevices*

Dieser Eingang dient zur Festlegung der Gesamt-Anzahl der verwendbaren Geräte.\
Die Geräte werden von den niedrigsten Gerätenummern her fortlaufend belegt.\
Beispiel: *wTotalNumberOfDevices* = 3: Es werden die Geräte 1 - 3 (Eingänge und Ausgänge) verwandt / berücksichtigt.\
Zulässiger Bereich: 0 - *cwMaxNumberOfDevices*

#### Eingang *wActiveNumberOfDevices*

Dieser Eingang dient zur Festlegung der Anzahl der Geräte, die aktuell verwendet werden sollen.\
Zulässiger Bereich: 0 - *wTotalNumberOfDevices*

#### Eingang *xUpdate*

Jede ansteigende Flanke an diesem Eingang löst eine Neuberechnung der aktuellen Gerätefolge aus.\
Randbedingungen: *xConOperationHours* = FALSE, Betriebsstundendifferenz = 0 Stunden.

#### Ausgang *udiCurrentSequence*

Dieser Ausgang zeigt stets die aktuelle Gerätefolge als Ganzzahl an. Die Nummer des Geräts mit der höchsten Priorität steht dabei immer am Anfang, dann folgt die Nummer des Geräts mit der zweithöchsten Priorität, usw.\
Beispiel: *udiCurrentSequence* = 145 bedeutet: Gerät 1 = Priorität 1, Gerät 4 = Priorität 2 und Gerät 5 = Priorität 3

#### Ausgang *sCurrentSequence*

Dieser Ausgang zeigt stets die aktuelle Gerätefolge als String mit Trennzeichen an. Bezüglich der Prioritäten gilt dasselbe wie beim Ausgang *udiCurrentSequence*.\
Beispiel: *sdiCurrentSequence* = ‘1-4-5’ bedeutet: Gerät 1 = Priorität 1, Gerät 4 = Priorität 2 und Gerät 5 = Priorität 3

#### Ausgang *wNumberOfOperationalDevices*

Dieser Ausgang zeigt stets die Anzahl der betriebsbereiten Geräte an.

#### Ausgang Störung *xErr*

Dieser Ausgang ist aktiv (= TRUE), falls mindestens eine der nachfolgenden Bedingungen erfüllt ist.

1. *wActiveNumberOfDevices* > *wTotalNumberOfDevices*
2. *wTotalNumberOfDevices* > *cwMaxNumberOfDevices*
3. *wActiveNumberOfDevices* > *wOperationalNumberofDevices*

\
In allen übrigen Fällen ist der Ausgang \*xErr\* nicht aktiv (= FALSE).

#### Ausgang *eOperationalCondition*

Dieser Ausgang stellt stets die aktuelle Lastsituation (Leerlauf, Teillast, Volllast) in Abhängigkeit vom Sollwert / Parameter **xEnFb** dar.\
**xEnFb** = FALSE: Die Freigabeausgänge *xCmd* der betriebsbereiten Geräte werden ausgewertet / berücksichtigt.\
**xEnFb** = TRUE: Die Betriebszustände *xFb* der betriebsbereiten Geräte werden ausgewertet / berücksichtigt.\
Beispiel: **xEnFb** = TRUE, *wTotalNumberOfDevices* = 3 und *xFb1* = TRUE und *xFb2* = TRUE: Ausgang = *PartLoad\_Inputs\_Fb*

#### Sollwert / Parameter **xConOperatingHours**

**xConOperatingHours** = FALSE: Die Umschaltung der Gerätefolge wird nur durch eine ansteigende Flanke am Eingang *xUpdate* ausgelöst.\
**xConOperatingHours** = TRUE: Die Umschaltung der Gerätefolge wird in Abhängigkeit von den Betriebsstunden, den Betriebsmeldungen (bei **xEnFb** = TRUE)\
und den Freigaben (bei **xEnFb** = FALSE) ausgelöst.

#### Sollwert / Parameter **xEnFb**

**xEnFb** = FALSE: Die Freigabeausgänge ‘xCmd’ der betriebsbereiten Geräte werden ausgewertet / berücksichtigt.\
**xEnFb** = TRUE: Die Betriebszustände ‘xFb’ der betriebsbereiten Geräte werden ausgewertet / berücksichtigt.

#### Sollwert / Parameter **wTolerance**

Dieser Sollwert bestimmt die maximale Betriebsstundendifferenz vor einer Umschaltung der Gerätefolge aufgrund der Betriebsstunden.

#### Bestimmung der Gerätefolge

Eine Umschaltung der Gerätefolge kann **generell** nur erfolgen, falls mindestens eine der nachfolgenden Bedingungen erfüllt ist:

1. Der Störzustand von mindestens einem Gerät ( Geräte 1 - *wTotalNumberOfDevices* ) ist verändert (hohe Priorität)
2. Die Gesamtanzahl an Geräten (Eingang *wTotalNumberOfDevices*) (1 - *cwMaxNumberOfDevices*) hat sich verändert (hohe Priorität)
3. Die Betriebsstundenanzahl von mindestens einem betriebsbereiten Gerät (Geräte 1 - *wTotalNumberOfDevices*) hat sich verändert (niedrige Priorität)

#### Definition - Leerlauf:

xEnFb = FALSE: Die Freigabeausgänge ‘xCmd’ aller betriebsbereiten Geräte (Geräte 1 - wTotalNumberOfDevices) sind inaktiv (= FALSE)\
xEnFb = TRUE: Die Betriebsmeldungen ‘xFb’ aller betriebsbereiten Geräte (Geräte 1 - wTotalNumberOfDevices) sind inaktiv (= FALSE)

#### Definition - Volllast:

xEnFb = FALSE: Die Freigabeausgänge ‘xCmd’ aller betriebsbereiten Geräte (Geräte 1 - wTotalNumberOfDevices) sind aktiv (= TRUE)\
xEnFb = TRUE: Die Betriebsmeldungen ‘xFb’ aller betriebsbereiten Geräte (Geräte 1 - wTotalNumberOfDevices) sind aktiv (= TRUE)

#### Definition - Teillast:

xEnFb = FALSE: Die Anzahl der Freigabeausgänge 'xCmd' aller betriebsbereiten Geräte im Zustand aktiv (= TRUE) ist grösser/gleich 1 und kleiner als die Anzahl aller betriebsbereiten Geräte (Geräte 1 - wTotalNumberOfDevices)\
xEnFb = FALSE: Die Anzahl der Betriebsmeldungen xFb aller betriebsbereiten Geräte im Zustand aktiv (= TRUE) ist grösser/gleich 1 und kleiner als die Anzahl aller betriebsbereiten Geräte (Geräte 1 - wTotalNumberOfDevices)\
\
\
\
Umschaltung mit hoher Priorität (= sofort) in Abhängigkeit von den Störzuständen (Eingänge xAlarm) und dem Eingang **wTotalNumberOfDevices.**\
\
Der Störzustand jedes Gerätes im Bereich 1 - *wTotalNumberOfDevices* wird zyklisch erfasst und auf Veränderungen hin ausgewertet.\
Der Eingang *wTotalNumberOfDevices* wird zyklisch erfasst und auf Veränderungen hin ausgewertet.\
Jedes gestörte Gerät (Eingang *xAlarm* = TRUE) im Bereich 1 - *wTotalNumberOfDevices* ist nicht mehr betriebsbereit.\
Jede Änderung im Störzustand von mindestens einem Gerät im Bereich 1 - *wTotalNumberOfDevices* löst eine sofortige Neuberechnung der Gerätefolge aus.\
Jede Änderung im Eingang *wTotalNumberOfDevices* löst eine sofortige Neuberechnung der Gerätefolge aus.\
\
\
\
Umschaltung mit **niedriger** Priorität in Abhängigkeit von den Betriebsstunden (Eingänge *udiOperationHours*), Betriebszuständen (Eingänge *xFb*)\
und Freigabeausgängen (Ausgänge *xCmd*) der Geräte 1 - 3.\
\
Die Betriebsstunden jedes betriebsbereiten Gerätes im Bereich 1 - *wTotalNumberOfDevices* werden zyklisch erfasst und auf Veränderungen hin ausgewertet.\
Die Betriebszustände und Freigabeausgänge jedes betriebsbereiten Gerätes im Bereich 1 - *wTotalNumberOfDevices* werden zyklisch erfasst.\
Die Neuberechnung der Gerätefolge erfolgt, sobald eine der nachfolgend beschriebenen Situationen gegeben ist:\
\
\
\
**Situation 1** (*xConOperationHours* = FALSE, ansteigende Flanke am Eingang *xUpdate*)\
\
Es erfolgt eine Neuberechung der Gerätefolge mit einer Betriebsstundendifferenz von 0 Stunden, d.h. das ungestörte Gerät mit der geringsten Betriebsstundenanzahl\
hat die höchste Priorität (bei Betriebsstunden-Gleichheit hat das Gerät mit der niedrigeren Nummer die höhere Priorität).\
\
\
\
**Situation 2** (*xConOperationHours* = TRUE, Leerlauf bzw. Volllast)\
\
Im Leerlauf bzw. unter Volllast erfolgt eine Neuberechung der Gerätefolge mit einer Betriebsstundendifferenz von 0 Stunden, d.h. das ungestörte Gerät\
mit der geringsten Betriebsstundenanzahl hat die höchste Priorität (bei Betriebsstunden-Gleichheit hat das Gerät mit der niedrigeren Nummer die höhere Priorität).\
Die Neuberechnung der Gerätefolge wird ausgelöst, falls sich die Betriebsstundenanzahl von mindestens einem betriebsbereiten Gerät verändert hat.\
\
\
\
**Situation 3** (*xConOperationHours* = TRUE, Teillast)\
\
Beim erstmaligen Sprung in den Teillastbetrieb erfolgt eine Neuberechung der Gerätefolge mit einer Betriebsstundendifferenz von 0 Stunden, d.h. das ungestörte Gerät\
mit der geringsten Betriebsstundenanzahl hat die höchste Priorität (bei Betriebsstunden-Gleichheit hat das Gerät mit der niedrigeren Nummer die höhere Priorität).\
\
Im regulären Teillastbetrieb erfolgt eine Neuberechung der Gerätefolge mit einer Betriebsstundendifferenz von **wTolerance** Stunden.\
Die Neuberechnung der Gerätefolge wird ausgelöst, falls sich die Betriebsstundenanzahl von mindestens einem betriebsbereiten Gerät verändert hat.

#### Freigabeausgänge 'xCmd’

\
Die Zustände der Ausgänge der Geräte im Bereich 1 - wTotalNumberOfDevices werden abschließend wie folgt festgelegt:\
\
Die Freigabeausgänge der betriebsbereiten Geräte im Bereich 1 - wTotalNumberOfDevices werden aktiviert, falls deren aktuelle Priorität <= der Anzahl der\
angeforderten Geräte (Eingang \*wActiveNumberOfDevices) ist.\
Die Freigabeausgänge der betriebsbereiten Geräte im Bereich 1 - wTotalNumberOfDevices werden deativiert, falls deren aktuelle Priorität > der Anzahl der\
angeforderten Geräte (Eingang wActiveNumberOfDevices) ist.

#### Prioritätsausgänge *wPrio*

\
Die Prioritätsausgänge jedes Geräts enthalten stets die aktuelle Priorität im Bereich 0 - wTotalNumberOfDevices.\
\
Priorität = 0: Das Gerät hat keine oder eine ungültige Priorität\
Priorität = 1: Das Gerät hat die höchste Priorität\
Priorität = 2: Das Gerät hat die zweithöchste Priorität\
Priorität = 3: Das Gerät hat die dritthöchste Priorität\
usw.

### CODESYS

InOut:

| Scope       | Name                          | Type                          | Initial |
| ----------- | ----------------------------- | ----------------------------- | ------- |
| Input       | `wTotalNumberOfDevices`       | `WORD`                        | 2       |
| Input       | `wActiveNumberOfDevices`      | `WORD`                        | 0       |
| Input       | `xFb1`                        | `BOOL`                        | FALSE   |
| Input       | `xFb2`                        | `BOOL`                        | FALSE   |
| Input       | `xFb3`                        | `BOOL`                        | FALSE   |
| Input       | `xFb4`                        | `BOOL`                        | FALSE   |
| Input       | `xFb5`                        | `BOOL`                        | FALSE   |
| Input       | `xFb6`                        | `BOOL`                        | FALSE   |
| Input       | `xFb7`                        | `BOOL`                        | FALSE   |
| Input       | `xFb8`                        | `BOOL`                        | FALSE   |
| Input       | `xAlarm1`                     | `BOOL`                        | TRUE    |
| Input       | `xAlarm2`                     | `BOOL`                        | TRUE    |
| Input       | `xAlarm3`                     | `BOOL`                        | TRUE    |
| Input       | `xAlarm4`                     | `BOOL`                        | TRUE    |
| Input       | `xAlarm5`                     | `BOOL`                        | TRUE    |
| Input       | `xAlarm6`                     | `BOOL`                        | TRUE    |
| Input       | `xAlarm7`                     | `BOOL`                        | TRUE    |
| Input       | `xAlarm8`                     | `BOOL`                        | TRUE    |
| Input       | `udiOperatingHours1`          | `UDINT`                       | 0       |
| Input       | `udiOperatingHours2`          | `UDINT`                       | 0       |
| Input       | `udiOperatingHours3`          | `UDINT`                       | 0       |
| Input       | `udiOperatingHours4`          | `UDINT`                       | 0       |
| Input       | `udiOperatingHours5`          | `UDINT`                       | 0       |
| Input       | `udiOperatingHours6`          | `UDINT`                       | 0       |
| Input       | `udiOperatingHours7`          | `UDINT`                       | 0       |
| Input       | `udiOperatingHours8`          | `UDINT`                       | 0       |
| Input       | `xUpdate`                     | `BOOL`                        |         |
| Input Const | `xConOperatingHours`          | `BOOL`                        | TRUE    |
| Input Const | `xEnFb`                       | `BOOL`                        | TRUE    |
| Input Const | `wTolerance`                  | `WORD`                        | 100     |
| Output      | `udiCurrentSequence`          | `UDINT`                       | 0       |
| Output      | `sCurrentSequence`            | `STRING`                      | ‘’      |
| Output      | `wNumberOfOperationalDevices` | `WORD`                        | 0       |
| Output      | `xCmd1`                       | `BOOL`                        | FALSE   |
| Output      | `xCmd2`                       | `BOOL`                        | FALSE   |
| Output      | `xCmd3`                       | `BOOL`                        | FALSE   |
| Output      | `xCmd4`                       | `BOOL`                        | FALSE   |
| Output      | `xCmd5`                       | `BOOL`                        | FALSE   |
| Output      | `xCmd6`                       | `BOOL`                        | FALSE   |
| Output      | `xCmd7`                       | `BOOL`                        | FALSE   |
| Output      | `xCmd8`                       | `BOOL`                        | FALSE   |
| Output      | `wPrio1`                      | `WORD`                        | 0       |
| Output      | `wPrio2`                      | `WORD`                        | 0       |
| Output      | `wPrio3`                      | `WORD`                        | 0       |
| Output      | `wPrio4`                      | `WORD`                        | 0       |
| Output      | `wPrio5`                      | `WORD`                        | 0       |
| Output      | `wPrio6`                      | `WORD`                        | 0       |
| Output      | `wPrio7`                      | `WORD`                        | 0       |
| Output      | `wPrio8`                      | `WORD`                        | 0       |
| Output      | `xErr`                        | `BOOL`                        | FALSE   |
| Output      | `eOperationalCondition`       | eRedundance3\_OperationalMode |         |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://support.powerio.com/hub/codesys-hvac/hvac-library/functionblocks/general/redundance8.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
