Sei sulla pagina 1di 21

Text input of variable Testdisplay: Se viene selezionato, allora in modalit`a on line si ha la

possibilit`a di inserire un valore che dopo aver premuto <Enter> verr`a scritto sulla variabile
che appare nel campo Textdisplay della categoria Variables. Attraverso lo scroll box
viene scelto il tipo di dato che `e possibile ricevere in ingresso. Selezionando Text verr`a
mostrato in on line mode un campo di testo su cui sar`a possibile digitare il valore desiderato.
Selezionando invece Numpad o Keypad verr`a visualizzata una tastiera rispettivamente
numerica o alfabetica, dove si potr`a premere direttamente il valore tra quelli disponibili. Il
range valido di questa tastiera viene definito digitando i valori di massimo e di minimo nei
rispettivi campi Max: e Min:
4.3.2

Text for Tooltip

Questa categoria offre la possibilit`a di visualizzare in modalit`a on line un testo nel momento in
cui il cursore del mouse viene posizionato sopra lelemento. Il testo che si vuole visualizzare deve
essere scritto nellapposito campo Content.
4.3.3

Security

Questa categoria `e utile se chi crea lelemento vuole garantire delle differenti possibilit`a di accesso e di visualizzazione ai vari user group utilizzanti Codesys definiti precedentemente. Infatti
attraverso il comando ProjectUser Group Passwords si accede ad una finestra in cui `e
possibile creare un proprio user-group (contrassegnato da un livello) protetto da Password. Le

Figure 35: Finestra di configurazione dellelemento visualizzato (Categoria Security)


possibilit`a di accesso e di visualizzazione che possono essere assegnate allelemento sono mostrate
nella seguene tabella: Se si vogliono assegnare le medesime regole daccesso anche agli altri elNo Access
Read Access
Full Access

Lelemento non sar`a visibile


Lelemento sar`a visibile ma non utilizzabile (non sono permessi input)
Lelemento sar`a visibile e utilizzabile (pu`o ricevere ingressi)

ementi presenti nella stessa visualizzazione, baster`a attivare lopzione Apply to all visual
elements.
42

Figure 36: Finestra di definizione della password di user-group


4.3.4

Programmability

Le propriet`a di ogni elemento che compone una visualizzazione possono essere definite anche
attraverso i componenti di una particolare variabile oggetto (di tipo VisualObjectType), che pu`o
essere utilizzata esclusivamente per questo tipo di programmazione. Ci`o `e possibile utilizzando

Figure 37: Finestra di configurazione dellelemento visualizzato (Categoria Programmability)


la struttura VisualObjectType che fa parte della libreria SysLibVisu.lib. Questa libreria
di solito non `e presente nella versione demo gratuita di CoDeSys. Per creare una variabile
VisualObjectType riferita allelemento che si sta configurando sar`a necessario inserire nel campo
di testo una variabile che verr`a cosi dichiarata automaticamente. La dichiarazione avverr`a in
modo implicito e non visibile per lutente ma la variabile diventer`a automaticamente visibile da
tutti i programmi del progetto. Per maggiori informazioni sulla struttura VisualObjectType e
sulluso dei suoi vari componenti si consiglia di consultare la tabella di pagina 24 e seguenti del
manuale The Codesys Visualization.

4.4

Bitmap

E possibile inserire nella visualizzazione corrente anche un un immagine Bitmap attraverso il


comando InsertBitmap o usando direttamente il relativo tasto presente nella barra applicazioni dellEditor grafico. Per configurare questo tipo di elemento sar`a necessario digitare la
path del file bitmap che si vuole inserire nel campo di testo Bitmap presente nella finestra di
43

Figure 38: Finestra di configurazione di immagine Bitmap


configurazione. Possono essere selezionati inoltre altri parametri utili per per la definizione delle
dimensioni e dellaspetto dellimmagine in modalit`a on line.

4.5

Visualization

E possibile inserire allinterno della visualizzazione corrente anche un elemento-visualizzazione,


