Best Practices

Professional coding standards for reliable industrial automation systems.

🚀 Enhance Your Development Experience

Get syntax highlighting, IntelliSense, and debugging support for Structured Text:

Install VS Code Extension →

Code Style and Formatting

// Good: Clear structure and indentation
IF SystemReady AND NOT EmergencyStop THEN
    StartMotor := TRUE;
    StatusLED := GREEN;
    
    // Check operating conditions
    IF Temperature > SafetyLimit THEN
        TriggerAlarm := TRUE;
        StartMotor := FALSE;
    END_IF;
ELSE
    StartMotor := FALSE;
    StatusLED := RED;
END_IF;

// Bad: Hard to read
if systemready and not emergencystop then startmotor:=true;statusled:=green;end_if;

Naming Conventions

// Good naming conventions
VAR
    // Clear, descriptive names
    MotorRunning : BOOL;
    TemperatureSensor : REAL;
    ConveyorSpeed : REAL;
    StartButton : BOOL;
    
    // Function blocks with FB prefix
    FB_Motor : MotorController;
    FB_Timer : TON;
    
    // Constants in ALL_CAPS
    MAX_TEMPERATURE : REAL := 85.0;
    MIN_PRESSURE : REAL := 2.5;
END_VAR

// Bad naming
VAR
    x : BOOL;           // Unclear
    temp : REAL;        // Abbreviated
    motor1 : BOOL;      // Not descriptive
    M1 : MotorController; // Cryptic
END_VAR

Error Handling

// Always check for error conditions
FUNCTION_BLOCK SafeMotorController
VAR_INPUT
    Start : BOOL;
    Speed : REAL;
END_VAR
VAR_OUTPUT
    Running : BOOL;
    Error : BOOL;
    ErrorMessage : STRING;
END_VAR

// Input validation
IF Speed < 0.0 OR Speed > 100.0 THEN
    Error := TRUE;
    ErrorMessage := 'Speed out of range (0-100)';
    Running := FALSE;
    RETURN;
END_IF;

// Safety checks
IF EmergencyStop OR NOT SafetyOK THEN
    Error := TRUE;
    ErrorMessage := 'Safety system fault';
    Running := FALSE;
    RETURN;
END_IF;

// Normal operation
IF Start AND NOT Error THEN
    Running := TRUE;
    ErrorMessage := '';
ELSE
    Running := FALSE;
END_IF;

END_FUNCTION_BLOCK

Documentation

(*
    Function Block: ConveyorController
    Purpose: Controls conveyor belt speed and direction
    Author: Engineering Team
    Version: 1.2
    Date: 2024-06-15
*)
FUNCTION_BLOCK ConveyorController
VAR_INPUT
    Enable : BOOL;          (* TRUE to enable conveyor *)
    Speed : REAL;           (* Speed setpoint 0.0-100.0 % *)
    Direction : BOOL;       (* TRUE = Forward, FALSE = Reverse *)
END_VAR
VAR_OUTPUT
    Running : BOOL;         (* Conveyor is running *)
    ActualSpeed : REAL;     (* Current speed feedback *)
    Fault : BOOL;           (* Fault condition present *)
END_VAR

// Main control logic
IF Enable AND NOT Fault THEN
    // Start conveyor with specified parameters
    Running := TRUE;
    ActualSpeed := Speed;
ELSE
    // Safety shutdown
    Running := FALSE;
    ActualSpeed := 0.0;
END_IF;

END_FUNCTION_BLOCK

Performance Tips

// Use efficient data types
VAR
    Counter : UINT;         // Use UINT instead of DINT for small counts
    Status : BYTE;          // Use BYTE for flags (8 bits)
    LargeValue : DINT;      // Use DINT only when needed
END_VAR

// Minimize function block calls
VAR
    Timer1 : TON;
    TimerResult : BOOL;
END_VAR

// Good: Call once, use result multiple times
Timer1(IN := StartCondition, PT := T#5s);
TimerResult := Timer1.Q;

IF TimerResult THEN
    Action1 := TRUE;
END_IF;
IF TimerResult THEN
    Action2 := TRUE;
END_IF;

// Avoid complex expressions in conditions
// Good: Break down complex logic
SafeToOperate := NOT EmergencyStop AND SafetyOK AND PowerOn;
IF SafeToOperate AND OperatorReady THEN
    StartSequence := TRUE;
END_IF;

Key Guidelines

  • • Use clear, descriptive variable names
  • • Implement proper error handling and safety checks
  • • Comment complex logic and document function blocks
  • • Use consistent indentation and formatting
  • • Choose appropriate data types for efficiency
  • • Test thoroughly with edge cases

© 2025 ControlForge Systems