ExampleHotWater (FB)¶
FUNCTION_BLOCK ExampleHotWater
Example hot water boiler control
This example function block implements a simple hot water boiler control to demonstrate how to implement a plant / an aggregate in ST using CODESYS Building Automation library function blocks. All other examples are implemented using CFC, because this way it’s a bit more easy to read / understand. No matter of this ST is also a good choice to implement plants / aggregates. Here we demonstrate, that an implementation using ST is also easy to read / understand if structured nicely and well documented.
This example involves:
2 point control of boiler temperature
steady control of boiler supply temperature
demand-based activation of loading pump
legionella prevention
optional unload protection using supply temperature sensor
Watch out for comments in the implementation where those aspects are covered.

supply temperature sensor
mixing valve
loading pump
boiler supply temperature sensor
upper boiler temperature sensor
lower boiler temperature sensor
circulation pump
2 point control of boiler temperature¶
A boiler load cycle is requested, if boiler temperature is below setpoint. The boiler load cycle is stopped, if boiler temperature exceeds setpoint plus hysteresis.
Legionella prevention¶
Boiler temperature is to be kept above 60°C for at least an hour the day. Circulation pump is enabled during this load cycle.
Optional unload protection¶
In case there is a supply temperature sensor ExampleHotWater checks the supply temperature before / during a load operation. In case the supply temperature is below boiler temperature the boiler will not be loaded.
Caveats¶
To keep complexity as low as possible this example omits - amongst others - the following real world application aspects worth mentioning:
configuration missing (configuration of m_legionellaPreventionDone, m_legionellaPreventionTimer, m_loadPump, m_circPump, m_mixingValve etc. is not or not completely exposed on the ExampleHotWater VAR_INPUT section)
input consistency checks (rHyst <= 0, implausible measurement values, …)
no legionella warning issued, if legionella prevention load cycle is missed due to unload conditions
sensors missing (both pumps - service / error indication, …)
xError / eErrorID not computed at all, see ExampleAirConditioning2 how to do this
sensor / actuator process I/O not mapped (FB sensor inputs, m_loadPump, m_circPump, m_mixingValve, …)
- InOut:
Scope
Name
Type
Initial
Comment
Input
rSetpt
REAL
50.0
Hot water temperature setpoint
rHyst
REAL
5.0
Hot water temperature hysteresis
rSupplyTemp
REAL
Supply temperature
xSupplyTempSensor
BOOL
FALSE
Optional supply temperature sensor exists
rBoilerSupplyTemp
REAL
Boiler supply temperature
rBoilerTemp1
REAL
Upper boiler temperature
rBoilerTemp2
REAL
Lower boiler temperature
xCircPumpRequest
BOOL
FALSE
Request circulation pump
tLegionella
TIME
TIME#1440m0s0ms
Time to next legionella prevention boiler load cycle
xReset
BOOL
FALSE
Reset
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
rRequestedBoilerTemp
REAL
Requested boiler temperature
xLegionellaPreventionDone
BOOL
Legionella prevention has been done in the last 24 hours
xLoad
BOOL
Boiler will be loaded actually.
xLoadPump
BOOL
Loading pump running
xCircPump
BOOL
Circulation pump running
rValve
REAL
Mixing valve
tLegionellaRemaining
TIME
Remaing time to next legionella prevention boiler load cycle