# PowerFeedOptimizer

## `PowerFeedOptimizer` (FB)

FUNCTION\_BLOCK PowerFeedOptimizer

### Short description

> Maximum limiting of electrical power at the grid connection point by switching off consumers 1 - 4 (index ‘\_Con’) (e.g. electric heater)\
> Minimum limiting of electrical power at the grid connection point by switching on generators 1 - 4 (index ‘\_Gen’) (e.g. heat pump for cooling)\
> Influencing factors: electrical power at the grid connection point, operating hours, operating and fault states of consumers / generators\
> Typical application: optimization of the time course of electrical power at the grid connection point

### Representation

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

### Interfaces

#### Inputs

| Name                          | Data type | Value range | Initial value | Function                                                                                              |
| ----------------------------- | --------- | ----------- | ------------- | ----------------------------------------------------------------------------------------------------- |
| *xEn*                         | BOOL      |             | TRUE          | Enable / disable of the function block                                                                |
| *xUpdateDeviceOutputs*        | BOOL      |             | FALSE         | Update of the device outputs (on every rising edge)                                                   |
| *xResError*                   | BOOL      |             | FALSE         | Reinitialization of the fault outputs to their respective fault-free states (on every rising edge)    |
| *rElectricalPower*            | REAL      |             | 0.0           | Current electrical power at the feed-in point in XX.X kW                                              |
| *rMaxElectricalPower\_Con*    | REAL      |             | 100.0         | Maximum electrical power at the feed-in point (consumption) in XX.X kW before switching off consumers |
| *rMaxElectricalPower\_Gen*    | REAL      |             | 100.0         | Maximum electrical power at the feed-in point (feed-in) in XX.X kW before switching on generators     |
| *wActiveNumberOfDevices\_Con* | WORD      |             | 4             | Number of requested consumers (0 - 4)                                                                 |
| *xFb\_Con1*                   | BOOL      |             | FALSE         | Operation - Consumer 1 (TRUE = running)                                                               |
| *xFb\_Con2*                   | BOOL      |             | FALSE         | Operation - Consumer 2 (TRUE = running)                                                               |
| *xFb\_Con3*                   | BOOL      |             | FALSE         | Operation - Consumer 3 (TRUE = running)                                                               |
| *xFb\_Con4*                   | BOOL      |             | FALSE         | Operation - Consumer 4 (TRUE = running)                                                               |
| *xAlarm\_Con1*                | BOOL      |             | FALSE         | Fault - Consumer 1 (TRUE = fault)                                                                     |
| *xAlarm\_Con2*                | BOOL      |             | FALSE         | Fault - Consumer 2 (TRUE = fault)                                                                     |
| *xAlarm\_Con3*                | BOOL      |             | FALSE         | Fault - Consumer 3 (TRUE = fault)                                                                     |
| *xAlarm\_Con4*                | BOOL      |             | FALSE         | Fault - Consumer 4 (TRUE = fault)                                                                     |
| *udiOpHours\_Con1*            | UDINT     |             | 0             | Operating hours - Consumer 1                                                                          |
| *udiOpHours\_Con2*            | UDINT     |             | 0             | Operating hours - Consumer 2                                                                          |
| *udiOpHours\_Con3*            | UDINT     |             | 0             | Operating hours - Consumer 3                                                                          |
| *udiOpHours\_Con4*            | UDINT     |             | 0             | Operating hours - Consumer 4                                                                          |
| *wActiveNumberOfDevices\_Gen* | WORD      |             | 4             | Number of requested generators (0 - 4)                                                                |
| *xFb\_Gen1*                   | BOOL      |             | FALSE         | Operation - Generator 1 (TRUE = running)                                                              |
| *xFb\_Gen2*                   | BOOL      |             | FALSE         | Operation - Generator 2 (TRUE = running)                                                              |
| *xFb\_Gen3*                   | BOOL      |             | FALSE         | Operation - Generator 3 (TRUE = running)                                                              |
| *xFb\_Gen4*                   | BOOL      |             | FALSE         | Operation - Generator 4 (TRUE = running)                                                              |
| *xAlarm\_Gen1*                | BOOL      |             | FALSE         | Fault - Generator 1 (TRUE = fault)                                                                    |
| *xAlarm\_Gen2*                | BOOL      |             | FALSE         | Fault - Generator 2 (TRUE = fault)                                                                    |
| *xAlarm\_Gen3*                | BOOL      |             | FALSE         | Fault - Generator 3 (TRUE = fault)                                                                    |
| *xAlarm\_Gen4*                | BOOL      |             | FALSE         | Fault - Generator 4 (TRUE = fault)                                                                    |
| *udiOpHours\_Gen1*            | UDINT     |             | 0             | Operating hours - Generator 1                                                                         |
| *udiOpHours\_Gen2*            | UDINT     |             | 0             | Operating hours - Generator 2                                                                         |
| *udiOpHours\_Gen3*            | UDINT     |             | 0             | Operating hours - Generator 3                                                                         |
| *udiOpHours\_Gen4*            | UDINT     |             | 0             | Operating hours - Generator 4                                                                         |
| *xUpdateRedundance4\_Con*     | BOOL      |             | FALSE         | Trigger recalculation of the sequence for consumers (internal FB ‘Redundance4’) on every rising edge  |
| *xUpdateRedundance4\_Gen*     | BOOL      |             | FALSE         | Trigger recalculation of the sequence for generators (internal FB ‘Redundance4’) on every rising edge |

