Sei sulla pagina 1di 16

Linguaggi di Programmazione per PLC

Estefanı́a Etchevés Miciolino

26 ottobre 2016

1 Lo Standard CEI 61131-3


Lo standard CEI 61131-3 è stato pubblicato a fine del 1993 e recentemente
aggiornato nel febbraio del 2013 dalla Commissione Elettrotecnica Interna-
zionale. Essendo uno standard, esso costituisce solo un modello, non un
vincolo implementativo. Esso descrive e definisce i seguenti 5 linguaggi di
programmazione per il PLC, sia testuali che grafici:

• IL - Instruction List;

• ST - Structured Text;

• FBD - Function Block Diagram;

• LD - Ladder Diagram;

• SFC - Sequential Function Chart.

I tipi di dati che sono compatibili con lo standard sono i dati booleani
(BOOL), interi (INTEGER), reali (REAL), i BYTE, le parole (WORD), le
stringhe (STRING) e due tipi particolari, il DATE ed il TIME. Oltre a que-
sti, è prevista anche la definizione di tipi personalizzati da parte dell’utente,
a seconda delle esigenze, detti dati derivati.

2 ST - Structured Text
Questo è linguaggio di programmazione testuale ad alto livello, molto vicino
al Pascal.

I comandi e operatori più utilizzati sono quelli descritti in seguito:

:= assegnazione di variabili
; termine istruzione

1
Operatori aritmetici:
+ somma / divisione
− differenza MOD divisione intera
∗ prodotto ∗∗ elevamento a potenza

Operatori di relazione:
< minore >= maggiore o uguale
<= minore o uguale = uguale
> maggiore <> diverso

Operatori su bit:
&, AND prodotto logico
OR somma logica
XOR somma logica esclusiva
NOT negazione

È possibile l’utilizzo delle parentesi per raggruppare operazioni, in modo


da modificarne l’ordine di esecuzione.

Tale linguaggio prevede anche dei costrutti per implementare delle istru-
zioni condizionate, in particolare:
IF ... THEN ... END IF
IF ... THEN ... ELSE ... END IF
IF ... THEN ... ELSEIF ... THEN ... ELSE ... END IF
CASE ... OF ... ELSE ... END CASE

L’istruzione CASE viene utilizzata per le decisioni multiple che dipen-


dono da una variabile intera.

Per quanto riguarda i cicli, i costrutti messi a disposizione dal ST sono:


FOR ... TO ... BY ... DO ... END FOR basato su una variabile
intera che viene incrementata;
WHILE ... DO ... END WHILE verifica la condizione all’inizio;
REPEAT ... UNTIL ... END REPEAT verifica la condizione alla
fine, per cui i comandi vengono eseguiti almeno una volta;
EXIT permette di uscire immediatamente dal ciclo, interrompendone
l’esecuzione.

2.1 Esempi

2
IF abilitazione & (conteggio < 100) THEN
conteggio := 100;
stato tornio := fermo;
END IF

CASE conteggio OF
1 : stato tornio := fermo;
2,3,4,5 : stato tornio := funzionante;
6 . . . 50 : stato tornio := guasto;
END CASE

FOR conteggio = 10 TO conteggio = 6 BY -1 DO


forno1[conteggio] := forno1[conteggio-5];
IF forno1[conteggio].valore = 100.00 THEN
EXIT;
END IF
END FOR

3 IL - Instruction List
Questo è un linguaggio di basso livello, simile all’assembly, costituito da una
sequenza di istruzioni. Le componenti sono:

• operatore - fa riferimento all’accumulatore (area di memoria dedicata


al salvataggio temporaneo di una variabile) e all’operando;

• modificatore;

• operando;

• etichetta - stringa utilizzata prima dell’operatore, seguita da : .

Gli operatori predefiniti dallo standard sono quelli elencati in seguito:


LD (load) - assegna all’accumulatore il valore della cella di memoria
indicata dall’operando;
ST (store) - copia il valore dell’accumulatore nell’area di memoria asse-
gnata alla variabile indicata dall’operando;
S (set) - assegna ad una variabile booleana, indicata dall’operatore, il
valore 1 se nell’accumulatore c’e’ il valore 1;
R (reset) - assegna ad una variabile booleana, indicata dall’operatore, il
valore 0 se nell’accumulatore c’e’ il valore 1;
AND, OR, XOR - operatori logici su variabili booleane, che vengono
eseguiti tra il valore presente nell’accumulatore e quello indicato dall’ope-
rando, ed il cui risultato viene salvato nell’accumulatore;