creando una istanza (un riferimento) della visualizzazione che si vuole aprire sopra quella corrente.
La configurazione di questa istanza viene definita nella categoria Visualization presente allinterno
della finestra di configurazione di questo particolare tipo di elemento. Si pu`o utilizzare il tasto ...
per aprire una finestra contenente la lista delle visualizzazioni disponbili allinterno del progetto.
Per spiegare a cosa serva il tasto Placeholder presente allinterno di questa finestra di configurazione `e necessario descrivere il funzionamento dei placeholders.
4.5.1

La funzione dei Placeholders

Nel momento in cui lutente va a configurare qualsiasi tipo di elemento ha la possibilit`a di inserire
nei vari campi di testo, un determinato placeholder (letteralmente tieni posto) che rimpiazzi
il rispettivo testo o variabile.
Ora, utilizzare questi particolari puntatori ha senso solo se la visualizzazione che si sta configurando non sar`a usata direttamente nel programma, bens` se `e stata creata per essere inserita
come istanza allinterno di un altra visualizzazione. Ogni stringa inclusa in due successivi segni
a forma di dollaro ($) `e un placeholder valido (es: $variable1$).
44

Figure 39: Finestra di configurazione di un elemento-visualizzazione

45

Ogni placeholder che viene usato deve essere inserito in un apposita lista nella finestra ExtrasList of Placeholders..(figura 40) in cui `e necessario specificare anche il gruppo di variabili che pu`o essere rimpiazzato da ogni placeholder.

Figure 40: Finestra ExtrasList of Placeholders... Per ogni placeholder deve esser specificato il numero dellelemento in cui viene usato e il gruppo di variabili che pu`o rimpiazzare
allinterno della definizione una eventuale istanza
Quando poi si sta definendo nella visualizzazione corrente una istanza di questa visualizzazione,
proprio attraverso il pulsante Placeholder della finestra di configurazione si acceder`a alla
colonna dei placeholder disponibili e si andr`a a definire per listanza corrente il valore di ognuno di essi tra quelli che erano stati definiti nella visualizzazione-madre (figura 41).

Figure 41: In questa finestra `e possibile definire il valore da attribuire ai placeholder per listanza
che si sta creando

4.6

Gruppi di Elementi

Si possono definire gruppi di elementi selezionado i vari componenti tutti in una volta attraverso
il mouse. Il gruppo cosi formato potr`a essere configurato attraverso il comando ExtrasGroup,
46

Figure 42: Finestra di configurazione di un gruppo di elementi


ogni gruppo si comporter`a come un singolo elemento.

47

Esempio

In questa sezione viene proposto un esempio di controllo logico, si vedr`a come risolverlo partendo
da zero.
Limpianto da controllare, come si pu`o vedere in figura 43, consiste in una cisterna principale

Figure 43: Impianto di imbottigliamento


in cui devono essere inseriti due liquidi differenti. Il primo liquido viene immesso nella cisterna
tramite lelettrovalvola EV1 mentre il secondo liquido viene immesso tramite lelettrovalvola
EV2.
Il rapporto in volume tra liquido 1 e liquido 2 deve essere di 4:1. Il livello del liquido allinterno
della cisterna `e acquisito tramite un sensore analogico. Una volta raggiunto il livello di 200
allinterno del serbatoio si deve permettere ai due liquidi di miscelarsi e di realizzare le opportune reazioni chimiche lasciandoli dentro la cisterna per 10 secondi. A questo punto, terminata
la formazione del composto liquido finale, si procede alla sua immissione nelle bottiglie. Quando
il liquido `e imbottigliato deve essere mantenuto ad una certa temperatura (60 ), mediante una
opportuna resistenza () che scalda il liquido; le bottiglie sono presenti su un nastro trasportatore attivato dal segnale Motor. Quando il sensore (Pres Bottle) che segnala che la bottiglia si
trova sotto lelettrovalvola di espulsione del composto `e attivo, si pu`o procedere al riempimento
della bottiglia (con lattivazione dellelettrovalvola EV3). Il riempimento della bottiglia termina
quando il suo livello raggiunge il valore di 100. A questo punto il nastro trasportatore pu`o essere riattivato per il riempimento di una nuova bottiglia. Il processo viene avviato dal segnale
Start Proc attivo e pu`o essere interrotto solo quando il serbatoio `e completamente vuoto. Nelle
48