#### Outputs

| Name                               | Data type                               | Value range | Initial value | Function                                                                                      |
| ---------------------------------- | --------------------------------------- | ----------- | ------------- | --------------------------------------------------------------------------------------------- |
| *xLoadRejection\_Con*              | BOOL                                    |             | FALSE         | Current state of load shedding of active consumers (TRUE = shedding active)                   |
| *rTotalNomElectricalPower\_Con*    | REAL                                    |             | 0.0           | Total nominal electrical power of all ready-to-operate and active consumers in XX.X kW        |
| *rControlSignal\_Con*              | REAL                                    |             | 0.0           | Difference of electrical power in XX.X kW for the consumers                                   |
| *wNumberOfOperationalDevices\_Con* | WORD                                    |             | 0             | Number of operational consumers                                                               |
| *udiCurrentSequence\_Con*          | UDINT                                   |             | 0             | Current device sequence of the consumers as integer (criteria: fault state, operating hours)  |
| *sCurrentSequence\_Con*            | STRING                                  |             | ‘’            | Current device sequence of the consumers as string (criteria: fault state, operating hours)   |
| *stOutputs\_Con1*                  | stDevicesOutputsCon\_PowerFeedOptimizer |             |               | Current states of all outputs of consumer 1                                                   |
| *stOutputs\_Con2*                  | stDevicesOutputsCon\_PowerFeedOptimizer |             |               | Current states of all outputs of consumer 2                                                   |
| *stOutputs\_Con3*                  | stDevicesOutputsCon\_PowerFeedOptimizer |             |               | Current states of all outputs of consumer 3                                                   |
| *stOutputs\_Con4*                  | stDevicesOutputsCon\_PowerFeedOptimizer |             |               | Current states of all outputs of consumer 4                                                   |
| *eOperationalCondition\_Con*       | eRedundance3\_OperationalMode           |             |               | Number / name of the current operating condition of the consumers (Redundance4)               |
| *xLoadConnection\_Gen*             | BOOL                                    |             | FALSE         | Current state of connection of active generators (TRUE = connection active)                   |
| *rTotalNomElectricalPower\_Gen*    | REAL                                    |             | 0.0           | Total nominal electrical power of all ready-to-operate and active generators in XX.X kW       |
| *rControlSignal\_Gen*              | REAL                                    |             | 0.0           | Difference of electrical power in XX.X kW for the generators                                  |
| *wNumberOfOperationalDevices\_Gen* | WORD                                    |             | 0             | Number of operational generators                                                              |
| *udiCurrentSequence\_Gen*          | UDINT                                   |             | 0             | Current device sequence of the generators as integer (criteria: fault state, operating hours) |
| *sCurrentSequence\_Gen*            | STRING                                  |             | ‘’            | Current device sequence of the generators as string (criteria: fault state, operating hours)  |
| *stOutputs\_Gen1*                  | stDevicesOutputsGen\_PowerFeedOptimizer |             |               | Current states of all outputs of generator 1                                                  |
| *stOutputs\_Gen2*                  | stDevicesOutputsGen\_PowerFeedOptimizer |             |               | Current states of all outputs of generator 2                                                  |
| *stOutputs\_Gen3*                  | stDevicesOutputsGen\_PowerFeedOptimizer |             |               | Current states of all outputs of generator 3                                                  |
| *stOutputs\_Gen4*                  | stDevicesOutputsGen\_PowerFeedOptimizer |             |               | Current states of all outputs of generator 4                                                  |
| *eOperationalCondition\_Gen*       | eRedundance3\_OperationalMode           |             |               | Number / name of the current operating condition of the generators (Redundance4)              |
| *xErr*                             | BOOL                                    |             | FALSE         | Output - Fault (TRUE = fault)                                                                 |
| *sErrorCodes\_General*             | STRING                                  |             | ‘’            | String with the numbers of active error bits - general                                        |
| *sErrorCodes\_Con*                 | STRING                                  |             | ‘’            | String with the numbers of active error bits - consumers                                      |
| *sErrorCodes\_Gen*                 | STRING                                  |             | ‘’            | String with the numbers of active error bits - generators                                     |

#### Setpoints / parameters

