vignette|Exemple de programme structuré Le texte structuré, ou (ST) en anglais, est un des cinq langages de programmation pour automates programmables industriels (API) définis par la norme CEI 61131-3. C'est un langage de haut niveau et sa structure rappelle les langages Ada et Pascal.
Le format de ces fichiers a été standardisé en XML par PLCopen.
Des instructions plus ou moins complexes sont supportées, par exemple : boucles d'itération (REPEAT-UNTIL; WHILE-DO; FOR) ; conditions (IF-THEN-ELSE; CASE) ; fonctions (SQRT(); SIN()).
Exemple de programme (* simple state machine *) TxtState := STATES[StateMachine];
CASE StateMachine OF 1: ClosingValve(); ELSE ;; BadCase(); END_CASE;
Autre exemple de programmation ST
// 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
Exemple de déclaration d'un bloc fonctionnel
//======================================================================= // 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
Voir aussi PLCopen
Notes et références
Liens externes
Catégorie:Langage de programmation Catégorie:Automation