seguenti tabelle sono raccolti tutti i sensori e gli attuatori dellimpianto1 .


Attuatori
Motor
HotOn

Tipo
Digitale
Digitale

EV1
EV2
EV3

Digitale
Digitale
Digitale

Descrizione
Segnale di pilotaggio per il motore che aziona il nastro trasportatore
Rappresenta il segnale di accensione e spegnimento per scaldare il
liquido
Segnale che se vero fa aprire lelettrovalvola uno
Segnale che se vero fa aprire lelettrovalvola due
Segnale che se vero fa aprire lelettrovalvola tre

Table 2: Sono mostrati gli attuatori presenti nellimpianto imbottigliatore.

Sensori
Start Proc
Pres bottle

Tipo
Digitale
Digitale

TemperatureValue
Liv serb

Analogico
Analogico

Liv bot

Analogico

Descrizione
Sensore che rileva linizio del processo
Sensore che rileva la presenza della bottiglia nella zona
di riempimento
Sensore che indica il valore della temperatura in C
Sensore che indica il livello del liquido contenuto nel
serbatoio
Sensore che indica il livello del liquido contenuto nella
bottiglia di volta in volta riempita

Table 3: Sono mostrati i sensori presenti nellimpianto imbottigliatore.


Una volta definite le nostre variabili, andiamo ad implementare su Codesys il nostro sistema
di controllo logico, ed il programma per la simulazione del Plant, consideriamo inizialmente il
controllo logico senza il controllo della temperatura. Si crea un nuovo progetto in Codesys, cliccando su new, appare una finestra con il nome Target Settings, selezionare none nellopzione
Configuration (di solito `e gi`a di default cos`) e cliccare su ok. A questo punto appare una
finestra come quella di figura figura 44, lasciamo il nome e selezioniamo come tipo di linguaggio
SFC, questa POU sar`a il programma dove `e presente il controllo logico dellimpianto. A questo
punto appare la finestra come in figura 45, ci troviamo nelleditor per scrivere un programma in
SFC, `e possibile vedere come lambiente Codesys sia diviso in due parti, sulla sinistra c`e la parte
di gestione delle POU, e delle possibili configurazioni del progetto (Risorce, interfaccia grafica
per la visualizzaizone, ecc...) mentre nella parte destra `e aperto leditor corrispondente alla parte
sinistra selezionata. In questo caso essendo selezionato il programma PLC PRG `e aperto leditor
per scrivere programmi in SFC. A questo punto al fase preliminare di creazione di un nuovo
progetto `e conclusa. Andando nel browser di progetto nella parte Resources, dovrebbero essere
visualizzate le librerie inserite di default; Standard e IECSFC come in figura 46 Se il progetto
non presenta queste librerie, si deve accedere al men`
u Library Manager, con un doppio click del
1

I nomi dei sensori e attuatori sono quelli utilizzati nel codice di controllo in CoDeSys.

49

Figure 44: Definizione nuova POU

Figure 45: Editor SFC per PLC PRG

50

Figure 46: Librerie standard in Codesys


mouse, che far`a comparire la schermata come in figura 47. A questo punto cliccando con il pulsante destro nella finestra in mezzo allo schermo con il nome di Library Manager e cliccando sul
comando Additional Library `e possibile inserire le librerie standard e IECSFC, questultima
serve per la gestione degli step IEC. Per inserire le librerie bisogna selezionare i file con estensione

Figure 47: Inserimento di librerie standard in Codesys


.LIB, una volta selezionate il browser di libreria presenta lelenco delle POU preprogrammate
che si possono inserire nel programma in corso di progetto (es. Timer, contatori, ecc.) con sulla
destra la loro dichiarazione di variabili e laspetto grafico (visibile durante la programmazione
nei linguaggi LD e FBD).
51

Tornando alleditor SFC `e possibile ora scrivere il codice relativo al nostro sistema di controllo,
come si pu`o notare la barra degli strumenti con leditor SFC aperto visualizza le possibili modifiche al diagramma che si possono fare:
Step transistion before: inserisce una sequenza passo transizione prima del punto selezionato.
Step transition after: inserisce una sequenza passo-transizione dopo il punto selezionato.
Alternative Branch (right) : inserisce una diramazione alternativa (due transizioni in disgiunzione tra loro), aggiungendo una transizione alla destra di quella selezionata.
Alternative Branch (left): inserisce una diramazione alternativa (due transizioni in disgiunzione tra loro), aggiungendo una transizione alla sinistra di quella selezionata.
Parallel Branch (right): inserisce una diramazione parallela (due sequenze di passi eseguite
contemporaneamente), aggiungendo un passo alla destra di quello selezionato.
Parallel Branch (left): inserisce una diramazione parallela (due sequenze di passi eseguite
contemporaneamente), aggiungendo un passo alla sinistra di quello selezionato.
Jump: inserisce un salto verso uno stato.
Transition Jump: inserisce un salto e una transizione.
E possibile ora scrivere il codice relativo al controllo, per inserire le variabili ci sono due possibilit`a, la prima `e quella di scrivere tutte le variabili prima di iniziare il codice, la seconda `e
quella di inserire la variabili di volta in volta. Infatti mentre si scrive del codice in Codesys se
non si scrive una parola chiave (comandi predefiniti) appare una finestra come quella riportata
in figura 48, in cui `e possibile definire le variabili. Allinterno della finestra `e possibile definire la
classe, (globale, ingresso, uscita, locale ecc...) il nome, il tipo (intera, reale, ecc...) valore iniziale
e un commento per descrivere la variabile; per definire una variabile globale, bisogna definirla
di classe VAR GLOBAL. E comunque possibile definire tutte le variabili allinizio, se una variabile
deve avere visibilit`a solo allinterno di quella POU, la variabile va definita allinterno della POU
stessa nella parte superiore delleditor, se invece la variabile deve essere visibile a pi`
u POU allora
questa va definita nelleditor delle variabili globali, che si trova nel men`
u Resources alla voce
Global Variables.
Quando prima abbiamo definito le variabili di ingresso ed uscita per il programma di controllo,
le abbiamo definite rispetto allimplementazione su un PLC. In modalit`a di simulazione per`o
le variabili di ingresso ed uscita, devono poter essere manipolate anche dal programma per la
simulazione del sistema, quindi queste variabili devono avere una visibilit`a non locale ma globale.
Tutte le variabili che abbiamo definito precedentemente come di ingresso ed uscita, andranno
dichiarate globali perch`e vengono utilizzate anche dal programma per la simulazione del plant.
Una volta ultimato il programma in SFC `e possibile scrivere il programma per la simulazione del
plant, per definire una nuova POU basta cliccare con il tasto destro sullicona POUs e selezionare
il comando Add object, a questo punto compare una finestra come quella iniziale (figura 44) da
qui `e possibile definire una nuova POU scegliendo il linguaggio desiderato. Ad esempio per la
scrittura del programma per la simulazione del plant `e possibile usare il linguaggio ST perch`e
rende pi`
u semplice limplementazione del programma. Terminata la scrittura del programma
52

Figure 48: Inserimento delle variabili.

per la simulazione del plant, `e possibile definire una interfaccia grafica tramite la quale `e possibile interagire con i programmi. Selezionando nel browser di progetto di Codesys nella parte
Visualization `e possibile inserire degli oggetti, cliccando con il tasto destro su Visualization
ed usando il comando Add object, nel quale `e possibile inserire degli elementi grafici come forme
geometriche, immagini ed oggetti predefiniti per la visualizzazione di valori (istogrammi, display
virtuali, ecc...) e pulsanti da collegare alle variabili. Ciascuno di questi oggetti pu`o essere inserito
selezionando il pulsante relativo nella barra degli strumenti in lato nella schermata, puntando il
mouse in un punto del foglio e trascinando il puntatore tenendo premuto il tasto sinistro per impostare la grandezza delloggetto. Per una descrizione approfondita degli oggetti grafici guardare
la sezione 4.
A questo punto una volta completata la scrittura di tutte le componenti del progetto, bisogna
inserire le POU desiderate nel ciclo di esecuzione (come spiegato nella sezione 3.6 ), nel nostro caso andando nel men`
u Resources e scegliendo Task Configuration dobbiamo andare ad
inserire uno o pi`
u task, a seconda di come vogliamo implementare le nostre POU. Una volta
completato un progetto nel suo insieme (programmi, definizioni delle variabili) `e possibile verificarne la correttezza selezionando il comando Build dal men`
u Project. Se il comando non `e
corretto, verr`a visualizzato lerrore tra i messaggi tra i messaggi nella parte in basso a destra
della finestra Codesys; cliccando due volte sullerrore selezionato, Codesys apre automaticamente
il programma nel punto dellerrore.
Se il progetto `e corretto `e possibile eseguirlo in modalit`a simulazione, attraverso il men`
u online
ed il comando login, ed una volta effettuato il login `e necessario lanciare lesecuzione del programma mediante il comando Run. A questo punto il programma `e in esecuzione sul PC, il
quale simula il funzionamento del PLC in modo virtuale. nel men`
u online deve essere impostata
lopzione simulation mode, se allinizio del progetto si `e impostato il target su None questa
53

Init

Start_Proc

Step2

EV1

EV2

Motor

Liv_serb>=160

Step3

Liv_serb>=200

Step8

Step8.t>t#10s

Step10

Liv_Serb<=0

Pres_Bottle AND Liv_serb >0 AND Liv_bot<=50

Init

Step4

EV3

Liv_bot>=50

Liv_serb<=0

Init

Step10

Figure 49: SFC del programma di controllo logico.

54

0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029

(*Riempimento del serbatoio*)


IF (EV1 OR EV2) THEN
Liv_serb:=Liv_serb+1;
END_IF;
(*Svuotamento serbatoio riempimento bottiglia*)
IF (EV3 AND Liv_Serb>0 )THEN
Liv_bot:=Liv_bot+1;
Liv_serb:=Liv_serb-1;
IF Liv_serb<=0 THEN
Liv_serb:=0;
END_IF
END_IF;
IF Motor THEN
Pos_bottle:=Pos_bottle+5;
END_IF;
IF (Pos_bottle>=195 AND Pos_bottle<=205) THEN
Pres_bottle:=TRUE;
ELSE
Pres_bottle:=FALSE;
END_IF;
IF Pos_bottle>=300 THEN
Pos_bottle:=0;
Liv_bot:=0;
END_IF;

Figure 50: ST del programma di simulazione plant.

55

opzione dovrebbe essere gi`a impostata e non modificabile.


Viene riportato in seguito il codice SFC della logica di controllo, ed il codice ST per il programma
per la simulazione dellimpianto.

6
6.1

Esempio con attuatore generalizzato


Il concetto dellattuatore generalizzato

Nella scrittura dei software c`e stata una evoluzione, con laumentare della complessit`a si sono
dovute trovare tecniche che andavano oltre al concetto classico di funzione, e cos` `e nata lidea di
incapsulamento cio`e del creare degli oggetti base che potevano essere riutilizzati in pi`
u software.
Questa teoria della programmazione prende il nome di programmazione ad oggetti.
Per spiegare meglio come tutto questo discorso si possa abbinare anche al controllo di sequenze
si pu`o pensare al semplice esempio di un impianto che, in un particolare momento, deve aprire
una porta. Si possono avere tre tipi di sensore che mi dicono in che stato `e la porta:
A Singola Retroazione Un sensore di questo tipo mi dice quando lazione `e finita, nel nostro
caso avr`a un valore TRUE quando la porta `e completamente aperta o FALSE quando `e chiusa
o `e in fase di movimento.
A Doppia Retroazione Questo tipo mi dar`a informazione sia sulla partenza che sulla conclusione delloperazione. Con una prima variabile mi dir`a se la porta `e completamente chiusa
o no, mentre con una seconda variabile se `e completamente aperta o no. Combinando le
due informazioni posso sempre sapere in che condizione si trova il mio sistema.
A Time-Out Questo non `e un sensore vero e proprio. Io so quanto tempo ci vuole per fare
una operazione quindi immagino che, passata quella quantit`a di tempo dopo lemissione
del comando, quella certa operazione sia effetivamente conclusa, tenendo conto magari di
un certo margine di errore.
In ambito controllistico lastrazione si ottiene dividendo la politica di gestione dal meccanismo
di funzionamento. Avr`o cio`e un gestore che mi da il comando di aprire la porta e un oggetto,
che `e linsieme di uno o pi`
u attuatori e uno o pi`
u sensori, che mi esegue loperazione voluta
azionando un certo meccanismo. Questo oggetto di controllo `e lAttuatore Generalizzato.
Lastrazione si vede se si pensa al fatto che al gestore non interessa che tipo di sensore usa
lattuatore generalizzato per aprire la porta. Limportante `e che quando arriva il comando di
apertura la porta si apra. Oltre allastrazione si possono ritrovare le propriet`a di incapsulamento
e riutilizzabilit`a, infatti il meccanismo di funzionamento `e incapsulato allinterno delloggetto
attuatore generalizzato che pu`o essere riutilizzato tranquillamente in un impianto completamente
diverso ma che ha una operazione simile allapertura della porta.
Possiamo classificare questi oggetti in due famiglie di attuatori generalizzati:
Do/Done Questo tipo di attuatore viene fatto partire dal controllo principale con un comando
Do. Lapertura della porta `e proprio un esempio di questo tipo di attuatore generalizzato.
Start/Stop In questo caso `e il controllo principale che fa partire e ferma loggetto, usando due
comandi (tipicamente Sart e Stop). Per esempio il controllo di temperatura di un
56

liquido viene fatto partire e continua fintanto che il controllo principale dice che non `e pi`
u
necessario.

6.2

Imbottigliatore con attuatore generalizzato

Supponiamo ora di voler aggiungere al nostro impianto la funzione per il mantenimento ad una
certa temperatura del liquido miscelato durante il processo di imbottigliamento. Si avr`a un
sensore TemperatureValue che indicher`a il valore della temperatura del liquido ed una resistenza
comandata attraverso il comando HotOn.
Aggiungere questa funzione al nostro impianto dato il modo in cui `e stato scritto il codice
precedentemente non `e cos` agevole vista la sua scarsa modularit`a, lo stesso vale ad esempio se
cambiassimo dei sensori. Ad esempio invece di avere un sensore di livello della bottiglia, vogliamo
mettere un sensore di peso per sapere quando la bottiglia `e piena, la logica dellimpianto non
cambia, cambia solo limplementazione. Anche questa variazione nel codice non sarebbe agevole,
visto che sono state completamente mischiate le funzioni da implementare con i meccanismi con
cui si vogliono impelmentare. Analizziamo ora il nostro processo e scomponiamolo nelle funzioni
base che il nostro processo esegue per ottenere la funzione complessiva.
Il primo passo da fare per la definizione degli attuatori generalizzati `e quello di indetificare le
funzionalit`a del sistema, cio`e delle funzioni/operazioni di base che devono essere eseguite dal
sistema.
Nel sistema di esempio se ne possono individuare quattro:
1. Riempimento del serbatoio.
2. Posizionamento delle bottiglie.
3. Svuotamento del serbatoio.
4. Controllo della temperatura.
La prima ha solo il compito di immettere i due liquidi nella cisterna nel rapporto indicato (per
generalizzare il tutto si pu`o anche permettere un rapporto variabile) e contare i 10 secondi necessari per il miscelamento.
La seconda gestir`a il nastro trasportatore per mettere in posizione corretta le bottiglie. Qui si
inizia gi`a a notare la riutilizzabilit`a: se abbiamo una altro sistema che ha una funzionalit`a che
prevede il posizionamento, possiamo benissimo utilizzare lattuatore generalizzato che creremo
per limbottigliatore, basta solo cambiare i parametri che dicono al nostro oggetto quale motore
e quale sensore usare per la sua funzionalit`a, senza dover riprogettare tutto dallinizio.
La terza funzionalit`a si occuper`a di svuotare lentamente il serbatoio fino al riempimento di una
bottiglia.
Infine la quarta user`a la resistenza per scaldare la miscela ed effettuare una isteresi della temperatura.

6.3

Descrizione della sequenza

Una volta che sono state trovate le funzionalit`a di base bisogna indicare la sequenza con la quale
vengono usate. Questa descrizione serve per capire come e quando vanno usati i vari attuatori generalizzati creati quando si andr`a a implementare il controllo principale. Nellesempio
57

dellimpianto di imbottigliamento la sequenza `e la seguente:


Riempimento Serbatoio- Posizionamento - Riempimento Bottiglia - Posizionamento
- Riempimento Bottiglia - Posizionamento - Riempimento Bottiglia - ....
fino a quando il serbatoio `e completamente vuoto, nel qual caso si riparte con un altro Riempimento
Serbatoio. In parallelo a tutto questo c`e il Controllo Temperatura solo quando c`e del liquido
allinterno della cisterna.
Dopo che sono state definite le funzionalit`a e la sequenza con la quale sono usate bisogna andare
ad un livello pi`
u basso ed iniziare a pensare a quali sensori e attuatori servono per per permettere
allattuatore generalizzato di eseguire la sua funzionalit`a. E anche possibile che siano gi`a stati
definiti prima i sensori e gli attuatori da utilizzare, in questo caso basta semplicemente associarli
allattuatore generalizzato. Nellimpianto di imbottigliamento delll esempio i sensori ed attuatori erano gi`a assegnati:
Sensori:
2 sensori analogici di livello, uno per la cisterna e uno per la bottiglia;
1 sensore digitale di presenza per le bottiglia;
1 sensore analogico di temperatura per la cisterna.
Attuatori:
3 elettrovalvole di tipo on/off per limmissione dei liquidi e lespulsione della miscela;
1 motore per la movimentazione del nastro trasportatore;
1 resistenza per il controllo della temperatura del liquido allinterno della cisterna.

6.4

Accoppiamento sensore/attuatore

Nella sezione precedente `e stata riportata la lista dei sensori e degli attuatori, ora dobbiamo
legare questi sensori ed attuatori alle funzionalit`a per definire gli attuatori generalizzati che
useremo. Infatti lAttuatore Generalizzato realizza la sua funzione usando un certo numero di
sensori e attuatori reali, che vengono nascosti dentro la funzione stessa. Tutto questo serve
per separare la politica di gestione dal meccanismo di funzionamento. Infatti il meccanismo `e
implementato allinterno degli attuatori generalizzati, mentre la politica di gestione dellimpianto
`e nel programma principale, il quale non vede i singoli sensori o i singoli attuatori ma dialoga
solamente con gli Attuatori Generalizzati. Questa separazione politca/meccanismo `e la base
della riutilizzabilit`a. Per migliorare la leggibilit`a e la funzionalit`a del sistema bisogna cercare di
creare degli oggetti disgiunti, cio`e ogni sensore e ogni attuatore devono essere associati ad un
solo attuatore generalizzato.
Ritornando al nostro esempio, questo accoppiamento risulta essere molto semplice, grazie alla
semplicit`a del sistema stesso.
1. Riempimento serbatoio:
58

sensore analogico per il livello della cisterna


2 elettrovalvole di tipo on/off per limmissione dei due liquidi
2. Posizionamento bottiglia:
sensore digitale di presenza bottiglia
motore per la movimentazione del nastro trasportatore
3. Riempimento Bottiglia:
sensore analogico per il livello della bottiglia
elettrovalvola di tipo on/off per lespulsione della miscela
4. Controllo temperatura:
sensore di temperatura
resistenza.
Con questo punto `e terminata la parte di progettazione del controllo del sistema, ora rimane
limplementazione pratica.

6.5

Implementazione in Codesys

Per implementare lattuatore generalizzato useremo i function block. Andiamo a definire il function block per il riempimento del serbatoio, come mostrato in figura 51. Nella parte sinistra della
finestra si definisce il tipo POU, nel nostro caso Function Block, mentre nella parte destra si
definisce il linguaggio con il quale si vuole definire la POU; un Function Block pu`o essere definito
con qualsiasi tipo di linguaggio. nella finestra dove sono lelenco delle POU `e possibile vedere
che le POU che sono function block hanno tra parentesi al sigla (FB). Una volta che abbiamo
definito Il FB, `e come se avessimo definito un tipo di dato, definendo il FB per il serbatoio non
abbiamo definito il programma per implementare lattuatore generalizzato per il controllo del
livello del serbatoio, ma abbiamo definito il tipo di dato con il quale potremo definire listanza
per lattuatore generalizzato.
Per definire lattuatore generalizzato, possiamo definire una POU di tipo Program, e come linguaggio della POU il linguaggio FBD (Function Block Diagram), questo ci permette di creare
un attuatore generalizzato del tipo di function block che abbiamo definito precdentemente.
Il FBD `e definito per righe, su ogni riga `e possibile mettere un elemento, oppure una serie di
elementi. Quando si definisce il programma `e presente una sola riga e su questa ci sono 3 punti
interrogativi ed un piccolo box tratteggiato, cliccando su questo con il tasto destro del mouse
e cliccando su box `e possibile inserire il blocco desiderato. Apparir`a di default il block AND,
cliccando sulla scritta AND e premendo il tasto F2 (Input Assistant) `e possibile richiamare il
function block creato in precedenze. Premendo F2 appare una finestra (come quella di figura
16) con tutti i tipi di function block, cliccando su User defined Function Block `e possibile
richiamare i FB definiti dallutente. Se ad esempio avevamo chiamato il nostro FB come LevelFB, apparir`a un blocco chiamato LevelFB che avr`a gli ingressi e le uscite definite nel FB. Ora `e
possibile assegnare una istanza a quel FB, infatti sopra blocco bisogna mettere il nome di quella
59

Figure 51: Definizione del function block.

Figure 52: Definizione di un attuatore generalizzato

60

Figure 53: Finestra del function block digram.

61

istanza, chiamiamola ad esempio TankLevel, una volta finita di scrivere apparir`a la finestra per
lassegnamento delle variabili come in figura 52, si vede che LevelFB `e un tipo di variabile, mentre
TankLevel `e un dato di quel tipo di variabile. Per definire un altro GA, bisogna inserire una riga
nella finestra, per fare questo bisogna cliccare con il tasto destro e cliccare su network(before)
oppure network(after), in questo modo si inserisce una riga prima o dopo della riga selezionata.
Inserendo pi`
u righe `e possibile inserire tutti i GA che servono per il nostro controllo logico, come
in figura 53.
Una volta definiti tutti i GA bisogna inserire nel task configuration il programma FBD dove sono
presenti le definizioni dei vari GA. I GA definiti in questo modo diventano delle entit`a sempre
vive, in questo modo ogni singolo GA pu`o incapsulare la diagnostica locale e lasciare alla politica
solo la diagnostica riguardante guasti ad alto livello (come possono essere una errata sequenza di
operazioni). La politica dovr`a soltanto azionare il GA ed aspettare che il GA finisca la proprio
operazione, in questo modo c`e una completa divisione tra politica ed implementazione del meccanismo. Naturalmente ci dovr`a essere una gestione di sincronizzazione, per i GA, ad esempio
per un GA di tipo Do-Done la politica dovr`a dare il segnale Do controllando che il GA sia libero
(in stato di Ready) e una volta che ha ricevuto il segnale di Done, dovr`a resettare il segnale di
Do (in maniera analoga il GA dovr`a agire sul segnale di Done). Per la definizione dei singoli GA
per lesempio dellimbottigliatore si veda lesempio ImbottigliatoreGA.pro

62