| Name                             | Data type | Value range | Initial value    | Function                                                                                                                                                                                             |
| -------------------------------- | --------- | ----------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **tTimeUpdateDeviceOutputs**     | TIME      |             | T#3s             | Update interval for operations influenced by the input ‘xUpdateDeviceOutputs’                                                                                                                        |
| **wTolerance\_Con**              | WORD      |             | 100              | Threshold - operating hours difference for direct successive switching in partial-load operation of consumers                                                                                        |
| **xEnFb\_Con**                   | BOOL      |             | FALSE            | Selection criterion for determining the operating state (idle / partial load / full load), FALSE: enable outputs - consumers (xCmd\_ConX), TRUE: operation feedback inputs - consumers (xFb\_ConX)   |
| **xConOperatingHours\_Con**      | BOOL      |             | TRUE             | Trigger criterion for recalculation of the sequence, FALSE: only via input ‘xUpdateRedundance4\_Con’, TRUE: automatic after operating hours ‘udiOpHours\_ConX’                                       |
| **wTolerance\_Gen**              | WORD      |             | 100              | Threshold - operating hours difference for direct successive switching in partial-load operation of generators                                                                                       |
| **xEnFb\_Gen**                   | BOOL      |             | FALSE            | Selection criterion for determining the operating state (idle / partial load / full load), FALSE: enable outputs - generators (xCmd\_GenX), TRUE: operation feedback inputs - generators (xFb\_GenX) |
| **xConOperatingHours\_Gen**      | BOOL      |             | TRUE             | Trigger criterion for recalculation of the sequence, FALSE: only via input ‘xUpdateRedundance4\_Gen’, TRUE: automatic after operating hours ‘udiOpHours\_GenX’                                       |
| **tInitDelay\_EP**               | TIME      |             | T#5s             | Start delay - initialization for the input ‘rElectricalPower’ (eInitial\_rEP = InitValueDelayed)                                                                                                     |
| **eInitial\_EP**                 | eInit     |             | eInit.InputValue | Selection of the initial value for the input ‘rElectricalPower’                                                                                                                                      |
| **rInitValue\_EP**               | REAL      |             | 0.0              | Initial value for the input ‘rElectricalPower’ (eInitial\_rEP = InitValue)                                                                                                                           |
| **tTimeConstant\_EP**            | TIME      |             | T#15s            | Filter - time constant for the input ‘rElectricalPower’                                                                                                                                              |
| **rTn\_Con**                     | REAL      |             | 180.0            | PI controller for the power difference: reset time for the control deviation in seconds                                                                                                              |
| **rTn\_Gen**                     | REAL      |             | 180.0            | PI controller for the power difference: reset time for the control deviation in seconds                                                                                                              |
| **rMinNomElectricalPower\_Con1** | REAL      |             | 0.0              | Minimum nominal electrical power of consumer 1 in XX.X kW                                                                                                                                            |
| **rMaxNomElectricalPower\_Con1** | REAL      |             | 10.0             | Maximum nominal electrical power of consumer 1 in XX.X kW                                                                                                                                            |
| **tOnDelayCmd\_Con1**            | TIME      |             | T#10s            | Turn-on delay - enable output ‘xCmd’ - consumer 1                                                                                                                                                    |
| **tOffDelayCmd\_Con1**           | TIME      |             | T#10s            | Turn-off delay - enable output ‘xCmd’ - consumer 1                                                                                                                                                   |
| **rMinNomElectricalPower\_Con2** | REAL      |             | 0.0              | Minimum nominal electrical power of consumer 2 in XX.X kW                                                                                                                                            |
| **rMaxNomElectricalPower\_Con2** | REAL      |             | 10.0             | Maximum nominal electrical power of consumer 2 in XX.X kW                                                                                                                                            |
| **tOnDelayCmd\_Con2**            | TIME      |             | T#10s            | Turn-on delay - enable output ‘xCmd’ - consumer 2                                                                                                                                                    |
| **tOffDelayCmd\_Con2**           | TIME      |             | T#10s            | Turn-off delay - enable output ‘xCmd’ - consumer 2                                                                                                                                                   |
| **rMinNomElectricalPower\_Con3** | REAL      |             | 0.0              | Minimum nominal electrical power of consumer 3 in XX.X kW                                                                                                                                            |
| **rMaxNomElectricalPower\_Con3** | REAL      |             | 10.0             | Maximum nominal electrical power of consumer 3 in XX.X kW                                                                                                                                            |
| **tOnDelayCmd\_Con3**            | TIME      |             | T#10s            | Turn-on delay - enable output ‘xCmd’ - consumer 3                                                                                                                                                    |
| **tOffDelayCmd\_Con3**           | TIME      |             | T#10s            | Turn-off delay - enable output ‘xCmd’ - consumer 3                                                                                                                                                   |
| **rMinNomElectricalPower\_Con4** | REAL      |             | 0.0              | Minimum nominal electrical power of consumer 4 in XX.X kW                                                                                                                                            |
| **rMaxNomElectricalPower\_Con4** | REAL      |             | 10.0             | Maximum nominal electrical power of consumer 4 in XX.X kW                                                                                                                                            |
| **tOnDelayCmd\_Con4**            | TIME      |             | T#10s            | Turn-on delay - enable output ‘xCmd’ - consumer 4                                                                                                                                                    |
| **tOffDelayCmd\_Con4**           | TIME      |             | T#10s            | Turn-off delay - enable output ‘xCmd’ - consumer 4                                                                                                                                                   |
| **rMinNomElectricalPower\_Gen1** | REAL      |             | 0.0              | Minimum nominal electrical power of generator 1 in XX.X kW                                                                                                                                           |
| **rMaxNomElectricalPower\_Gen1** | REAL      |             | -10.0            | Maximum nominal electrical power of generator 1 in XX.X kW                                                                                                                                           |
| **tOnDelayCmd\_Gen1**            | TIME      |             | T#10s            | Turn-on delay - enable output ‘xCmd’ - generator 1                                                                                                                                                   |
| **tOffDelayCmd\_Gen1**           | TIME      |             | T#10s            | Turn-off delay - enable output ‘xCmd’ - generator 1                                                                                                                                                  |
| **rMinNomElectricalPower\_Gen2** | REAL      |             | 0.0              | Minimum nominal electrical power of generator 2 in XX.X kW                                                                                                                                           |
| **rMaxNomElectricalPower\_Gen2** | REAL      |             | -10.0            | Maximum nominal electrical power of generator 2 in XX.X kW                                                                                                                                           |
| **tOnDelayCmd\_Gen2**            | TIME      |             | T#10s            | Turn-on delay - enable output ‘xCmd’ - generator 2                                                                                                                                                   |
| **tOffDelayCmd\_Gen2**           | TIME      |             | T#10s            | Turn-off delay - enable output ‘xCmd’ - generator 2                                                                                                                                                  |
| **rMinNomElectricalPower\_Gen3** | REAL      |             | 0.0              | Minimum nominal electrical power of generator 3 in XX.X kW                                                                                                                                           |
| **rMaxNomElectricalPower\_Gen3** | REAL      |             | -10.0            | Maximum nominal electrical power of generator 3 in XX.X kW                                                                                                                                           |
| **tOnDelayCmd\_Gen3**            | TIME      |             | T#10s            | Turn-on delay - enable output ‘xCmd’ - generator 3                                                                                                                                                   |
| **tOffDelayCmd\_Gen3**           | TIME      |             | T#10s            | Turn-off delay - enable output ‘xCmd’ - generator 3                                                                                                                                                  |
| **rMinNomElectricalPower\_Gen4** | REAL      |             | 0.0              | Minimum nominal electrical power of generator 4 in XX.X kW                                                                                                                                           |
| **rMaxNomElectricalPower\_Gen4** | REAL      |             | -10.0            | Maximum nominal electrical power of generator 4 in XX.X kW                                                                                                                                           |
| **tOnDelayCmd\_Gen4**            | TIME      |             | T#10s            | Turn-on delay - enable output ‘xCmd’ - generator 4                                                                                                                                                   |
| **tOffDelayCmd\_Gen4**           | TIME      |             | T#10s            | Turn-off delay - enable output ‘xCmd’ - generator 4                                                                                                                                                  |