3
ADD, SUB, MUL, DIV - operatori aritmetici per la somma, sottra-
zione, moltiplicazione e divisione, il cui risultato viene salveto nell’accumu-
latore;
GT (greater than), GE (greater or equal), EQ (equal), NE (not equal),
LE (less or equal), LT (less than) - operatori di comparazione;
JMP (jump) - salto all’etichetta indicata dall’operando;
CAL (call) - chiamata a blocco funzionale indicato dall’operando;
RET (return) - ritorno da funzione o blocco funzionale.

I modificatori che sono messi a disposizione da questo linguaggio sono:


N (not) - negazione booleana dell’operando, utilizzato per gli operatori
LD ed ST;
C (condition) - esegue l’operatore solo se il valore dell’accumulatore è 1,
rendendo condizionato il salto, utilizzato con JMP, CAL e RET;
(, ) - utilizzate per modificare l’ordine di esecuzione di una funzione.

3.1 Esempi:

XOR:
LD a
ANDN b
OR (b
ANDN a)
ST c

Flip-Flop T:
LD i
ANDN i prec
JMPCN ava
LD u
STN u
ava: LD i
ST i prec

4 FBD - Function Block Diagram


L’FBD è un linguaggio grafico che crea un’analogia con i circuiti elettroni-
ci, seguendo la logica dei diagrammi a blocchi, particolarmente adatto per
implementare funzioni logiche booleane ed operazioni aritmetiche. Tale lin-
guaggio permette di realizzare programmi complessi, connettendo blocchi
funzionali e funzioni sviluppati anche in altri linguaggi.

4
Nel blocco in figura, XXX rappresenta la funzione che si vuole imple-
mentare, X1, X2, ... sono le variabili d’ingresso per tale funzione, e Y1, Y2,
... sono le variabili di uscita.

Le uscite delle funzioni o blocchi funzionali vengono connessi agli ingressi


di altri, creando una serie. Di per se non ci sono elementi intrinseci del
linguaggio.
È anche possibile creare degli anelli chiusi, riportando l’uscita di una
funzione o di un blocco come ingresso per uno precedente. Tale ingresso verrà
valutato all’analisi successiva della rete, essendo anche qui il funzionamento
di tipo ciclico.

4.1 Esempio:

5 LD - Ladder Diagram
I linguaggio Ladder, o schema a contatti, è il linguaggio più diffuso per la
programmazione dei PLC, di tipo grafico, nato per non rendere difficoltoso il
passaggio dal controllo a logica cablata di tipo elettromeccanica che veniva
utilizzato nell’ambito industriale prima dell’avvento dei PLC, al controllo a
logica programmata. Si era reso necessario infatti, per i tecnici ed operatori
non esperti di programmazione, creare un linguaggio di programmazione
che fosse vicino al loro modo di operare, con l’utilizzo di relè, contatti e
bobine, temporizzatori, etc. Ed è proprio su questa base che fu sviluppato
il ladder, i cui componenti sono proprio contatti e bobine, i quali vengono
combinati, insieme ad altri blocchi funzionali, lungo i pioli o rung (linee
orizzontali) tra i montanti o linee calde di alimentazione (linee verticali)
per creare la logica di controllo desiderata, per cui è un linguaggio che ha
delle implicazioni elettriche. Lungo questi deve essere garantita la continuità
logica (elettrica), e vengono eseguiti da sinistra verso destra, e dall’alto verso
il basso.

5
In questo modo è possibile creare dei circuiti di controllo logico (su base
booleana) o sequenziale, a seconda delle esigenze. Di per se, questo linguag-
gio descrive il ciclo operativo del PLC, cioè rappresenta la sequenza delle
cose che il PLC deve fare ad ogni ciclo.

I componenti di base del linguaggio ladder sono:


Linee calde: rappresentano le linee di alimentazione del sistema. Quella
a sinistra può essere associata alla fase, mentre quella a destra può essere
associata alla massa.

