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_BLOCK
Practical 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);