### Function description

#### General

This function block is used to limit (control) the electrical power at the grid connection point ‘rElectricalPower’\
to adjustable maximum values. The power/energy drawn from the grid connection point is marked with a positive sign, the power/energy fed back to the\
grid connection point is marked with a negative sign.\
\
If the electrical power ‘rElectricalPower’ exceeds the adjustable positive minimum value ‘rMinElectricalPower\_Con’, the consumers are\
continuously switched off (PI-controller behavior), starting with the device with the lowest priority.\
\
If the electrical power ‘rElectricalPower’ falls below the adjustable negative minimum value ‘rMinElectricalPower\_Gen’, the generators are\
continuously switched on (PI-controller behavior), starting with the device with the highest priority.\
\
Without further wiring to the inputs ‘xFb’, ‘xAlarm’ and ‘udiOpHours’ and the initial parameter settings, device 1 is assigned priority 1 (= highest)\
and device 4 is assigned priority 4 (= lowest) for each respective group.\
For each functionality (switching off consumers, switching on generators) an internal function block ‘Redundance4’ from this library exists,\
where an adjustable number of consumers (‘wActiveNumberOfDevices\_Con’) and generators (‘wActiveNumberOfDevices\_Gen’)\
are used. The detailed description of this function block can be found there.\
\
The enable / disable of the function block is controlled via the input ‘xEn’; in the disabled state all outputs assume defined states.\
Devices with the index ‘\_Con’ are consumers, devices with the index ‘\_Gen’ are generators.

#### Input *xEn*

This input is used to enable / disable the function block; in the disabled state all outputs assume defined states.

#### Input *xUpdateDeviceOutputs*

Every rising edge at this input triggers an update of all device outputs (outputs ‘stOutputs\_XXXX’).

#### Input *xResError*

Every rising edge at this input triggers a reset of all fault outputs (‘sErrorCodes\_General’, ‘sErrorCodes\_Con’ and ‘sErrorCodes\_Gen’)\
to the fault-free state.

