Linguaggio Structured Text per PLC
Potresti guardare: https://www.plcacademy.com/structured-text-tutorial/ per prendere spunto per fare i blocchi di pseudocode.
Introduzione
Section titled “Introduzione”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.
Costrutti di selezione
Section titled “Costrutti di selezione”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_IFSelezione 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;Costrutti di iterazione
Section titled “Costrutti di iterazione”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=0END_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 istruzioniEND_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;Chiamate di Function Blocks
Section titled “Chiamate di Function Blocks”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.
Operatori
Section titled “Operatori”Tutti gli operatori classici. La particolarità sta nell’operatore diverso: <>.
Esempi di ST
Section titled “Esempi di ST”Elaborazione di numeri reali
Section titled “Elaborazione di numeri reali”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_IFEND_FUNCTIONUtilizzo di FB timer Ton
Section titled “Utilizzo di FB timer Ton”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_IFEND_PROGRAM;Eventi temporizzati in ST
Section titled “Eventi temporizzati in ST”Ogni secondo, si incrementa il contatore. Tramite il costrutto di selezione multipla si può scrive un codice che:
- dopo 1 secondo: valvola 1 aperta, le altre due sono chiuse.
- dopo 2 secondi: valvola 2 aperta, le altre due sono chiuse.
- 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_IFEND_PROGRAM;Set e reset di una variabile
Section titled “Set e reset di una variabile”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_IFEND_PROGRAM;Sequential Function Chart
Section titled “Sequential Function Chart”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.
Stati/passi logici
Section titled “Stati/passi logici”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.
Variabili associate al passo
Section titled “Variabili associate al passo”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 connome_passo.T. È consultabile solo mentre si è nello stesso stato a cui è associata
Tali variabili sono impostate in sola lettura.
Transizioni
Section titled “Transizioni”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.
Azioni
Section titled “Azioni”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:
- nome di una variabile booleana scritta direttamente dentro al blocco,
- 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 è.
Qualificatori delle azioni
Section titled “Qualificatori delle azioni”| Qualificatore | Significato | Descrizione |
|---|---|---|
| nessuno | Di default ha lo stesso significato di N | |
| N | Non-stored | L’azione termina quando il passo si disattiva |
| R | Reset | Termina un’azione attivata con i qualificatori S, SD, SL o DS. |
| S | Set (stored) | L’azione continua anche quando il passo si disattiva e termina solo quando viene resettata. |
| L | Time Limited | L’azione comincia quando il passo diventa attivo o continua finché il passo si disattiva oppure trascorre un certo intervallo di tempo. |
| D | Time Delay | Un 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. |
| P | Pulse | L’azione comincia quando il passo diventa attivo o disattivo e viene eseguita una sola volta. |
| SD | Stored and Time Delayed | L’azione comincia dopo un ritardo anche se il passo diventa inattivo e continua finché non è resettata. |
| DS | Delayed and Stored | Un 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. |
| SL | Stored and Time Limited | L’azione comincia quando il passo diventa attivo e continua finché non viene resettata o non trascorre un certo intervallo di tempo. |
Regole di evoluzione
Section titled “Regole di evoluzione”Inizializzazione
Section titled “Inizializzazione”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.
Divergenza opzionale
Section titled “Divergenza opzionale”La divergenza opzionale esprime un criterio di scelta: traduce IF o CASE. Le “diramazioni” possono essere mutualmente esclusive: solo uno viene attivato.
Convergenza opzionale
Section titled “Convergenza opzionale”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.
Divergenza simultanea: parallelismo
Section titled “Divergenza simultanea: parallelismo”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.
Convergenza simultanea: sincronizzazione
Section titled “Convergenza simultanea: sincronizzazione”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