Skip to content

Linguaggio Structured Text per PLC

Potresti guardare: https://www.plcacademy.com/structured-text-tutorial/ per prendere spunto per fare i blocchi di pseudocode.

ST (Structured Text) è un Linguaggio di alto livello, Pascal-like, efficace per realizzare complesse elaborazioni matematiche o per gestire particolari strutture dati.

ST nasce come linguaggio condition driven ma può essere impostato per adattarsi alla programmazione state driven.

Prevede tutti i costrutti tipici dei linguaggi strutturati:

  • assegnazione: Variabile := Espressione;,
  • selezione di alternative,
  • iterazione.

L’istruzione EXIT forza l’uscita da tutti i costrutti precedenti.

L’iterazione si intende nello stesso ciclo di esecuzione del controllore. Occorre fare attenzione nella programmazione per evitare loop prolunghino il tempo di esecuzione fino alla scadenza del watchdog timer impostato.

Selezione tra alternative.

IF [boolean expression] THEN
<statement>;
ELSIF [boolean expression] THEN
<statement>;
ELSE
<statement>;
END_IF ;

Esempio:

IF (LS1 = TRUE) THEN
Q1 := TRUE;
ELSEIF (LS2 = TRUE) THEN
Q2 := TRUE;
ELSE
Q3 := TRUE;
END_IF

Selezione multipla:

CASE [numeric expression] OF
result1: <statement>;
resultN: <statemtent>;
ELSE
<statement>;
END_CASE;

Esempio:

CASE NUM_PEZZI OF
1, 5: Q1 := TRUE;
Q2 := FALSE;
2: Q1 := FALSE;
10..20: Q2 := TRUE;
ELSE
Q1 := NOT Q1;
Q2 := Q1 OR Q2;
END_CASE;

Anziché il classico do-while, si usa il repeat-until loop. Quando la condizione specificata dopo la keyword UNTIL è TRUE, si esce dal loop di istruzioni poste tra le keywork REPEAT ed UNTIL (non si eseguono più).

VAR
Counter: BYTE := 8;
Var1: BYTE := 2;
END_VAR
REPEAT
Var1 := Var1*2;
Counter := Counter-1;
UNTIL
Counter=0
END_REPEAT;

Il while loop esegue le istruzioni finché la condizione specificata dopo la keyword WHILE è TRUE. Quando tale condizione passa a FALSE, il codice esce dal loop.

VAR
Counter: BYTE := 8;
Var1: BYTE := 2;
END_VAR
WHILE counter>0 DO
Var1 := Var1*2;
Counter := Counter-1;
END_WHILE;

Il ciclo for si compone delle seguenti keyword: FOR, TO, BY, DO ed END_FOR con la seguente struttura.

FOR variabile_interazione := valore_init TO valore_finale BY passo_di_itazione DO
istruzioni
END_FOR;

Un paio di esempi di for loop sono:

VAR
Counter: BYTE;
Var1: BYTE := 2;
Erg: BYTE;
END_VAR
FOR Counter := 1 TO 5 BY 1 DO
Var1 := Var1 * 2;
END_FOR;
Erg := Var1;

Il secondo esempio prevede anche un if annidato dentro al corpo del for:

VAR
I, J: BYTE;
ARR: ARRAY[1..100] OF INT;
END_VAR
J:=101;
FOR I:=1 TO 100 BY 2 DO
IF ARR[I] = 70 THEN
J := I;
EXIT;
END_IF;
END_FOR;

Istruzioni del tipo: FB_nome_istanza(Par1 := A, Par2 := B, ...);

I parametri di uscita di un FB sono accessibili direttamente con: FB_nome_istanza.Out1.

Chiamate di functions devono essere effettuate in una assegnazione o in una espressione, in modo che il risultato della funzione venga usato esplicitamente: RES := Fun_Def(A, B, ...);.

Con A che andrà nella prima variabile definita nella sezione VAR_INPUT della funzione e B nella seconda variabile definita.

Tutti gli operatori classici. La particolarità sta nell’operatore diverso: <>.

Si supponga di dover controllare la temperatura di un forno, avendo a disposizione un sensore analogico ed una serpentina comandata tramite un interruttore ON/OFF.

Il controllo solitamente utilizzato è il cosiddetto controllo on/off con isteresi. Il valore numerico reale fornito dal sensore viene confrontato con il valore di temperatura che si desidera mantenere. Se la serpentina è accesa e questi differiscono per una quantità maggiore di un certo valore, la serpentina viene spenta. Viceversa, se la serpentina è spenta e la temperatura scende oltre al di sotto del riferimento, essa viene riaccesa.

N.B. Nel codice seguente, scrivere IF (Comando = TRUE) THEN oppure IF Comando THEN è la stessa cosa.