#### Input *rElectricalPower*

The current electrical power at the grid connection point is available at this input. Power drawn is indicated by a positive sign, feed-in by a negative sign. The electrical power is then time-filtered (four parameters with the index ‘\_EP’)\
and is available for the internal control processes.

#### Input *rMaxElectricalPower\_Con*

This input sets the current maximum value of electrical power consumption. If the current electrical power at input ‘rElectricalPower’\
exceeds this maximum value, consumers are continuously switched off according to their nominal power, starting with the consumer with the lowest priority.\
The control behavior of the used PI controller can be influenced by the parameter ‘rTn\_Con’ (= reset time).

#### Input *rMaxElectricalPower\_Gen*

This input sets the current maximum value of electrical power feed-in. If the current electrical power at input ‘rElectricalPower’\
falls below this maximum value, generators are continuously switched on according to their nominal power, starting with the generator with the highest priority.\
The control behavior of the used PI controller can be influenced by the parameter ‘rTn\_Gen’ (= reset time).

#### Input *wActiveNumberOfDevices\_Con*

This input sets the number of consumers used in the range 0 - 4. It is directly connected to the internal function block ‘Redundance4\_Con’\
(input ‘wActiveNumberOfDevices’).

#### Input *wActiveNumberOfDevices\_Gen*

This input sets the number of generators used in the range 0 - 4. It is directly connected to the internal function block ‘Redundance4\_Gen’\
(input ‘wActiveNumberOfDevices’).

#### Device inputs `xFb``, Alarm` and `udiOpHours`

These device inputs are forwarded directly to the corresponding inputs of the internal function blocks of type ‘Redundance4’ and there influence the current\
sequence of the respective four devices.

#### Inputs `xUpdateRedundance4`

These inputs are forwarded directly to the corresponding inputs of the internal function blocks of type ‘Redundance4’ and there influence the current\
sequence of the respective four devices.

#### Output *xLoadRejection\_Con*

This output always indicates the current shedding of active consumers (= TRUE).

#### Output *rTotalNomElectricalPower\_Con*

This output always indicates the currently switchable power of the ready-to-operate and active consumers in kW.

#### Output *rControlSignal\_Con*

This output always indicates the control signal of the internal PI controller (= desired power to be shed).

#### Output *wNumberOfOperationalDevices\_Con*

This output always indicates the number of ready-to-operate consumers.

#### Output *udiCurrentSequence\_Con*

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, then follows the number of the device with the second highest priority, etc.\
Example: *udiCurrentSequence\_Con* = 145 means: device 1 = priority 1, device 4 = priority 2 and device 5 = priority 3\\

#### Output *sCurrentSequence\_Con*

This output always shows the current device sequence as a string with separators. The same priority rules apply as\
for the output *udiCurrentSequence*.\
Example: *sCurrentSequence\_Con* = ‘1-4-5’ means: device 1 = priority 1, device 4 = priority 2 and device 5 = priority 3\\

#### Outputs *stOutputs\_Con*

This structure variable always shows the current states of the respective devices. The following variables are displayed:<br>

1. rMinNomElectricalPower: Minimum nominal electrical power of the consumer in XX.X kW
2. rMaxNomElectricalPower: Maximum nominal electrical power of the consumer in XX.X kW
3. wPrio: Current priority of the device (0 = none, 1 = highest, 4 = lowest)
4. rPowerSignalPercent: Control signal for electrical power in percent (0.0 - 100.0%)
5. rPowerSignalkW: Control signal for electrical power in kW
6. xCmd: Enable output of the device (TRUE = enabled) considering the on and off delays
7. xCmd\_Redundance4: Enable output of the device (TRUE = enabled) due to the internal function block ‘Redundance4\_Con’

#### Output *eOperationalCondition\_Con*

This output always indicates the current load situation (idle, partial load, full load) and is taken directly from the internal function block ‘Redundance4’.

#### Output *xLoadConnection\_Gen*

This output always indicates the current connection of active (= TRUE) generators.

#### Output *rTotalNomElectricalPower\_Gen*

This output always indicates the currently connectable power of the ready-to-operate and active generators in kW.

#### Output *rControlSignal\_Gen*

This output always indicates the control signal of the internal PI controller (= desired power to be connected).

#### Output *wNumberOfOperationalDevices\_Gen*

This output always indicates the number of ready-to-operate generators.

#### Output *udiCurrentSequence\_Gen*

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, then follows the number of the device with the second highest priority, etc.\
Example: *udiCurrentSequence\_Gen* = 145 means: device 1 = priority 1, device 4 = priority 2 and device 5 = priority 3\\

#### Output *sCurrentSequence\_Gen*

This output always shows the current device sequence as a string with separators. The same priority rules apply as\
for the output *udiCurrentSequence*.\
Example: *sCurrentSequence\_gen* = ‘1-4-5’ means: device 1 = priority 1, device 4 = priority 2 and device 5 = priority 3\\

#### Outputs *stOutputs\_Gen*

