# Redundance2

## `Redundance2` (FB)

FUNCTION\_BLOCK Redundance2

### Kurzbeschreibung

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

### Darstellung

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

### Schnittstellen

#### Eingänge

| Name                | Datentyp | Wertebereich | Initialwert | Funktion                                      |
| ------------------- | -------- | ------------ | ----------- | --------------------------------------------- |
| *xEnOne*            | BOOL     |              |             | Anforderung - Führungsgerät                   |
| *xEnTwo*            | BOOL     |              |             | Anforderung - Führungs- und Folgegerät        |
| *xFb1*              | BOOL     |              |             | Betrieb - Gerät 1                             |
| *xFb2*              | BOOL     |              |             | Betrieb - Gerät 2                             |
| *xAlarm1*           | BOOL     |              |             | Störung - Gerät 1                             |
| *xAlarm2*           | BOOL     |              |             | Störung - Gerät 2                             |
| *uiOperatingHours1* | UDINT    |              |             | Betriebsstunden - Gerät 1                     |
| *uiOperatingHours2* | UDINT    |              |             | Betriebsstunden - Gerät 2                     |
| *xUpdate*           | BOOL     |              |             | Eingang - Folgeschaltung nach Betriebsstunden |

#### Ausgänge

| Name               | Datentyp | Wertebereich | Initialwert | Funktion             |
| ------------------ | -------- | ------------ | ----------- | -------------------- |
| *iCurrentSequence* | INT      |              |             | Aktuelle Gerätefolge |
| *xCmd1*            | BOOL     |              |             | Freigabe - Gerät 1   |
| *xCmd2*            | BOOL     |              |             | Freigabe - Gerät 2   |
| *xErr*             | BOOL     |              |             | Ausgang - Störung    |

#### Sollwerte / Parameter

| Name                            | Datentyp          | Wertebereich                                                                                 | Initialwert            | Funktion                                                                         |
| ------------------------------- | ----------------- | -------------------------------------------------------------------------------------------- | ---------------------- | -------------------------------------------------------------------------------- |
| **eModeRedundance**             | eOpModeRedundance | eOpModeRedundance.Auto, eOpModeRedundance.ForceComponent1, eOpModeRedundance.ForceComponent2 | eOpModeRedundance.Auto | Betriebsart der Sequenzfestlegung                                                |
| **xConOperatingHours**          | BOOL              |                                                                                              | TRUE                   | Freigabe - Folgeschaltung nach Betriebsstunden                                   |
| **xEnFb**                       | BOOL              |                                                                                              | TRUE                   | Freigabe - Verwendung der Betriebsmeldungen                                      |
| **wTolerance**                  | WORD              |                                                                                              | 100                    | Grenzwert - Betriebsstundendifferenz                                             |
| **xIgnoreAlarmXFollowerDevice** | BOOL              |                                                                                              | FALSE                  | Parameter zur Ignorierung des Störzustands des Folgegerätes (TRUE = Ignorierung) |

### Funktionsbeschreibung

#### Allgemeines

Dieser Funktionsbaustein dient zur redundanten Steuerung von zwei gleichartigen Geräten in Abhängigkeit von den Einflussgrößen Anforderungen (*xEnOne* und *xEnTwo*), Betriebstunden (*uiOperatingHours1* und *uiOperatingHours2*), Betriebszuständen (*xFb1* und *xFb2*), Störzuständen (*xAlarm1* und *xAlarm2*) und der Betriebsart für die Sequenzfestlegung (**eModeRedundance**).\
Die Freigabe des Führungs- und bei Bedarf des Folgegerätes wird intern festgelegt und unter Berücksichtigung der aktuellen Folge *iCurrentSequence* auf die Geräteausgänge *xCmd1* bzw. *xCmd2* übertragen.

#### Anforderungen *xEnOne* und *xEnTwo*

Sie dienen zur Festlegung, ob nur das Führungsgerät oder das Führungs- und das Folgegerät angefordert werden sollen.

| *xEnOne* | *xEnTwo* | Führungsgerät | Folgegerät | Hinweis                                |
| -------- | -------- | ------------- | ---------- | -------------------------------------- |
| FALSE    | FALSE    | FALSE         | FALSE      | Keine Anforderung                      |
| TRUE     | FALSE    | TRUE          | FALSE      | Anforderung - Führungsgerät            |
| X        | TRUE     | TRUE          | TRUE       | Anforderung - Führungs- und Folgegerät |

Legende: X = Unbestimmt

#### Ausgang Störung *xErr*

Er zeigt eine Diskrepanz zwischen den Anforderungen und den Störzuständen der Geräte an.\
In der Funktionstabelle werden die Konstellationen beschrieben, die den Ausgang *xErr* (= TRUE) aktivieren, d.h eine Störung anzeigen.\
In allen übrigen Fällen ist der Ausgang *xErr* nicht aktiv (= FALSE).

