Codesys : Premiers pas en ST

Qu'est ce que le langage ST ?

le langage de programmation ST est défini par la norme CEI-61131-3.

Le texte structuré est un langage de programmation, comparable à d'autres langages de haut niveau tels que C ou PASCAL, qui permet le développement d'algorithmes complexes.

Le code du programme est constitué d'une combinaison d'expressions et d'instructions, qui peuvent également être exécutées de manière conditionnelle (IF… THEN… ELSE) ou en boucle (WHILE… DO).

Une expression est une construction qui renvoie une valeur après son évaluation.

Les expressions sont également des opérateurs et des opérandes.

 

Les différentes expressions du langage ST

L'affectation :

L'affectation d'une valeur dans une variable est réalisée via l'expression ":=".

VarDestination:=VarSource;
VarDest:=543;

Dans les deux exemples précédents, la valeur de VarSource est transférée dans la valeur de VarDestination. La valeur 543 est transférée dans VarDest qui prend donc cette nouvelle valeur.

IF ... THEN

L'instruction IF permet de faire un choix sur la suite du code à exécuter.

IF Var1=10 THEN
Var2:=Var1;
ELSE
 Var2:=Var2+1;
END_IF

Dans l'exemple précédent, SI la valeur de Var1 vaut 10 ALORS la valeur de Var1 est transférée dans la valeur de Var2 SINON La valeur de Var2 vaut sa valeur plus un.

 

FOR ... DO

L'instruction FOR permet de répéter un nombre de fois finie une suite d'instructions.

FOR i:=1 TO 10 DO
 SuiteDInstructionsARealiser;
END_FOR

L'instruction "SuiteDInstructionsARealiser" sera évaluée 10 fois, la valeur de i allant de 1 à 10 et étant incrémentée à chaque évaluation de l'instruction.

 

CASE ... OF

L'instruction CASE permet de faire un choix sur une valeur de variable à tester

CASE iStep OF
0:
   Instructions0;
1:
   Instructions1;
10:
   Instructions10;
END_CASE

Le code précédent évalue la valeur de la variable iStep et effectue les instructions qui correspondent à la valeur renseignée. Si, par exemple, la valeur de la variable iStep vaut 1, alors Instructions1 sera exécuté.

 

Complexification

Les instructions précédemment expliquées peuvent être complexifiées et bien sûr imbriquées les unes dans les autres.

Par exemples, l'instruction IF peut être complexifiée avec la notion de ELSEIF, l'instruction FOR peut être complexion par la notion de BY (afin de donner un pas d'incrément différent de 1 à la variable de boucle), l'instruction CASE avec un ELSE, des valeurs de test groupées...

D'autres instructions peuvent être utilisées mais doivent peuvent être vite dangereuses pour notre programme. Ce sont par exemple, les instructions WHILE et REPEAT. En effet ces deux instructions peuvent provoquer des boucles infinies si les conditions de sorties de ces boucles ne sont jamais atteintes, et dans ce cas, notre programme automate sera bloqué et pourra même s'arrêter par dépassement de temps de cycle.

Certes, une instruction FOR peut aussi provoquer une boucle infinie, mais ce cas est beaucoup plus évident à éviter, car il n'est pas dans une logique de fonctionnement normale de la boucle FOR.

FOR i:=1 TO 10 DO
 i:=1;
END_FOR

L'exemple ci-dessus réalise une boucle infinie en utilisant l'instruction FOR.

 

Le code en ST

Le code en ST est donc un enchainement des instructions précédemment expliquées ainsi que l'appel de blocs fonctionnels, de fonctions, de programmes...

 

Pourquoi est-il préférable de coder en ST ?

Quelques exemples sont fournis dans cet article : Quel langage de programmation choisir ?

Pour reprendre le point sur le raisonnement du cerveau, notre cerveau raisonne plus naturellement en pensant SI j'ai ca, alors je fais ça. La structure ST est donc nettement plus adaptée au raisonnement de notre cerveau.

Ce qui dans un premier temps peut rebuter, c'est la "grammaire" de ce langage, les listes d'instructions et les pages et les pages de code qui se rapprochent d'un langage informatique et s'éloignent d'un langage automatisme.

La "grammaire" est pourtant simple et ne nécessite que peut d'apprentissage.

 

Premier programme simple en ST

Nous allons réaliser un programme très simple, le but n'étant pas dans un premier temps d'aligner des lignes et des lignes de code.

Simplement en utilisant les instructions précédemment expliquées, nous voulons que lorsque la variable xIN passe à TRUE, la variable iCompteur s'incrémente de 1.

Il faut donc dans un premier temps que l'on détecte le front montant de notre variable xIN. Pour ce faire, il faut mémoriser l'état de la variable Xin et la comparer à l'état lors du tour de cycle précédent.

Il nous faut donc une variable qui servira de mémorisation et une autre variable pour le front montant.

Lorsque cette variable passera à TRUE, il faudra incrémenter la variable iCompteur. 

PROGRAM PLC_PRG
VAR
 xIn:BOOL;
 xFront:BOOL;
 xMemxIn:BOOL;
 icompteur:INT;
END_VAR

IF xIN THEN
 IF NOT xMemxIn THEN
  xFront:=TRUE;
 ELSE
  xFront:=FALSE;
 END_IF
 xMemxIn:=TRUE;
ELSE
 xMemxIn:=FALSE;
END_IF
IF xFront THEN
 icompteur:=icompteur+1;
END_IF

Nous verrons ultérieurement que Codesys disposent de solutions pour simplifier certaines fonctionnalités.