This structure variable always shows the current states of the respective devices. The following variables are displayed:<br>

1. rMinNomElectricalPower: Minimum nominal electrical power of the generator in XX.X kW
2. rMaxNomElectricalPower: Maximum nominal electrical power of the generator in XX.X kW
3. wPrio: Current priority of the device (0 = none, 1 = highest, 4 = lowest)
4. rPowerSignalPercent: Control signal for electrical power in percent (0.0 - 100.0%)
5. rPowerSignalkW: Control signal for electrical power in kW
6. xCmd: Enable output of the device (TRUE = enabled) considering the on and off delays
7. xCmd\_Redundance4: Enable output of the device (TRUE = enabled) due to the internal function block ‘Redundance4\_Gen’

#### Output *eOperationalCondition\_Gen*

This output always indicates the current load situation (idle, partial load, full load) and is taken directly from the internal function block ‘Redundance4’.

#### Output fault *xErr*

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

1. Number of general errors > 0
2. Number of errors in the consumer functionality > 0
3. Number of errors in the generator functionality > 0

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

#### Output *sErrorCodes\_General*

This output displays possibly active errors (maximum 16 = bits 0 - 15) from the general area as a string.\
Example: ‘1-2’: error bits 0 and 1 are active.

#### Output *sErrorCodes\_Con*

This output displays possibly active errors (maximum 16 = bits 0 - 15) from the consumer area as a string.\
Example: ‘1-2’: error bits 0 and 1 are active.

#### Output *sErrorCodes\_Gen*

This output displays possibly active errors (maximum 16 = bits 0 - 15) from the generator area as a string.\
Example: ‘1-2’: error bits 0 and 1 are active.

#### Parameter *wTolerance\_Con*, ‘xEnFb\_Con’ and ‘xConOperatingHours\_Con’

These parameters concern the strategies for determining the device sequence in the internal function block ‘Redundance4’ and are described in detail there.

#### Parameter *wTolerance\_Gen*, ‘xEnFb\_Gen’ and ‘xConOperatingHours\_Gen’

These parameters concern the strategies for determining the device sequence in the internal function block ‘Redundance4’ and are described in detail there.

#### Parameter *rMinNominalElectricalPower\_ConX*, *rMaxNominalElectricalPower\_ConX*, ‘tOnDelayCmd\_ConX’ and ‘tOffDelayCmd\_ConX’

These parameters relate to consumers 1 - 4 and influence the associated device outputs. The respective on and off delays\
apply to the respective device outputs ‘xCmd’.

#### Parameter *rMinNominalElectricalPower\_GenX*, *rMaxNominalElectricalPower\_GenX*, ‘tOnDelayCmd\_GenX’ and ‘tOffDelayCmd\_GenX’

These parameters relate to generators 1 - 4 and influence the associated device outputs. The respective on and off delays\
apply to the respective device outputs ‘xCmd’.

#### Criteria for updating the device outputs ‘stOutputs\_ConX’

These outputs are updated in the enabled state (xEn = TRUE) if at least one of the following criteria is met:<br>

1. once after every controller restart
2. on every rising edge at the input ‘xUpdateDeviceOutputs’
3. cyclically at the time interval ‘tTimeUpdateDeviceOutputs’ (‘tTimeUpdateDeviceOutputs’ > 0)
4. once at every change of the sequence (‘udiCurrentSequence\_Con’)
5. once at every change of the minimum nominal electrical power of the consumers (‘rMinNomElectricalPower\_ConX’)
6. once at every change of the maximum nominal electrical power of the consumers (‘rMaxNomElectricalPower\_ConX’)
7. once at every rising edge on the input ‘xEn’

#### Criteria for updating the device outputs ‘stOutputs\_GenX’

These outputs are updated in the enabled state (xEn = TRUE) if at least one of the following criteria is met:<br>

1. once after every controller restart
2. on every rising edge at the input ‘xUpdateDeviceOutputs’
3. cyclically at the time interval ‘tTimeUpdateDeviceOutputs’ (‘tTimeUpdateDeviceOutputs’ > 0)
4. once at every change of the sequence (‘udiCurrentSequence\_Gen’)
5. once at every change of the minimum nominal electrical power of the generators (‘rMinNomElectricalPower\_GenX’)
6. once at every change of the maximum nominal electrical power of the generators (‘rMaxNomElectricalPower\_GenX’)
7. once at every rising edge on the input ‘xEn’

### CODESYS

InOut:

| Scope       | Name                              | Type                                    | Initial          |
| ----------- | --------------------------------- | --------------------------------------- | ---------------- |
| Input       | `xEn`                             | `BOOL`                                  | TRUE             |
| Input       | `xUpdateDeviceOutputs`            | `BOOL`                                  | FALSE            |
| Input       | `xResError`                       | `BOOL`                                  | FALSE            |
| Input       | `rElectricalPower`                | `REAL`                                  | 0.0              |
| Input       | `rMaxElectricalPower_Con`         | `REAL`                                  | 100.0            |
| Input       | `rMaxElectricalPower_Gen`         | `REAL`                                  | -100.0           |
| Input       | `wActiveNumberOfDevices_Con`      | `WORD`                                  | 4                |
| Input       | `xFb_Con1`                        | `BOOL`                                  | FALSE            |
| Input       | `xFb_Con2`                        | `BOOL`                                  | FALSE            |
| Input       | `xFb_Con3`                        | `BOOL`                                  | FALSE            |
| Input       | `xFb_Con4`                        | `BOOL`                                  | FALSE            |
| Input       | `xAlarm_Con1`                     | `BOOL`                                  | FALSE            |
| Input       | `xAlarm_Con2`                     | `BOOL`                                  | FALSE            |
| Input       | `xAlarm_Con3`                     | `BOOL`                                  | FALSE            |
| Input       | `xAlarm_Con4`                     | `BOOL`                                  | FALSE            |
| Input       | `udiOpHours_Con1`                 | `UDINT`                                 | 0                |
| Input       | `udiOpHours_Con2`                 | `UDINT`                                 | 0                |
| Input       | `udiOpHours_Con3`                 | `UDINT`                                 | 0                |
| Input       | `udiOpHours_Con4`                 | `UDINT`                                 | 0                |
| Input       | `wActiveNumberOfDevices_Gen`      | `WORD`                                  | 4                |
| Input       | `xFb_Gen1`                        | `BOOL`                                  | FALSE            |
| Input       | `xFb_Gen2`                        | `BOOL`                                  | FALSE            |
| Input       | `xFb_Gen3`                        | `BOOL`                                  | FALSE            |
| Input       | `xFb_Gen4`                        | `BOOL`                                  | FALSE            |
| Input       | `xAlarm_Gen1`                     | `BOOL`                                  | FALSE            |
| Input       | `xAlarm_Gen2`                     | `BOOL`                                  | FALSE            |
| Input       | `xAlarm_Gen3`                     | `BOOL`                                  | FALSE            |
| Input       | `xAlarm_Gen4`                     | `BOOL`                                  | FALSE            |
| Input       | `udiOpHours_Gen1`                 | `UDINT`                                 | 0                |
| Input       | `udiOpHours_Gen2`                 | `UDINT`                                 | 0                |
| Input       | `udiOpHours_Gen3`                 | `UDINT`                                 | 0                |
| Input       | `udiOpHours_Gen4`                 | `UDINT`                                 | 0                |
| Input       | `xUpdateRedundance4_Con`          | `BOOL`                                  | FALSE            |
| Input       | `xUpdateRedundance4_Gen`          | `BOOL`                                  | FALSE            |
| Output      | `xLoadRejection_Con`              | `BOOL`                                  | FALSE            |
| Output      | `rTotalNomElectricalPower_Con`    | `REAL`                                  | 0.0              |
| Output      | `rControlSignal_Con`              | `REAL`                                  | 0.0              |
| Output      | `wNumberOfOperationalDevices_Con` | `WORD`                                  | 0                |
| Output      | `udiCurrentSequence_Con`          | `UDINT`                                 | 0                |
| Output      | `sCurrentSequence_Con`            | `STRING`                                | ‘’               |
| Output      | `stOutputs_Con1`                  | stDevicesOutputsCon\_PowerFeedOptimizer |                  |
| Output      | `stOutputs_Con2`                  | stDevicesOutputsCon\_PowerFeedOptimizer |                  |
| Output      | `stOutputs_Con3`                  | stDevicesOutputsCon\_PowerFeedOptimizer |                  |
| Output      | `stOutputs_Con4`                  | stDevicesOutputsCon\_PowerFeedOptimizer |                  |
| Output      | `eOperationalCondition_Con`       | eRedundance3\_OperationalMode           |                  |
| Output      | `xLoadConnection_Gen`             | `BOOL`                                  | FALSE            |
| Output      | `rTotalNomElectricalPower_Gen`    | `REAL`                                  | 0.0              |
| Output      | `rControlSignal_Gen`              | `REAL`                                  | 0.0              |
| Output      | `wNumberOfOperationalDevices_Gen` | `WORD`                                  | 0                |
| Output      | `udiCurrentSequence_Gen`          | `UDINT`                                 | 0                |
| Output      | `sCurrentSequence_Gen`            | `STRING`                                | ‘’               |
| Output      | `stOutputs_Gen1`                  | stDevicesOutputsGen\_PowerFeedOptimizer |                  |
| Output      | `stOutputs_Gen2`                  | stDevicesOutputsGen\_PowerFeedOptimizer |                  |
| Output      | `stOutputs_Gen3`                  | stDevicesOutputsGen\_PowerFeedOptimizer |                  |
| Output      | `stOutputs_Gen4`                  | stDevicesOutputsGen\_PowerFeedOptimizer |                  |
| Output      | `eOperationalCondition_Gen`       | eRedundance3\_OperationalMode           |                  |
| Output      | `xErr`                            | `BOOL`                                  | FALSE            |
| Output      | `sErrorCodes_General`             | `STRING`                                | ‘’               |
| Output      | `sErrorCodes_Con`                 | `STRING`                                | ‘’               |
| Output      | `sErrorCodes_Gen`                 | `STRING`                                | ‘’               |
| Input Const | `tOffDelayCmd_Gen4`               | `TIME`                                  | TIME#10s0ms      |
| Input Const | `tOnDelayCmd_Gen4`                | `TIME`                                  | TIME#10s0ms      |
| Input Const | `rMaxNomElectricalPower_Gen4`     | `REAL`                                  | -10.0            |
| Input Const | `rMinNomElectricalPower_Gen4`     | `REAL`                                  | 0.0              |
| Input Const | `tOffDelayCmd_Gen3`               | `TIME`                                  | TIME#10s0ms      |
| Input Const | `tOnDelayCmd_Gen3`                | `TIME`                                  | TIME#10s0ms      |
| Input Const | `rMaxNomElectricalPower_Gen3`     | `REAL`                                  | -10.0            |
| Input Const | `rMinNomElectricalPower_Gen3`     | `REAL`                                  | 0.0              |
| Input Const | `tOffDelayCmd_Gen2`               | `TIME`                                  | TIME#10s0ms      |
| Input Const | `tOnDelayCmd_Gen2`                | `TIME`                                  | TIME#10s0ms      |
| Input Const | `rMaxNomElectricalPower_Gen2`     | `REAL`                                  | -10.0            |
| Input Const | `rMinNomElectricalPower_Gen2`     | `REAL`                                  | 0.0              |
| Input Const | `tOffDelayCmd_Gen1`               | `TIME`                                  | TIME#10s0ms      |
| Input Const | `tOnDelayCmd_Gen1`                | `TIME`                                  | TIME#10s0ms      |
| Input Const | `rMaxNomElectricalPower_Gen1`     | `REAL`                                  | -10.0            |
| Input Const | `rMinNomElectricalPower_Gen1`     | `REAL`                                  | 0.0              |
| Input Const | `tOffDelayCmd_Con4`               | `TIME`                                  | TIME#10s0ms      |
| Input Const | `tOnDelayCmd_Con4`                | `TIME`                                  | TIME#10s0ms      |
| Input Const | `rMaxNomElectricalPower_Con4`     | `REAL`                                  | 10.0             |
| Input Const | `rMinNomElectricalPower_Con4`     | `REAL`                                  | 0.0              |
| Input Const | `tOffDelayCmd_Con3`               | `TIME`                                  | TIME#10s0ms      |
| Input Const | `tOnDelayCmd_Con3`                | `TIME`                                  | TIME#10s0ms      |
| Input Const | `rMaxNomElectricalPower_Con3`     | `REAL`                                  | 10.0             |
| Input Const | `rMinNomElectricalPower_Con3`     | `REAL`                                  | 0.0              |
| Input Const | `tOffDelayCmd_Con2`               | `TIME`                                  | TIME#10s0ms      |
| Input Const | `tOnDelayCmd_Con2`                | `TIME`                                  | TIME#10s0ms      |
| Input Const | `rMaxNomElectricalPower_Con2`     | `REAL`                                  | 10.0             |
| Input Const | `rMinNomElectricalPower_Con2`     | `REAL`                                  | 0.0              |
| Input Const | `tOffDelayCmd_Con1`               | `TIME`                                  | TIME#10s0ms      |
| Input Const | `tOnDelayCmd_Con1`                | `TIME`                                  | TIME#10s0ms      |
| Input Const | `rMaxNomElectricalPower_Con1`     | `REAL`                                  | 10.0             |
| Input Const | `rMinNomElectricalPower_Con1`     | `REAL`                                  | 0.0              |
| Input Const | `rTn_Gen`                         | `REAL`                                  | 180.0            |
| Input Const | `rTn_Con`                         | `REAL`                                  | 180.0            |
| Input Const | `tTimeConstant_EP`                | `TIME`                                  | TIME#15s0ms      |
| Input Const | `rInitValue_EP`                   | `REAL`                                  | 0.0              |
| Input Const | `eInitial_EP`                     | eInit                                   | eInit.InputValue |
| Input Const | `tInitDelay_EP`                   | `TIME`                                  | TIME#5s0ms       |
| Input Const | `xConOperatingHours_Gen`          | `BOOL`                                  | TRUE             |
| Input Const | `xEnFb_Gen`                       | `BOOL`                                  | FALSE            |
| Input Const | `wTolerance_Gen`                  | `WORD`                                  | 100              |
| Input Const | `xConOperatingHours_Con`          | `BOOL`                                  | TRUE             |
| Input Const | `xEnFb_Con`                       | `BOOL`                                  | FALSE            |
| Input Const | `wTolerance_Con`                  | `WORD`                                  | 100              |
| Input Const | `tTimeUpdateDeviceOutputs`        | `TIME`                                  | TIME#3s0ms       |
