IL Linguaggio per la programmazione del PLC Ing. Marco Giannini IL Linguaggio per la programmazione del PLC Prof. Giuseppe Mastronardi Architettura e Programmazione dei Microelaboratori Anno accademico 2008/2009
Ladder Diagram (Linguaggio a contatti)
Linguaggio a contatti La forma del programma deriva dalla logica a relè, con le due linee verticali laterali (i montanti della scala) rappresentati l’alimentazione e con le linee orizzontali (i pioli o rung) che alimentano una bobina se una certa combinazione di contatti abilita il flusso di energia. I contatti sono associati agli ingressi digitali oppure a condizioni interne al dispositivo (rappresentati entrambi da bit di memoria). Una bobina è associata a un bit della memoria e, col suo tramite, comandare una uscita digitale o segnalare una condizione interna.
Linguaggio a contatti Regola fondamentale: il flusso di energia ha come unico verso quello che va dal montante sinistro al montante destro; la bobina U1 può essere accesa se sono chiusi i contatti I1, I2, I3, I4 e non quando sono chiusi i contatti I7, I5, I2, I3, I4.
Tipi di istruzioni del linguaggio a contatti Istruzioni di base: contatti e uscite di tipo relè Istruzioni di temporizzazione e conteggio Istruzioni per il controllo del programma Istruzioni per la gestione dei dati Istruzioni per funzioni speciali (regolatori PID)
Descrizione della memoria RAM di un PLC virtuale Area degli ingressi: 32 word da 16 bit con indirizzi I1-I32; Ix:y indica il bit y della word x; ad ogni ingresso digitale corrisponde un bit; ad ogni ingresso analogico corrisponde una word di 16 bit. Area delle uscite: 32 word da 16 bit con indirizzi U1-U32; si utilizzano le stesse convenzioni dell’area degli ingressi.
Descrizione della memoria RAM di un PLC virtuale Area utente: 512 word da 16 bit indirizzabili con W1-W512; è utilizzata per memorizzare dati, tabelle, risultati parziali dell’elaborazione del programma utente. Area PID: sono previste 4 strutture di tipo regolatore PID indirizzabili con P1-P4. sono previste 16 strutture di temporizzazione con indirizzi T1-T16. Area dei Temporizzatori :
Modalità di esecuzione di un programma scritto in linguaggio a contatti Lettura degli ingressi e scrittura del loro stato in memoria. Esecuzione del programma un rung dopo l’altro, procedendo dall’alto verso il basso, da sinistra verso destra. Scrittura delle uscite, prelevando il loro stato dalla memoria.
Istruzioni di base Contatto normalmente aperto: se il bit ad esso associato è ad 1 (ON) il processore chiude il contatto; se il bit è a 0 (OFF) il contatto rimane aperto. Il bit ad esso associato può appartenere all’area di memoria degli ingressi (Ix:y), delle uscite (Ux:y) e all’area utente (Wx:y). Contatto normalmente chiuso: se il bit ad esso associato è ad 1 (ON) il processore apre il contatto; se il bit è a 0 (OFF) il contatto rimane chiuso. Valgono le stesse considerazioni dell’istruzione precedente.
Istruzioni di base Bobina: è utilizzata per settare il bit ad essa associato che può essere un bit dell’area delle uscite (Ux:y) o un bit dell’area utente (Wx:y). Questa istruzione deve essere sempre inserita all’estrema destra del rung; se le istruzioni che la precedono realizzano la continuità elettrica e logica, il bit ad essa associato assume valore “1”, altrimenti assume valore “0”. Latch bobina: mantiene lo stato ON del bit associato anche quando le condizioni che lo hanno attivato sono diventate false; l’unico modo di portarlo nello stato OFF è utilizzare l’istruzione UNLATCH BOBINA.
Istruzioni di base Unlatch bobina: è l’istruzione duale della LATCH BOBINA e quindi mantiene lo stato OFF del bit associato anche quando le istruzioni precedenti realizzano la continuità elettrica e logica. Per portare allo stato ON il bit associato, si deve utilizzare necessariamente l’istruzione LATCH BOBINA .
Esempi di programmi con istruzioni di base Si vuole memorizzare nel bit U1:1 il risultato della OR tra i bit I1:1 e I1:2.
Annotazione importante L’ordine in cui vengono scritti i rung è molto importante. Nel programma a sinistra tutte le uscite vengono aggiornate in un solo ciclo di esecuzione, mentre nel programma a destra le tre uscite vengono aggiornate in tre cicli successivi una dopo l’altra.
Riconoscimento del fronte di salita Primo ciclo di esecuzione: il primo rung viene abilitato quando I 1:1 = 1, per cui W 1:1 viene portato a 1. Successivamente viene eseguito il secondo rung e quindi anche W 1:2 = 1. Secondo ciclo di esecuzione: W 1:2 era stato portato a 1 per cui W 1:1 va a 0.
Istruzioni di temporizzazione e conteggio Il temporizzatore deve essere sempre posizionato all’estrema destra del rung; Tx è il suo indirizzo con x = 1 - 16; la durata massima è di 360000 centesimi di secondo (un’ora). Se viene stabilita la continuità logica del rung, il temporizzatore inizia il conteggio e la sua locazione di memoria contiene 0; quando termina il conteggio, Tx = 1 fin quando il temporizzatore non viene resettato; se durante il conteggio si interrompe l’alimentazione, si resetta. Temporizzatore a ritenuta: il suo funzionamento è molto simile al temporizzatore semplice; se viene interrotta l’alimentazione, viene conservato il valore raggiunto nel conteggio. Per resettare questo temporizzatore si utilizza l’istruzione -(RES)-. Il valore corrente del conteggio è nell’indirizzo Tx.acc.
Istruzioni di temporizzazione e conteggio Contatore ad incremento: Cx indica l’indirizzo (x = 1- 16), e il massimo numero di eventi contati è 1000. Deve essere sempre posizionato a destra del rung e, se il rung in cui si trova subisce una transizione falso/vero (0- 1), incrementa di uno il suo valore. Quando il contatore raggiunge il n. di eventi impostato, il bit ad esso associato assume 1 e viene resettato automaticamente il conteggio. Per resettare a zero il conteggio da programma, si utilizza l’istruzione -(RES)-; il valore corrente del conteggio è disponibile all’indirizzo Cx.acc.
Istruzioni per il controllo del programma Se alimentata, permette di saltare ad un rung dove è presente l’istruzione di etichetta corrispondente indicata mediante un numero; deve essere posizionata all’estrema destra del rung. Indica la destinazione del salto e deve essere posizionata a sinistra del rung. Permette di controllare, attraverso un solo insieme di condizioni, l’esecuzione di un’intera parte di programma racchiuse tra due istruzioni MCR (Master Control Relay); se la prima viene alimentata, viene eseguita quella parte, altrimenti tutte le bobine di quella parte sono messe a zero. Le due istruzioni sono posizionate alla destra dei rung.
Istruzioni per il controllo del programma Il funzionamento del ZCL (Zone Control Last state) è identico a quello dell’istruzione precedente; l’unica differenza è che, se la prima delle due istruzioni non viene alimentata, le uscite presenti nella parte di programma controllata rimangono nel loro stato. Salto a sottoprogramma: il sottoprogramma è racchiuso tra due istruzioni, una di inizio –I SBR I-, corredata dal numero di sottoprogramma, e l’altra di fine –( RET )-.
Istruzioni per la movimentazione di dati Trasferisce il contenuto di una word di memoria (OP 1) oppure un valore assoluto in OP 2. E’ un’istruzione di uscita e quindi va posizionata a destra del rung. Esegue operazioni aritmetico/logiche tra due operandi; il risultato dell’operazione è memorizzato in RES. Le operazioni sono: ADD, MUL, SUB, DIV, AND, OR. Si posiziona a destra del rung.
Istruzioni per la attivazione dei rung Esegue operazioni di comparazione tra due operandi; il risultato dell’operazione è memorizzato in RES. Le operazioni sono: EQU, NEQ, GEQ, LEQ, GRT, LES. Si posiziona a sinistra del rung.
Istruzioni PID Kp: guadagno proporzionale Kd : guadagno derivativo Ki: guadagno integrale rif: word del riferimento var: variabile da controllare com: valore del controllo
Istruzioni di connessione La coppia di istruzioni di connessione -->zyx> e >zyx>-- viene utilizzata per spezzare un rung troppo lungo:
Esempi
Programmazione di una XOR U3:15 = (I1:4 AND NOT(I1:7)) OR (NOT(I1:4) AND I1:7)
Riconoscimento del Fronte di Salita
Riconoscimento del Fronte di Discesa
Flip Flop di tipo D
Ritardo di spegnimento
Esercizi
Tradurre in LD la seguente istruzione in ST Esercizio Tradurre in LD la seguente istruzione in ST
Soluzione I