Structured text explained

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).[1] [2] It is a high level language that is block structured and syntactically resembles Pascal, on which it is based.[3] 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

(* 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 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 configurationCONFIGURATION 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

Notes and References

  1. Web site: Bacidore . Mike . Should I limit programming to ladder logic or use all standards within IEC 61131? . 16 May 2018 . Control Design.
  2. Web site: Stevic . Tom . A very short history of PLC programming platforms . 5 May 2017 . Control Design.
  3. Roos . Nieke . Programming PLCs using Structured Text . Department of Computing Science, University of Nijmegen. 10.1.1.49.2016 .