| *xEnOne* | *xEnTwo* | *xAlarm1* | *xAlarm2* | *xErr* | Hinweis                                                                 |
| -------- | -------- | --------- | --------- | ------ | ----------------------------------------------------------------------- |
| TRUE     | X        | TRUE      | TRUE      | TRUE   | Anforderung - Führungsgerät und beide Geräte gestört                    |
| X        | TRUE     | TRUE      | X         | TRUE   | Anforderung - Führungs- und Folgegerät und mindestens ein Gerät gestört |
| X        | TRUE     | X         | TRUE      | TRUE   | Anforderung - Führungs- und Folgegerät und mindestens ein Gerät gestört |

Legende: X = Unbestimmt

#### Ausgang *iCurrentSequence*

Er zeigt stets die aktuelle Folge der beiden Geräte an.\
Die erste Ziffer zeigt stets die Gerätenummer des Führungsgerätes an (Beispiel: *iCurrentSequence* = 1X … Führungsgerät = Gerät 1)\
Die zweite Ziffer zeigt stets die Gerätenummer des Folgegeräts an. (Beispiel: *iCurrentSequence* = X2 … Folgegerät = Gerät 2)

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

Im Zustand TRUE wird bei jeder Abarbeitung des Funktionsblocks die Folgeschaltung in Abhängigkeit von den Betriebsstunden und Betriebsmeldungen (bei **xEnFb** = TRUE) der Geräte 1 und 2 ausgelöst.\
Im Zustand FALSE kann die Folgeschaltung nur noch durch eine ansteigende Flanke am Eingang *xUpdate* ausgelöst werden.

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

Im Zustand TRUE werden in der Folgeschaltung die Betriebszustände der Geräte 1 und 2 ausgewertet und berücksichtigt.\
Im Zustand FALSE werden in der Folgeschaltung die Geräteausgänge der Geräte 1 und 2 ausgewertet und berücksichtigt.

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

Dieser Sollwert bestimmt die maximale Betriebsstundendifferenz vor einer Umschaltung des Führungs- und des Folgegeräts aufgrund der Betriebsstunden.

#### Sollwert / Parameter **eModeRedundance**

Dieser Sollwert legt die Betriebsart der Sequenzfestlegung fest. Im Automatikbetrieb erfolgt die Festlegung der Sequenz automatisch.\
Die Zwangsfestlegung der Sequenz in den Betriebsarten ForceComponent1 bzw. ForceComponent2 erfolgt über eine gezielte Beeinflussung der internen Stände der Betriebsstundenzähler bzw. des Sollwerts / Parameters **wTolerance**.\
Die Sequenzumschaltung im Störungsfall ist daher nach wie vor gegeben.

| **eModeRedundance**               | Führungsgerät           | Folgegerät              | Hinweis                        |
| --------------------------------- | ----------------------- | ----------------------- | ------------------------------ |
| eOpModeRedundance.Auto            | Automatische Festlegung | Automatische Festlegung | Automatische Sequenzfestlegung |
| eOpModeRedundance.ForceComponent1 | Gerät 1                 | Gerät 2                 | Erzwungene Sequenz Gerät 1 - 2 |
| eOpModeRedundance.ForceComponent2 | Gerät 2                 | Gerät 1                 | Erzwungene Sequenz Gerät 2 - 1 |

#### Bestimmung des Führungs- und des Folgegeräts

Umschaltung mit hoher Priorität in Abhängigkeit von den Störzuständen der Geräte 1 und 2

| *xAlarm1* | *xAlarm2* | Führungsgerät     | Folgegerät        | Hinweis                   |
| --------- | --------- | ----------------- | ----------------- | ------------------------- |
| FALSE     | FALSE     | nicht beeinflusst | nicht beeinflusst | Beide Geräte ohne Störung |
| TRUE      | FALSE     | Gerät 2           | Gerät 1           | Gerät 1 gestört           |
| X         | TRUE      | Gerät 1           | Gerät 2           | Gerät 2 gestört           |

Legende: X = Unbestimmt

Umschaltung mit niedriger Priorität in Abhängigkeit von den Betriebsstunden, Betriebsmeldungen (**xFb**) und Freigabeausgänge (**xCmd**) der Geräte 1 und 2

Eine Neubewertung und -festlegung mit niedriger Priorität kann dabei jeweils wie folgt ausgelöst werden:

**xConOperatingHours** = TRUE und / oder ansteigende Flanke am Eingang *xUpdate*

