ExampleAirConditioning2 (FB)¶
FUNCTION_BLOCK ExampleAirConditioning2
Example air conditioning 2
This example function block evolves from ExampleAirConditioning1 and implements a bit more complex air conditioning plant to demonstrate how to:
implement a plant / an aggregate in CFC using CODESYS Building Automation library function blocks
use SequenceControl and SequenceSwitch
do anti-freeze control / anti-freeze shutoff for heater coil
compute the xError / eErrorID from xError / eErrorID of function block instances used
This example involves following real world application aspects:
recirculation air admixing
minimum outdoor air ratio
sequence control of recirculation air damper / heater coil / cooler coil
energy selection (outdoor air vs. extract air) for recirculation air damper
energy level
air side anti-freeze / water side anti-freeze for heater coil
exhaust air damper / outdoor air damper control
extract air fan / supply air fan control
Watch out for comments in the implementation where those aspects are covered.

outdoor air temperatur sensor
outdoor air damper
recirculation air damper
heater coil (water operated)
frost monitor
heater coil return temperatur sensor
cooler coil (water operated)
supply air fan
extract air fan
extract air temperatur sensor
exhaust air damper
Air types¶
Air types - terms, abbreviations and colors oriented towards DIN EN 16798-3.

Sequence control damper / heater coil / cooler coil¶
SequenceControl is used to control three sequences - heater coil, RCA damper and cooler coil.
RCA damper - 0% (maximum outdoor air) .. 100% (would be: no outdoor air)
This is about to utilize mixed air or outdoor air energy as much as possible to heat / cool.
In case you want to trade comfort (in this case control deviation and it’s duration) a bit higher to energy consumption, you might want to set mc_rDamperCoilOverlap to a value < 0.0, making the RCA damper sequence and the coil sequences overlap thus forcing the coils to jump in before maximum RCA ratio is reached. Set mc_rDamperCoilOverlap to -1.0 (K) will make the coil open 25% (because rXP = 4.0) if recirculation air damper reached maximum.
Recirculation air admixing and energy selection¶
RCA admixing is done using the RCA damper as primary control sequence thus minimizing heat / cool energy consumption. Please see m_energySelection for the energy selection aspect.
Minimum outdoor air ratio¶
Minimum ODA ratio is achieved by rMax2 := 100% - rMinOdaRatio Remember: RCA damper is controlled by sequence 2. rOut2 = 0% means maximum ODA ratio (100% in this case).
Water side anti-freeze for heater coil¶
Water side anti-freeze for heater coil is done with two separate sub-functionalities
a controlled startup procedure
continuous anti-freeze during control
The startup procedure is done using HVAC_AntiFreezeControlStartup if ODA temperature < startup threshold:
preload (the heater coil):
ODA / ETA damper closed
RCA damper open (maximum recirculation air ratio - 100%)
forcing the heater coil to open
check heater coil return temperature to reach a threshold
after preload - wait for system to become settled (HVAC_AntiFreezeControlStartup.tFollowUp):
open ODA / ETA damper to minimum ODA ratio
set RCA damper accordingly to minimum ODA ratio
take over to normal control actions
SequenceControl.xForceEnable and .rForcedValue is used to force the heater coil sequence, thus providing smooth control takeover after sucessfull startup.
The continuous anti-freeze during control is done using a CommandVariable setting the heater coil sequence minimum.
Air side anti-freeze¶
Air side anti-freeze is done using a frost monitor HVAC_AntiFreezeControlMonitor. The frost monitor simply does shut-off the whole plant, but keeping the heater coil opened to maximum.
Hints¶
Unused pins of function block instances are hidden, so refer to the function block documentation for more details.
Caveats¶
To keep complexity as low as possible this example omits the following real world application aspects worth mentioning:
configuration missing (configuration of m_energyLevelSetpoint, m_sequenceControl, m_antiFreezeControlStartup and m_antiFreezeCont is not exposed on the ExampleAirConditioning1 VAR_INPUT section)
ignoring the subtle differences between indoor air control vs. extract air control (assuming extract air temp. = indoor air temp.)
no indoor air / supply air cascade control (control quality)
no supply air minimum enforced (physiological problems caused by low supply air temperature)
ramping up/down the ODA / EHA damper after anti-freeze control preload is done (our impl. does simply switch to rMinOdaRatio or 100%)
cooling is not blocked if continuous anti-freeze during control is opening heater coil
- InOut:
Scope
Name
Type
Initial
Comment
Input
xEnable
BOOL
TRUE
Enable
eLevel
EnergyLevel.COMFORT
Energy level
rEtaTemp
REAL
22.0
Extract air temperature
rSetptHeatComfort
REAL
21.0
Heat setpoint comfort level
rSetptCoolComfort
REAL
23.0
Cool setpoint comfort level
rOdaTemp
REAL
10.0
Outdoor air temperature
rMinOdaRatio
REAL
20.0
Minimum outdoor air ratio, 0..100%
rHeaterCoilReturnTemp
REAL
20.0
Heater coil return temperature
xFrost
BOOL
FALSE
Heater coil frost indication
xReset
BOOL
FALSE
Reset to proportional control / reset detected input error
itfDateTimeProvider
Util.IDateTimeProvider
Globals.g_dtpDateTimeProvider
Source for the current date and time information in milliseconds since 1.1.1970 00:00:00.000
Output
eModeOut
HeatCoolOperationMode.INACTIVE
Operation mode.
rHeatOut
REAL
Heat valve signal (0..100%).
rCoolOut
REAL
Cool valve signal (0..100%).
rOdaDamperOut
REAL
Outdoor air damper signal (0..100%).
rRcaDamperOut
REAL
Recirculation air damper signal (0..100%).
rEhaDamperOut
REAL
Exhaust air damper signal (0..100%).
xFan
BOOL
Extract air / supply air fan
xAntiFreezeStartup
BOOL
Anti-freeze control startup indication
xAntiFreezeStartupError
BOOL
Anti-freeze control startup error indication
xFrostAlarm
BOOL
Frost alarm indication
xError
BOOL
Error indication
eErrorID
Error ID