Functions & Function Blocks
Modular programming with functions and function blocks for code reuse and maintainability.
🚀 Enhance Your Development Experience
Get syntax highlighting, IntelliSense, and debugging support for Structured Text:
Install VS Code Extension →Functions
// Function definition
FUNCTION CalculateArea : REAL
VAR_INPUT
Length : REAL;
Width : REAL;
END_VAR
CalculateArea := Length * Width;
END_FUNCTION
// Function with validation
FUNCTION ConvertTemperature : REAL
VAR_INPUT
Temperature : REAL;
FromUnit : STRING;
ToUnit : STRING;
END_VAR
IF FromUnit = 'F' AND ToUnit = 'C' THEN
ConvertTemperature := (Temperature - 32.0) * 5.0 / 9.0;
ELSIF FromUnit = 'C' AND ToUnit = 'F' THEN
ConvertTemperature := Temperature * 9.0 / 5.0 + 32.0;
ELSE
ConvertTemperature := Temperature; // No conversion
END_IF;
END_FUNCTION
// Using functions
VAR
RoomArea : REAL;
TempC : REAL;
END_VAR
RoomArea := CalculateArea(Length := 12.5, Width := 8.0);
TempC := ConvertTemperature(75.0, 'F', 'C');Function Blocks
// Function block definition
FUNCTION_BLOCK MotorController
VAR_INPUT
Start : BOOL;
Stop : BOOL;
Speed : REAL;
END_VAR
VAR_OUTPUT
Running : BOOL;
Fault : BOOL;
ActualSpeed : REAL;
END_VAR
VAR
_internalState : INT;
_startTimer : TON;
END_VAR
// Start/stop logic
_startTimer(IN := Start, PT := T#500ms);
IF _startTimer.Q AND NOT Stop AND NOT Fault THEN
Running := TRUE;
ActualSpeed := Speed;
ELSE
Running := FALSE;
ActualSpeed := 0.0;
END_IF;
// Fault detection
IF Speed > 100.0 OR Speed < 0.0 THEN
Fault := TRUE;
Running := FALSE;
END_IF;
END_FUNCTION_BLOCK
// Using function blocks
VAR
Motor1 : MotorController;
Motor2 : MotorController;
END_VAR
// Call function blocks
Motor1(Start := StartButton1, Stop := StopButton1, Speed := SpeedSetpoint1);
Motor2(Start := StartButton2, Stop := StopButton2, Speed := SpeedSetpoint2);
// Use outputs
Conveyor1Running := Motor1.Running;
Conveyor2Running := Motor2.Running;Variable Declarations
FUNCTION_BLOCK AdvancedController
VAR_INPUT
Enable : BOOL; // Input from external source
Setpoint : REAL; // Target value
END_VAR
VAR_OUTPUT
Output : REAL; // Controlled output
Ready : BOOL; // Status indication
END_VAR
VAR_IN_OUT
Settings : ControlSettings; // Bidirectional data
END_VAR
VAR
_internalValue : REAL; // Private internal variable
_timer : TON; // Internal timer
END_VAR
VAR_TEMP
TempCalc : REAL; // Temporary calculation
END_VAR
// Function block logic
IF Enable THEN
TempCalc := Setpoint * Settings.GainFactor;
Output := TempCalc;
Ready := TRUE;
ELSE
Output := 0.0;
Ready := FALSE;
END_IF;
END_FUNCTION_BLOCKPractical Example
// Complete example: Tank level controller
FUNCTION_BLOCK TankController
VAR_INPUT
LevelSensor : REAL; // Tank level 0-100%
FillEnable : BOOL; // Allow filling
EmptyEnable : BOOL; // Allow emptying
END_VAR
VAR_OUTPUT
FillValve : BOOL; // Fill valve control
EmptyValve : BOOL; // Empty valve control
HighAlarm : BOOL; // High level alarm
LowAlarm : BOOL; // Low level alarm
END_VAR
VAR
HighLevel : REAL := 90.0; // High alarm setpoint
LowLevel : REAL := 10.0; // Low alarm setpoint
FillLevel : REAL := 75.0; // Stop filling
EmptyLevel : REAL := 25.0; // Stop emptying
END_VAR
// Alarm logic
HighAlarm := LevelSensor > HighLevel;
LowAlarm := LevelSensor < LowLevel;
// Fill control
IF FillEnable AND NOT HighAlarm THEN
FillValve := LevelSensor < FillLevel;
ELSE
FillValve := FALSE;
END_IF;
// Empty control
IF EmptyEnable AND NOT LowAlarm THEN
EmptyValve := LevelSensor > EmptyLevel;
ELSE
EmptyValve := FALSE;
END_IF;
END_FUNCTION_BLOCK
// Implementation
VAR
Tank1 : TankController;
Tank2 : TankController;
END_VAR
Tank1(LevelSensor := AnalogInput1,
FillEnable := AutoMode,
EmptyEnable := AutoMode);
Tank2(LevelSensor := AnalogInput2,
FillEnable := AutoMode,
EmptyEnable := AutoMode);