Structured text

Structured text, abbreviated as ST or STX, is one of the five languages supported by the IEC 61131-3 standard, designed for programmable logic controllers (PLCs). It is a high level language that is block structured and syntactically resembles Pascal, on which it is based. All of the languages share IEC61131 Common Elements. The variables and function calls are defined by the common elements so different languages within the IEC 61131-3 standard can be used in the same program.
Complex statements and nested instructions are supported:
Sample program.
TxtState := STATES[StateMachine];
CASE StateMachine OF
 1: ClosingValve();
 StateMachine := 2;
 2: OpeningValve();
ELSE
 BadCase();
END_CASE;
Unlike in some other programming languages, there is no fallthrough for the CASE statement: the first matching condition is entered, and after running its statements, the CASE block is left without checking other conditions.
Additional ST programming examples.
// PLC configuration
CONFIGURATION DefaultCfg
 VAR_GLOBAL
 b_Start_Stop : BOOL; // Global variable to represent a boolean.
 b_ON_OFF : BOOL; // Global variable to represent a boolean.
 Start_Stop AT %IX0.0:BOOL; // Digital input of the PLC (Address 0.0)
 ON_OFF AT %QX0.0:BOOL; // Digital output of the PLC (Address 0.0). (Coil)
 END_VAR
 // Schedule the main program to be executed every 20 ms
 TASK Tick(INTERVAL := t#20ms);
 PROGRAM Main WITH Tick : Monitor_Start_Stop;
END_CONFIGURATION
PROGRAM Monitor_Start_Stop // Actual Program
 VAR_EXTERNAL
 Start_Stop : BOOL;
 ON_OFF : BOOL;
 END_VAR
 VAR // Temporary variables for logic handling
 ONS_Trig : BOOL;
 Rising_ONS : BOOL;
 END_VAR
 // Start of Logic
 // Catch the Rising Edge One Shot of the Start_Stop input
 ONS_Trig := Start_Stop AND NOT Rising_ONS;
 // Main Logic for Run_Contact -- Toggle ON / Toggle OFF ---
 ON_OFF := (ONS_Trig AND NOT ON_OFF) OR (ON_OFF AND NOT ONS_Trig);
 // Rising One Shot logic 
 Rising_ONS := Start_Stop;
END_PROGRAM
Function block example.
// Function Block Timed Counter : Incremental count of the timed interval
FUNCTION_BLOCK FB_Timed_Counter
 VAR_INPUT
 Execute : BOOL := FALSE; // Trigger signal to begin Timed Counting
 Time_Increment : REAL := 1.25; // Enter Cycle Time (Seconds) between counts
 Count_Cycles : INT := 20; // Number of Desired Count Cycles
 END_VAR
 VAR_OUTPUT
 Timer_Done_Bit : BOOL := FALSE; // One Shot Bit indicating Timer Cycle Done
 Count_Complete : BOOL := FALSE; // Output Bit indicating the Count is complete 
 Current_Count : INT := 0; // Accumulating Value of Counter
 END_VAR
 VAR
 CycleTimer : TON; // Timer FB from Command Library
 CycleCounter : CTU; // Counter FB from Command Library
 TimerPreset : TIME; // Converted Time_Increment in Seconds to MS
 END_VAR
 // Start of Function Block programming
 TimerPreset := REAL_TO_TIME(in := Time_Increment) * 1000;
 CycleTimer(
 in := Execute AND NOT CycleTimer.Q,
 pt := TimerPreset);
 Timer_Done_Bit := CycleTimer.Q;
 CycleCounter(
 cu := CycleTimer.Q,
 r := NOT Execute,
 pv := Count_Cycles);
 Current_Count := CycleCounter.cv;
 Count_Complete := CycleCounter.q;
END_FUNCTION_BLOCK