# Redundance8

## `Redundance8` (FB)

FUNCTION\_BLOCK Redundance8

### Short description

> Redundant control of 0 - 8 identical devices\
> Influencing factors: requests, operating hours, operating and fault conditions\
> Typical application: determination of the master and follower devices

### Representation

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

### Interfaces

#### Inputs

| Name                     | Data type | Value range | Initial value | Function                                                   |
| ------------------------ | --------- | ----------- | ------------- | ---------------------------------------------------------- |
| *wTotalNumberOfDevices*  | WORD      |             | 2             | Total number of devices (0 - *cwMaxMumberOfDevices*)       |
| *wActiveNumberOfDevices* | WORD      |             | 0             | Number of active devices (0 - *wTotalNumberOfDevices*)     |
| *xFb1*                   | BOOL      |             | FALSE         | Running - Device 1 (TRUE = running)                        |
| *xFb2*                   | BOOL      |             | FALSE         | Running - Device 2 (TRUE = running)                        |
| *xFb3*                   | BOOL      |             | FALSE         | Running - Device 3 (TRUE = running)                        |
| *xFb4*                   | BOOL      |             | FALSE         | Running - Device 4 (TRUE = running)                        |
| *xFb5*                   | BOOL      |             | FALSE         | Running - Device 5 (TRUE = running)                        |
| *xFb6*                   | BOOL      |             | FALSE         | Running - Device 6 (TRUE = running)                        |
| *xFb7*                   | BOOL      |             | FALSE         | Running - Device 7 (TRUE = running)                        |
| *xFb8*                   | BOOL      |             | FALSE         | Running - Device 8 (TRUE = running)                        |
| *xAlarm1*                | BOOL      |             | TRUE          | Fault - Device 1 (TRUE = fault)                            |
| *xAlarm2*                | BOOL      |             | TRUE          | Fault - Device 2 (TRUE = fault)                            |
| *xAlarm3*                | BOOL      |             | TRUE          | Fault - Device 3 (TRUE = fault)                            |
| *xAlarm4*                | BOOL      |             | TRUE          | Fault - Device 4 (TRUE = fault)                            |
| *xAlarm5*                | BOOL      |             | TRUE          | Fault - Device 5 (TRUE = fault)                            |
| *xAlarm6*                | BOOL      |             | TRUE          | Fault - Device 6 (TRUE = fault)                            |
| *xAlarm7*                | BOOL      |             | TRUE          | Fault - Device 7 (TRUE = fault)                            |
| *xAlarm8*                | BOOL      |             | TRUE          | Fault - Device 8 (TRUE = fault)                            |
| *uiOperatingHours1*      | UDINT     |             | 0             | Operating hours - Device 1                                 |
| *uiOperatingHours2*      | UDINT     |             | 0             | Operating hours - Device 2                                 |
| *uiOperatingHours3*      | UDINT     |             | 0             | Operating hours - Device 3                                 |
| *uiOperatingHours4*      | UDINT     |             | 0             | Operating hours - Device 4                                 |
| *uiOperatingHours5*      | UDINT     |             | 0             | Operating hours - Device 5                                 |
| *uiOperatingHours6*      | UDINT     |             | 0             | Operating hours - Device 6                                 |
| *uiOperatingHours7*      | UDINT     |             | 0             | Operating hours - Device 7                                 |
| *uiOperatingHours8*      | UDINT     |             | 0             | Operating hours - Device 8                                 |
| *xUpdate*                | BOOL      |             |               | Trigger recalculation of the sequence on every rising edge |

#### Outputs

| Name                          | Data type                     | Value range | Initial value | Function                                                             |
| ----------------------------- | ----------------------------- | ----------- | ------------- | -------------------------------------------------------------------- |
| *udiCurrentSequence*          | UDINT                         |             | 0             | Current device sequence as integer                                   |
| *sCurrentSequence*            | STRING                        |             | ‘’            | Current device sequence as string                                    |
| *wNumberOfOperationalDevices* | WORD                          |             | 0             | Number of operational devices                                        |
| *xCmd1*                       | BOOL                          |             | FALSE         | Enable - Device 1 (TRUE = enable)                                    |
| *xCmd2*                       | BOOL                          |             | FALSE         | Enable - Device 2 (TRUE = enable)                                    |
| *xCmd3*                       | BOOL                          |             | FALSE         | Enable - Device 3 (TRUE = enable)                                    |
| *xCmd4*                       | BOOL                          |             | FALSE         | Enable - Device 4 (TRUE = enable)                                    |
| *xCmd5*                       | BOOL                          |             | FALSE         | Enable - Device 5 (TRUE = enable)                                    |
| *xCmd6*                       | BOOL                          |             | FALSE         | Enable - Device 6 (TRUE = enable)                                    |
| *xCmd7*                       | BOOL                          |             | FALSE         | Enable - Device 7 (TRUE = enable)                                    |
| *xCmd8*                       | BOOL                          |             | FALSE         | Enable - Device 8 (TRUE = enable)                                    |
| *wPrio1*                      | WORD                          |             | 0             | Current priority of device 1 (0 = none, 1 - *wTotalNumberOfDevices*) |
| *wPrio2*                      | WORD                          |             | 0             | Current priority of device 2 (0 = none, 1 - *wTotalNumberOfDevices*) |
| *wPrio3*                      | WORD                          |             | 0             | Current priority of device 3 (0 = none, 1 - *wTotalNumberOfDevices*) |
| *wPrio4*                      | WORD                          |             | 0             | Current priority of device 4 (0 = none, 1 - *wTotalNumberOfDevices*) |
| *wPrio5*                      | WORD                          |             | 0             | Current priority of device 5 (0 = none, 1 - *wTotalNumberOfDevices*) |
| *wPrio6*                      | WORD                          |             | 0             | Current priority of device 6 (0 = none, 1 - *wTotalNumberOfDevices*) |
| *wPrio7*                      | WORD                          |             | 0             | Current priority of device 7 (0 = none, 1 - *wTotalNumberOfDevices*) |
| *wPrio8*                      | WORD                          |             | 0             | Current priority of device 8 (0 = none, 1 - *wTotalNumberOfDevices*) |
| *xErr*                        | BOOL                          |             | FALSE         | Output - Fault                                                       |
| *eOperationalCondition*       | eRedundance3\_OperationalMode |             |               | Number / name of the current operating condition                     |