| **xConOperatingHours** | *xUpdate*        | Bedingungen                                                                                                                     | Führungsgerät                                                                                           |
| ---------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| FALSE                  | FALSE, TRUE, H/L |                                                                                                                                 | keine Neubewertung                                                                                      |
| TRUE                   | FALSE, TRUE, H/L | gleiche Betriebsmeldungen (**xFb** = TRUE oder = FALSE) oder gleiche Freigabeausgänge (**xCmd** = TRUE oder = FALSE) der Geräte | Gerät mit geringerer Betriebsstundenanzahl                                                              |
| TRUE                   | FALSE, TRUE, H/L | Ein Gerät in Betrieb (**xFb** = TRUE) oder ein Gerät freigegeben (**xCmd** = FALSE)                                             | Wechsel zum Gerät mit geringerer Betriebsstundenanzahl, falls Betriebsstundendifferenz > **wTolerance** |
| FALSE                  | L/H              | *uiOperatingHours1* = *uiOperatingHours2* = 0 (keine Betriebsstunden vorhanden)                                                 | Wechsel des Führungs- mit dem Folgegerät                                                                |
| FALSE                  | L/H              | *uiOperatingHours1* oder *uiOperatingHours2* > 0                                                                                | Gerät mit geringerer Betriebsstundenanzahl                                                              |

Legende: L/H … ansteigende Flanke, H/L … abfallende Flanke

#### Geräteausgänge *xCmd1* und *xCmd2*

Die Geräteausgänge werden (xIgnoreAlarmXFollowerDevice = FALSE) abschließend wie folgt festgelegt:

**Führungsgerät = Gerät 1**

*xCmd1* = TRUE: Das Führungsgerät ist angefordert und mindestens ein Gerät ist angefordert und das Gerät 1 ist nicht gestört *xCmd1* = FALSE: In allen übrigen Fällen

*xCmd2* = TRUE: Das Folgegerät ist angefordert und mindestens ein Gerät ist angefordert und das Gerät 2 ist nicht gestört *xCmd2* = FALSE: In allen übrigen Fällen

**Führungsgerät = Gerät 2**

*xCmd1* = TRUE: Das Folgegerät ist angefordert und mindestens ein Gerät ist angefordert und das Gerät 1 ist nicht gestört *xCmd1* = FALSE: In allen übrigen Fällen

*xCmd2* = TRUE: Das Führungsgerät ist angefordert und mindestens ein Gerät ist angefordert und das Gerät 2 ist nicht gestört *xCmd2* = FALSE: In allen übrigen Fällen

Die Geräteausgänge werden ( xIgnoreAlarmXFollowerDevice = TRUE und gleichzeitig sind nicht beide Geräte gestört ) abschließend wie folgt festgelegt:

**Führungsgerät = Gerät 1**

*xCmd1* = TRUE: Das Führungsgerät ist angefordert und mindestens ein Gerät ist angefordert und das Gerät 1 ist nicht gestört *xCmd1* = FALSE: In allen übrigen Fällen

*xCmd2* = TRUE: Das Folgegerät ist angefordert und mindestens ein Gerät ist angefordert. *xCmd2* = FALSE: In allen übrigen Fällen

**Führungsgerät = Gerät 2**

*xCmd1* = TRUE: Das Folgegerät ist angefordert und mindestens ein Gerät ist angefordert *xCmd1* = FALSE: In allen übrigen Fällen

*xCmd2* = TRUE: Das Führungsgerät ist angefordert und mindestens ein Gerät ist angefordert und das Gerät 2 ist nicht gestört *xCmd2* = FALSE: In allen übrigen Fällen

### CODESYS

InOut:

| Scope       | Name                          | Type              | Initial                |
| ----------- | ----------------------------- | ----------------- | ---------------------- |
| Input       | `xEnOne`                      | `BOOL`            |                        |
| Input       | `xEnTwo`                      | `BOOL`            |                        |
| Input       | `xFb1`                        | `BOOL`            |                        |
| Input       | `xFb2`                        | `BOOL`            |                        |
| Input       | `xAlarm1`                     | `BOOL`            |                        |
| Input       | `xAlarm2`                     | `BOOL`            |                        |
| Input       | `uiOperatingHours1`           | `UDINT`           |                        |
| Input       | `uiOperatingHours2`           | `UDINT`           |                        |
| Input       | `xUpdate`                     | `BOOL`            |                        |
| Input Const | `xIgnoreAlarmXFollowerDevice` | `BOOL`            | FALSE                  |
| Input Const | `eModeRedundance`             | eOpModeRedundance | eOpModeRedundance.Auto |
| Input Const | `xConOperatingHours`          | `BOOL`            | TRUE                   |
| Input Const | `xEnFb`                       | `BOOL`            | TRUE                   |
| Input Const | `wTolerance`                  | `WORD`            | 100                    |
| Output      | `iCurrentSequence`            | `INT`             |                        |
| Output      | `xCmd1`                       | `BOOL`            |                        |
| Output      | `xCmd2`                       | `BOOL`            |                        |
| Output      | `xErr`                        | `BOOL`            |                        |