Contatti: Rappresentano i bit di ingresso al sistema oppure delle con-


dizioni digitali interne al dispositivo (stato del sistema). Essi permettono il
flusso di “energia” (continuità logica) verso destra lungo il rung, in funzione
dello stato del but a cui è associato.
normalmente aperto - chiuso quando il bit associato
è a uno.
normalmente chiuso - chiuso quando la variabile
booleana a cui è associato è falsa.
a fronte di salita - viene chiuso solo se la variabile
booleana a cui è associata passa da 0 a 1.
a fronte di discesa - viene chiuso solo se la variabile
booleana a cui è associata passa da 1 a 0.
Bobine: sono elementi che operano sul bit, e rappresentano le variabili
di uscita al sistema, cioè sono associate a bit di memoria.
semplice - al bit associato in memoria viene assegnato
il valore 1 quando è alimentata.
negata - assegna alla variabile booleana associata il
valore 1 se non alimentata.
a memorizzazione set (latch o di aggancio) - il bit
associato in memoria viene portato ad 1 quando ali-
mentata, e vi permane anche quando non cè più
continuità logica lungo il rung.
a memorizzazione reset (unlatch) - il bit associato in
memoria viene portato a 0 quando alimentata, e vi
permane anche quando non cè più continuità logica
lungo il rung.
a fronte di salita - associa un 1 alla variabile so-
lo quando tra due esecuzioni successive passa da
disalimentata ad alimentata.

6
a fronte di discesa - associa un 1 alla variabile so-
lo quando tra due esecuzioni successive passa da
alimentata a disalimentata.

5.1 Esempi:
Funzione IF ... THEN: quando il contatto sulla sinistra viene portato ad 1
(chiuso), allora vi è continuità logica tra la linea calda di sinistra e quella
di destra, per cui la bobina sulla destra viene alimentata, ed il bit di me-
moria associato viene portato ad 1. Quando il contatto viene riaperto tale
continuità si perde, ed il bit associato alla bobina va a 0.

Analogamente, se sono due o più le bobine collegate allo stesso contatto,


quando esso viene chiuso tutte le bobine vengono alimentate. È possibile
realizzare cosı̀ una funzione del tipo IF ... THEN ... AND ...

Funzione logica OR: quando uno dei due contatti (o entrambi) viene
chiuso, esso permette il passaggio di “corrente” verso la bobina, che viene di
conseguenza alimentata. Tale funzione viene implementata con dei contatti
in parallelo.

Funzione logica AND: affinchè la bobina venga alimentata, entrambi i


contatti devono essere chiusi, altrimenti il flusso logico viene bloccato dal
contatto che è aperto. Per ottenere tale funzione vengono posizionati i con-
tatti in serie.

7
Funzione logica NOT: la bobina viene alimentata solo se il bit associato
al contatto normalmente chiuso è 0. Tale funzione logica permette di avere
nel bit di memoria associato alla bobina un valore pari alla negazione del
contenuto di memoria associato al contatto.

Funzione logica XOR (OR esclusivo): soltanto se uno dei bit associati ai
contatti A o B vale 1, porta la bobina ad essere alimentata.

Essendo una logica binaria, è possibile ottenere queste stesse funzioni


logiche con diverse combinazioni di contatti, sia normalmente aperti che
chiusi; le soluzioni nei vari linguaggi di programmazioni non sono mai uni-
voche.

Flip-Flop Set/Reset: questa configurazione permette di creare una cella


di memoria che viene portata ad 1 se il contatto S è chiuso ed R è aperto, o
viene portata a 0 viceversa. Nel caso in cui entrambi i contatti S ed R sono
ad 1 o a 0, la cella mantiene il valore precedente presente in memoria.

Come si vede, è anche possibile utilizzare il valore delle variabili come


ingressi, associandolo a dei contatti.

8
Flip-Flop T (Toggle): per ogni fronte di salita dell’ingresso si verifica la
commutazione dello stato dell’uscita.

5.2 Altre funzioni


Altre funzionalità che possono essere implementate in LD sono:

Temporizzatori: forniscono un valore vero in uscita dopo che il relativo