#### Setpoints / parameters

| Name                   | Data type | Value range | Initial value | Function                                                                                                         |
| ---------------------- | --------- | ----------- | ------------- | ---------------------------------------------------------------------------------------------------------------- |
| **xConOperatingHours** | BOOL      |             | TRUE          | FALSE = follow switching enabled only by input xUpdate, TRUE = follow switching automatically by operating hours |
| **xEnFb**              | BOOL      |             | TRUE          | FALSE = switching by enable (xCmdX), TRUE = switching by running signal (xFbX)                                   |
| **wTolerance**         | WORD      |             | 100           | Threshold - operating hours difference for direct follow change in partial load operation                        |

### Function description

#### General

This function block is used for redundant control of 0 - 8 identical devices depending on the influencing variables.\
Demands (*wActiveNumberOfDevices*), operating hours (*uiOperatingHours*), operating states (*xFb*) and\
fault states (*xAlarm*).

#### Input *wTotalNumberOfDevices*

This input is used to determine the total number of available devices.\
Devices are assigned consecutively starting from the lowest device numbers.\
Example: *wTotalNumberOfDevices* = 3: Devices 1 - 3 (inputs and outputs) are used / considered.\
Allowed range: 0 - *cwMaxNumberOfDevices*

#### Input *wActiveNumberOfDevices*

This input is used to determine the number of devices that should currently be used.\
Allowed range: 0 - *wTotalNumberOfDevices*

#### Input *xUpdate*

Each rising edge on this input triggers a recalculation of the current device sequence.\
Boundary conditions: *xConOperationHours* = FALSE, operating hours difference = 0 hours.

#### Output *udiCurrentSequence*

This output always shows the current device sequence as an integer. The number of the device with the highest priority is always at the beginning, followed by the number of the device with the second highest priority, etc.\
Example: *udiCurrentSequence* = 145 means: Device 1 = priority 1, Device 4 = priority 2 and Device 5 = priority 3

#### Output *sCurrentSequence*

This output always shows the current device sequence as a string with delimiters. The same applies regarding priorities as for the output *udiCurrentSequence*.\
Example: *sdiCurrentSequence* = ‘1-4-5’ means: Device 1 = priority 1, Device 4 = priority 2 and Device 5 = priority 3

#### Output *wNumberOfOperationalDevices*

This output always indicates the number of operational devices.

#### Output Fault *xErr*

This output is active (= TRUE) if at least one of the following conditions is met.

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

\
In all other cases the output \*xErr\* is not active (= FALSE).

#### Output *eOperationalCondition*

This output always represents the current load situation (idle, partial load, full load) depending on the setpoint / parameter **xEnFb** thereof.\
**xEnFb** = FALSE: The enable outputs *xCmd* of the operational devices are evaluated / considered.\
**xEnFb** = TRUE: The operating states *xFb* of the operational devices are evaluated / considered.\
Example: **xEnFb** = TRUE, *wTotalNumberOfDevices* = 3 and *xFb1* = TRUE and *xFb2* = TRUE: Output = *PartLoad\_Inputs\_Fb*

#### Setpoint / parameters **xConOperatingHours**

**xConOperatingHours** = FALSE: Switching of the device sequence is triggered only by a rising edge at input *xUpdate* .\
**xConOperatingHours** = TRUE: Switching of the device sequence is triggered depending on the operating hours, the running signals (when **xEnFb** = TRUE)\
and the enables (when **xEnFb** = FALSE) .

#### Setpoint / parameters **xEnFb**

**xEnFb** = FALSE: The enable outputs ‘xCmd’ of the operational devices are evaluated / considered.\
**xEnFb** = TRUE: The running states ‘xFb’ of the operational devices are evaluated / considered.

