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:
(* simple state machine *)TxtState:=STATES[StateMachine];CASEStateMachineOF1:ClosingValve();StateMachine:=2;2:OpeningValve();ELSEBadCase();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.
// PLC configurationCONFIGURATIONDefaultCfgVAR_GLOBALb_Start_Stop:BOOL;// Global variable to represent a boolean.b_ON_OFF:BOOL;// Global variable to represent a boolean.Start_StopAT%IX0.0:BOOL;// Digital input of the PLC (Address 0.0)ON_OFFAT%QX0.0:BOOL;// Digital output of the PLC (Address 0.0). (Coil)END_VAR// Schedule the main program to be executed every 20 msTASKTick(INTERVAL:=t#20ms);PROGRAMMainWITHTick:Monitor_Start_Stop;END_CONFIGURATIONPROGRAMMonitor_Start_Stop// Actual ProgramVAR_EXTERNALStart_Stop:BOOL;ON_OFF:BOOL;END_VARVAR// Temporary variables for logic handlingONS_Trig:BOOL;Rising_ONS:BOOL;END_VAR// Start of Logic// Catch the Rising Edge One Shot of the Start_Stop inputONS_Trig:=Start_StopANDNOTRising_ONS;// Main Logic for Run_Contact -- Toggle ON / Toggle OFF ---ON_OFF:=(ONS_TrigANDNOTON_OFF)OR(ON_OFFANDNOTONS_Trig);// Rising One Shot logic Rising_ONS:=Start_Stop;END_PROGRAM
//=======================================================================// Function Block Timed Counter : Incremental count of the timed interval//=======================================================================FUNCTION_BLOCKFB_Timed_CounterVAR_INPUTExecute:BOOL:=FALSE;// Trigger signal to begin Timed CountingTime_Increment:REAL:=1.25;// Enter Cycle Time (Seconds) between countsCount_Cycles:INT:=20;// Number of Desired Count CyclesEND_VARVAR_OUTPUTTimer_Done_Bit:BOOL:=FALSE;// One Shot Bit indicating Timer Cycle DoneCount_Complete:BOOL:=FALSE;// Output Bit indicating the Count is complete Current_Count:INT:=0;// Accumulating Value of CounterEND_VARVARCycleTimer:TON;// Timer FB from Command LibraryCycleCounter:CTU;// Counter FB from Command LibraryTimerPreset:TIME;// Converted Time_Increment in Seconds to MSEND_VAR// Start of Function Block programmingTimerPreset:=REAL_TO_TIME(in:=Time_Increment)*1000;CycleTimer(in:=ExecuteANDNOTCycleTimer.Q,pt:=TimerPreset);Timer_Done_Bit:=CycleTimer.Q;CycleCounter(cu:=CycleTimer.Q,r:=NOTExecute,pv:=Count_Cycles);Current_Count:=CycleCounter.cv;Count_Complete:=CycleCounter.q;END_FUNCTION_BLOCK
{{cite journal}}
: Cite journal requires |journal=
(help)