blocco rimane alimentato per un tempo stabilito, indicato all’interno del
blocco in millisecondi.

È possibile conoscere il tempo trascorso tramite il comando Tx.acc, dove


Tx è il nome del contatore a cui si fa riferimento, cosı̀ come il comando
Tx.dn restituisce un valore 1 o 0 a seconda se ha finito o meno il conteggio.
Dato che il temporizzatore Tx si resetta quando non viene più alimen-
tato, è disponibile anche il temporizzatore a ritenuta TxR, il quale
continua il conteggio anche se disalimentato e non si resetta. Per fare ciò, è
necessario utilizzare una bobina RES ad esso associata, che lo resetta quan-
do viene alimentata.

Contatore: conta il numero di fronti di salita che riceve in ingresso, e


da 1 in uscita quando ha raggiunto un certo numero di conteggi prestabilito.

9
Analogamente ai temporizzatori, in Cx.acc viene registrato il numero di
conteggio raggiunto.
Sono disponibili contatori sia ad incremento (CU) che a decremento
(CD), ed alimentano una bobina RES associata al contatore Cx è possibile
resettare il contatore.

Salto condizionato: permette di controllare il flusso del programma.


Viene utilizzata una stringa, detta label, per indicare il punto in cui si vuole
saltare.

Salto a sottoprogramma: a differenza del salto condizionato, questo


salta ad una porzione di codice che viene eseguito, per poi tornare indie-
tro e proseguire dal punto in cui aveva effettuato il salto. Il termine del
sottoprogramma viene indicato da una bobina RET.

10
5.3 Esempi:

Ritardo nello spegnimento: l’uscita viene portata a zero dopo un certo


intervallo di tempo rispetto all’ingresso.

Inizializzazione programma: a questo scopo è possibile utilizzare anche


il bit di stato interno del PLC %S13, chiamato first scan bit, che vale 1 solo
durante la prima esecuzione del PLC, e si setta automaticamente a 0 alla
fine del primo scan.

11
Oscillatore ad onda quadra:

Trasferimento di memoria: permette di spostare il contenuto da una


cella di memoria ad un’altra, i cui indirizzi vengono indicati come operandi
all’interno del blocco.

Conteggio di eventi:

12
Operazioni aritmetiche e logiche: quando il blocco viene “alimenta-
to”, esegue l’operazione e salva il risultato nel blocco di memoria indicato
dall’indirizzo presente in RES.

ADD - somma algebrica;


MUL - prodotto algebrico;
SUB - sottrazione;
DIV - divisione;
AND - prodotto logico;
OR - somma logica.

I due operandi corrispondono agli indirizzi di memoria in cui risiedono


le variabili su cui deve essere eseguita l’operazione indicata dal blocco.

Comparazioni: esegue il tipo di comparazione indicata dal blocco tra


i contenuti delle celle di memoria indicate dagli operandi, e manda ad 1
l’uscita se il risultato della comparazione è vero, 0 altrimenti.

EQU - uguale;
NEQ - diverso;
GEQ - maggiore o uguale;
LEQ - minore o uguale;
GRT - maggiore;
LES - minore.

6 SFC - Sequential Function Chart


Questo linguaggio, ispirato alle macchine a stati finiti, si rende molto utile
per la scrittura di algoritmi per il controllo logico/sequenziale, mirati la
coordinamento e sequenziamento di azioni elementari. Il tipo di sistemi
complessi da descrivere sono quelli ad eventi discreti, cioè con spazio di
stato discreto, e la cui evoluzione dipende dal verificarsi o meno di particolari
condizioni, chiamate appunto eventi.

13
Gli elementi che costituiscono questi diagrammi sono:

Fasi ed eventuali azioni associate. Ogni fase vie-


ne identificata da un numero, in genere ordinati in
maniera sequenziale, o da un nome, che lo identifi-
ca in maniera univoca. Sono condizioni invarianti
del sistema, modificabili solo con il verificarsi di
un determinato evento, il quale genera una transi-
zione che porta il sistema in una nuova fase, detto
cambiamento di stato.
Una fase può essere non attiva o attiva. In tal caso, all’interno del qua-
drato che la identifica viene posizionato un token, ed il comportamento del
blocco funzionale o del programma è definito dalle azioni associate a tale
fase. Una fase a cui non è associata un’azione puó essere considerata come
una fase di attesa, nella quale il sistema vi permane finché non si verificano
le condizioni necessarie per passare ad un’altra fase. Ad ogni fase vengono
associate due variabili:

Nome Fase.X variabile booleana che indica se la fase è attiva (1) o


meno (0).
Nome Fase.T variabile di tipo TIME che memorizza per quanto tem-
po la fase è rimasta attiva durante l’ultima attivazione.

Le azioni associate ad una fase vengono identi-


ficate come un rettangolo collegato alla suddetta
fase, e sono identificate dal loro nome. Il corpo
puó essere sviluppato in qualunque linguaggio di
programmazione previsto dallo standard. Queste
azioni vengono eseguite solo nel momento in cui
la relativa fase diviene attiva.
Un indicatore di tipo booleando indica se l’azione in esecuzione è stata
completata (1) o meno (0), mentre un qualificatore determina la modalitá
in cui tale azione viene eseguita. Questo puó assumere i valori:

N - non memorizzata. L’azione si esegue fintanto che la fase resta attiva,


ed un’ultima volta quando viene disattivata. Quest’ultima rappresenta una
caratteristica comune a qualunque tipo di esecuzione, ed è stabilita dallo
standard.
P - impulsiva. Si esegue una volta quando la fase viene attivata.
S,R - set/reset. L’azione viene eseguita anche dopo la disattivazione
della fase a cui è associata, finchè non viene resettata.
Dx - delay. L’inizio dell’azione viene ritardato di un numero di secondi
x.

14
DSx - delay-set. L’inizio dell’azione viene ritardato di x secondi, dopo
di che viene mantenuta la sua esecuzione, anche dopo che la fase diviene
disattiva.
Lx - limited. L’azione viene eseguita in maniera ripetuta per un certo
intervallo di tempo x.
SLx - set-limited. L’azione viene eseguita in maniera ripetuta per x se-
condi, anche se la fase nel frattempo diviene disattivata.

Fase iniziale. Lo standard richiede che ogni gra-


fo SFC abbia una sola fase iniziale, la quale viene
evidenziata da una doppia cornice.

Transizioni con relativa condizione da cui di-


pende il passaggio da una fase a quella succes-
siva. La transizione viene indicata da una bar-
ra orizzontale nera, mentre la condizione associa-
ta è sempre una variabile booleana, una funzione
booleana o un’asserzione.
Archi orientati, che connettono le fasi tra di
loro stabilendo la sequenza di esecuzione del pro-
gramma. Sono sempre interrotti da una transi-
zione. In genere l’ordine di esecuzione è dall’alto
verso il basso (programmazione top-down), per
cui in tal caso la freccia indicando in senso viene
omessa.
Regole dello SFC:

1. Tra due fasi collegate da un arco orientato c’è sempre una transizione.
Per cui due fasi non possono essere connesse direttamente.

2. Tra due transizioni c’è sempre almeno una fase. Per cui due transizio-
ni non possono essere connesse direttamente, ma è possibile collegare
piú fase in seguito ad una transizione.

3. La condizione associata ad una transizione viene valutata solo quando


tutte le fasi precedenti sono attive.

4. Se una condizione è vera e tutte le fasi precedenti alla transizione sono


attive, si dice che la transizione è superabile. Tutte le fasi precedenti a
tale transizione vengonocontemporaneamente disattivate e, nello
stesso istante, tutte le fasi successive divengono attive.

5. Se piú transizioni diventano superabili nello stesso istante, esse vengo-


no superate tutte contemporaneamente.

15
Le variabili temporali vengono indicate come t/Xn/d, dove t indica che
si tratta di tale tipo di variabile, Xn è il marker associato alla fase, e d è la
durata della temporizzazione. La variabile temporale assume inizialmente il
valore 0, e diventa 1 dopo che la variabile Xn rimane attiva per un tempo
pari a d, rimanendo in tale stato fino alla disattivazione di Xn.

Un classico esempio di utilizzo di tale variabile è rappresentato dal pre-


riscaldamento di componenti del processo, oppure dei watchdog per gli
allarmi, come nel seguente caso:

16

Potrebbero piacerti anche