#### Setpoint / parameters **wTolerance**

This setpoint determines the maximum operating hours difference before switching the device sequence due to operating hours.

#### Determination of the device sequence

A change of the device sequence can **in general** only occur if at least one of the following conditions is met:

1. The fault condition of at least one device ( devices 1 - *wTotalNumberOfDevices* ) has changed (high priority)
2. The total number of devices (input *wTotalNumberOfDevices*) (1 - *cwMaxNumberOfDevices*) has changed (high priority)
3. The operating hours of at least one operational device (devices 1 - *wTotalNumberOfDevices*) have changed (low priority)

#### Definition - idle:

xEnFb = FALSE: The enable outputs ‘xCmd’ of all operational devices (devices 1 - wTotalNumberOfDevices) are inactive (= FALSE)\
xEnFb = TRUE: The running signals ‘xFb’ of all operational devices (devices 1 - wTotalNumberOfDevices) are inactive (= FALSE)

#### Definition - full load:

xEnFb = FALSE: The enable outputs ‘xCmd’ of all operational devices (devices 1 - wTotalNumberOfDevices) are active (= TRUE)\
xEnFb = TRUE: The running signals ‘xFb’ of all operational devices (devices 1 - wTotalNumberOfDevices) are active (= TRUE)

#### Definition - partial load:

xEnFb = FALSE: The number of enable outputs 'xCmd' of all operational devices in state active (= TRUE) is greater than or equal to 1 and less than the number of all operational devices (devices 1 - wTotalNumberOfDevices)\
xEnFb = FALSE: The number of status feedbacks xFb of all operational devices in state active (= TRUE) is greater than or equal to 1 and less than the number of all operational devices (devices 1 - wTotalNumberOfDevices)\
\
\
\
Switching with high priority (= immediate) depending on the fault conditions (inputs xAlarm) and the input **wTotalNumberOfDevices.**\
\
The fault condition of each device in the range 1 - *wTotalNumberOfDevices* is sampled cyclically and evaluated for changes.\
The input *wTotalNumberOfDevices* is cyclically detected and evaluated for changes.\
Each faulty device (input *xAlarm* = TRUE) in the range 1 - *wTotalNumberOfDevices* is no longer operational.\
Any change in the fault state of at least one device in the range 1 - *wTotalNumberOfDevices* triggers an immediate recalculation of the device sequence.\
Any change on the input *wTotalNumberOfDevices* triggers an immediate recalculation of the device sequence.\
\
\
\
Switching with **lower** priority depending on operating hours (inputs *udiOperationHours*), operating states (inputs *xFb*)\
and enable outputs (outputs *xCmd*) of devices 1 - 3.\
\
The operating hours of each operational device in the range 1 - *wTotalNumberOfDevices* are sampled cyclically and evaluated for changes.\
The operating states and enable outputs of each operational device in the range 1 - *wTotalNumberOfDevices* are sampled cyclically.\
Recalculation of the device sequence occurs as soon as one of the situations described below applies:\
\
\
\
**Situation 1** (*xConOperationHours* = FALSE, rising edge at input *xUpdate*)\
\
A recalculation of the device sequence takes place with an operating hours difference of 0 hours, i.e. the non-faulty device with the lowest operating hours\
has the highest priority (in case of equal operating hours the device with the lower number has the higher priority).\
\
\
\
**Situation 2** (*xConOperationHours* = TRUE, idle or full load)\
\
In idle or full load a recalculation of the device sequence takes place with an operating hours difference of 0 hours, i.e. the non-faulty device\
with the lowest operating hours has the highest priority (in case of equal operating hours the device with the lower number has the higher priority).\
The recalculation of the device sequence is triggered if the operating hours of at least one operational device have changed.\
\
\
\
**Situation 3** (*xConOperationHours* = TRUE, partial load)\
\
On the first transition into partial load operation a recalculation of the device sequence takes place with an operating hours difference of 0 hours, i.e. the non-faulty device\
with the lowest operating hours has the highest priority (in case of equal operating hours the device with the lower number has the higher priority).\
\
In regular partial load operation a recalculation of the device sequence takes place with an operating hours difference of **wTolerance** hours.\
The recalculation of the device sequence is triggered if the operating hours of at least one operational device have changed.

#### Enable outputs 'xCmd’

\
The states of the outputs of the devices in the range 1 - wTotalNumberOfDevices are finally determined as follows:\
\
The enable outputs of the operational devices in the range 1 - wTotalNumberOfDevices are activated if their current priority <= the number of\
requested devices (input \*wActiveNumberOfDevices).\
The enable outputs of the operational devices in the range 1 - wTotalNumberOfDevices are deactivated if their current priority > the number of\
requested devices (input wActiveNumberOfDevices).

#### Priority outputs *wPrio*

\
The priority outputs of each device always contain the current priority in the range 0 - wTotalNumberOfDevices.\
\
Priority = 0: The device has no or an invalid priority\
Priority = 1: The device has the highest priority\
Priority = 2: The device has the second highest priority\
Priority = 3: The device has the third highest priority\
etc.

### 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/en/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.
