# Structured text

> Mediated Wiki article. Canonical URL: https://mediated.wiki/source/Structured_text
> Markdown URL: https://mediated.wiki/source/Structured_text.md
> Source: https://en.wikipedia.org/wiki/Structured_text
> Source revision: 1311678594
> License: Creative Commons Attribution-ShareAlike 4.0 International (https://creativecommons.org/licenses/by-sa/4.0/)

Programming language  for programmable logic controllers

For the lightweight text markup languages, see [StructuredText](/source/StructuredText) and [reStructuredText](/source/ReStructuredText).

**Structured text**, abbreviated as **ST** or **STX**, is one of the five languages supported by the [IEC 61131-3](/source/IEC_61131-3) standard, designed for [programmable logic controllers](/source/Programmable_logic_controller) (PLCs).[1][2] It is a high level language that is [block structured](/source/Block_(programming)) and syntactically resembles [Pascal](/source/Pascal_(programming_language)), on which it is based.[3] All of the languages share [IEC61131 Common Elements](/source/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:

- Iteration loops (REPEAT-UNTIL; WHILE-DO)

- Conditional execution (IF-THEN-ELSE; CASE)[3]

- Functions (SQRT(), SIN())

## Sample program

(* simple state machine *)
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 [fall through](/source/Switch_statement#Fall_through) 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

## References

1. **[^](#cite_ref-1)** Bacidore, Mike (16 May 2018). ["Should I limit programming to ladder logic or use all standards within IEC 61131?"](https://www.controldesign.com/articles/2018/should-i-limit-programming-to-ladder-logic-or-use-all-standards-within-iec-61131/). *Control Design*.

1. **[^](#cite_ref-2)** Stevic, Tom (5 May 2017). ["A very short history of PLC programming platforms"](https://www.controldesign.com/articles/2017/a-very-short-history-of-plc-programming-platforms/). *Control Design*.

1. ^ [***a***](#cite_ref-nlpaper_3-0) [***b***](#cite_ref-nlpaper_3-1) Roos, Nieke. "Programming PLCs using Structured Text". Department of Computing Science, University of Nijmegen. [CiteSeerX](/source/CiteSeerX_(identifier)) [10.1.1.49.2016](https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.49.2016). {{[cite journal](https://en.wikipedia.org/wiki/Template:Cite_journal)}}: Cite journal requires |journal= ([help](https://en.wikipedia.org/wiki/Help:CS1_errors#missing_periodical))

---
Adapted from the Wikipedia article [Structured text](https://en.wikipedia.org/wiki/Structured_text) by Wikipedia contributors ([contributor history](https://en.wikipedia.org/wiki/Structured_text?action=history)). Available under [Creative Commons Attribution-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-sa/4.0/). Changes may have been made.
