संरचित पाठ

संरचित पाठ, जिसे एसटी या एसटीएक्स के रूप में संक्षिप्त किया गया है, IEC 61131-3 मानक द्वारा समर्थित पाँच भाषाओं में से एक है, जिसे निर्देशयोग्य तर्क नियंत्रक (PLCs) के लिए अभिकल्पित किया गया है।  यह एक उच्च स्तरीय भाषा है जो खण्ड (प्रोग्रामिंग) है और वाक्यात्मक रूप से पास्कल (प्रोग्रामिंग भाषा) से मिलती जुलती है, जिस पर यह आधारित है। सभी भाषाएँ IEC61131 सामान्य तत्वों को साझा करती हैं। चर और फलन निर्देश सामान्य तत्वों द्वारा परिभाषित किए जाते हैं इसलिए IEC 61131-3 मानक के भीतर विभिन्न भाषाओं का उपयोग एक ही कार्यक्रम में किया जा सकता है।

जटिल कथन और स्थिर निर्देश समर्थित हैं:


 * पुनरावृति आवर्ती (REPEAT-UNTIL; WHILE-DO)
 * सशर्त निष्पादन (IF-THEN-ELSE; CASE)
 * कार्य (एसक्यूआरटी, एसआईएन )

प्रतिरूप क्रमादेश
कुछ अन्य प्रोग्रामिंग भाषाओं के विपरीत, सीएएसई वर्णन के लिए कोई फॉलथ्रू नहीं है: पहली मिलान स्थिति दर्ज की जाती है, और इसके वर्णन चलाने के बाद, अन्य स्तिथियों की जाँच किए बिना सीएएसई खण्ड छोड़ दिया जाता है।

फलन खण्ड उदाहरण
//=======================================================================

// 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