FUNCTION_BLOCK Isteresi
(* I/O variables definition *)
VAR_INPUT
Temperatura: REAL;
Set_Point: REAL;
Eps: REAL;
END_VAR
VAR_OUTPUT
Comando: BOOL;
END_VAR
IF Comando THEN
(* Comando is TRUE *)
IF Temperatura > (Set_Point + Eps) THEN
Comando := FALSE;
END_IF
ELSE
(* Comando is FALSE *)
IF Temperatura < (Set_Point - Eps) THEN
Comando := TRUE;
END_IF
END_IF
END_FUNCTION

Ogni 3 secondi si incrementa il contatore (variabile count). Quando il contatore arriva al valore di 5, si accende la variabile turnOn.

PROGRAM PLC_PRG
VAR
myTon: TON;
count: BYTE;
turnOn: BOOL;
END_VAR
(* code *)
myTon(IN := NOT myTon.Q, PT := T#3s);
IF (myTon.Q = TRUE) THEN
count := count +1;
ELSE
IF (count = 5) THEN
turnOn := TRUE;
END_IF
END_IF
END_PROGRAM;

Ogni secondo, si incrementa il contatore. Tramite il costrutto di selezione multipla si può scrive un codice che:

  1. dopo 1 secondo: valvola 1 aperta, le altre due sono chiuse.
  2. dopo 2 secondi: valvola 2 aperta, le altre due sono chiuse.
  3. dopo 3 secondi: valvola 3 aperta, le altre due sono chiuse.
PROGRAM PLC_PRG
VAR
myTon: TON;
count: BYTE;
valve1 AT %QX1.0: BOOL;
valve2 AT %QX1.1: BOOL;
valve3 AT %QX1.2: BOOL;
END_VAR
(* code *)
myTon(IN := NOT myTon.Q, PT := T#1s);
IF (myTon.Q = TRUE) THEN
count := count +1;
ELSE
CASE count OF
1:
valve1 := TRUE;
valve2 := FALSE;
valve3 := FALSE;
2:
valve1 := FALSE;
valve2 := TRUE;
valve3 := FALSE;
3:
valve1 := FALSE;
valve2 := FALSE;
valve3 := TRUE;
END_CASE
END_IF
END_PROGRAM;

Questo esercizio si svolge con function block rilevatori di fronte di salita.

PROGRAM PLC_PRG
VAR
start_btn AT %IX0.0: BOOL;
stop_btn AT %IX0.1: BOOL;
green_light AT %QX1.0: BOOL;
RTRIG_start: R_TRIG;
RTRIG_stop: R_TRIG;
END_VAR
RTRIG_start(CLK := start_btn);
IF (RTRIG_start.Q = TRUE) THEN
green_light: TRUE;
END_IF
RTRIG_stop(CLK:= stop_button);
IF (RTRIG_stop.Q = TRUE) THEN
green_light := FALSE;
END_IF
END_PROGRAM;

SFC (Sequential Function Chart) è un formalismo grafico per la descrizione del ciclo operativo di macchine automatiche. È definito dalla Norma IEC 61131-3, trova diretta implementazione come linguaggio di programmazione in molti tools di sviluppo.

SFC facilita la scomposizione gerarchica del funzionamento della macchina e la strutturazione del programma in sottoparti più semplici.

SFC evidenzia il comportamento sequenziale della macchina o di sue componenti. SFC nasce per le seguenti necessità:

  • linguaggio formale comprensibile a diversi profili professionali,
  • approccio top-down: il funzionamento della macchina viene scomposto in passi fondamentali analizzati separatamente (riducendo così la complessità di ogni singolo elemento),
  • semplificare la descrizione del funzionamento: la descrizione ingresso-uscita porta ad una descrizione molto semplice.

Steps: stati o passi logici di funzionamento.

Un passo rappresenta una situazione in cui il comportamento del controllore (rispetto a ingressi e uscite) segue le regole definite dalle azioni associate allo stato. Si definisce lo stato di attività associato ad un passo: il passo può essere attivo o disattivo.

Lo stato di attività di un passo può essere rappresentato dal possesso o meno di un token, rappresentabile graficamente con un “pallino pieno”.

Stato iniziale: in ogni schema deve essere presente uno ed uno solo stato iniziale. Si distingue dagli altri stati per una determinata caratteristica grafica: cornice doppia o più spessa.

Ogni volta che creo un nuovo passo, automaticamente si generano due variabili ad esso associate:

  • variabile di stato: booleano che rappresenta il possesso (o meno) del token, si accede con nome_passo.X
  • variabile timer: di tipo TIME, conta il tempo dal momento in cui il passo diventa attivo e si accede con nome_passo.T. È consultabile solo mentre si è nello stesso stato a cui è associata

Tali variabili sono impostate in sola lettura.

Transitions: transizioni tra gli stati logici, condizionati dal valore di segnali sensoriali. Dunque una transizione rappresenta la condizione secondo la quale il controllo passa da un passo (o passi) predecessore ad un passo (o passi) successivo secondo la topologia stabilità dalla rete di connessioni.

La transizione è graficamente rappresentata da una linea orizzontale che taglia il collegamento verticale. Ogni transizione deve essere associata ad una condizione. Dalla valutazione di tale espressione, risulta un valore booleano. Una condizione sempre vera si identifica dal simbolo 1 o dalla parola chiave TRUE.

Le transizioni possono essere molto articolate.

L’azione descrive il comportamento del controllore in corrispondenza dell’attivazione di un passo. Ad ogni passo sono associate zero o più azioni. Un passo di attesa (wait) ha zero azioni associate.

Un’azione è definita mediante un blocco grafico in cui sono specificati i seguenti due elementi:

  • qualificatore dell’azione: definisce il tipo dell’azione da intraprendere (se impulsiva, continua, temporizzata, …). I qualificatori sono N, R, S, P, L, D, SD, DS, SL.
  • implementazione effettiva dell’azione, può essere di due tipi:
    1. nome di una variabile booleana scritta direttamente dentro al blocco,
    2. richiamo di un modulo di codice chiamato AZIONE (il 4° tipo di POU, anche se la norma non lo include tra i POU).

Ogni azione ha un qualificatore che identifica che tipo di azione è.

QualificatoreSignificatoDescrizione
nessunoDi default ha lo stesso significato di N
NNon-storedL’azione termina quando il passo si disattiva
RResetTermina un’azione attivata con i qualificatori S, SD, SL o DS.
SSet (stored)L’azione continua anche quando il passo si disattiva e termina solo quando viene resettata.
LTime LimitedL’azione comincia quando il passo diventa attivo o continua finché il passo si disattiva oppure trascorre un certo intervallo di tempo.
DTime DelayUn timer viene settato quando il passo diventa attivo: se il passo è ancora attivo dopo l’azzeramento del timer, l’azione comincia e termina quando il passo si disattiva.
PPulseL’azione comincia quando il passo diventa attivo o disattivo e viene eseguita una sola volta.
SDStored and Time DelayedL’azione comincia dopo un ritardo anche se il passo diventa inattivo e continua finché non è resettata.
DSDelayed and StoredUn timer viene settato quando il passo diventa attivo: se il passo è ancora attivo dopo l’azzeramento del timer, l’azione comincia e termina quando viene resettata.
SLStored and Time LimitedL’azione comincia quando il passo diventa attivo e continua finché non viene resettata o non trascorre un certo intervallo di tempo.

All’avviamento, in ogni sequenza SFC vi è un passo attivo senza alcuna condizione preliminare: passo iniziale. Le azioni associate al passo iniziale vengono immediatamente eseguite.

Un programma SFC può essere composto da più POU. Deve esserci un passo iniziale per ogni POU. L’azione associata ad un passo attivo avente una transizione a valle con condizione associata sempre vera, viene eseguita sempre almeno una volta.

Conseguenze dell’attivazione:

  • l’attivazione di un passo provoca l’esecuzione di tutte le azioni ad esso associate,
  • la disattivazione di un passo provoca l’interruzione di tutte le azioni ad esso associate (a meno che non si tratti di azioni tipo S, SL, SD).

Sintassi dei passi e delle transizioni:

  • due passi debbono essere separati da una transizione,
  • due transizioni debbono essere separati da un passo.

I collegamenti arrivano ai passi o se ne dipartono in posizione verticale.

La divergenza opzionale esprime un criterio di scelta: traduce IF o CASE. Le “diramazioni” possono essere mutualmente esclusive: solo uno viene attivato.

Siccome nella divergenza opzionale solo un percorso viene attivato, le transizioni e quindi le condizioni devono essere specificate per tutte le sequenze alternative.

Una divergenza opzionale si può richiudere con una convergenza opzionale o con i rami divergenti che approdano a stati differenti e non si richiudono.

La divergenza simultanea esprime un parallelismo tra azioni e anche un meccanismo di sincronizzazione. I rami che divergono da una divergenza simultanea iniziano nello stesso istante, poi ognuno evolve a modo suo e con i suoi tempi. Alla fine, si devono aspettare per richiudersi: devono essere tutti in esecuzione nel loro ultimo stato per valutare la transizione sottostante alla chiusura.

Se si ha una divergenza simultanea, questa verrà obbligatoriamente richiusa da una convergenza simultanea.


La norma stabilisce alcune regole formali che non possono essere violate, in quanto ogni ambiente di sviluppo le segnala come errori e non consente di implementarle: è impossibile mettere due stati conseguenti senza una transizione in mezzo, l’ambiente di sviluppo non lo consente fisicamente.

La norma stabilisce altre regole che non dovrebbero essere infrante in quanto porterebbero a comportamenti imprevedibili, e sono dunque considerate una fonte di errore. Un programmatore può violarle, l’IDE consente di farlo e non segnala errori, però ciò causa un andamento pericoloso del codice creato.


Vantaggi dei vari linguaggi di programmazione:

  • LD: eventi asincroni e impostare set/reset di segnali con un numero limitato di condizioni,
  • ST: impostare algoritmi matematici complessi,
  • SFC: ottimo quando devo modellare il comportamento sequenziale del ciclo macchina standard