28.03.2015 Views

Da una descrizione UML ad un Modello di Simulazione completo ...

Da una descrizione UML ad un Modello di Simulazione completo ...

Da una descrizione UML ad un Modello di Simulazione completo ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Università <strong>di</strong> Pisa<br />

Laurea Specialistica in<br />

Ingegneria<br />

dell’Automazione<br />

Progetto <strong>di</strong> Controllo dei Processi<br />

<strong>Da</strong> <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> <strong>ad</strong> <strong>un</strong> <strong>Modello</strong> <strong>di</strong> <strong>Simulazione</strong><br />

<strong>completo</strong>, realizzato in ambiente Matlab-Simulink<br />

Studenti: Roberto Nicolino, Nicola Di Lecce


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

ABSTRACT<br />

Partendo da <strong><strong>un</strong>a</strong> analisi approfon<strong>di</strong>ta sulle potenzialità che oggi offre Unified Modeling<br />

Language si mostra come questo linguaggio si ponga da tramite tra cliente e committente, per<br />

evitare inutili incomprensioni e per permettere la realizzazione <strong>di</strong> <strong>un</strong> modello <strong>completo</strong> e<br />

dettagliato <strong>di</strong> <strong>un</strong> sistema. Grazie <strong>ad</strong> <strong>UML</strong> è possibile realizzare simulazioni in ambiente Matlab<br />

percorrendo <strong>un</strong> processo <strong>di</strong> integrazione <strong>completo</strong> tra le due piattaforme <strong>di</strong> sviluppo<br />

2


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

In<strong>di</strong>ce<br />

1. L’UNIFIED MODELING LANGUAGE<br />

1.1 <strong>UML</strong>: che cosa è p. 4<br />

1.2 Perché utilizzare <strong>UML</strong> p. 6<br />

1.3 La genesi p. 9<br />

1.4 <strong>UML</strong>: come metamodello p. 11<br />

1.5 Sintassi astratta p. 14<br />

1.6 Gli strumenti <strong>di</strong> lavoro <strong>UML</strong> p. 17<br />

1.7 Componenti <strong>UML</strong> p. 18<br />

1.8 Il Class Diagram: approfon<strong>di</strong>menti p. 21<br />

1.9 Use Case Diagrams: specifiche p. 34<br />

1.10 State Diagrams p. 42<br />

1.11 Sequence Diagrams p. 46<br />

1.12 Deployment Diagrams p. 63<br />

2 LE S-FUNTIONS<br />

2.1 Introduzione alle S-F<strong>un</strong>ctions p. 69<br />

2.2 Guida alla scrittura delle S-F<strong>un</strong>ctions p. 74<br />

2.3 Panoramica sulle Routines p. 82<br />

3 LO STATEFLOW MATLAB<br />

3.1 Introduzione p. 94<br />

3.1 Stato p. 96<br />

3.2 Transizione p. 97<br />

3.3 Gi<strong>un</strong>zione p. 99<br />

3.4 Eventi p. 101<br />

3.5 <strong>Da</strong>ti p. 101<br />

4. DA <strong>UML</strong> A MATLAB: UN ESEMPIO<br />

4.1 Introduzione p. 102<br />

4.2 Scelta <strong>di</strong> componenti e attrezzature per l’impianto p. 103<br />

4.3 Il Class Diagram p. 118<br />

3


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

4.4 State Diagram p. 120<br />

4.5 Collaboration Diagram p. 123<br />

4.6 Sequence Diagram p. 123<br />

4.7 Stateflow: Statechart p. 124<br />

4.8 Riepilogo delle Regole <strong>di</strong> tr<strong>ad</strong>uzione p. 125<br />

4.9 Sviluppi Futuri p. 127<br />

4


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

1. L’UNIFIED MODELING LANGUAGE<br />

1.1 <strong>UML</strong>: che cosa è<br />

Lo Unified Modeling Language è <strong>un</strong> linguaggio per specificare, costruire, visualizzare e<br />

documentare manufatti sia <strong>di</strong> sistemi software, che <strong>di</strong> altri sistemi non strettamente software.<br />

<strong>UML</strong> rappresenta <strong><strong>un</strong>a</strong> collezione <strong>di</strong> best practices <strong>di</strong> ingegneria, <strong>di</strong>mostratesi vincenti nella<br />

modellazione <strong>di</strong> vasti e complessi sistemi. Lo <strong>UML</strong> permette <strong>di</strong> visualizzare, per mezzo <strong>di</strong> <strong>un</strong><br />

formalismo rigoroso, “manufatti” dell’ingegneria, consentendo <strong>di</strong> illustrare idee, decisioni<br />

prese, e soluzioni <strong>ad</strong>ottate.<br />

Tale linguaggio favorisce, inoltre, la <strong>di</strong>vulgazione delle informazioni, in quanto standard<br />

internazionale non legato alle singole imprese. In teoria, <strong>un</strong> qual<strong>un</strong>que tecnico, <strong>di</strong> qualsivoglia<br />

nazionalità, <strong>di</strong>pendente della più ignota delle software house, con <strong>un</strong> minimo <strong>di</strong> conoscenza<br />

dell’<strong>UML</strong> dovrebbe essere in gr<strong>ad</strong>o <strong>di</strong> leggere il modello del progetto e <strong>di</strong> comprenderne ogni<br />

particolare senza troppa fatica e, soprattutto, senza le ambiguità tipiche del linguaggio naturale.<br />

Come al solito qualche problema può sempre emergere, ma si tratterebbe com<strong>un</strong>que <strong>di</strong><br />

problemi <strong>di</strong> poca entità. Un conto è non comprendere qualche particolare, <strong>un</strong> altro è non<br />

comprendere assolutamente cosa voleva realizzare l’autore.<br />

I vantaggi che derivano dal poter <strong>di</strong>sporre <strong>di</strong> <strong>un</strong> modello del sistema sono notevoli e fin<br />

troppo evidenti. Basti pensare alla non in<strong>di</strong>fferente semplificazione del processo <strong>di</strong><br />

manutenzione che, da solo, tipicamente incide più del 50% nel ciclo <strong>di</strong> vita dei sistemi ben<br />

progettati; alla possibilità <strong>di</strong> allocare risorse aggi<strong>un</strong>tive in corso d’opera, riducendo il rischio<br />

che ciò <strong>di</strong>venti controproducente.<br />

Disporre <strong>di</strong> <strong>un</strong> linguaggio per descrivere <strong>un</strong> sistema costringe il progettista stesso <strong>ad</strong><br />

analizzare, con maggior minuzia, aspetti del sistema anche <strong>di</strong> <strong>un</strong> certo rilievo, i quali,<br />

viceversa, potrebbero incautamente venir trascurati da <strong>un</strong>’analisi non molto rigorosa.<br />

Per ciò che concerne l’utilizzo dello <strong>UML</strong> nello “specificare”, bisogna tener presente che in<br />

questo contesto l’espressione si riferisce alla possibilità <strong>di</strong> realizzare modelli completi, precisi e<br />

non ambigui. Lo <strong>UML</strong> <strong>di</strong>spone <strong>di</strong> tutti i meccanismi necessari per la specifica <strong>di</strong> qualsiasi<br />

particolare ritenuto rilevante in ogni fase del ciclo <strong>di</strong> vita del progetto e quin<strong>di</strong>, in ultima<br />

analisi, per produrre modelli accurati.<br />

Lo <strong>UML</strong>, permette <strong>di</strong> realizzare modelli che si prestano <strong>ad</strong> essere implementati con <strong>di</strong>versi<br />

linguaggi <strong>di</strong> programmazione, sebbene risulti particolarmente efficace per la progettazione <strong>di</strong><br />

5


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

sistemi Object Oriented. In effetti è possibile realizzare <strong>un</strong> mapping esplicito tra <strong>un</strong> modello<br />

<strong>UML</strong> e <strong>un</strong> linguaggio <strong>di</strong> programmazione. Chiaramente, tale legame risulta più imme<strong>di</strong>ato per i<br />

linguaggi fortemente basati sul par<strong>ad</strong>igma Object Oriented, quali C++, Java, Small-Talk, Ada,<br />

e così via.<br />

Gli st<strong>ad</strong>i evolutivi attraverso cui si sono sviluppate le metodologie per la realizzazione del<br />

software orientato agli oggetti si basano su:<br />

• Utilizzo dei primi linguaggi <strong>di</strong> programmazione orientati agli oggetti;<br />

• Sviluppo <strong>di</strong> tecniche <strong>di</strong> analisi e progettazione orientate agli oggetti per aiutare la<br />

modellazione dei sistemi commerciali, l’analisi dei requisiti e la progettazione <strong>di</strong><br />

sistemi software. Il numero <strong>di</strong> queste tecniche cresce rapidamente;<br />

• Nascita dell’<strong>UML</strong>, progettato per combinare tra loro i vantaggi delle numerose<br />

notazioni e tecniche <strong>di</strong> analisi e progettazione, così da ottenere <strong>un</strong>o standard a<br />

livello industriale.<br />

Sul mercato sono presenti <strong>di</strong>versistrumenti, in gr<strong>ad</strong>o <strong>di</strong> generare co<strong>di</strong>ce a partire dal relativo<br />

modello, sia interattivamente durante la fase <strong>di</strong> <strong>di</strong>segno, sia su richiesta. L’esistenza <strong>di</strong> queste<br />

f<strong>un</strong>zionalità, sebbene ancora non del tutto mature, dovrebbe far capire che l’implementazione è<br />

veramente <strong>un</strong> particolare del <strong>di</strong>segno, specie con linguaggi come Java.<br />

La generazione automatica <strong>di</strong> <strong><strong>un</strong>a</strong> prima implementazione del sistema risulta<br />

particolarmente utile quando il modello deve essere realizzato parallelamente (cioè sempre!),<br />

poiché fornisce, ai <strong>di</strong>versi sviluppatori, lo scheletro — eventualmente con qualche metodo<br />

implementato — delle classi fondamentali del sistema che dovrebbero presentare <strong>un</strong>’interfaccia<br />

stabile e ben definita.<br />

Sebbene alc<strong>un</strong>i strumenti tentino, in alc<strong>un</strong>i casi particolari, <strong>di</strong> realizzare determinati meto<strong>di</strong><br />

con il co<strong>di</strong>ce appropriato, è probabilmente ancora <strong>un</strong> po’ prematuro azzardarsi a utilizzare<br />

appieno tale f<strong>un</strong>zionalità, a meno che non si tratti <strong>di</strong> meri meto<strong>di</strong> get / set <strong>di</strong> proprietà.<br />

Il mapping tra modello e linguaggio <strong>di</strong> programmazione permette anche la realizzazione <strong>di</strong><br />

f<strong>un</strong>zioni <strong>di</strong> reverse engineering: fornendo a <strong>un</strong> opport<strong>un</strong>o tool i co<strong>di</strong>ci sorgenti o, tal<strong>un</strong>e volte<br />

anche quelli compilati, questo è in gr<strong>ad</strong>o <strong>di</strong> ricostruire a ritroso il modello fino, ovviamente,<br />

alla fase <strong>di</strong> <strong>di</strong>segno. Purtroppo non si è ancora riusciti a realizzare <strong>un</strong> tool in gr<strong>ad</strong>o <strong>di</strong> ricostruire<br />

i requisiti del cliente.<br />

Il processo <strong>di</strong>retto (engineering) e quello inverso (reverse engineering) determinano quello<br />

che in gergo viene definito ro<strong>un</strong>d-trip engineering. Nel mondo ideale, la f<strong>un</strong>zione <strong>di</strong> reverse<br />

6


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

non dovrebbe mai venir utilizzata, in quello reale è invece molto apprezzata, e tutto <strong>di</strong>pende<br />

dall’uso che se ne fa.<br />

In fase <strong>di</strong> <strong>di</strong>segno, probabilmente non è opport<strong>un</strong>o descrivere tutto dettagliatamente;<br />

verosimilmente è opport<strong>un</strong>o lasciare qualche margine ai programmatori (tutto in f<strong>un</strong>zione delle<br />

loro capacità). Sono ritenute assolutamente naturali e accettabili mo<strong>di</strong>fiche del modello in fase<br />

<strong>di</strong> co<strong>di</strong>fica, fintantoché queste non stravolgano il modello stesso. Durante la fase <strong>di</strong> co<strong>di</strong>fica<br />

può anche acc<strong>ad</strong>ere <strong>di</strong> accorgersi che <strong><strong>un</strong>a</strong> data libreria non f<strong>un</strong>ziona come dovrebbe, o che c’è<br />

qualche lac<strong><strong>un</strong>a</strong> nel modello, o che risulta opport<strong>un</strong>o cambiare qualche strategia al fine <strong>di</strong><br />

ottenere <strong>un</strong> co<strong>di</strong>ce più efficiente. Tutto ciò è normalissimo. Tuttavia, nell’eventualità che le<br />

mo<strong>di</strong>fiche generino <strong>un</strong>o stravolgimento del modello, piuttosto che procedere<br />

nell’implementazione sarebbe forse necessario introdurre <strong>un</strong>’opport<strong><strong>un</strong>a</strong> iterazione della fase <strong>di</strong><br />

<strong>di</strong>segno e successiva co<strong>di</strong>fica.<br />

Un progetto, per quanto ben congegnato, potrebbe perdere gran parte del suo fascino se<br />

poco documentato, o <strong>ad</strong><strong>di</strong>rittura potrebbe finire per non essere compreso e in futuro non venire<br />

correttamente aggiornato.<br />

Per terminare, lo <strong>UML</strong> fornisce sia dei meccanismi molto formali, sia del testo libero da<br />

aggi<strong>un</strong>gere, ogni qual volta lo si ritenga necessario, a parti ritenute poco chiare o<br />

particolarmente complesse, al fine <strong>di</strong> aumentarne il livello <strong>di</strong> particolare.<br />

1.2 Perché utilizzare <strong>UML</strong><br />

Ogni qualvolta, in <strong><strong>un</strong>a</strong> <strong>di</strong>sciplina dell’ingegneria, vi sia la necessità <strong>di</strong> realizzare <strong>un</strong><br />

“manufatto”, in<strong>di</strong>pendentemente dalla <strong>di</strong>mensione e dal settore <strong>di</strong> interesse (<strong><strong>un</strong>a</strong> casa, <strong>un</strong><br />

grattacielo, <strong>un</strong> particolare meccanismo, <strong>un</strong> ponte, <strong>un</strong> <strong>di</strong>partimento <strong>di</strong> <strong>un</strong>’azienda, e così via) si<br />

procede cercando <strong>di</strong> realizzarne <strong>un</strong> modello.<br />

L’obiettivo è produrre, in tempi relativamente brevi e soprattutto a costi contenuti, <strong><strong>un</strong>a</strong><br />

versione razionalizzata e semplificata del sistema reale che, tuttavia, consenta <strong>di</strong> evidenziarne<br />

l’aspetto finale e <strong>di</strong> stu<strong>di</strong>arne prestazioni, affidabilità e comportamento.<br />

I modelli, importantissimi in tutti i processi <strong>di</strong> sviluppo, trovano la loro più completa<br />

legittimazione nell’ambito <strong>di</strong> sistemi <strong>di</strong> <strong>di</strong>mensioni me<strong>di</strong>e e gran<strong>di</strong>. In tali circostanze la<br />

complessità <strong>di</strong> questi sistemi nella loro interezza ne rende molto <strong>di</strong>fficoltosa la comprensione. È<br />

quin<strong>di</strong> maggiormente avvertita la necessità <strong>di</strong> avvalersi <strong>di</strong> modelli in gr<strong>ad</strong>o <strong>di</strong> descrivere, in<br />

maniera semplificata, sistemi com<strong>un</strong>que complessi.<br />

7


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Si vedrà come lo <strong>UML</strong>, grazie alla sua organizzazione in “viste” (Views), risponda alla<br />

logica necessità della mente umana <strong>di</strong> concentrarsi, in ogni istante, su <strong>un</strong> numero limitato <strong>di</strong><br />

aspetti del sistema ritenuti importanti per la particolare fase del processo <strong>di</strong> sviluppo,<br />

rimandando a momenti successivi l’analisi degli aspetti rilevanti per le altre viste.<br />

Figura 1.1: La vignetta dell’altalena<br />

Oltre ai motivi già citati, i modelli sono basilari poiché, avvalendosi anche del feedback<br />

fornito dai committenti, permettono <strong>di</strong> definire i requisiti del sistema in maniera chiara e, con la<br />

cooperazione del proprio gruppo, <strong>di</strong> razionalizzarne il processo <strong>di</strong> sviluppo. I vantaggi che se<br />

ne ricavano sono <strong>di</strong>versi: <strong>ad</strong>eguate analisi dei tempi, migliori stime dei costi, piani più precisi<br />

<strong>di</strong> allocazione delle risorse, <strong>di</strong>stribuzioni più affidabili del carico <strong>di</strong> lavoro.<br />

Si riesce quin<strong>di</strong> a risparmiare tempo e denaro, a ridurre i fattori <strong>di</strong> rischio presenti in ogni<br />

progetto, a stu<strong>di</strong>are la risposta del sistema a particolari sollecitazioni, e via <strong>di</strong> seguito.<br />

Nonostante però il grande valore apportato all’ingegneria del software dall’utilizzo della<br />

modellazione, troppo spesso in molte organizzazioni questa meravigliosa tecnica rimane<br />

ancora <strong><strong>un</strong>a</strong> chimera.<br />

8


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

A ness<strong>un</strong>o appartenente al settore dell’ingegneria e<strong>di</strong>le verrebbe in mente <strong>di</strong> costruire<br />

interamente <strong>un</strong> grattacielo, per poi stu<strong>di</strong>arne la risposta a sollecitazioni <strong>di</strong> carattere sismico. Il<br />

buon senso, risorsa purtroppo sempre rara, suggerisce <strong>di</strong> procedere con la realizzazione <strong>di</strong> <strong><strong>un</strong>a</strong><br />

versione miniaturizzata sulla quale condurre tutti gli stu<strong>di</strong> del caso.<br />

Non necessariamente <strong>un</strong> processo <strong>di</strong> modellazione genera <strong>un</strong> oggetto tangibile: talvolta si<br />

tenta <strong>di</strong> rappresentare <strong>un</strong> complesso reale per mezzo <strong>di</strong> eleganti sistemi <strong>di</strong> <strong>di</strong>sequazioni e quin<strong>di</strong><br />

l’intero modello si risolve in <strong><strong>un</strong>a</strong> raffinata astrazione.<br />

Tutto ciò che è fin troppo scontato in molte <strong>di</strong>scipline dell’ingegneria non lo è nel settore<br />

dell’Informatica o dell’Automazione, <strong>ad</strong> essa strettamente connessa. In molte organizzazioni la<br />

produzione del software è ancora <strong>un</strong>’attività, per così <strong>di</strong>re, “artigianale” in cui il relativo<br />

processo <strong>di</strong> sviluppo prevede tre fasi: analisi dei requisiti, implementazione e test..<br />

Si provi a immaginare che cosa potrebbe acc<strong>ad</strong>ere se si avviasse la progettazione <strong>di</strong> <strong>un</strong><br />

ponte a partire da specifiche sommarie, magari com<strong>un</strong>icate verbalmente o, peggio ancora, se si<br />

partisse subito a costruirlo materialmente, magari affidandosi all’esperienza <strong>di</strong> qualche<br />

costruttore (ve<strong>di</strong> figura 1.1). Inconcepibile! Tutto ciò, benché possa sembrare “fuori dal<br />

mondo”, molto spesso è prassi com<strong>un</strong>e nel mondo dell’ingegneria informatica. Malgr<strong>ad</strong>o siano<br />

stati versati fiumi d’inchiostro sull’argomento, e svariati gruppi <strong>di</strong> ricerca lavorino a tempo<br />

pieno per la definizione <strong>di</strong> nuovi standard <strong>di</strong> analisi, in molte organizzazioni, soprattutto<br />

italiane, anche <strong>di</strong> “comprovato” prestigio, tale attività è ancora considerata prettamente<br />

acc<strong>ad</strong>emica, vezzo <strong>di</strong> giovani neolaureati perché, in ultima analisi, è <strong>di</strong> scarsa utilità nel<br />

mondo reale, dove l’obiettivo è produrre co<strong>di</strong>ce e l’esperienza è in gr<strong>ad</strong>o <strong>di</strong> sopperire a tutto.<br />

L’inevitabile risultato è che spesso si procede cominciando par<strong>ad</strong>ossalmente da <strong><strong>un</strong>a</strong> delle<br />

ultime fasi del processo <strong>di</strong> ingegnerizzazione, ossia dalla stesura del co<strong>di</strong>ce (paragonabile alla<br />

costruzione del ponte <strong>di</strong> cui si parlava nell’esempio).<br />

Si inizia concentrandosi prematuramente sul modo in cui re<strong>di</strong>gere il co<strong>di</strong>ce ed,<br />

eventualmente, alla fine si scrivono “due righe <strong>di</strong> analisi”, magari demandando il te<strong>di</strong>oso<br />

incarico all’ultimo arrivato nel team.<br />

In molte occasioni può acc<strong>ad</strong>ere che, a progetto “ultimato e pronto per la consegna”, ci si<br />

accorga dell’errata architettura. Non è da escludere, nel peggiore dei casi, che, per via <strong>di</strong> <strong>un</strong>o<br />

sviluppo interamente incentrato sulla fase <strong>di</strong> co<strong>di</strong>fica, e quin<strong>di</strong> privo della visione globale che<br />

solo <strong>un</strong> buon processo <strong>di</strong> modellazione può apportare, sia praticamente impossibile integrare i<br />

moduli prodotti in parallelo o che sia necessario costruire estemporanei moduli <strong>di</strong> interfaccia o,<br />

ancora, che il sistema preveda percorsi così tortuosi da renderlo praticamente inutilizzabile.<br />

9


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Per terminare, sintetizzando al massimo il concetto si può <strong>di</strong>re che si modella<br />

essenzialmente per due motivi:<br />

• aumentare la propria comprensione sia <strong>di</strong> <strong>un</strong> problema sia <strong>di</strong> eventuali soluzioni<br />

ipotizzate;<br />

• com<strong>un</strong>icare.<br />

1.3 La genesi<br />

Originariamente il lavoro fu iniziato da Gr<strong>ad</strong>y Booch e James Rumbaugh, con l’intento <strong>di</strong><br />

produrre <strong>un</strong> nuovo metodo, detto “metodo <strong>un</strong>ificato” che raccogliesse il meglio dei meto<strong>di</strong><br />

Booch e OMT-2, del quale Rumbaugh era stato <strong>un</strong>o dei principali promotori. Nel 1995 si <strong>un</strong>ì a<br />

loro Ivar Jacobson, fautore del metodo denominato OOSE (Object Oriented Software<br />

Engineering): il terzetto si era così costituito. L’azienda che promuove il progetto è la Rational<br />

Software Corporation che, dal canto suo, provvede anche <strong>ad</strong> assorbire la Objective Systems,<br />

azienda svedese che aveva sviluppato e <strong>di</strong>stribuito il software Objectory. A questo p<strong>un</strong>to il<br />

qu<strong>ad</strong>ro era <strong>completo</strong> e lo standard in lavorazione fu ribattezzato Unified Modeling Language.<br />

La prima versione, la celebre 1.0, fu <strong>di</strong>sponibile nel gennaio 1997.<br />

L’<strong>UML</strong> è <strong>un</strong>o strumento <strong>di</strong> analisi molto versatile, nato per risolvere le problematiche<br />

connesse con la progettazione Object Oriented del software, ma che ben si <strong>ad</strong>atta a essere<br />

utilizzato negli ambienti più <strong>di</strong>sparati. Esso è stato, per esempio, utilizzato alla C<strong>ad</strong>ence per la<br />

produzione <strong>di</strong> <strong>un</strong> <strong>di</strong>spositivo <strong>di</strong> compressione vocale operante a livello <strong>di</strong> porta fisica. Ancora,<br />

<strong><strong>un</strong>a</strong> delle aziende fornitrici della US Navy ha utilizzato lo <strong>UML</strong> come linguaggio <strong>di</strong><br />

progettazione <strong>di</strong> <strong>un</strong> sistema d’arma <strong>di</strong> nuova generazione. Un’azienda sanitaria si è avvalsa<br />

dello <strong>UML</strong> nella realizzazione <strong>di</strong> <strong>un</strong> modello per il trattamento dei pazienti, e così via.<br />

Visto l’enorme successo riscosso nell’applicazione industriale e nel mondo acc<strong>ad</strong>emico e<br />

considerato il relativo riconoscimento a livello <strong>di</strong> standard (<strong>UML</strong> 1.0 è stato proposto<br />

all’Object Managment Group nel gennaio 1997), gli stessi ideatori <strong>di</strong>chiararono ormai conclusa<br />

la loro esperienza in questo ambito tanto da de<strong>di</strong>carsi a nuove sfide. Allo stato attuale lo<br />

sviluppo dell’<strong>UML</strong> è affidato a <strong><strong>un</strong>a</strong> task force appartenente all’OMG, la famosa RTF (Revision<br />

Task Force), <strong>di</strong>retta da Chris Kobyrn. Obiettivo <strong>di</strong> tale gruppo è accogliere e analizzare<br />

suggerimenti provenienti dalle industrie, correggere inevitabili imperfezioni (bugs) e colmare<br />

eventuali lac<strong>un</strong>e.<br />

10


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Attualmente dovrebbe essere già <strong>di</strong>sponibile le versione 2.0. L’evoluzione dello <strong>UML</strong> è<br />

mostrata in fig. 1.2, attraverso il <strong>di</strong>agramma dei componenti, <strong>un</strong>o degli strumenti messi a<br />

<strong>di</strong>sposizione dal linguaggio.<br />

11


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

1.4 <strong>UML</strong>: come metamodello<br />

Lo <strong>UML</strong> è <strong>un</strong> linguaggio che permette <strong>di</strong> costruire <strong>un</strong> modello <strong>di</strong> <strong>un</strong> sistema da analizzare o<br />

da progettare, ovvero permette <strong>di</strong> realizzare <strong><strong>un</strong>a</strong> rappresentazione astratta <strong>di</strong> <strong>un</strong> sistema basata<br />

su alc<strong>un</strong>i concetti fondamentali, come classi e associazioni.<br />

I concetti base dello <strong>UML</strong> vengono usati anche per descrivere la semantica del linguaggio<br />

stesso. Si ha quin<strong>di</strong> <strong>un</strong> modello per <strong>un</strong> linguaggio <strong>di</strong> modellazione, cioè <strong>un</strong> metamodello. Ad<br />

esempio si possono consultare i <strong>di</strong>agrammi delle figure 1.3 – 1.4 che descrivono la struttura<br />

principale del linguaggio <strong>UML</strong>, cioè la parte principale del suo metamodello.<br />

Quin<strong>di</strong> nasce il problema <strong>di</strong> rendere standard la definizione <strong>di</strong> altri linguaggi <strong>di</strong><br />

modellazione, ogn<strong>un</strong>o dei quali avrà il suo metamodello. Tra i metodologi si è ritenuto<br />

opport<strong>un</strong>o definire <strong>un</strong> linguaggio com<strong>un</strong>e denominato MOF (Meta Object Facility) [MOFS]<br />

per descrivere <strong>di</strong>versi metamodelli attraverso dei meta-metamodelli (<strong>ad</strong> esempio XMI, che è il<br />

formato standard <strong>di</strong> scambio <strong>di</strong> modelli tra applicazioni <strong>di</strong> <strong>di</strong>verse piattaforme, è definito<br />

attraverso MOF).<br />

Lo <strong>UML</strong> possiede <strong><strong>un</strong>a</strong> definizione rigorosa <strong>di</strong> metamodello, istanza del meta-metamodello<br />

definito anch’esso attraverso il MOF. Si tratta <strong>di</strong> concetti molto eleganti e affascinanti, <strong>ad</strong><br />

elevato livello <strong>di</strong> astrazione. Il metamodello dello <strong>UML</strong> è descritto per mezzo dello <strong>UML</strong><br />

stesso. Si tratta indubbiamente <strong>di</strong> <strong><strong>un</strong>a</strong> scelta molto elegante, ma ha per inconveniente che <strong>ad</strong><br />

<strong><strong>un</strong>a</strong> prima lettura della specifica si può avere <strong><strong>un</strong>a</strong> certa confusione.<br />

Un metamodello è <strong>un</strong> modello a sua volta istanza <strong>di</strong> <strong>un</strong> meta-metamodello, fruibile per<br />

esprimere <strong><strong>un</strong>a</strong> istanza <strong>di</strong> modello: l’<strong>UML</strong> (metamodello) permette <strong>di</strong> realizzare <strong>di</strong>versi modelli<br />

Object-Oriented (modelli definiti dall’utente). Il metamodello dello <strong>UML</strong> definisce la struttura<br />

dei modelli <strong>UML</strong>. Un metamodello non fornisce alc<strong><strong>un</strong>a</strong> regola su come esprimere concetti del<br />

mondo Object-Oriented, quali <strong>ad</strong> esempio classi, interfacce, relazioni e così via, ma esso rende<br />

possibile avere <strong>di</strong>verse notazioni che si conformano al metamodello stesso.<br />

Così come avviene nella relazione che lega le classi agli oggetti, <strong><strong>un</strong>a</strong> volta definita <strong><strong>un</strong>a</strong><br />

classe si possono avere svariate istanze della stessa (oggetti), analogamente è possibile<br />

progettare <strong>un</strong> numero infinito <strong>di</strong> varianti dello “<strong>UML</strong>” (istanze del metamodello).<br />

Nelle sue prime apparizioni ufficiali lo <strong>UML</strong> era composto “semplicemente” da <strong><strong>un</strong>a</strong><br />

notazione grafica, fruibile per rappresentare modelli <strong>di</strong> sistemi Object-Oriented. Quando poi è<br />

gi<strong>un</strong>to il momento della presentazione allo OMG, per il conferimento del riconoscimento<br />

ufficiale <strong>di</strong> standard (Gennaio 1997), si è reso necessario conferirgli <strong><strong>un</strong>a</strong> veste più formale.<br />

12


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Così, a partire dalla versione 1.1, lo <strong>UML</strong> definisce rigorosamente <strong>un</strong> metamodello e la<br />

notazione atta alla formulazione <strong>di</strong> modelli Object-Oriented conformi <strong>ad</strong> esso.<br />

Riassumendo, <strong>un</strong> meta-metamodello è <strong>un</strong> modello che definisce <strong>un</strong> linguaggio per<br />

esprimere <strong>un</strong> metamodello. La relazione tra il meta-metamodello ed il metamodello è<br />

paragonabile a quella esistente tra il metamodello ed <strong>un</strong> modello.<br />

Figura 1.3: Meta-metamodello, metamodello e modello <strong>UML</strong><br />

Lo <strong>UML</strong> è definito in termini del meta-metamodello denominato MOF: Meta Object<br />

Facility [MOFS]. Nella figura 1.3 viene illustrato graficamente quanto emerso fino a questo<br />

p<strong>un</strong>to: relazioni esistenti tra il meta-metamodello, il metamodello ed il modello dell’utente.<br />

Scorrendo il <strong>di</strong>agramma dall’alto verso il basso si assiste <strong>ad</strong> <strong><strong>un</strong>a</strong> gr<strong>ad</strong>uale <strong>di</strong>minuzione del<br />

livello <strong>di</strong> astrazione; se si fosse deciso <strong>di</strong> visualizzare <strong>un</strong> ulteriore livello si sarebbero trovate<br />

entità, istanze delle classi del modello dell’utente, cioè oggetti.<br />

Se, per esempio, si realizzasse <strong>un</strong> prototipo <strong>di</strong> <strong>un</strong> sistema <strong>di</strong> commercio elettronico, a livello<br />

del modello realizzato dall’architetto, si troverebbero classi (opport<strong><strong>un</strong>a</strong>mente relazionate tra<br />

loro) del tipo: Categoria, SottoCategoria, Prodotto, Utente, Profilo, e così via. Se poi si volesse<br />

13


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

visualizzare il livello inferiore, l’istanza dello user model, bisognerebbe inserire oggetti, istanze<br />

<strong>di</strong> tali classi, come per esempio il prodotto <strong>di</strong> co<strong>di</strong>ce X, avente prezzo Y, della categoria Z. Per<br />

avere <strong>un</strong>’idea più chiara si consulti il <strong>di</strong>agramma riportato nella figura 1.4.<br />

Figura 1.4: Esempio delle relazioni ai vari gr<strong>ad</strong>i <strong>di</strong> astrazione tra i modelli <strong>UML</strong><br />

Come si può notare, nel modello <strong>di</strong> analisi compare <strong><strong>un</strong>a</strong> classe denominata “Or<strong>di</strong>ne”<br />

appartenente al dominio del problema. La classe è <strong>un</strong>’istanza della metaclasse Class, presente<br />

nel package <strong>UML</strong> metamodello, e contiene attributi ed operazioni che, a loro volta, sono<br />

istanze rispettivamente delle metaclassi Attribute ed Operation. Se anche in questo caso si fosse<br />

deciso <strong>di</strong> visualizzare <strong>un</strong> ulteriore livello si sarebbero trovate le istanze delle classe Or<strong>di</strong>ne,<br />

ossia oggetti del tipo or<strong>di</strong>ne.<br />

14


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Appare che il livello <strong>di</strong> meta-metamodello ha la stessa struttura del livello <strong>di</strong> metamodello:<br />

questo fatto è causato dalla stretta relazione che c’è fra MOF e <strong>UML</strong>. Infatti, a quanto si legge<br />

nella specifica ufficiale <strong>di</strong> OMG (“Meta Object Facility (MOF) Specification” [MOFS]), si<br />

potrebbe avere in futuro <strong><strong>un</strong>a</strong> fusione tra i meta-metamodelli <strong>di</strong> MOF e il metamodello <strong>di</strong> <strong>UML</strong>:<br />

nel frattempo rimangono due entità <strong>di</strong>stinte.<br />

In sintesi, lo <strong>UML</strong> è basato su <strong>un</strong> metamodello integrato, composto da numerosi elementi<br />

collegati fra loro secondo regole precise. Utilizzando gli elementi del metamodello è possibile<br />

creare i modelli per i sistemi da rappresentare e la maggior parte degli elementi stessi hanno<br />

<strong>un</strong>’icona definita dalla notazione dello <strong>UML</strong> che li rappresenta graficamente. Gli elementi del<br />

metamodello possono comparire in <strong>di</strong>agrammi <strong>di</strong> <strong>di</strong>verso tipo e le regole sintattiche permettono<br />

<strong>di</strong> verificare la correttezza.<br />

1.5 Sintassi astratta<br />

La sintassi astratta viene definita utilizzando la notazione dei meta-modelli. Si tratta <strong>di</strong> <strong>un</strong><br />

sottoinsieme della notazione <strong>UML</strong> che utilizza il <strong>di</strong>agramma delle classi per definire gli<br />

elementi dei modelli <strong>UML</strong> e le relazioni che intercorrono tra loro. La figura 1.5, <strong>di</strong> seguito<br />

riportata, mostra <strong>un</strong> frammento del <strong>di</strong>agramma che definisce la sintassi astratta <strong>di</strong> <strong>UML</strong>.<br />

<strong>UML</strong> specification permette la definizione <strong>di</strong> <strong>un</strong> metodo, dei sui attributi e delle sue<br />

associazioni anche in linguaggio naturale. Questo <strong>di</strong>agramma mostra che Operazione e Metodo<br />

sono meta-classi, entrambe sottoclassi della meta-classe astratta ProprietàComportamentale, e<br />

che Operazione è <strong><strong>un</strong>a</strong> specifica <strong>di</strong> Metodo. Mentre <strong>un</strong>’Operazione possiede <strong>un</strong> attributo<br />

specifica, <strong>un</strong> Metodo ha solo come attributo <strong>un</strong> corpo: la specifica nella meta-classe Operazione<br />

è <strong><strong>un</strong>a</strong> stringa che definisce il prototipo (signature) dell’operazione (il suo valore <strong>di</strong> ritorno,<br />

nome e parametri).<br />

15


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

ProprietàComportamentale<br />

Query: boolean<br />

Operazione<br />

Concorrenza: CallConcurrencyKind<br />

R<strong>ad</strong>ice: boolean<br />

Foglia: boolean<br />

Astratto: boolean<br />

Specifica: String<br />

1 *<br />

+specifica<br />

Metodo<br />

Corpo: ProcedureExpression<br />

Figura 1.5: Frammento della sintassi astratta <strong>di</strong> <strong>UML</strong><br />

Il corpo nella meta-classe Metodo è <strong><strong>un</strong>a</strong> procedura, probabilmente scritta in <strong>un</strong> linguaggio <strong>di</strong><br />

programmazione, che definisce come il metodo implementa l’operazione. Una determinata<br />

istanza <strong>di</strong> <strong>un</strong>’operazione in <strong><strong>un</strong>a</strong> classe è <strong>un</strong>’istanza della meta-classe Operazione.<br />

Metodo<br />

Un metodo è l’implementazione <strong>di</strong> <strong>un</strong>’operazione, esso descrive l’algoritmo o la procedura<br />

che genera i risultati <strong>di</strong> <strong>un</strong>’operazione. Nel meta-modello, <strong>un</strong> Metodo è <strong><strong>un</strong>a</strong> <strong>di</strong>chiarazione <strong>di</strong> <strong>un</strong><br />

comportamento ben specifico in <strong>un</strong> Classificatore e realizza <strong><strong>un</strong>a</strong> (quin<strong>di</strong> <strong>di</strong>rettamente) o <strong>un</strong><br />

insieme (allora in<strong>di</strong>rettamente) <strong>di</strong> Operazioni del Classificatore.<br />

Attributi<br />

Corpo – L’implementazione del Metodo come ProcedureExpression.<br />

Associazioni<br />

Specifica – In<strong>di</strong>ca <strong>un</strong>’Operazione implementata dal Metodo. L’Operazione deve essere<br />

contenuta nel Classificatore che possiede il Metodo o essere ere<strong>di</strong>tata da esso. Le signature<br />

dell’Operazione e del Metodo devono corrispondere.<br />

Esiste <strong>un</strong>’analoga specifica per Operazione e per ogni altra meta-classe del meta-modello.<br />

16


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Regole sintattiche<br />

Le regole sintattiche che generano espressioni ben formate si applicano a istanze delle<br />

meta-classi, ossia <strong>ad</strong> operazioni, meto<strong>di</strong>, classi e tutto ciò che si trova a livello del modello.<br />

Esse forniscono le regole cui devono obbe<strong>di</strong>re le istanze delle meta-classi, come <strong>un</strong> insieme <strong>di</strong><br />

invarianti. Gli invarianti sono vincoli che non possono essere spezzati: devono sempre risultare<br />

veri perché il modello abbia significato. Sono descritti in Object Constraint Language (OCL).<br />

Ad esempio, la specifica della meta-classe Class afferma che se la classe è concreta (non<br />

astratta), allora ogni operazione dovrebbe avere <strong>un</strong> metodo che la realizza. Il vincolo seguente è<br />

scritto in OCL.<br />

Not self.Astratto implies self.ogniOperazione -> perOgni (op |<br />

self.ogniMetodo -> esiste (m | m.specifica -> include (op)))<br />

Questi vincoli sul meta-modello possono essere utilizzati per verificare che il modello si<br />

attenga alle regole <strong>di</strong> <strong>UML</strong> e sia ben formato. Si noti che OCL viene utilizzato all’interno <strong>di</strong><br />

<strong>UML</strong> per esprimere vincoli interni al modello.<br />

Per esempio, se <strong><strong>un</strong>a</strong> delle regola <strong>di</strong> <strong>un</strong> sistema per con<strong>di</strong>videre i viaggi, prevede che ogni<br />

viaggio legato da <strong>un</strong> contratto <strong>di</strong> con<strong>di</strong>visione deve essere svolto da <strong>un</strong> <strong>di</strong>verso Car Sharer<br />

(persona che con<strong>di</strong>vide la propria macchina), questo potrebbe essere espresso in OCL nel<br />

seguente modo:<br />

context ContrattoCon<strong>di</strong>visione inv:<br />

self.Con<strong>di</strong>viso->forAll (i, j | (i.viaggia = j.viaggia)<br />

implies i = j)<br />

In italiano, questo significa che nel contesto della classe ContrattoCon<strong>di</strong>visione c'è <strong><strong>un</strong>a</strong><br />

regola invariante definita come segue: se si prende ogni possibile coppia <strong>di</strong> collegamenti tra<br />

<strong>un</strong>'istanza <strong>di</strong> ContrattoCon<strong>di</strong>visione e istanze <strong>di</strong> Viaggio basate sull’associazione Con<strong>di</strong>viso, e<br />

per ogni membro della coppia si segue il collegamento basato sull'associazione viaggia fino a<br />

<strong>un</strong>'istanza della classe Car Sharer e se tali collegamenti sono gli stessi, anche i due viaggi sono<br />

uguali. E dato che i due viaggi sono in realtà lo stesso viaggio, ne deriva che due <strong>di</strong>versi viaggi<br />

appartenenti allo stesso Car Sharer non possono essere con<strong>di</strong>visi all'interno dello stesso<br />

accordo <strong>di</strong> con<strong>di</strong>visione.<br />

17


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Semantica<br />

La semantica <strong>di</strong> <strong>UML</strong> è descritta in linguaggio naturale. Per esempio, quella che segue è la<br />

<strong>descrizione</strong> della meta-classe Operazione (ve<strong>di</strong> figura 1.5).<br />

“Un’Operazione è <strong>un</strong> costrutto concettuale, mentre il Metodo è il costrutto per<br />

l’implementazione. Le loro caratteristiche com<strong>un</strong>i, come possedere <strong><strong>un</strong>a</strong> segnature, sono<br />

espresse rispettivamente nella meta-classe ProprietàComportamentale e nella semantica<br />

specifica dell’Operazione. I costrutti del Metodo sono definiti nella corrispondente sottoclasse<br />

<strong>di</strong> ProprietàComportamentale”.<br />

Tuttavia la maggior parte delle informazioni relative alle operazioni si trova nella<br />

definizione <strong>di</strong> Classe. La comprensione completa della semantica richiederebbe la lettura<br />

approfon<strong>di</strong>ta <strong>di</strong> tutta questa parte.<br />

1.6 Gli strumenti <strong>di</strong> lavoro <strong>UML</strong><br />

Come ogni linguaggio che si rispetti anche l'<strong>UML</strong> necessita <strong>di</strong> tools appropriati che ne<br />

agevolino l'utilizzo. Servirsi <strong>di</strong> carta e penna è sicuramente sempre valido ma non può<br />

certamente garantire da solo <strong>un</strong> risultato apprezzabile. Ci sono sul mercato tanti tools che<br />

trattano l'<strong>UML</strong>. Probabilmente, però, il più <strong>di</strong>ffuso è lo strumento della Rational, Il Rose. Il<br />

Rational Rose è stato <strong>di</strong>segnato per fornire ai team <strong>di</strong> sviluppo tutti gli strumenti necessari per il<br />

modellamento <strong>di</strong> soluzioni robuste ed efficienti.<br />

La Microsoft ha prodotto <strong>un</strong>o strumento che permette <strong>di</strong> definire <strong>un</strong> sottoinsieme dei<br />

modelli che il Rational Rose mette a <strong>di</strong>sposizione: il Microsoft Visual Modeler. Tale software<br />

si può consigliare a chi si avvicina per la prima volta al mondo del Visual Modeling. Il<br />

Microsoft Visual Modeler permette, tra l'altro, <strong>di</strong>:<br />

• Identificare e <strong>di</strong>segnare oggetti del business e mapparli in componenti software;<br />

• Descrivere come i componenti possono essere <strong>di</strong>stribuiti su <strong><strong>un</strong>a</strong> rete;<br />

• Generare co<strong>di</strong>ce base Visual Basic <strong>di</strong>rettamente dalla costruzione del modello;<br />

• Utilizzare il reverse engineering per creare i modelli da applicazioni già esistenti.<br />

18


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Altro strumento da segnalare è <strong>UML</strong>et, <strong>un</strong> software open source basato su Java che permette<br />

la scrittura <strong>di</strong> <strong>di</strong>agrammi <strong>UML</strong>. Tra le opzioni, la possibilità <strong>di</strong> esportare i <strong>di</strong>agrammi in SVG,<br />

JPG e PDF.<br />

1.7 Componenti <strong>UML</strong><br />

Il linguaggio <strong>UML</strong> contiene svariati elementi grafici che vengono messi insieme durante la<br />

creazione dei <strong>di</strong>agrammi. <strong>Da</strong>to che l'<strong>UML</strong> è <strong>un</strong> linguaggio, come tale utilizza delle regole per<br />

combinare i componenti nella creazione dei <strong>di</strong>agrammi.<br />

L'obiettivo dei <strong>di</strong>agrammi è quello <strong>di</strong> costruire molteplici viste <strong>di</strong> <strong>un</strong> sistema tutte correlate<br />

tra <strong>di</strong> loro. L'insieme <strong>di</strong> tali viste costituirà quello che abbiamo definito Visual Modeling. Si<br />

passano ora in rassegna, brevemente, tutti i <strong>di</strong>agrammi <strong>UML</strong> prima <strong>di</strong> analizzarli più<br />

dettagliatamente in seguito.<br />

La notazione <strong>UML</strong> include <strong>di</strong>eci tipi <strong>di</strong> <strong>di</strong>agrammi, <strong>di</strong>visi in cinque categorie. Si tenga<br />

presente che è assolutamente possibile costruire e aggi<strong>un</strong>gere dei <strong>di</strong>agrammi <strong>di</strong>fferenti dagli<br />

standard (che vengono definiti ibri<strong>di</strong>) rispetto a quelli definiti dal linguaggio. La tabella 1.1<br />

mostra le categorie e i <strong>di</strong>agrammi corrispondenti.<br />

Tabella 1.1: Classificazione dei <strong>di</strong>agrammi <strong>UML</strong><br />

19


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Class Diagram<br />

Per avere <strong><strong>un</strong>a</strong> idea imme<strong>di</strong>ata <strong>di</strong> cosa sia <strong><strong>un</strong>a</strong> classe è possibile usare come esempio il fatto<br />

che tutti gli oggetti o esseri viventi, spesso, sono riconducibili a determinate categorie<br />

(computers, automobili, piante, animali). Queste categorie costituiscono le classi. Una classe è<br />

<strong><strong>un</strong>a</strong> categoria o <strong>un</strong> gruppo <strong>di</strong> oggetti (con questo termine si includono, per como<strong>di</strong>tà anche gli<br />

esseri viventi) che hanno attributi simili e comportamenti analoghi. I Class Diagrams<br />

forniscono le rappresentazioni utilizzate dagli sviluppatori.<br />

Object Diagram<br />

Un oggetto è <strong><strong>un</strong>a</strong> istanza <strong>di</strong> <strong><strong>un</strong>a</strong> classe, ovvero <strong><strong>un</strong>a</strong> qualcosa <strong>di</strong> specifico che ha dei valori<br />

determinati per i suoi attributi e dei comportamenti specifici.<br />

Use Case Diagram<br />

Uno Use Case (caso d'uso) è <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>di</strong> <strong>un</strong> comportamento particolare <strong>di</strong> <strong>un</strong><br />

sistema dal p<strong>un</strong>to <strong>di</strong> vista dell'utente. Per gli sviluppatori, gli use case <strong>di</strong>agram rappresentano<br />

<strong>un</strong>o strumento notevole: infatti tramite tali <strong>di</strong>agrammi, essi possono agevolmente ottenere <strong><strong>un</strong>a</strong><br />

idea chiara dei requisiti del sistema dal p<strong>un</strong>to <strong>di</strong> vista utente e quin<strong>di</strong> scrivere il co<strong>di</strong>ce senza<br />

timore <strong>di</strong> non aver recepito bene lo scopo finale. Nella rappresentazione grafica, viene<br />

utilizzato <strong>un</strong> simbolo particolare per l'actor (l'utente o <strong>un</strong> altro sistema che interagisce) che si<br />

vedrà in seguito.<br />

L'actor è l'entità che interagisce con <strong>un</strong>o use case facendo partire la sequenza <strong>di</strong> azioni<br />

descritte dallo use case stesso e, eventualmente, ricevendo delle precise risposte dal sistema.<br />

Può essere <strong><strong>un</strong>a</strong> persona o anche <strong>un</strong> altro sistema.<br />

State Diagram<br />

Ad <strong>un</strong> determinato istante, durante il f<strong>un</strong>zionamento del sistema, <strong>un</strong> oggetto si trova in <strong>un</strong><br />

particolare stato. Gli State Diagrams rappresentano tali stati, ed i loro cambiamenti nel tempo.<br />

Ogni state <strong>di</strong>agram inizia con <strong>un</strong> simbolo che identifica lo stato iniziale (Start State) e termina<br />

con <strong>un</strong> altro simbolo che rappresenta lo stato finale (End State). Per esempio, ogni persona può<br />

essere identificato dai seguenti stati: neonato, bambino, <strong>ad</strong>olescente, <strong>ad</strong>ulto, anziano.<br />

20


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Sequenze Diagram<br />

I class <strong>di</strong>agrams e gli object <strong>di</strong>agrams rappresentano informazione statica. In <strong>un</strong> sistema<br />

f<strong>un</strong>zionante, tuttavia, gli oggetti interagiscono l'<strong>un</strong>o con l'altro, e queste interazioni avvengono<br />

in relazione al trascorrere del tempo. Il sequence <strong>di</strong>agram mostra le <strong>di</strong>namiche, basate sul<br />

tempo, delle varie interazioni tra gli oggetti.<br />

Activity Diagram<br />

Le attività che si riscontrano all'interno <strong>di</strong> use case o all'interno del comportamento <strong>di</strong> <strong>un</strong><br />

oggetto acc<strong>ad</strong>ono, tipicamente, in <strong><strong>un</strong>a</strong> sequenza ben definita. Tale sequenza si rappresentata<br />

con gli activity <strong>di</strong>agrams.<br />

Collaboration Diagram<br />

Gli elementi <strong>di</strong> <strong>un</strong> sistema lavorano insieme per realizzare e sod<strong>di</strong>sfare le necessità del<br />

sistema. Un linguaggio <strong>di</strong> modellazione deve avere <strong>un</strong> modo per rappresentare tale<br />

cooperazione. Il Collaboration Diagram nasce proprio per questa ragione.<br />

Component Diagram<br />

Oggi, nell'ingegneria del software si utilizza sempre più il modello <strong>di</strong> organizzazione<br />

secondo il quale ogn<strong>un</strong>o nel team <strong>di</strong> lavoro lavora su <strong>un</strong> componente <strong>di</strong>fferente. Il component<br />

<strong>di</strong>agram descrive questa importante caratteristica.<br />

Deployment Diagram<br />

Il Deployment Diagram mostra l'architettura dal p<strong>un</strong>to <strong>di</strong> vista fisico e logistico <strong>di</strong> <strong>un</strong><br />

sistema. Tale <strong>di</strong>agramma può descrivere i vari <strong>di</strong>spositivi presenti, mostrare le varie<br />

connessioni che intercorrono tra <strong>di</strong> essi e, ancora, il software che è installato su ogni macchina.<br />

Una domanda che ci si potrebbe porre a questo p<strong>un</strong>to è la seguente: Ma è proprio<br />

necessario sviluppare tutti i <strong>di</strong>agrammi che l'<strong>UML</strong> mette a <strong>di</strong>sposizione ?<br />

La risposta a questa domanda può variare in relazione alla complessità del Sistema che si<br />

intende costruire ma, in linea <strong>di</strong> massima, tende <strong>ad</strong> essere affermativa. La ragione <strong>di</strong> ciò<br />

consiste nel fatto che i <strong>di</strong>agrammi <strong>UML</strong> sono stati pensati per venire incontro all'esigenza <strong>di</strong><br />

rendere il Sistema comprensibile da <strong>di</strong>fferenti persone con <strong>di</strong>fferenti figure professionali.<br />

Probabilmente, <strong>ad</strong> esempio, <strong>un</strong> commerciale non trarrà <strong><strong>un</strong>a</strong> particolare impressione leggendo<br />

21


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

<strong>un</strong> Class Diagram ma potrà, certamente, avere le idee più chiare analizzando <strong>un</strong>o Use Case<br />

Diagram.<br />

1.8 Il Class Diagram: approfon<strong>di</strong>menti<br />

Si è detto precedentemente che gli oggetti possono essere sud<strong>di</strong>visi in categorie e, quin<strong>di</strong>, in<br />

classi.<br />

Il Class Diagram del linguaggio <strong>UML</strong> consiste <strong>di</strong> svariate classi connesse tra <strong>di</strong> loro<br />

tramite delle relazioni. Prima <strong>di</strong> tutto, però, è importante definire graficamente <strong><strong>un</strong>a</strong> classe in<br />

<strong>UML</strong>.<br />

Una classe viene rappresentata da <strong>un</strong> rettangolo (fig. 1.7). Il nome della classe, per<br />

convenzione, è <strong><strong>un</strong>a</strong> parola con l'iniziale maiuscola ed appare vicino alla sommità del rettangolo.<br />

Se il nome della classe definita consiste <strong>di</strong> <strong><strong>un</strong>a</strong> parola composta a sua volta da più parole allora<br />

viene utilizzata <strong><strong>un</strong>a</strong> notazione in cui tutte le iniziali <strong>di</strong> ogni parola sono scritte in maiuscolo.<br />

Figura 1.6: La classe<br />

Definizione generica <strong>di</strong> <strong><strong>un</strong>a</strong> classe<br />

Un Attributo rappresenta <strong><strong>un</strong>a</strong> proprietà <strong>di</strong> <strong><strong>un</strong>a</strong> classe. Esso descrive <strong>un</strong> insieme <strong>di</strong> valori<br />

che la proprietà può avere quando vengono istanziati oggetti <strong>di</strong> quella determinata classe. Una<br />

classe può avere zero o più attributi.<br />

Un attributo il cui nome è costituito da <strong><strong>un</strong>a</strong> sola parola viene scritto sempre in caratteri<br />

minuscoli. Se, invece, il nome dell'attributo consiste <strong>di</strong> più parole (es: Informazioni-Cliente)<br />

allora il nome dell'attributo si scriverà <strong>un</strong>endo tutte le parole che ne costituiscono il nome<br />

stesso con la particolarità che la prima parola verrà scritta in minuscolo mentre le successive<br />

avranno la loro prima lettera in maiuscolo. Nell'esempio visto l'attributo sarà identificato dal<br />

termine: informazioniCliente. La lista degli attributi <strong>di</strong> <strong><strong>un</strong>a</strong> classe viene separata graficamente<br />

dal nome della classe a cui appartiene tramite <strong><strong>un</strong>a</strong> linea orizzontale.<br />

22


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Nell'icona della classe, come si vede nella figura precedente, è possibile specificare <strong>un</strong> tipo<br />

in relazione <strong>ad</strong> ogni attributo (string, float, int, bool). E' anche possibile specificare <strong>un</strong> valore <strong>di</strong><br />

default che <strong>un</strong> attributo può avere (fig. 1.7).<br />

Figura 1.7: Attributi<br />

Un'Operazione è <strong>un</strong>'azione che gli oggetti <strong>di</strong> <strong><strong>un</strong>a</strong> certa classe possono compiere;<br />

analogamente al nome degli attributi, il nome <strong>di</strong> <strong>un</strong>'operazione viene scritto con caratteri<br />

minuscoli. Anche qui, se il nome dell'operazione consiste <strong>di</strong> più parole, allora tali parole si<br />

<strong>un</strong>iscono tra <strong>di</strong> loro ed ogn<strong><strong>un</strong>a</strong> <strong>di</strong> esse, eccetto la prima, viene scritta con il primo carattere<br />

maiuscolo. La lista delle operazioni (meto<strong>di</strong>) viene rappresentata graficamente sotto la lista<br />

degli attributi e separata da questa tramite <strong><strong>un</strong>a</strong> linea orizzontale come da figura 1.8. Anche I<br />

meto<strong>di</strong> possono avere delle informazioni <strong>ad</strong><strong>di</strong>zionali. Nelle parentesi che seguono il nome <strong>di</strong><br />

<strong>un</strong>'operazione, infatti, è possibile mostrare gli eventuali parametri necessari al metodo insieme<br />

al loro tipo. Infine, se il metodo rappresenta <strong><strong>un</strong>a</strong> f<strong>un</strong>zione è necessario anche specificare il tipo<br />

restituito.<br />

Figura 1.8: Vista completa <strong>di</strong> <strong><strong>un</strong>a</strong> classe<br />

Altre informazioni <strong>ad</strong><strong>di</strong>zionali che possono essere <strong>un</strong>ite agli attributi <strong>di</strong> <strong><strong>un</strong>a</strong> classe sono le<br />

Constraints e le Note. Le Constraints sono delle caselle <strong>di</strong> testo racchiuse tra parentesi.<br />

All'interno delle parentesi viene specificata <strong><strong>un</strong>a</strong> o più regole che la classe è tenuta a seguire<br />

obbligatoriamente.<br />

23


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Le Note solitamente sono associate con gli attributi e/o con i meto<strong>di</strong>. Esse forniscono <strong><strong>un</strong>a</strong><br />

informazione aggi<strong>un</strong>tiva <strong>ad</strong> <strong><strong>un</strong>a</strong> classe. Una nota può contenere sia elementi grafici che<br />

elementi <strong>di</strong> testo. Come si può riuscire a <strong>di</strong>scernere le classi da utilizzare dalla intervista con il<br />

cliente ?<br />

E' necessario, a tal fine, prestare particolare attenzione ai nomi che i clienti usano per<br />

descrivere le entità del loro business. Tali nomi saranno ottimi can<strong>di</strong>dati per <strong>di</strong>ventare delle<br />

classi nel modello <strong>UML</strong>. Si deve stare, altresì, attenti ai verbi che vengono pron<strong>un</strong>ciati dai<br />

clienti. Questi costituiranno, con molta probabilità, i meto<strong>di</strong> (le operazioni) nelle classi definite.<br />

Gli attributi <strong>di</strong> <strong><strong>un</strong>a</strong> classe verranno stabiliti con le analoghe modalità utilizzate per i nomi delle<br />

classi.<br />

Associazioni<br />

Quando più classi sono connesse l'<strong><strong>un</strong>a</strong> con l'altra da <strong>un</strong> p<strong>un</strong>to <strong>di</strong> vista concettuale, tale<br />

connessione viene denominata Associazione. Graficamente, <strong>un</strong>'associazione viene<br />

rappresentata con <strong><strong>un</strong>a</strong> linea che connette due classi, con il nome dell'associazione appena sopra<br />

la linea stessa come mostrato in fig.1.9.<br />

Figura 1.9: Associazione<br />

Quando <strong><strong>un</strong>a</strong> classe si associa con <strong>un</strong>'altra, ogn<strong><strong>un</strong>a</strong> <strong>di</strong> esse gioca <strong>un</strong> ruolo all'interno<br />

dell'associazione. E' possibile mostrare questi ruoli sul <strong>di</strong>agramma, scrivendoli vicino la linea<br />

orizzontale dalla parte della classe che svolge <strong>un</strong> determinato ruolo.<br />

Un'associazione può essere più complessa del concetto <strong>di</strong> connettere <strong><strong>un</strong>a</strong> classe <strong>ad</strong> <strong>un</strong>'altra.<br />

E' possibile, infatti che più classi possano connettersi <strong>ad</strong> <strong><strong>un</strong>a</strong> singola classe.<br />

Qualche volta <strong>un</strong>'associazione tra due classi deve seguire <strong><strong>un</strong>a</strong> regola. Tale regola si in<strong>di</strong>ca<br />

inserendo <strong><strong>un</strong>a</strong> constraint vicino la linea che rappresenta l'associazione.<br />

24


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 1.10: Classe associazione<br />

Esattamente come <strong><strong>un</strong>a</strong> classe, <strong>un</strong>'associazione può avere attributi ed operazioni. In questo<br />

caso si parla <strong>di</strong> <strong><strong>un</strong>a</strong> Classe Associazione (figura 1.10). Le classi associazione vengono<br />

visualizzate allo stesso modo con cui si mostra <strong><strong>un</strong>a</strong> classe normale. Si utilizza <strong><strong>un</strong>a</strong> linea<br />

tratteggiata per connettere <strong><strong>un</strong>a</strong> Classe Associazione alla linea <strong>di</strong> associazione. La molteplicità è<br />

<strong>un</strong> tipo speciale <strong>di</strong> associazione in cui si mostra il numero <strong>di</strong> oggetti appartenenti <strong>ad</strong> <strong><strong>un</strong>a</strong> classe<br />

che interagisce con il numero <strong>di</strong> oggetti della classe associata. Una classe, in generale, può<br />

essere correlata <strong>ad</strong> <strong><strong>un</strong>a</strong> altra nei seguenti mo<strong>di</strong>:<br />

• Uno <strong>ad</strong> <strong>un</strong>o<br />

• Uno a molti<br />

• Uno <strong>ad</strong> <strong>un</strong>o o più<br />

• Uno a zero o <strong>un</strong>o<br />

• Uno <strong>ad</strong> <strong>un</strong> intervallo limitato (es.: 1 a 2 - 20)<br />

• Uno <strong>ad</strong> <strong>un</strong> numero esatto n<br />

• Uno <strong>ad</strong> <strong>un</strong> insieme <strong>di</strong> scelte (es.: 1 a 5 o 8)<br />

Il linguaggio <strong>UML</strong> utilizza <strong>un</strong> asterisco (*) per rappresentare le opzioni molti e più.<br />

Qualche volta, <strong><strong>un</strong>a</strong> classe può trovarsi in associazione con se stessa. Ciò si verifica quando<br />

<strong><strong>un</strong>a</strong> classe contiene oggetti che possono giocare svariati ruoli. Tali associazioni sono chiamate:<br />

Associazioni Riflessive.<br />

Figura 1.11: Associazione riflessiva<br />

25


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Associazione Riflessiva<br />

Senza le relazioni, <strong>un</strong> modello <strong>di</strong> classi sarebbe soltanto <strong><strong>un</strong>a</strong> lista <strong>di</strong> rettangoli che<br />

rappresentano <strong>un</strong> "vocabolario" del sistema. Le relazioni mostrano come i termini del<br />

vocabolario si connettono tra <strong>di</strong> loro per fornire <strong>un</strong> qu<strong>ad</strong>ro della fetta <strong>di</strong> sistema che si sta<br />

modellando. L'Associazione rappresenta, d<strong>un</strong>que, la connessione concettuale fondamentale tra<br />

le classi in cui ogni classe, come detto, gioca <strong>un</strong> ruolo specifico.<br />

Ere<strong>di</strong>tarietà e Generalizzazione<br />

Se si conosce qualcosa riguardo <strong>ad</strong> <strong><strong>un</strong>a</strong> categoria <strong>di</strong> cose, automaticamente si sa qualcosa<br />

che è possibile trasferire <strong>ad</strong> altre categorie che, in qualche modo, <strong>di</strong>scendono dalla categoria<br />

stessa. Ad esempio, se si conosce qualcosa su <strong>un</strong> animale generico (si sa che <strong>un</strong> animale<br />

mangia, dorme, è nato, si sposta da <strong>un</strong> luogo <strong>ad</strong> <strong>un</strong> altro, e così via), si può <strong>di</strong>re che tutte le<br />

sottocategorie <strong>di</strong> animali (rettili, anfibi, mammiferi, ecc.) ere<strong>di</strong>teranno le stesse caratteristiche.<br />

Tale meccanismo, in Analisi Object Oriented, viene definito come: Ere<strong>di</strong>tarietà (fig. 1.12).<br />

Figura 1.12: Ere<strong>di</strong>tarietà<br />

Un esempio <strong>di</strong> ere<strong>di</strong>tarietà<br />

Una classe figlia (o sottoclasse) può ere<strong>di</strong>tare gli attributi e le operazioni da <strong>un</strong>'altra classe<br />

(che viene definita classe p<strong>ad</strong>re o super classe) che sarà sempre più generica della classe figlia.<br />

Nella generalizzazione, <strong><strong>un</strong>a</strong> classe figlia può rappresentare <strong>un</strong> valido sostituto della classe<br />

p<strong>ad</strong>re: in qual<strong>un</strong>que posto appaia la classe p<strong>ad</strong>re, sarebbe possibile far apparire la classe figlia.<br />

Il viceversa non è, invece, vero.<br />

26


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

In <strong>UML</strong> l'ere<strong>di</strong>tarietà viene rappresentata con <strong><strong>un</strong>a</strong> linea che connette la classe p<strong>ad</strong>re alla<br />

classe <strong>di</strong>scendente e dalla parte della classe p<strong>ad</strong>re si inserisce <strong>un</strong> triangolo (<strong><strong>un</strong>a</strong> freccia).<br />

Se ragioniamo dal p<strong>un</strong>to <strong>di</strong> vista dell'associazione, l'ere<strong>di</strong>tarietà può essere vista come <strong>un</strong> tipo<br />

<strong>di</strong> associazione. Come devono fare gli analisti per scoprire l'ere<strong>di</strong>tarietà <strong>di</strong> <strong><strong>un</strong>a</strong> o più classi ?<br />

L'analista deve far si che gli attributi e le operazioni per <strong><strong>un</strong>a</strong> classe siano generali e si<br />

applichino a parecchie altre classi (le sottoclassi) che, a loro volta, potranno "specializzare" la<br />

classe p<strong>ad</strong>re aggi<strong>un</strong>gendo attributi e operazioni propri. Un'altra possibilità è che l'analista noti<br />

che due o più classi hanno <strong>un</strong> numero <strong>di</strong> attributi ed operazioni in com<strong>un</strong>e.<br />

Le classi che non permettono <strong>di</strong> istanziare ness<strong>un</strong> tipo <strong>di</strong> oggetto sono dette classi astratte.<br />

In <strong>UML</strong> <strong><strong>un</strong>a</strong> classe astratta si in<strong>di</strong>ca scrivendo il suo nome in corsivo.<br />

Si può d<strong>un</strong>que <strong>di</strong>re che <strong><strong>un</strong>a</strong> classe può ere<strong>di</strong>tare attributi ed operazioni da <strong>un</strong>'altra classe. La<br />

classe che ere<strong>di</strong>ta è figlia della classe (p<strong>ad</strong>re) da cui prende gli attributi e le operazioni. Le<br />

classi astratte sono utilizzate soltanto come classi base per l'ere<strong>di</strong>tarietà e non forniscono alc<strong>un</strong><br />

oggetto implementabile.<br />

Aggregazioni<br />

Qualche volta <strong><strong>un</strong>a</strong> classe può rappresentare il risultato <strong>di</strong> <strong>un</strong> insieme <strong>di</strong> altre classi che la<br />

compongono. Questo è <strong>un</strong> tipo speciale <strong>di</strong> relazione denominata aggregazione. Le classi che<br />

costituiscono i componenti e la classe finale sono in <strong><strong>un</strong>a</strong> relazione particolare del tipo:<br />

parte-intero (part-whole).<br />

Un'aggregazione è rappresentata come <strong><strong>un</strong>a</strong> gerarchia in cui l'intero si trova in cima e i<br />

componenti (parte) al <strong>di</strong> sotto. Una linea <strong>un</strong>isce l'intero <strong>ad</strong> <strong>un</strong> componente con <strong>un</strong> rombo<br />

raffigurato sulla linea stessa vicino all'intero.<br />

Un esempio <strong>di</strong> aggregazione<br />

Si considerino le parti che costituiscono <strong>un</strong> Televisore. Ogni TV ha <strong>un</strong> involucro esterno<br />

(Box), <strong>un</strong>o schermo, degli altoparlanti, delle resistenze, dei transistors, <strong>un</strong> circuito integrato e<br />

<strong>un</strong> telecomando (oltre, naturalmente, <strong>ad</strong> altri tantissimi componenti!). Il telecomando può, a sua<br />

volta, contenere le seguenti parti: resistenze, transitors, batterie, tastiera e luci remote.<br />

Il Class Diagram che ne deriva sarà il seguente:<br />

27


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 1.13: Aggregazione<br />

Qualche volta l'insieme <strong>di</strong> possibili componenti <strong>di</strong> <strong>un</strong>'aggregazione si identifica in <strong><strong>un</strong>a</strong><br />

relazione OR. Per modellare tale situazione (fig. 1.13), è necessario utilizzare <strong><strong>un</strong>a</strong> constraint<br />

ossia la parola OR all'interno <strong>di</strong> parentesi graffe su <strong><strong>un</strong>a</strong> linea tratteggiata che connette le due<br />

linee parte-intero.<br />

Una composizione è <strong><strong>un</strong>a</strong> tipo più forte <strong>di</strong> aggregazione. Ogni componente in <strong><strong>un</strong>a</strong><br />

composizione può appartenere soltanto <strong>ad</strong> <strong>un</strong> intero. Il simbolo utilizzato per <strong><strong>un</strong>a</strong> composizione<br />

è lo stesso utilizzato per <strong>un</strong>'aggregazione eccetto il fatto che il rombo è colorato <strong>di</strong> nero. Se, <strong>ad</strong><br />

esempio, si esamina l'aspetto esterno degli uomini, si evincerà che ogni persona ha (tra le altre<br />

cose): <strong><strong>un</strong>a</strong> testa, <strong>un</strong> corpo, due braccia. e due gambe. Tale concetto viene rappresentato nel<br />

seguente grafico:<br />

Figura 1.14: Associazione composita<br />

in tale associazione ogni componente appartiene esattamente <strong>ad</strong> <strong>un</strong> intero. Un'aggregazione<br />

quin<strong>di</strong>, specifica <strong>un</strong>'associazione <strong>di</strong> tipo parte-intero in cui <strong><strong>un</strong>a</strong> classe che rappresenta l' intero è<br />

costituita da più classi che la compongono.<br />

28


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Una composizione è <strong><strong>un</strong>a</strong> forma più forte <strong>di</strong> aggregazione in cui <strong>un</strong> componente può<br />

appartenere soltanto <strong>ad</strong> <strong>un</strong> intero. Le aggregazioni e le composizioni sono rappresentate come<br />

linee che <strong>un</strong>iscono l'intero e il componente singolo tramite, rispettivamente, <strong>un</strong> rombo aperto e<br />

<strong>un</strong> rombo riempito <strong>di</strong> nero, entrambi <strong>di</strong>segnati dalla parte dell'intero.<br />

Interfacce e Realizzazioni<br />

Finora si è detto che è importante definire le classi in base all'intervista fatta con il cliente, e<br />

far sì che tali classi vengano messe nelle corrette relazioni tra <strong>di</strong> loro. Tuttavia, è possibile che<br />

alc<strong>un</strong>e classi non siano correlate <strong>ad</strong> <strong><strong>un</strong>a</strong> particolare classe p<strong>ad</strong>re e che il loro comportamento<br />

possa includere alc<strong>un</strong>e operazioni tutte recanti lo stesso nome. In tal caso esiste la possibilità <strong>di</strong><br />

definire tali operazioni per <strong><strong>un</strong>a</strong> classe e riutilizzarle per le altre: è proprio quello che avviene<br />

tramite l'utilizzo delle interfacce.<br />

Un'Interfaccia è <strong>un</strong> insieme <strong>di</strong> operazioni che specifica alc<strong>un</strong>i aspetti del comportamento <strong>di</strong><br />

<strong><strong>un</strong>a</strong> classe; in altre parole, si può <strong>di</strong>re che <strong>un</strong>'interfaccia rappresenta <strong>un</strong> insieme <strong>di</strong> operazioni<br />

che <strong><strong>un</strong>a</strong> classe offre <strong>ad</strong> altre classi. Per modellare <strong>un</strong>'interfaccia si utilizza lo stesso modo<br />

utilizzato per modellare <strong><strong>un</strong>a</strong> classe, con <strong>un</strong> rettangolo. La <strong>di</strong>fferenza consiste nel fatto che<br />

<strong>un</strong>'interfaccia non ha attributi ma soltanto operazioni (meto<strong>di</strong>). Un altro modo utilizzato in<br />

<strong>UML</strong> per rappresentare le interfacce è quello che utilizza <strong>un</strong> piccolo cerchio che si <strong>un</strong>isce<br />

tramite <strong><strong>un</strong>a</strong> linea alle classi che implementano l'interfaccia stessa.<br />

La tastiera del computer è <strong>un</strong> tipico esempio <strong>di</strong> interfaccia riutilizzabile. La pressione <strong>di</strong> <strong>un</strong><br />

tasto (KeyStroke) rappresenta <strong>un</strong>'operazione che è stata riutilizzata dalla macchina per scrivere.<br />

La collocazione dei tasti è la stessa della macchina per scrivere, ma il p<strong>un</strong>to cruciale è che la<br />

pressione <strong>di</strong> <strong>un</strong> tasto è stata trasferita da <strong>un</strong> sistema (i due sistemi, come si evince facilmente,<br />

nel nostro caso sono la macchina per scrivere ed il computer) <strong>ad</strong> <strong>un</strong> altro. D'altro canto, sulla<br />

tastiera dei computer si trovano <strong>un</strong> insieme <strong>di</strong> operazioni che non si trovano sulla macchina per<br />

scrivere (Ctrl, Alt, PageUp, PageDown, ecc.).<br />

Figura 1.15: Interfaccia<br />

29


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Una interfaccia è <strong><strong>un</strong>a</strong> collezione <strong>di</strong> operazioni che <strong><strong>un</strong>a</strong> classe esegue. Per <strong>di</strong>stinguere le<br />

interfacce dalle classi, dal p<strong>un</strong>to <strong>di</strong> vista <strong>UML</strong> si utilizza la scrittura interface all'inizio del<br />

nome <strong>di</strong> ogni interfaccia, come mostrato nella figura 1.15.<br />

La relazione tra <strong><strong>un</strong>a</strong> classe ed <strong>un</strong>'interfaccia viene definita Realizzazione. Tale relazione è<br />

visualizzata nel modello da <strong><strong>un</strong>a</strong> linea tratteggiata con <strong>un</strong> triangolo largo aperto costruito sul lato<br />

dell'interfaccia.<br />

Visibilità<br />

La Visibilità si applica <strong>ad</strong> attributi o operazioni e specifica la possibilità che hanno le classi<br />

<strong>di</strong> usare gli attributi e le operazioni <strong>di</strong> <strong>un</strong>'altra classe. Sono consentiti tre livelli <strong>di</strong> visibilità:<br />

• Livello pubblico: L'utilizzo viene esteso a tutte le classi;<br />

• Livello protetto: L'utilizzo è consentito soltanto alle classi che derivano dalla classe<br />

originale;<br />

• Livello privato: Soltanto la classe originale può utilizzare gli attributi e le operazioni<br />

definite come tali.<br />

A livello grafico vengono utilizzati, generalmente, i seguenti simboli per <strong>di</strong>stinguere i tre<br />

livelli:<br />

• Livello pubblico: +<br />

• Livello protetto: #<br />

• Livello privato: -<br />

Class Diagram - Un esempio pratico<br />

Si prenda come esempio <strong><strong>un</strong>a</strong> applicazione classica: quella che permette <strong>di</strong> scrivere <strong>un</strong><br />

documento <strong>di</strong> testo. Si cerchi <strong>di</strong> descrivere i passi che costituiscono tale applicazione.<br />

Si Supponga che si stia <strong>di</strong>gitando <strong>un</strong> documento <strong>di</strong> testo, utilizzando qualche famoso e<strong>di</strong>tor <strong>di</strong><br />

testi, come Microsoft Word, <strong>ad</strong> esempio. L'utente ha due possibilità iniziali:<br />

• Cominciare a scrivere <strong>un</strong> nuovo documento;<br />

• Aprire <strong>un</strong> documento esistente.<br />

30


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Il testo da scrivere, ovviamente, verrà <strong>di</strong>gitato tramite l'utilizzo della tastiera.<br />

Ogni documento è composto <strong>di</strong> svariate pagine, e ogni pagina, a sua volta, è composta da<br />

<strong><strong>un</strong>a</strong> testata, dal corpo del documento e da <strong>un</strong> piè <strong>di</strong> pagina. Nella intestazione e nel piè <strong>di</strong><br />

pagina è possibile aggi<strong>un</strong>gere la data, l'ora, il numero <strong>di</strong> pagina, la collocazione del file, e così<br />

via. Il corpo del documento è formato da frasi. Le frasi, a loro volta, sono composte da parole e<br />

segni <strong>di</strong> p<strong>un</strong>teggiatura. Le parole sono formate da lettere, numeri e/o caratteri speciali. Inoltre,<br />

vi è la possibilità <strong>di</strong> aggi<strong>un</strong>gere delle immagini e delle tabelle nel documento. Le tabelle sono<br />

costituite da righe e colonne ed ogni cella <strong>di</strong> <strong><strong>un</strong>a</strong> tabella può contenere del testo o delle<br />

immagini. Dopo aver terminato il documento, l'utente può scegliere <strong>di</strong> salvarlo o stamparlo.<br />

Si è in tal modo descritto, in maniera semplificata ma congruente, il processo <strong>di</strong> creazione <strong>di</strong> <strong>un</strong><br />

documento tramite Microsoft Word.<br />

Si è ora in gr<strong>ad</strong>o <strong>di</strong> estrarre la seguente lista <strong>di</strong> parole chiave: documento , e<strong>di</strong>tor <strong>di</strong><br />

documenti, Microsoft Word, testo , tastiera, intestazione, piè pagina, corpo del documento,<br />

data, ora, numero <strong>di</strong> pagina, collocazione del file, pagina, frase, parola, segno <strong>di</strong><br />

p<strong>un</strong>teggiatura, lettera, numero, carattere speciale, immagine, tabella, riga, colonna, cella,<br />

utente.<br />

Si potrà <strong>di</strong>re che le parole chiave evidenziate sono sicuramente can<strong>di</strong>date a <strong>di</strong>ventare classi o<br />

attributi per il modello da sviluppare. Come è possibile osservare, nell'esempio descritto,<br />

l'oggetto attorno a cui ruota <strong>un</strong> po' tutto il <strong>di</strong>scorso è il Documento.<br />

Per tale ragione, sarà <strong><strong>un</strong>a</strong> buona idea identificare nel Documento la classe centrale del<br />

nostro Class Diagram. Un documento, come detto, può avere svariate pagine e, quin<strong>di</strong>, si potrà<br />

definire <strong>un</strong> attributo: numeroDiPagine che descrive tale caratteristica. Invece, per le operazioni,<br />

sarà bene definire i meto<strong>di</strong>: Apri( ), Salva( ), Stampa( ),Nuovo( ). Si è detto, poi, che ogni<br />

documento è composto <strong>di</strong> pagine. La Pagina sarà, d<strong>un</strong>que, <strong>un</strong> buon can<strong>di</strong>dato per essere <strong><strong>un</strong>a</strong><br />

classe del nostro <strong>di</strong>agramma (fig. 1.16).<br />

Figura 1.16: Esempio <strong>di</strong> classe<br />

31


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

La Classe Pagina conterrà <strong>un</strong> attributo : numeroDiPagina, che identificherà il numero della<br />

pagina dell'oggetto, e le seguenti operazioni: nuovaPagina(), nascon<strong>di</strong>Intestazione() e<br />

nascon<strong>di</strong>Piè<strong>di</strong>Pagina() (fig.1.17).<br />

Figura 1.17: La classe pagina<br />

I meto<strong>di</strong> per la testata e il piè <strong>di</strong> pagina fanno intendere che è bene definire altre due classi:<br />

Intestazione e PiePagina. Tali classi hanno i seguenti attributi in com<strong>un</strong>e: data, ora,<br />

numeroDiPagina e pathFile. Tali attributi sono opzionali per ogni intestazione o piè <strong>di</strong> pagina e<br />

l'utente potrà configurarli a suo piacimento.<br />

La somiglianza tra Intestazione e PiePagina spinge a definire ancora <strong><strong>un</strong>a</strong> nuova classe che<br />

sia in com<strong>un</strong>e alle due appena descritte. È qui che si utilizza il concetto <strong>di</strong> ere<strong>di</strong>tarietà che è<br />

stato definito in precedenza.<br />

La classe p<strong>ad</strong>re sarà BottomUp (questo nome è scelto perché le intestazioni e i piè <strong>di</strong> pagina<br />

appaiono, rispettivamente, nella parte alta e bassa <strong>di</strong> ogni pagina del documento) e conterrà gli<br />

attributi che sono in com<strong>un</strong>e alle classi Intestazione e PiePagina oltre alle operazioni (anch'esse<br />

in com<strong>un</strong>e) : visualizza(), mo<strong>di</strong>fica() e nascon<strong>di</strong>().<br />

Le classi Intestazione e PiePagina (figlie <strong>di</strong> BottomUp) avranno la necessità, quin<strong>di</strong>, <strong>di</strong><br />

definire, rispettivamente, soltanto le operazioni: nuovaIntestazione() e nuovoPiePagina()<br />

(fig.1.18).<br />

Figura 1.18: Esempio <strong>di</strong> ere<strong>di</strong>tarietà<br />

32


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Prima <strong>di</strong> passare <strong>ad</strong> esaminare il corpo del documento o il testo, si ponga <strong>un</strong>o sguardo alla<br />

definizione dei componenti <strong>di</strong> <strong>un</strong> testo. Come detto, il testo del documento è composto <strong>di</strong> frasi.<br />

Le frasi, a loro volta, sono composte <strong>di</strong> parole e le parole sono formate da caratteri. Se le parole<br />

sono, d<strong>un</strong>que, array <strong>di</strong> caratteri e le frasi sono identificabili come array <strong>di</strong> parole, allora <strong><strong>un</strong>a</strong><br />

frase è anche (per <strong><strong>un</strong>a</strong> sorta <strong>di</strong> proprietà transitiva) <strong>un</strong> array <strong>di</strong> caratteri. Quin<strong>di</strong>, il corpo <strong>di</strong> <strong>un</strong><br />

documento può essere descritto come <strong>un</strong> array <strong>di</strong> caratteri. Per tale ragione, per descrivere il<br />

testo <strong>di</strong> <strong>un</strong> documento si farà uso della classe Carattere con alc<strong>un</strong>e sottoclassi (fig. 1.19).<br />

La classe Carattere avrà gli attributi: co<strong>di</strong>ceASCII e tipo (il tipo informa sulla tipologia <strong>di</strong><br />

carattere, ovvero se esso è in formato normale, corsivo, grassetto o sottolineato) e definirà le<br />

operazioni: Normale(), Corsivo(), Grassetto() e Sottolineato(). Come <strong>di</strong>scendenti della classe<br />

Carattere si definirà poi: Lettera, SegnoDiP<strong>un</strong>teggiatura, CarattereSpeciale e Numero.<br />

Inoltre, nel corpo del documento possono comparire tabelle o immagini, entrambe costituiranno<br />

altre due nuove classi nel nostro <strong>di</strong>agramma.<br />

Figura 1.19: La classe carattere<br />

La Classe Tabella (fig.1.20) contiene gli attributi numeroDiRighe e numeroDiColonne e<br />

definisce le operazioni inserisciRiga( ) e inserisciColonna( ). Ogni tabella consiste <strong>di</strong> <strong><strong>un</strong>a</strong> o più<br />

celle e in ogni cella è possibile che compaiano testo o immagini.<br />

33


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 1.20: La classe tabella<br />

Utilizzando le associazioni tra le classi che si sono descritte si otterrà d<strong>un</strong>que il seguente<br />

Class Diagram che descrive l’esempio:<br />

Figura 1.21: Esempio <strong>di</strong> Class Diagram<br />

È importante rendersi conto che il <strong>di</strong>agramma precedente non costituisce la massima<br />

<strong>descrizione</strong> in particolare per <strong>un</strong> processo <strong>di</strong> scrittura <strong>di</strong> <strong>un</strong> documento <strong>di</strong> testo.<br />

Il modello descritto potrà essere specializzato sempre <strong>di</strong> più e, quin<strong>di</strong>, crescere in modo<br />

appropriato per poter consentire <strong>un</strong> appropriato lavoro <strong>di</strong> analisi e <strong>di</strong>segno.<br />

34


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

1.9 Use Case Diagrams: specifiche<br />

I Class Diagrams forniscono <strong><strong>un</strong>a</strong> visione statica delle classi che intervengono nella<br />

creazione <strong>di</strong> <strong>un</strong> Sistema. Il tipo <strong>di</strong> <strong>di</strong>agramma, <strong>di</strong> seguito considerato, presenterà invece <strong><strong>un</strong>a</strong><br />

visione <strong>di</strong>namica e mostrerà come il sistema e le relative classi cambino con il passare del<br />

tempo. La visione statica aiuta gli analisti nella com<strong>un</strong>icazione con il cliente, mentre la visione<br />

<strong>di</strong>namica del Sistema, fornisce agli analisti <strong>un</strong> valido mezzo per instaurare <strong>un</strong> <strong>di</strong>alogo chiaro<br />

con il team degli sviluppatori ed aiuta gli sviluppatori stessi a creare i programmi.<br />

Esattamente come il Class Diagram rappresenta <strong>un</strong> ottimo modo per stimolare il cliente a<br />

parlare sul sistema dal suo p<strong>un</strong>to <strong>di</strong> vista, lo Use Case Diagram rappresenta <strong>un</strong> eccellente<br />

strumento per stimolare dei potenziali utenti a intervenire con le loro critiche ed opinioni sulla<br />

f<strong>un</strong>zionalità che il Sistema dovrà avere. Non è sempre facile per gli utenti riuscire a spiegare<br />

tecnicamente come essi intendano costruire il sistema desiderato; infatti, acc<strong>ad</strong>e sempre più<br />

spesso che essi in realtà sappiano esprimersi meglio dal p<strong>un</strong>to <strong>di</strong> vista pratico che non dal p<strong>un</strong>to<br />

<strong>di</strong> vista prettamente tecnico. Lo use case (Caso d'uso) è allora lo strumento ideale per aiutare a<br />

"rompere il ghiaccio".<br />

Le interviste con gli utenti iniziano facendo uso della terminologia del dominio, ma poi<br />

deviano ed utilizzano la terminologia del cliente. I risultati iniziali delle interviste devono<br />

portare alla definizione <strong>di</strong> Actors (attori) e use cases <strong>ad</strong> alto livello che descrivano i requisiti<br />

f<strong>un</strong>zionali in termini generali. Ne risulta che già questa informazione è in gr<strong>ad</strong>o <strong>di</strong> fornire i<br />

limiti e gli scopi del sistema che si intende sviluppare. Nelle interviste successive con gli utenti<br />

si cercherà <strong>di</strong> approfon<strong>di</strong>re maggiormente tali requisiti, portando così alla definizione <strong>di</strong><br />

modelli use case che sod<strong>di</strong>sfino le relazioni <strong>di</strong> inclusione e estensione. In questa fase è<br />

importante la comprensione del dominio, poiché se si hanno lac<strong>un</strong>e in tal senso potrebbe<br />

acc<strong>ad</strong>ere che si sviluppino troppi use cases e che ciò possa provocare <strong>un</strong> rallentamento nel<br />

processo <strong>di</strong> analisi.<br />

Gli use case sono collezioni <strong>di</strong> scenari che riguardano l'utilizzo del sistema in cui ogni<br />

scenario descrive <strong><strong>un</strong>a</strong> sequenza <strong>di</strong> eventi. La sequenza <strong>di</strong> eventi descritta da <strong>un</strong>o use case viene<br />

iniziata da <strong><strong>un</strong>a</strong> persona, o da <strong>un</strong> altro sistema o da <strong>un</strong> pezzo <strong>di</strong> hardware o ancora dal passare<br />

del tempo.<br />

Le entità che iniziano la sequenza <strong>di</strong> eventi sono definiti Actors. Il risultato della sequenza<br />

deve portare a qualcosa <strong>di</strong> utile all'actor che ha iniziato la sequenza o, anche, <strong>ad</strong> <strong>un</strong> <strong>di</strong>fferente<br />

actor. È anche possibile riutilizzare gli use cases. Per far ciò si possono usare due mo<strong>di</strong>:<br />

35


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

• Inclusion: Questo modo permette <strong>di</strong> utilizzare i passi appartenenti <strong>ad</strong> <strong><strong>un</strong>a</strong> sequenza <strong>di</strong><br />

<strong>un</strong> use case e inglobarli in <strong>un</strong> altro use case;<br />

• Extension: Tramite questo metodo è possible creare <strong>un</strong> nuovo use case semplicemente<br />

aggi<strong>un</strong>gendo dei passi <strong>ad</strong> <strong>un</strong> use case esistente.<br />

Si vedrà ora come rappresentare <strong>un</strong> modello use case e visualizzare le relazioni tra più use<br />

cases.<br />

Introduzione all' Use Case Model<br />

Un actor inizia la sequenza <strong>di</strong> <strong>un</strong> particolare use case, ed <strong>un</strong> actor (possibilmente lo stesso<br />

che ha iniziato, ma non necessariamente) riceve <strong>un</strong> ritorno dallo use case (fig. 1.22).<br />

Figura 1.22: Use case<br />

Graficamente, <strong>un</strong> ellisse rappresenta <strong>un</strong> use case ed <strong>un</strong> omino rappresenta <strong>un</strong> actor. L'actor<br />

che inizia la sequenza <strong>di</strong> eventi <strong>di</strong> <strong>un</strong> use case viene sempre inserito alla sinistra dell'use case<br />

mentre, al contrario, l'actor che riceve gli effetti causati dalla sequenza scatenata dall'use case<br />

stesso, viene <strong>di</strong>segnato alla destra. Il nome dell'actor appare appena sotto la raffigurazione<br />

dello stesso actor mentre il nome dell'Use Case appare o dentro l'ellisse o appena al <strong>di</strong> sotto <strong>di</strong><br />

esso.<br />

Una linea <strong>di</strong> associazione, infine, connette <strong>un</strong> actor all'use case e rappresenta la<br />

com<strong>un</strong>icazione tra l'actor e lo use case. La linea <strong>di</strong> associazione è <strong><strong>un</strong>a</strong> linea continua, simile a<br />

quella che connette due classi in associazione tra loro. Ogni use case è <strong><strong>un</strong>a</strong> lista <strong>di</strong> scenari, ed<br />

ogni scenario è <strong><strong>un</strong>a</strong> sequenza <strong>di</strong> passi. Per ciasc<strong>un</strong> use case, ogni scenario avrà la sua propria<br />

pagina rappresentata nel seguente modo:<br />

• Un actor che dà inizio alla sequenza dell'use case;<br />

• Le Pre con<strong>di</strong>zioni per lo use case;<br />

36


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

• I passi dello scenario vero e proprio;<br />

• Le Post Con<strong>di</strong>zioni quando lo scenario è <strong>completo</strong>;<br />

• L'actor che beneficia dell'use case.<br />

Gli Use Case Diagram danno del valore aggi<strong>un</strong>to alla raccolta <strong>di</strong> informazioni. Essi<br />

visualizzano gli use case, facilitano la com<strong>un</strong>icazione tra gli analisti e gli utenti e tra gli analisti<br />

ed il cliente.<br />

Relazioni tra Use Cases<br />

Quando si è iniziato a parlare <strong>di</strong> Use Case Diagrams, si è detto che è possibile il riutilizzo<br />

<strong>di</strong> <strong>un</strong> Use Case e che ciò era fattibile utilizzando due mo<strong>di</strong>: tramite l'inclusion e tramite<br />

l'extension.<br />

L'inclusion e la extension rappresentano <strong><strong>un</strong>a</strong> sorta <strong>di</strong> relazioni tra use case. In effetti,<br />

esistono anche altri due tipi <strong>di</strong> relazioni applicabili agli use cases : le generalizzazione<br />

(Generalization) e il raggruppamento (Grouping). Tali relazioni sono <strong>di</strong> seguito definite.<br />

Inclusion<br />

L'inclusion permette il riutilizzo <strong>di</strong> <strong>un</strong> use case all'interno <strong>di</strong> <strong>un</strong> altro use case. Per<br />

rappresentare graficamente <strong><strong>un</strong>a</strong> inclusion, si utilizza il simbolo utilizzato per la <strong>di</strong>pendenza tra<br />

classi, <strong><strong>un</strong>a</strong> linea tratteggiata che connette le classi con <strong><strong>un</strong>a</strong> freccia che p<strong>un</strong>ta sulla classe da cui<br />

<strong>di</strong>pende l'altra classe. Appena sotto questa linea, si aggi<strong>un</strong>ge <strong>un</strong>o stereotipo: la parola<br />

racchiusa, come si vede, tra doppie parentesi formate dai simboli "".<br />

Extension<br />

L'extension permette <strong>di</strong> creare <strong>un</strong> nuovo use case aggi<strong>un</strong>gendo dei passi in più <strong>ad</strong> <strong>un</strong> use<br />

case già esistente. Anche qui <strong><strong>un</strong>a</strong> linea tratteggiata con <strong><strong>un</strong>a</strong> freccia finale viene utilizzata per<br />

rappresentare l'extension, insieme con <strong>un</strong>o stereotipo che mostra la parola tra<br />

parentesi. All'interno dell'use case base, il p<strong>un</strong>to <strong>di</strong> extension appare sotto il nome dell'use case<br />

stesso.<br />

Generalization<br />

Le classi, come si è visto, possono ere<strong>di</strong>tare le caratteristiche <strong>di</strong> <strong>un</strong>'altra classe (classe<br />

p<strong>ad</strong>re). Allo stesso modo, tale ragionamento è applicabile agli use case. Nella ere<strong>di</strong>tà tra use<br />

37


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

case, lo use case figlio ere<strong>di</strong>ta il comportamento ed il significato dal p<strong>ad</strong>re ed in più aggi<strong>un</strong>ge<br />

le sue caratteristiche specifiche. Anche in questo caso vale lo stesso ragionamento applicato nel<br />

caso delle classi: e' possibile applicare lo use case figlio, l<strong>ad</strong>dove è possibile applicare il p<strong>ad</strong>re.<br />

La generalization viene rappresentata allo stesso modo con cui viene rappresentata per le classi,<br />

ovvero con <strong><strong>un</strong>a</strong> linea continua che ha <strong>un</strong> triangolo aperto che p<strong>un</strong>ta al p<strong>ad</strong>re. La relazione <strong>di</strong><br />

generalization può esistere anche tra actors.<br />

Grouping<br />

In alc<strong>un</strong>i use case <strong>di</strong>agrams, ci potrebbero essere molti use case e, magari, si desidererebbe<br />

organizzare il <strong>di</strong>agramma in modo migliore. Una tale situazione si può verificare quando si sta<br />

progettando <strong>un</strong> sistema che consiste <strong>di</strong> più sottosistemi. Il modo più semplice è <strong>di</strong> organizzare a<br />

gruppi gli use case che in qualche modo siano correlati (qualcosa <strong>di</strong> simile <strong>ad</strong> <strong>un</strong> tabbed<br />

folder).<br />

Use Case Diagram - esempio<br />

In questo esempio si cercherà <strong>di</strong> modellare, tramite gli use case <strong>di</strong>agrams, <strong><strong>un</strong>a</strong> macchina<br />

self-service per alimenti e bevande. La principale f<strong>un</strong>zione <strong>di</strong> <strong><strong>un</strong>a</strong> siffatta macchina è,<br />

ovviamente, quella <strong>di</strong> permettere <strong>ad</strong> <strong>un</strong> utente <strong>di</strong> acquistare <strong>un</strong> prodotto alimentare (cioccolata,<br />

succo <strong>di</strong> frutta, e cosi via). Ogni utente che interagisca con la macchina potrà, certamente, <strong>di</strong>re<br />

che la principale f<strong>un</strong>zione (e quin<strong>di</strong> il principale use case) della macchina stessa potrà essere<br />

definita come : "Acquisto <strong>di</strong> <strong>un</strong> prodotto".<br />

Si proverà pertanto <strong>ad</strong> esaminare ogni possibile scenario all'interno <strong>di</strong> questo use case. Gli<br />

scenari che ne derivano saranno, naturalmente, scaturiti dalle conversazioni con l'utente.<br />

Lo use case "Acquista <strong>un</strong> prodotto"<br />

L'actor in questo use case è il cliente. Il cliente vuole comprare alc<strong>un</strong>i dei prodotti offerti<br />

dalla macchina self-service. Per prima cosa egli dovrà inserire delle monete all'interno della<br />

macchina, poi selezionare il tipo <strong>di</strong> prodotto (o più <strong>di</strong> <strong>un</strong>o, se la macchina lo consente) e quin<strong>di</strong><br />

ricevere dalla macchina la lista dei prodotti scelti prima <strong>di</strong> procedere all'acquisto vero e proprio.<br />

Lo use case per tale tipo <strong>di</strong> scenario può essere il seguente (fig. 1.23):<br />

38


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 1.23: Esempio <strong>di</strong> use case<br />

Se si pensa <strong>un</strong> attimo più approfon<strong>di</strong>tamente è possibile che la macchina self-service non sia in<br />

gr<strong>ad</strong>o, <strong>ad</strong> <strong>un</strong> certo momento, <strong>di</strong> fornire <strong>un</strong>o o più prodotti oppure che la macchina non abbia a<br />

<strong>di</strong>sposizione l'esatto numero <strong>di</strong> monete per fornire il resto al cliente. Se è stato chiesto <strong>di</strong> gestire<br />

questi tipi <strong>di</strong> scenari bisogna tornare <strong>un</strong> attimo in<strong>di</strong>etro al momento in cui il cliente inserisce le<br />

monete nella macchina ed effettua la selezione. Si Supponga che la macchina, a questo p<strong>un</strong>to,<br />

non sia in gr<strong>ad</strong>o <strong>di</strong> sod<strong>di</strong>sfare la richiesta del cliente. In tal caso sarà preferibile presentare <strong>un</strong><br />

messaggio al cliente che lo informi che la macchina non ha come <strong>di</strong>sponibile il prodotto scelto<br />

e che permetta al cliente stesso <strong>di</strong> effettuare <strong><strong>un</strong>a</strong> nuova scelta o richiedere la restituzione delle<br />

monete.<br />

Se, invece, si è verificato lo scenario in cui è stato fornito <strong>un</strong> errato ammontare <strong>di</strong> monete, si<br />

suppone che la macchina restituirà l'importo originale <strong>di</strong> sol<strong>di</strong> al cliente. La precon<strong>di</strong>zione, in<br />

tal caso, è il cliente e la post con<strong>di</strong>zione è il prodotto acquistato o la restituzione dei sol<strong>di</strong>.<br />

Quanto descritto rappresenta lo scenario <strong>di</strong> <strong>un</strong> use case dal p<strong>un</strong>to <strong>di</strong> vista <strong>di</strong> <strong>un</strong> utente (e<br />

quin<strong>di</strong> <strong>di</strong> <strong>un</strong> actor). Ma potrebbero esserci anche altri tipi <strong>di</strong> actors. Per esempio, <strong>un</strong> fornitore<br />

<strong>di</strong> prodotti deve essere in gr<strong>ad</strong>o rifornire la macchina e il proprietario della macchina deve<br />

poter recuperare le monete accumulate. Questo induce a creare almeno altri due use case ossia:<br />

"Ricarica la Macchina" e "Ritira le Monete". Si considerino ora entrambi gli eventi, simulando<br />

<strong>un</strong>' intervista con il fornitore e con il proprietario.<br />

Lo use case "Ricarica la Macchina"<br />

Le azioni che <strong>un</strong> fornitore dovrà compiere <strong>ad</strong> intervalli <strong>di</strong> tempo regolari sono:<br />

• Il fornitore <strong>di</strong>sattiva la macchina;<br />

• Apre il contenitore dei prodotti;<br />

• Riempie ogni scompartimento fino alla massima capacità (Si potrebbe anche supporre<br />

che il fornitore riempia la macchina tenendo conto delle maggiori preferenze dei<br />

clienti);<br />

• Alla fine, il fornitore chiude il contenitore dei prodotti e riattiva la macchina.<br />

39


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

In questo caso, si potrà <strong>di</strong>re che la precon<strong>di</strong>zione è rappresentata dal trascorrere<br />

dell'intervallo <strong>di</strong> tempo tra <strong><strong>un</strong>a</strong> ricarica e l'altra e la post con<strong>di</strong>zione è data dal fatto che il<br />

fornitore ottiene <strong>un</strong> nuovo insieme <strong>di</strong> potenziali clienti. Lo use case <strong>di</strong>agram, in questo caso, è<br />

rappresentato dalla seguente figura:<br />

Figura 1.24: Lo use case “ricarica la macchina”<br />

Lo use case "Ritira Le Monete"<br />

Il responsabile per questo use case è il proprietario della macchina. In effetti, tuttavia, questi<br />

potrebbe coincidere con il fornitore. I passi che il proprietario della macchina deve fare sono<br />

uguali a quelli del fornitore. La <strong>di</strong>fferenza consiste nel fatto che il proprietario non ha a che fare<br />

con i prodotti, ma con i sol<strong>di</strong>. Quando l'intervallo <strong>di</strong> tempo tra <strong>un</strong> ritiro e l'altro è trascorso, il<br />

proprietario della macchina ritira l'ammontare <strong>di</strong> monete che si è depositato nella macchina. La<br />

post con<strong>di</strong>zione, in tal caso, è rappresentata dai sol<strong>di</strong> ritirati dal proprietario. Lo use case che<br />

descrive tale scenario è, d<strong>un</strong>que, rappresentato in figura 1.25:<br />

Figura 1.25: Lo use case ritira le monete<br />

Molti dei passi necessari allo use case "Ritira le monete" (<strong>di</strong>sattivare la macchina, aprire il<br />

contenitore, ecc.) sono uguali a quelli visti per lo use case "Ricarica la macchina". Questo è <strong>un</strong><br />

buon motivo per avvalersi dell'utilizzo dell'inclusion. E’ possibile allora combinare i due passi<br />

“Disattiva la macchina” e “apre il contenitore” in <strong>un</strong>o use case denominato: "Disattiva la<br />

macchina". Alla stessa maniera si definisce <strong>un</strong> nuovo use case dal nome "Riattiva la<br />

Macchina" che inglobi i passi <strong>di</strong> chiudere il contenitore e riattivare la macchina. Si Otterrà<br />

quanto riportato in figura 1.26:<br />

40


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 1.26: Use case <strong>completo</strong><br />

Lo use case "Ricarica la macchina" potrebbe essere la base per <strong>un</strong> altro use case: "Ricarica<br />

la macchina in base alle ven<strong>di</strong>te". Qui, il fornitore può riempire gli scompartimenti non più in<br />

modo <strong>un</strong>iforme per ogni prodotto ma in base alle ven<strong>di</strong>te dei singoli prodotti. Questo<br />

rappresenta <strong>un</strong> buon esempio <strong>di</strong> extension <strong>di</strong> <strong>un</strong> use case. Dopo l'inclusion e l'extension così<br />

definiti, lo use case "Ricarica la macchina" può <strong>di</strong>ventare pertanto (fig. 1.27):<br />

Figura 1.27: Ricarica la macchina – <strong><strong>un</strong>a</strong> variante<br />

41


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Si può anche utilizzare la generalizzazione guardando gli actors: fornitore e proprietario.<br />

Sarà possibile definire <strong>un</strong> actor più generico (Agente del Fornitore) che inglobi molte delle<br />

caratteristiche del Proprietario e del Fornitore. Tale generalizzazione è mostrata nella figura<br />

1.28.<br />

Figura 1.28: Esempio <strong>di</strong> generalizzazione <strong>di</strong> <strong>un</strong> actor<br />

Figura 1.29: Diagramma finale<br />

La figura 1.29 mostra il <strong>di</strong>agramma finale <strong>completo</strong> per la macchina self service.<br />

42


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

1.10 State Diagrams<br />

Si descrivono <strong>ad</strong>esso, elementi che non sono stati ancora esaminati. Tali elementi sono detti<br />

elementi comportamentali e mostrano come varie parti <strong>di</strong> <strong>un</strong> <strong>di</strong>agramma <strong>UML</strong> possano<br />

cambiare nel tempo.<br />

Allo stesso modo in cui <strong>un</strong> sistema interagisce con gli utenti, e possibilmente con altri<br />

sistemi, così gli oggetti che costituiscono il sistema stesso passano attraverso i necessari<br />

cambiamenti che servono a favorire le interazioni.<br />

Se si sta modellando <strong>un</strong> sistema, è necessario avere <strong>un</strong> meccanismo che gestisca le<br />

mo<strong>di</strong>fiche all'interno del modello stesso. Tale meccanismo, in <strong>UML</strong>, è rappresentato dagli<br />

State Diagrams.<br />

Per esempio, quando si preme <strong>un</strong> interruttore, <strong><strong>un</strong>a</strong> lamp<strong>ad</strong>a cambia il suo stato da spento <strong>ad</strong><br />

acceso (o viceversa). Oppure, ancora, quando si preme <strong>un</strong> tasto della tastiera o si muove il<br />

mouse durante il f<strong>un</strong>zionamento <strong>di</strong> <strong>un</strong>o screen saver sul computer, il computer abbandona la<br />

modalità <strong>di</strong> screen saver e ritorna a f<strong>un</strong>zionare regolarmente in modo attivo.<br />

Gli State Diagrams visualizzano gli stati che <strong>un</strong> oggetto può attraversare e i passaggi<br />

transitori che intercorrono tra questi stati. Inoltre gli State Diagrams mostrano il p<strong>un</strong>to <strong>di</strong><br />

partenza e il p<strong>un</strong>to <strong>di</strong> arrivo <strong>di</strong> <strong><strong>un</strong>a</strong> sequenza <strong>di</strong> cambi <strong>di</strong> stato. Uno State Diagram mostra gli<br />

stati <strong>di</strong> <strong>un</strong> singolo oggetto.<br />

Si consideri ora la rappresentazione grafica. Gli stati <strong>di</strong> <strong>un</strong>o State Diagram sono<br />

rappresentati con <strong>un</strong> rettangolo con gli angoli arrotondati. Il simbolo che mostra la transizione<br />

da <strong>un</strong>o stato <strong>ad</strong> <strong>un</strong> altro viene <strong>di</strong>segnato utilizzando <strong><strong>un</strong>a</strong> linea continua che termina con <strong><strong>un</strong>a</strong><br />

freccia.<br />

Un cerchio nero pieno rappresenta il p<strong>un</strong>to <strong>di</strong> partenza <strong>di</strong> <strong><strong>un</strong>a</strong> sequenza <strong>di</strong> stati mentre il<br />

p<strong>un</strong>to <strong>di</strong> arrivo viene rappresentato da due cerchi concentrici in cui il più interno è riempito <strong>di</strong><br />

nero (tale figura viene anche definita "occhio <strong>di</strong> bue").<br />

Figura 1.30: State <strong>di</strong>agram<br />

43


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Nella figura precedente si può vedere <strong>un</strong> esempio <strong>di</strong> quanto detto. Inoltre, come si può<br />

notare, è possibile aggi<strong>un</strong>gere maggiori dettagli alla figura stessa <strong>di</strong>videndo il rettangolo in tre<br />

aree separate.<br />

L'area in alto contiene il nome dello stato, l'area centrale contiene le variabili <strong>di</strong> stato<br />

(timers, contatori, date, ecc.) e l'area in basso rappresenta le attività (cioè quello che acc<strong>ad</strong>e<br />

quando il sistema entra in <strong>un</strong> determinato stato e cosa, invece, succede quando il sistema<br />

abbandona quello stato.<br />

Dettagli <strong>di</strong> Stato e Transizioni<br />

È possibile in<strong>di</strong>care sugli State Diagram <strong>un</strong> evento che causa il verificarsi <strong>di</strong> <strong><strong>un</strong>a</strong> transizione<br />

(<strong>un</strong> evento trigger) e l'azione che viene eseguita che fa sì che il cambio <strong>di</strong> stato possa avvenire.<br />

Per aggi<strong>un</strong>gere graficamente eventi e azioni si scrive vicino la linea <strong>di</strong> transizione <strong><strong>un</strong>a</strong><br />

<strong>descrizione</strong> <strong>di</strong> essi, utilizzando <strong><strong>un</strong>a</strong> barra per separare <strong>un</strong> evento <strong>di</strong> trigger da <strong>un</strong>'azione.<br />

Qualche volta può acc<strong>ad</strong>ere che <strong>un</strong> evento causi <strong><strong>un</strong>a</strong> transizione senza azioni associate e,<br />

qualche altra volta <strong><strong>un</strong>a</strong> transizione si verifica perchè <strong>un</strong>o stato completa <strong>un</strong>'attività (piuttosto<br />

che a causa <strong>di</strong> <strong>un</strong> evento). Questo tipo <strong>di</strong> transizione viene chiamata transizione senza trigger<br />

(triggerless transition).<br />

È anche possibile inserire <strong><strong>un</strong>a</strong> con<strong>di</strong>zione <strong>di</strong> controllo (guard con<strong>di</strong>tion). Quando la si<br />

incontra, la transizione ha luogo. (Per esempio lo screen saver viene attivato quando l'intervallo<br />

<strong>di</strong> tempo <strong>di</strong> x minuti viene raggi<strong>un</strong>to).<br />

Gli State Diagrams consentono, inoltre, <strong>di</strong> definire degli stati all'interno <strong>di</strong> altri stati. In tal<br />

caso, gli stati interni verranno definiti sotto-stati (substates) i quali, a loro volta, possono essere<br />

<strong>di</strong>sinti in sottostati sequenziali e sottostati concorrenti.<br />

I primi, come si evince dal nome stesso, rappresentano <strong><strong>un</strong>a</strong> sequenza <strong>di</strong> stati che vengono<br />

raggi<strong>un</strong>ti <strong>un</strong>o susseguentemente all'altro. I sottostati concorrenti, invece, rappresentano due o<br />

più sottostati sequenziali che si verificano allo stesso tempo. Tutto ciò viene rappresentato<br />

graficamente con <strong><strong>un</strong>a</strong> linea tratteggiata tra gli stati concorrenti. Per comprendere meglio questi<br />

concetti, com<strong>un</strong>que, si faccia riferimento all'esempio del paragrafo successivo.<br />

L'<strong>UML</strong> fornisce <strong>un</strong> simbolo che mostra che <strong>un</strong>o stato composto ricorda i suoi attivi<br />

sottostati quando l'oggetto effettua transizioni fuori dallo stato composto. Il simbolo usato è:<br />

<strong>un</strong>ito da <strong><strong>un</strong>a</strong> linea continua ai sottostati "ricordati", con <strong><strong>un</strong>a</strong> freccia che p<strong>un</strong>ta al sottostato<br />

opport<strong>un</strong>o.<br />

44


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Un messaggio che causa <strong><strong>un</strong>a</strong> transizione in <strong>un</strong> oggetto dello State Diagram (che riceve il<br />

messaggio stesso) viene chiamato segnale (signal).<br />

Nel mondo orientato agli oggetti, il mandare <strong>un</strong> segnale viene visto allo stesso modo come<br />

la creazione <strong>di</strong> <strong>un</strong> oggetto Segnale e la trasmssione <strong>di</strong> questo <strong>ad</strong> <strong>un</strong> oggetto Ricevente.<br />

L'oggetto Segnale può avere delle proprietà che saranno rappresentate da attributi.<br />

Infine, poiché <strong>un</strong> segnale è <strong>un</strong> oggetto, è anche possibile creare gerarchie <strong>di</strong> ere<strong>di</strong>tarietà <strong>di</strong><br />

segnali.<br />

State Diagram - Un esempio pratico<br />

Si supponga <strong>di</strong> voler creare <strong>un</strong> modello che descriva il f<strong>un</strong>zionamento <strong>di</strong> <strong>un</strong> tostapane,<br />

rivolgendo l’attenzione agli state <strong>di</strong>agram che <strong>un</strong> simile sistema può avere. Quali sono i passi<br />

perchè <strong>un</strong> tostapane riesca a preparare <strong>un</strong> toast ?<br />

Per prima cosa bisognerà accendere il tostapane, quin<strong>di</strong> mettere le fette <strong>di</strong> pan carrè<br />

all'interno <strong>di</strong> esso ed attendere alc<strong>un</strong>i minuti perchè sia cotto il toast. Lo state <strong>di</strong>agram iniziale<br />

sarà, d<strong>un</strong>que (fig. 1.31):<br />

Figura 1.31: Esempio <strong>di</strong> state <strong>di</strong>agram<br />

Ma quello rappresentato non è il <strong>di</strong>agramma finale. Per prevenire che il toast si bruci, la<br />

resistenza del tostapane deve produrre calore che non superi determinati valori <strong>di</strong> temperatura.<br />

Naturalmente, perchè il toast si cuocia a dovere è necessario anche che la temperatura non v<strong>ad</strong>a<br />

al <strong>di</strong> sotto <strong>di</strong> <strong>un</strong> certo valore minimo.<br />

Per tale ragione <strong>un</strong> termometro misura la temperatura prodotta dalla resistenza e quando il<br />

limite massimo viene raggi<strong>un</strong>to la resistenza passa in <strong>un</strong>o stato <strong>di</strong> attesa e non emette altro<br />

calore. Tale stato perdura finché la temperatura decresce fino <strong>ad</strong> arrivare al valore minimo. A<br />

questo p<strong>un</strong>to ritorna lo stato <strong>di</strong> "In Lavorazione". Con questi ulteriori dettagli, lo State Diagram<br />

<strong>di</strong>verrà come riportato in figura 1.32:<br />

45


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 1.32: State <strong>di</strong>agram dettagliato<br />

Ma per descrivere la transizione tra lo stato <strong>di</strong> "In Lavorazione" e lo stato "Inattivo" è<br />

necessario aggi<strong>un</strong>gere dei sottostati al <strong>di</strong>agramma, come mostrato nella prossima figura:<br />

Figura 1.33: Descrizione della transizione<br />

Si può notare che gli stati "In Lavorazione " e "Inattivo" sono molto simili. Entrambi<br />

devono misurare e comparare gli stati ma si <strong>di</strong>fferenziano nel processo <strong>di</strong> confronto della<br />

temperatura. Infatti, lo stato <strong>di</strong> "In Lavorazione" deve comparare la temperatura corrente con la<br />

temperatura limite superiore (se viene raggi<strong>un</strong>ta allora si passa allo stato "Inattivo") e lo stato<br />

"Inattivo" confronta la temperatura corrente con la temperatura limite inferiore (lo stato<br />

"Inattivo" viene rimpiazzato dallo stato <strong>di</strong> "In Lavorazione" quando acc<strong>ad</strong>e che la temperatura<br />

scende al <strong>di</strong> sotto del limite).<br />

46


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

È opport<strong>un</strong>o utilizzare gli State Diagrams perché essi aiutano gli analisti, i <strong>di</strong>segnatori e gli<br />

sviluppatori a capire il comportamento degli oggetti in <strong>un</strong> sistema. Gli sviluppatori, in<br />

particolare, devono conoscere come gli oggetti devono comportarsi in quanto è loro compito<br />

tr<strong>ad</strong>urre tali comportamenti in software e quant’altro.<br />

1.11 Sequence Diagrams<br />

Gli State Diagrams, analizzati nel precedente paragrafo, focalizzano la loro attenzione sugli<br />

stati <strong>di</strong> <strong>un</strong> oggetto. Ma è necessario, oltre alla definizione degli stati, instaurare <strong><strong>un</strong>a</strong><br />

com<strong>un</strong>icazione tra gli oggetti. L'<strong>UML</strong>, a tale proposito definisce il Sequence Diagram che,<br />

app<strong>un</strong>to, permette <strong>di</strong> modellare la com<strong>un</strong>icazione tra <strong>un</strong> oggetto ed <strong>un</strong> altro in relazione al<br />

trascorrere del tempo. Si capisce subito che in questo tipo <strong>di</strong> rappresentazione <strong>un</strong> ruolo cruciale<br />

viene svolto dal tempo.<br />

L'idea chiave qui è che le interazioni tra gli oggetti avvengano seguendo <strong>un</strong> or<strong>di</strong>ne ben<br />

preciso e che tale sequenza avvenga, nel tempo, dall'inizio alla fine.<br />

Il Sequence <strong>di</strong>agram è costituito da oggetti rappresentati nel modo ormai usuale - come<br />

rettangoli recanti <strong>un</strong> nome (con il nome sottolineato), messaggi rappresentati da linee continue<br />

recanti <strong><strong>un</strong>a</strong> freccia alla loro fine e il tempo rappresentato come progressione verticale. Si<br />

analizzino ora i componenti <strong>di</strong> <strong>un</strong> sequence <strong>di</strong>agram.<br />

I componenti dei Sequence Diagrams<br />

Oggetti<br />

Gli oggetti sono <strong>di</strong>segnati vicino la sommità del <strong>di</strong>agramma e sono <strong>di</strong>sposti in sequenza da<br />

sinistra verso destra. Essi possono essere inseriti in <strong>un</strong> qual<strong>un</strong>que or<strong>di</strong>ne che semplifichi la<br />

comprensione del <strong>di</strong>agramma. <strong>Da</strong> ogni rettangolo parte <strong><strong>un</strong>a</strong> linea tratteggiata verso il basso,<br />

denominata "linea della vita" (lifeline). L<strong>un</strong>go la lifeline si trova <strong>un</strong> piccolo rettangolo chiamato<br />

"attivazione" (activation). L'activation rappresenta l'esecuzione <strong>di</strong> <strong>un</strong>'operazione <strong>di</strong> cui<br />

l'oggetto si fa carico. La l<strong>un</strong>ghezza del rettangolo, invece, rappresenta la durata dell'activation.<br />

Tutto questo è mostrato nella figura 1.34:<br />

47


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 1.34: Sequence <strong>di</strong>agram<br />

Messaggi<br />

Un messaggio che viaggia da <strong>un</strong> oggetto <strong>ad</strong> <strong>un</strong> altro, viene <strong>di</strong>segnato a partire dalla lifeline<br />

dell'oggetto da cui parte il messaggio e arriva sulla lifeline dell'oggetto a cui il messaggio è<br />

<strong>di</strong>retto.<br />

Si può anche verificare il caso in cui <strong>un</strong> oggetto man<strong>di</strong> <strong>un</strong> messaggio a se stesso, cioè <strong>un</strong><br />

messaggio che parte dalla sua lifeline e arriva alla stessa lifeline. Tale tipo <strong>di</strong> comportamento<br />

viene definito Ricorsione.<br />

Nella tabella 1.2 vengono identificati tutti i possibili messaggi definiti in <strong>UML</strong> per i<br />

sequence <strong>di</strong>agrams, ogn<strong>un</strong>o dei quali, come si vede, ha <strong><strong>un</strong>a</strong> rappresentazione grafica <strong>di</strong>fferente.<br />

simple<br />

synchronous<br />

asynchronous<br />

Rappresenta il trasferimento del controllo da<br />

<strong>un</strong> oggetto <strong>ad</strong> <strong>un</strong> altro.<br />

Se <strong>un</strong> oggetto invia <strong>un</strong> messaggio sincrono,<br />

allora si attende che gli venga restituita <strong><strong>un</strong>a</strong><br />

risposta al messaggio stesso prima <strong>di</strong> poter<br />

continuare con altre operazioni.<br />

Diversamente dai messaggi sincroni, se <strong>un</strong><br />

oggetto invia <strong>un</strong> messaggio asincrono, non<br />

attende che gli venga inviata alc<strong><strong>un</strong>a</strong> risposta<br />

prima <strong>di</strong> continuare con altre operazioni<br />

Tabella 1.2: Messaggi per i sequence <strong>di</strong>agrams<br />

48


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Il Tempo<br />

Il sequence <strong>di</strong>agram rappresenta il trascorrere del tempo se visto in <strong>di</strong>rezione verticale. Il<br />

tempo, graficamente, viene fatto partire alla base <strong>di</strong> ogni oggetto e proseguire fino in basso. Ad<br />

esempio, <strong>un</strong> messaggio che si trovi più vicino all'oggetto rispetto <strong>ad</strong> <strong>un</strong> altro (rispetto alla<br />

<strong>di</strong>rezione verticale), si verificherà prima nel tempo.<br />

Figura 1.35: Il tempo<br />

Nei sequence <strong>di</strong>agram viene utilizzato il simbolo dell'actor per rappresentare l'inizio della<br />

sequenza, ma in realtà tale simbolo (come visto quando si è <strong>di</strong>scusso degli Use Case <strong>di</strong>agrams)<br />

non appartiene all'insieme dei simboli propri del sequence <strong>di</strong>agram.<br />

Mo<strong>di</strong> <strong>di</strong> creare le Sequenze<br />

In maniera uguale agli use case <strong>di</strong>agrams in cui è possibile mostrare o <strong>un</strong>'istanza (<strong>un</strong>o<br />

scenario) singola <strong>di</strong> <strong>un</strong>o use case o, più genericamente, <strong>un</strong> insieme degli scenari <strong>di</strong> <strong>un</strong> use case,<br />

così i sequence <strong>di</strong>agrams possono essere definiti su <strong><strong>un</strong>a</strong> singola istanza oppure definire <strong>un</strong><br />

modello più generico.<br />

49


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

I sequence <strong>di</strong>agrams generici forniscono spesso la possibilità <strong>di</strong> rappresentare delle<br />

istruzioni con<strong>di</strong>zionali (if) e dei cicli while in cui ogni con<strong>di</strong>zione descritta da <strong>un</strong> if (oppure da<br />

<strong>un</strong> while) viene racchiusa tra parentesi qu<strong>ad</strong>rate (nel caso del while la parentesi qu<strong>ad</strong>rata<br />

sinistra viene preceduta da <strong>un</strong> asterisco). Si consideri l'esempio <strong>di</strong> seguito riportato, per<br />

maggiore chiarezza.<br />

Esiste la possibilità, in <strong>un</strong> sequence <strong>di</strong>agram, <strong>di</strong> creare <strong>un</strong> oggetto. Quando ciò avviene,<br />

l'oggetto creato viene rappresentato nel modo visto finora e cioè con <strong>un</strong> rettangolo all'interno<br />

del quale viene descritto il nome dell'oggetto.<br />

La <strong>di</strong>fferenza, in questo caso, consiste nel fatto che l'oggetto non viene posizionato alla<br />

sommità del sequence <strong>di</strong>agram come si farebbe con gli altri oggetti ma, piuttosto, l<strong>un</strong>go la<br />

<strong>di</strong>mensione verticale che in<strong>di</strong>ca il tempo in cui tale oggetto viene creato.<br />

Può acc<strong>ad</strong>ere, qualche volta, che <strong>un</strong> oggetto esegua <strong>un</strong>'operazione che invochi lo stesso<br />

oggetto che l'ha provocata. In tal caso si parla <strong>di</strong> ricorsione. Ad esempio, si supponga che <strong>un</strong>o<br />

degli oggetti del sistema sia <strong>un</strong> calcolatore e che <strong><strong>un</strong>a</strong> delle sue operazioni sia il calcolo degli<br />

interessi. Al fine <strong>di</strong> permettere il calcolo per <strong>un</strong> lasso <strong>di</strong> tempo che racchiuda parecchi perio<strong>di</strong>,<br />

l'operazione per calcolare gli interessi deve invocare se stessa <strong>di</strong>verse volte. Il sequence<br />

<strong>di</strong>agram in figura 1.36, mostra tale caso:<br />

Figura 1.36: La ricorsione nel sequence <strong>di</strong>agram<br />

Sequence Diagram - Un esempio<br />

Si consideri lo stesso esempio visto in precedenza, ovvero quello della macchina Self-<br />

Service. Si definiscano i seguenti tre oggetti della Macchina Self-Service con cui verrà descritto<br />

il <strong>di</strong>agramma:<br />

• La Parte Frontale. - L'interfaccia che la macchina presenta all'utente;<br />

50


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

• La Cassetta delle monete - La parte in cui vengono accumulate le monete e che gestisce<br />

i vari controlli della macchina;<br />

• Il Contenitore dei Prodotti - La parte che contiene gli alimenti che vengono acquistati<br />

dal cliente.<br />

Il Sequence Diagram farà uso della seguente serie <strong>di</strong> azioni:<br />

• Il cliente inserisce le monete nella macchina;<br />

• Il cliente esegue la selezione del prodotto desiderato;<br />

• Le monete arrivano nella Cassetta delle Monete;<br />

• Il <strong>di</strong>spositivo <strong>di</strong> controllo della Cassetta delle monete verifica se il prodotto desiderato<br />

è presente nel Contenitore dei Prodotti;<br />

• La Cassetta delle Monete aggiorna la sua riserva <strong>di</strong> monete;<br />

• Il <strong>di</strong>spositivo <strong>di</strong> controllo della Cassetta delle Monete informa il Contenitore dei<br />

Prodotti che può espellere il prodotto desiderato dalla Parte Frontale della macchina.<br />

Figura 1.37: Esempio <strong>di</strong> sequence <strong>di</strong>agram<br />

51


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Collaboration Diagrams<br />

I collaboration <strong>di</strong>agrams rappresentano <strong>un</strong> tipo <strong>di</strong> <strong>di</strong>agramma molto simile a quello appena<br />

visto nei sequence <strong>di</strong>agram. Infatti, essi mostrano come interagiscono gli oggetti tra <strong>di</strong> loro,<br />

mettendo in risalto gli oggetti attraverso i quali viaggiano i messaggi che gli stessi oggetti si<br />

scambiano tra <strong>di</strong> loro. Sorge allora spontanea la domanda: Ma se già i sequence <strong>di</strong>agrams<br />

realizzano tali operazioni, perché l'<strong>UML</strong> ha bisogno <strong>di</strong> <strong>un</strong> altro <strong>di</strong>agramma dello stesso tipo ?<br />

Non svolgono le stesse f<strong>un</strong>zioni ?<br />

In effetti, il sequence <strong>di</strong>agram e il collaboration <strong>di</strong>agram sono simili. In particolare, si può<br />

<strong>di</strong>re che essi sono semanticamente equivalenti. Ovvero, i due <strong>di</strong>agrammi presentano la stessa<br />

informazione ed è facile convertire <strong>un</strong> sequence <strong>di</strong>agram in <strong>un</strong> collaboration <strong>di</strong>agram e<br />

viceversa. La principale <strong>di</strong>stinzione tra i due <strong>di</strong>agrammi, è che il sequence <strong>di</strong>agram è costruito<br />

seguendo come filo conduttore il tempo mentre il collaboration <strong>di</strong>agram si basa sullo spazio.<br />

Un collaboration <strong>di</strong>agram è <strong>un</strong>'estensione <strong>di</strong> <strong>un</strong> <strong>di</strong>agramma <strong>di</strong> oggetti. In più, oltre alle<br />

associazioni tra gli oggetti, esso consente <strong>di</strong> mostrare i messaggi che essi inviano per interagire<br />

tra <strong>di</strong> loro.<br />

I messaggi tra gli oggetti sono rappresentati con delle frecce che p<strong>un</strong>tano all'oggetto che<br />

riceve il messaggio stesso. Tali frecce sono posizionate vicino la linea <strong>di</strong> associazione tra gli<br />

oggetti. Una label vicino la freccia in<strong>di</strong>ca la specifica <strong>di</strong> <strong>un</strong> messaggio. Un messaggio,<br />

tipicamente, richiede all'oggetto ricevente <strong>di</strong> eseguire <strong><strong>un</strong>a</strong> delle sue operazioni. Una coppia <strong>di</strong><br />

parentesi terminano il messaggio; al loro interno si trovano gli eventuali parametri con cui le<br />

operazioni lavorano.<br />

Come detto, i collaboration <strong>di</strong>agrams possono essere convertiti in sequence <strong>di</strong>agrams e<br />

viceversa. Per far ciò, però, si deve tenere presente che è necessario aggi<strong>un</strong>gere <strong>un</strong> numero alla<br />

label <strong>di</strong> <strong>un</strong> messaggio che corrisponda all'or<strong>di</strong>ne in cui il messaggio appare nella sequenza. Il<br />

segno dei due p<strong>un</strong>ti separa il numero dal messaggio.<br />

Scrivere dei Collaboration Diagrams<br />

È possibile mostrare, in <strong>un</strong> collaboration <strong>di</strong>agram, il cambio <strong>di</strong> stato <strong>di</strong> <strong>un</strong> oggetto. Si<br />

possono mostrare, inoltre, le con<strong>di</strong>zioni allo stesso modo in cui esse sono rappresentate<br />

all'interno <strong>di</strong> <strong>un</strong> sequence <strong>di</strong>agram.<br />

Nel rettangolo che rappresenta l'oggetto si in<strong>di</strong>ca lo stato dell'oggetto stesso. Al <strong>di</strong>agramma<br />

si aggi<strong>un</strong>ge <strong>un</strong> altro rettangolo che rappresenta l'oggetto e in<strong>di</strong>ca lo stato mo<strong>di</strong>ficato. I due<br />

rettangoli vengono quin<strong>di</strong> <strong>un</strong>iti con <strong><strong>un</strong>a</strong> linea recante <strong>un</strong>'etichetta con <strong>un</strong>o stereotipo. La<br />

52


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

con<strong>di</strong>zione va inserita all'interno <strong>di</strong> <strong><strong>un</strong>a</strong> coppia <strong>di</strong> parentesi qu<strong>ad</strong>re considerato che tale<br />

con<strong>di</strong>zione deve precedere l'etichetta del messaggio.<br />

La cosa importante è coor<strong>di</strong>nare le con<strong>di</strong>zioni con <strong><strong>un</strong>a</strong> numerazione (per maggiori<br />

chiarimenti su tale costruzione si veda il paragrafo successivo).<br />

I collaboration <strong>di</strong>agram permettono anche <strong>di</strong> modellare la creazione <strong>di</strong> oggetti; nel processo<br />

<strong>di</strong> creazione <strong>di</strong> tali oggetti si inserisce <strong>un</strong>o stereotipo al messaggio che si occupa<br />

della creazione dell'oggetto stesso.<br />

Ancora, nei collaboration <strong>di</strong>agrams si possono rappresentare oggetti multipli e visualizzare<br />

i risultati restituiti.<br />

La rappresentazione <strong>di</strong> oggetti multipli viene effettuata tramite <strong>un</strong>o stack (<strong><strong>un</strong>a</strong> pila) <strong>di</strong><br />

rettangoli <strong>di</strong>segnati in sequenza inversa (da destra a sinistra). Si aggi<strong>un</strong>ge <strong><strong>un</strong>a</strong> con<strong>di</strong>zione<br />

(circondata da parentesi) e preceduta da <strong>un</strong> asterisco per in<strong>di</strong>care che il messaggio deve<br />

gi<strong>un</strong>gere a tutti gli oggetti.<br />

I risultati restituiti sono scritti come espressioni in cui il nome dell'espressione è preceduto<br />

dal valore <strong>di</strong> ritorno e seguito dai segni “: = “. Quin<strong>di</strong>, si scrivono il nome dell'operazione ed<br />

<strong><strong>un</strong>a</strong> lista <strong>di</strong> possibili attributi che l'operazione può accettare per produrre il risultato finale. La<br />

parte destra dell'espressione appena descritta viene definita firma del messaggio (messagesignature).<br />

Figura 1.38: Vista <strong>di</strong> <strong>un</strong> collaboration <strong>di</strong>agram<br />

In alc<strong>un</strong>e interazioni può acc<strong>ad</strong>ere che <strong>un</strong>o specifico oggetto si occupi del controllo del<br />

flusso. Questo oggetto attivo può mandare messaggi <strong>ad</strong> oggetti passivi ed interagire a sua volta<br />

con altri oggetti attivi. Inoltre, si potrebbe verificare anche il caso <strong>di</strong> <strong>un</strong> oggetto che man<strong>di</strong><br />

messaggi soltanto dopo che parecchi altri messaggi (possibilmente non consecutivi) siano stati<br />

inviati. In altre parole, l'oggetto deve sincronizzare il suo messaggio con <strong>un</strong> insieme <strong>di</strong> altri<br />

messaggi.<br />

53


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Il collaboration <strong>di</strong>agram rappresenta <strong>un</strong> oggetto attivo allo stesso modo <strong>di</strong> come si è visto<br />

finora con la <strong>di</strong>fferenza che i bor<strong>di</strong> del rettangolo sono spessi e in grassetto.<br />

I messaggi sincroni sono preceduti da <strong><strong>un</strong>a</strong> lista <strong>di</strong> messaggi che devono essere completati<br />

prima che il messaggio sincrono possa essere inviato. Una virgola separa <strong>un</strong> elemento della<br />

lista dall'altro e la lista termina con <strong><strong>un</strong>a</strong> barra.<br />

Ve<strong>di</strong>amo ora <strong>di</strong> mettere insieme tutti i concetti <strong>di</strong> cui si è parlato e <strong>di</strong> definire <strong>un</strong><br />

collaboration <strong>di</strong>agram <strong>completo</strong>.<br />

Collaboration Diagram - Un esempio<br />

Ancora <strong><strong>un</strong>a</strong> volta verrà utilizzato l'esempio della macchina self-service. Nell'esempio sul<br />

sequence <strong>di</strong>agram si è già costruito il <strong>di</strong>agramma per <strong>un</strong> sistema del genere. Adesso, si<br />

mostrerà come convertire il sequence <strong>di</strong>agram in <strong>un</strong> collaboration <strong>di</strong>agram.<br />

Lo scenario del caso migliore consiste <strong>di</strong> <strong>di</strong>versi passi:<br />

Il cliente inserisce le monete nella macchina ed esegue le selezione <strong>di</strong> <strong>un</strong>o o più prodotti<br />

presenti sulla macchina:<br />

• Quando il <strong>di</strong>spositivo <strong>di</strong> introduzione delle monete ottiene la somma dovuta (in questo<br />

caso si suppone che il cliente inserisca il corretto numero <strong>di</strong> monete necessarie) e vi è<br />

la <strong>di</strong>sponibilità dei prodotti scelti, allora viene espulso dalla macchina il prodotto<br />

scelto;<br />

• Il prodotto (o i prodotti) viene espulso dalla parte frontale della macchina in modo che<br />

il cliente possa prelevarli.<br />

Figura 1.39: Esempio <strong>di</strong> collaboration <strong>di</strong>agram<br />

54


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Quando però si esamina in particolare questa macchina ed il lavoro che essa svolge, ci si rende<br />

conto che sono possibili ulteriori scenari:<br />

• Introduzione <strong>di</strong> <strong>un</strong> numero errato <strong>di</strong> monete;<br />

• Mancata <strong>di</strong>sponibilità <strong>di</strong> <strong>un</strong> prodotto selezionato.<br />

È possibile utilizzare delle con<strong>di</strong>zioni che aiuteranno a descrivere il lavoro della macchina.<br />

Esse vengono visualizzate tra <strong><strong>un</strong>a</strong> coppia <strong>di</strong> parentesi qu<strong>ad</strong>re in modo tale che la con<strong>di</strong>zione<br />

preceda l'etichetta del messaggio. La cosa importante è tener presente che bisogna coor<strong>di</strong>nare le<br />

con<strong>di</strong>zioni con la numerazione progressiva.<br />

Nello scenario in cui la macchina non abbia a <strong>di</strong>sposizione il prodotto scelto è necessario<br />

che la macchina visualizzi <strong>un</strong> messaggio all'utente che gli permetta <strong>di</strong> selezionare <strong>un</strong> prodotto<br />

alternativo e ripetere, quin<strong>di</strong>, il processo oppure <strong>di</strong> avere restituite le monete. È, naturalmente,<br />

possibile descrivere <strong>un</strong> collaboration <strong>di</strong>agram anche per il caso in cui si sia inserito <strong>un</strong> numero<br />

errato <strong>di</strong> monete. Il collaboration <strong>di</strong>agram seguente illustra entrambi i casi (fig. 1.40)<br />

Figura 1.40: Collaboration <strong>di</strong>agram <strong>completo</strong><br />

Come è possibile vedere dallo schema, sono possibili fondamentalmente due scenari:<br />

Alimento Non Presente e Alimento Presente. Se si assume che tale <strong>di</strong>fferenziazione avvenga<br />

dopo il messaggio 2: InserimentoMonete(AlimentoSelezionato), il numero identificativo per<br />

questi messaggi sarà 3 per lo scenario Alimento Presente e 5 per lo scenario Alimento non<br />

Presente. Cosa avviene quando la macchina non ha a <strong>di</strong>sposizione il resto corretto ?<br />

55


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Essa deve visualizzare <strong>un</strong> messaggio, restituire le monete e chiedere al cliente <strong>di</strong> inserire la<br />

quantità esatta <strong>di</strong> monete. A questo p<strong>un</strong>to, la transazione è terminata. Quando la macchina ha la<br />

giusta quantità <strong>di</strong> monete, restituisce il resto al cliente ed espelle il prodotto selezionato.<br />

I due rami che sono prodotti dal processo annidato per il controllo del resto sono<br />

contrassegnati con 3 e 4 come da figura 1.41.<br />

Figura 1.41: Rami prodotti dal processo annidato<br />

Activity Diagrams<br />

Probabilmente, chi ha <strong>di</strong>mestichezza con la programmazione conoscerà i <strong>di</strong>agrammi <strong>di</strong><br />

flusso (flowchart). Il flowchart mostra <strong><strong>un</strong>a</strong> sequenza <strong>di</strong> passi, processi, p<strong>un</strong>ti decisionali e rami.<br />

I programmatori alle prime armi sono spesso indotti <strong>ad</strong> utilizzare i <strong>di</strong>agrammi <strong>di</strong> flusso per<br />

sviluppare <strong><strong>un</strong>a</strong> migliore logica <strong>di</strong> programmazione e ricavare delle soluzioni ai problemi<br />

software.<br />

L'activity <strong>di</strong>agram <strong>UML</strong> è molto simile ai flowchart. Infatti, esso mostra i passi (chiamati,<br />

propriamente, attività), i p<strong>un</strong>ti decisionali e i rami che intervengono nel flusso <strong>di</strong> <strong>un</strong><br />

programma. È utile per mostrare cosa acc<strong>ad</strong>e in <strong>un</strong> processo <strong>di</strong> business o in <strong>un</strong>'operazione ed è<br />

considerato come parte integrante dell'analisi <strong>di</strong> sistema.<br />

Un activity <strong>di</strong>agram viene <strong>di</strong>segnato per essere <strong><strong>un</strong>a</strong> vista semplificata <strong>di</strong> cosa acc<strong>ad</strong>e durante<br />

<strong>un</strong>'operazione o <strong>un</strong> processo. Si può affermare che esso altro non è che <strong>un</strong>'estensione dello state<br />

<strong>di</strong>agram. Quest'ultimo mostra gli stati <strong>di</strong> <strong>un</strong> oggetto e rappresenta le attività come frecce che si<br />

connettono agli stati. L'activity <strong>di</strong>agram mette in risalto le attività.<br />

56


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Ogni attività è rappresentata da <strong>un</strong> rettangolo con gli angoli arrotondati - più stretto e più<br />

ovale rispetto alla icona vista nello state <strong>di</strong>agram. L'elaborazione <strong>di</strong> <strong>un</strong>'attività porta al<br />

completamento della stessa e poi avviene <strong>un</strong>'automatica trasmissione alla successiva attività.<br />

Una freccia rappresenta la transizione da <strong>un</strong>'attività alla successiva. Anche l'activity <strong>di</strong>agram ha<br />

<strong>un</strong> p<strong>un</strong>to <strong>di</strong> partenza, rappresentato da <strong>un</strong> cerchio pieno, ed <strong>un</strong> p<strong>un</strong>to <strong>di</strong> fine rappresentato da <strong>un</strong><br />

occhio <strong>di</strong> bue (fig. 1.42).<br />

Figura 1.42: Activity <strong>di</strong>agram<br />

Costruzione <strong>di</strong> <strong>un</strong> Activity Diagram<br />

Si cercherà ora <strong>di</strong> esaminare le varie componenti in particolare: le modalità in cui vengono<br />

rappresentate le decisioni, i path concorrenti, i segnali e le swimlanes.<br />

Decisioni<br />

Un p<strong>un</strong>to <strong>di</strong> decisione può essere rappresentato in due mo<strong>di</strong>. La scelta sulla modalità da<br />

utilizzare è affidata interamente all'analista.<br />

Il primo modo consiste nel mostrare i possibili cammini che derivano <strong>di</strong>rettamente da<br />

<strong>un</strong>'attività. L'altro modo, invece, consiste nel rappresentare la transizione <strong>di</strong> <strong>un</strong>'attività con <strong>un</strong><br />

piccolo rombo e far seguire dal rombo stesso tutti i possibili cammini <strong>di</strong> flusso. Un altro modo<br />

ancora stabilisce <strong>di</strong> in<strong>di</strong>care la con<strong>di</strong>zione con <strong>un</strong>'istruzione racchiusa tra parentesi graffe vicino<br />

il path appropriato.<br />

57


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Si immagini <strong>di</strong> doversi recare al lavoro. Le fasi che descrivono tale processo saranno: aprire<br />

la macchina, inserire le chiavi nel cruscotto e quin<strong>di</strong> scegliere tra le seguenti due situazioni:<br />

• La macchina si avvia regolarmente;<br />

• La macchina non si avvia.<br />

Questi due possibili casi produrranno due altre attività:<br />

• Guidare la macchina;<br />

• Recarsi alla fermata del autobus (oppure prendere <strong>un</strong> taxi, la bicicletta o andare a<br />

pie<strong>di</strong>).<br />

Tale tipo <strong>di</strong> scenario viene rappresentato nel seguente grafico (si presti attenzione ai due mo<strong>di</strong><br />

<strong>di</strong> mostrare <strong><strong>un</strong>a</strong> decisione):<br />

Figura 1.43: Grafico decisonale<br />

Path Concorrenti<br />

Quando si esegue il modellamento <strong>di</strong> attività, molto frequentemente si verificherà la<br />

necessità <strong>di</strong> dover separare le transizioni in due cammini separati che vengano eseguiti allo<br />

stesso tempo (concorrentemente).<br />

58


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Una tale sud<strong>di</strong>visione viene rappresentata da <strong><strong>un</strong>a</strong> linea continua in grassetto, perpen<strong>di</strong>colare<br />

alla transizione e che mostri i cammini che avvengono al <strong>di</strong> fuori dalla linea stessa. Per<br />

rappresentare <strong>un</strong> "merge" successivo delle due attività, si fanno convergere i cammini verso<br />

<strong>un</strong>'altra linea in grassetto (fig. 1.44).<br />

Figura 1.44: Merge <strong>di</strong> attività<br />

Segnali<br />

Durante <strong><strong>un</strong>a</strong> sequenza <strong>di</strong> attività, è possible inviare <strong>un</strong> segnale. Quando viene ricevuto, il<br />

segnale causa la creazione <strong>di</strong> <strong>un</strong>'attività.<br />

Il simbolo per inviare <strong>un</strong> segnale è <strong>un</strong> pentagono convesso, mentre il simbolo per<br />

rappresentare il segnale ricevuto è <strong>un</strong> poligono concavo.<br />

Swimlanes<br />

L'activity <strong>di</strong>agram definisce anche la possibilità visualizzare i ruoli. Per far ciò, si separa il<br />

<strong>di</strong>agramma in segmenti paralleli, chiamati swimlanes (corsie <strong>di</strong> nuoto). Ogni swimlane mostra<br />

59


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

il nome <strong>di</strong> <strong>un</strong> determinato ruolo in cima e mostra le attività <strong>di</strong> quel ruolo. Le transizioni<br />

possono anche coinvolgere due swimlane.<br />

È possibile combinare l'activity <strong>di</strong>agram con i simboli <strong>di</strong> altri <strong>di</strong>agrammi e così produrre <strong>un</strong><br />

<strong>di</strong>agramma ibrido.<br />

Interfacce e Componenti: <strong>un</strong> approfon<strong>di</strong>mento<br />

Si è visto, finora, come i <strong>di</strong>agrammi descritti abbiano a che fare, in generale, con entità<br />

concettuali. Adesso si vedranno, invece, <strong>di</strong>agrammi <strong>UML</strong> che rappresentano entità del mondo<br />

reale: i componenti software (software component).<br />

Innanzitutto: cos'e' <strong>un</strong> software component ? Nient'altro che <strong><strong>un</strong>a</strong> parte fisica <strong>di</strong> <strong>un</strong> sistema.<br />

Esso risiede in <strong>un</strong> computer e non nella mente <strong>di</strong> <strong>un</strong> analista. Come si possono relazionare <strong>un</strong><br />

componente ed <strong><strong>un</strong>a</strong> classe?<br />

Basta pensare <strong>ad</strong> <strong>un</strong> componente come all'implementazione <strong>di</strong> <strong><strong>un</strong>a</strong> classe. La classe<br />

rappresenterà <strong>un</strong>'astrazione <strong>di</strong> <strong>un</strong> insieme <strong>di</strong> attributi ed operazioni. Ed <strong>un</strong> componente può<br />

essere visto come l'implementazione effettiva <strong>di</strong> <strong><strong>un</strong>a</strong> classe. È importante modellare i<br />

componenti e le relazioni che intercorrono tra <strong>di</strong> essi, in quanto:<br />

• I clienti possono vedere la struttura del sistema terminato;<br />

• Gli sviluppatori hanno <strong><strong>un</strong>a</strong> struttura alla quale rifarsi e attorno alla quale incentrare il<br />

loro lavoro;<br />

• Coloro che si occupano <strong>di</strong> scrivere la documentazione e i file <strong>di</strong> help si rendono conto<br />

meglio della f<strong>un</strong>zionalità del sistema e quin<strong>di</strong> riescono a creare dei documenti più<br />

efficienti.<br />

Quando si ha a che fare con i componenti, inevitabilmente si deve avere a che fare con le<br />

loro interfacce. Un'interfaccia, come visto, rappresenta la "faccia" dell'oggetto verso il mondo<br />

esterno in modo tale che altri oggetti possano chiedere all'oggetto che espone l'interfaccia <strong>di</strong><br />

eseguire le sue operazioni che sono nascoste dall'incapsulamento.<br />

Per l'analista che si occupa <strong>di</strong> <strong>di</strong>segnare il modello questo si tr<strong>ad</strong>uce nel fatto che il modo in<br />

cui si rappresenta <strong>un</strong>'interfaccia per <strong><strong>un</strong>a</strong> classe è lo stesso del modo in cui si rappresenta<br />

<strong>un</strong>'interfaccia per <strong>un</strong> componente. La relazione tra <strong>un</strong>'interfaccia e <strong><strong>un</strong>a</strong> classe (anche qui allo<br />

stesso modo) viene detta realizzazione (si veda quanto detto nel paragrafo Interfacce e<br />

Realizzazioni).<br />

60


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

È possibile rimpiazzare <strong>un</strong> componente con <strong>un</strong> altro se il nuovo componente è conforme alle<br />

stesse interfacce del vecchio. Il riutilizzo <strong>di</strong> <strong>un</strong> componente <strong>di</strong> <strong>un</strong> altro sistema è possibile se il<br />

nuovo sistema può accedere al componente stesso attraverso le sue interfacce.<br />

Fondamentalmente, dal p<strong>un</strong>to <strong>di</strong> vista della modellazione <strong>UML</strong>, ci sono tre tipi <strong>di</strong><br />

componenti:<br />

• Deployment components. Che rappresentano la base dei sistemi eseguibili (DLL,<br />

eseguibili, Controlli Active X, Java Beans);<br />

• Work Product Components: dai quali vengono creati i deployment components (e<br />

quin<strong>di</strong>: file <strong>di</strong> dati e file sorgenti);<br />

• Execution Components, creati come risultato del sistema in esecuzione.<br />

Infine, è da notare che quando <strong>un</strong> componente accede ai servizi <strong>di</strong> <strong>un</strong> altro componente<br />

utilizza <strong>un</strong> interfaccia <strong>di</strong> import. Viceversa, il componente che realizza l'interfaccia con dei<br />

servizi fornisce <strong><strong>un</strong>a</strong> interfaccia <strong>di</strong> export.<br />

Component Diagrams<br />

La principale icona <strong>di</strong> <strong>un</strong> component <strong>di</strong>agram è <strong>un</strong> rettangolo che, a sua volta, comprende<br />

due rettangoli più piccoli incastrati nel suo lato sinistro. Il nome del componente va inserito<br />

all'interno del rettangolo principale. Se il componente è <strong>un</strong> elemento <strong>di</strong> <strong>un</strong> package, è<br />

consigliabile far precedere il nome del componente dal nome del package.<br />

Figura 1.45: Component <strong>di</strong>agram<br />

Un componente e le interfacce che esso utilizza sono rappresentabili in due mo<strong>di</strong>:<br />

• Mostrando l'interfaccia come <strong>un</strong> rettangolo che contiene l'informazione relativa<br />

all'interfaccia. Il rettangolo è connesso al componente tramite <strong><strong>un</strong>a</strong> linea tratteggiata e<br />

<strong>un</strong> rettangolo che visualizza la realizzazione dell'interfaccia;<br />

61


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

• Utilizzando <strong>un</strong> piccolo cerchio connesso al componente tramite <strong><strong>un</strong>a</strong> linea continua che<br />

rappresenta la relazione <strong>di</strong> realizzazione dell'interfaccia.<br />

Figura 1.46: Rappresentare <strong>un</strong>’interfaccia – primo modo<br />

Modo 1: Un'interfaccia può essere rappresentata come <strong>un</strong> rettangolo, connesso al componente<br />

tramite <strong><strong>un</strong>a</strong> linea tratteggiata che termina con <strong><strong>un</strong>a</strong> freccia (fig. 1.46).<br />

Figura 1.47: Rappresentare <strong>un</strong>’interfaccia – secondo modo<br />

Modo 2: Un'interfaccia può essere rappresentata anche come <strong>un</strong> piccolo cerchio, connesso al<br />

componente tramite <strong><strong>un</strong>a</strong> linea tratteggiata che termina con <strong><strong>un</strong>a</strong> freccia (fig. 1.47).<br />

Component Diagram - Un esempio<br />

Si supponga <strong>di</strong> voler costruire <strong>un</strong> software per ascoltare della musica registrata su <strong>un</strong> CD-<br />

ROM. Per la scrittura <strong>di</strong> <strong>un</strong> siffatto programma ci si potrebbe avvalere <strong>di</strong> <strong>un</strong> linguaggio <strong>di</strong><br />

programmazione visuale come il Visual C++ o il Visual Basic, per esempio. Se il linguaggio<br />

utilizzato supporta dei controlli multime<strong>di</strong>ali, allora si potranno usare <strong>di</strong>rettamente od<br />

eventualmente riprogrammarli se necessario. Un possibile <strong>di</strong>segno grafico per il CD-player<br />

potrebbe essere (fig. 1.48):<br />

Figura 1.48: Music player<br />

62


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Come è possibile vedere il programma necessita dei seguente controlli:<br />

• play, stop, eject, pause<br />

• fast forward, rewind<br />

• power.<br />

Tali controlli saranno realizzati con l'utilizzo <strong>di</strong> bottoni, appositamente utilizzati per<br />

ciasc<strong>un</strong>o <strong>di</strong> essi. Se si guarda ogni bottone come <strong>un</strong> componente separato, è possibile ricavarne<br />

il seguente component <strong>di</strong>agram <strong>UML</strong> (fig. 1.49).<br />

Figura 1.49: Esempio <strong>di</strong> componet <strong>di</strong>agram<br />

Come si vede, tutti i componenti mostrati nel <strong>di</strong>agramma appartengono <strong>ad</strong> <strong>un</strong> <strong>un</strong>ico<br />

componente globale, il Bottone, anche se le azioni che essi eseguono sono <strong>di</strong>fferenti. Tali<br />

azioni saranno ottenute programmandole <strong><strong>un</strong>a</strong> <strong>ad</strong> <strong><strong>un</strong>a</strong>.<br />

63


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

1.12 Deployment Diagrams<br />

Ness<strong>un</strong> sistema software potrebbe mai f<strong>un</strong>zionare correttamente se non si basasse su <strong><strong>un</strong>a</strong><br />

solida struttura hardware. Per tale motivo, il Deployment Diagram modella proprio questo<br />

aspetto del sistema.<br />

Riesaminando <strong>un</strong> attimino il cammino fatto si può notare come si sia partiti da elementi <strong>di</strong><br />

analisi, per poi passare ai componenti che vivono nei computer ed infine, all'hardware che vive<br />

nel mondo reale.<br />

Come detto, l'hardware è <strong>un</strong> elemento primario nella composizione <strong>di</strong> <strong>un</strong> sistema a<br />

multicomponenti. L'<strong>UML</strong> fornisce dei simboli che hanno il compito <strong>di</strong> favorire la creazione <strong>di</strong><br />

<strong>un</strong> qu<strong>ad</strong>ro chiaro <strong>di</strong> come il settaggio e la composizione finale dell'hardware dovrà essere.<br />

L'elemento principale dell'hardware è costituito da <strong>un</strong> nodo (node), che costituisce <strong>un</strong> nome<br />

generico per ogni tipo <strong>di</strong> risorsa hardware.<br />

Sono definiti due tipi fondamentali <strong>di</strong> no<strong>di</strong>:<br />

• Il processore, ovvero <strong>un</strong> nodo che può consentire l'esecuzione <strong>di</strong> <strong>un</strong> componente<br />

• Un device, <strong>un</strong> nodo che tipicamente si interfaccia con il mondo esterno, e che non può,<br />

invece, eseguire alc<strong>un</strong> componente.<br />

Si considerino ora gli elementi grafici <strong>UML</strong> del deployment <strong>di</strong>agram. Un cubo rappresenta <strong>un</strong><br />

nodo. Un nodo ha <strong>un</strong> suo nome ed è possibile anche usare <strong>un</strong>o stereotipo per in<strong>di</strong>care il tipo <strong>di</strong><br />

risorsa che esso rappresenta. Se <strong>un</strong> nodo (fig. 1.50) fa parte <strong>di</strong> <strong>un</strong> package, allora il nome del<br />

package deve precedere il nome del nodo. Una linea che <strong>un</strong>isce due cubi rappresenta <strong><strong>un</strong>a</strong><br />

connessione tra i due no<strong>di</strong>. È possibile usare anche <strong>un</strong>o stereotipo per fornire informazioni sulla<br />

connessione.<br />

Figura 1.50: rappresentazione <strong>di</strong> <strong>un</strong> nodo nel deployment <strong>di</strong>agram<br />

Ogni nodo comprende alc<strong>un</strong>i dei componenti schierati nel sistema. Per in<strong>di</strong>care tali<br />

componenti si inserisce <strong><strong>un</strong>a</strong> relazione <strong>di</strong> <strong>di</strong>pendenza tra essi e il nodo cui appartengono.<br />

64


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Di seguito si vedrà, per esempio, <strong>di</strong> costruire <strong>un</strong> deployment <strong>di</strong>agram per <strong>un</strong> sistema<br />

informatico domestico. Il computer consiste dei seguenti elementi hardware:<br />

• Una CPU<br />

• Un monitor<br />

• Una stampante<br />

• Un mouse<br />

• Una tastiera<br />

Per quanto concerne il software si potrà avere, <strong>ad</strong> esempio:<br />

• Windows 98<br />

• Office 2000<br />

• Internet Explorer 5.0<br />

• Front Page<br />

• Dos,<br />

• Norton Commander<br />

• Visual C++<br />

Figura 1.51: Esempio <strong>di</strong> deployment <strong>di</strong>agram<br />

65


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Il nodo principale è rappresentato dalla CPU che, a sua volta, è composto <strong>di</strong> svariati<br />

componenti software collegati tra <strong>di</strong> loro da opport<strong>un</strong>e relazioni. Gli altri elementi hardware<br />

sono i devices connessi all'<strong>un</strong>ità centrale.<br />

Si può estendere questo <strong>di</strong>agramma aggi<strong>un</strong>gendo <strong>un</strong> modem ed <strong><strong>un</strong>a</strong> connessione <strong>ad</strong> Internet.<br />

I deployment <strong>di</strong>agram si rivelano particolarmente utili nel <strong>di</strong>segno e nel modellamento <strong>di</strong> reti <strong>di</strong><br />

calcolatori.<br />

Deployment Diagram - Un esempio<br />

Se si ha familiarità con le reti <strong>di</strong> calcolatori questi concetti saranno banali. In caso contrario,<br />

sarà utile soffermarsi per comprendere meglio l'esempio.<br />

La thin Ethernet è <strong><strong>un</strong>a</strong> rete <strong>di</strong> calcolatori molto com<strong>un</strong>e. Essa viene utilizzata in luoghi<br />

circoscritti, come stanze o palazzi, dove la connessione dei cavi può essere facilmente<br />

realizzata. Esistono alc<strong>un</strong>i calcoli matematici necessari per definire la l<strong>un</strong>ghezza dei cavi <strong>di</strong><br />

tutta la rete e la l<strong>un</strong>ghezza dei cavi che connettono due computer. Tali calcoli, com<strong>un</strong>que, non<br />

sono importanti per la realizzazione del deployment <strong>di</strong>agram.<br />

I Computer si connettono al cavo <strong>di</strong> rete tramite dei <strong>di</strong>spositivi <strong>di</strong> connessione chiamati T-<br />

connectors. I T-connectors hanno tre p<strong>un</strong>ti <strong>di</strong> connessione e la loro forma (da cui deriva il<br />

nome) è simile alla lettera T (figura 1.52).<br />

Figura 1.52: T-connector<br />

Il cavo <strong>di</strong> rete entra da <strong>un</strong> lato del connector ed esce dall'altro opposto mentre il terzo p<strong>un</strong>to<br />

<strong>di</strong> connessione va <strong>di</strong>rettamente al computer. Poiché la l<strong>un</strong>ghezza della rete è limitata, I p<strong>un</strong>ti<br />

finali del cavo necessitano <strong>di</strong> particolari <strong>di</strong>spositivi denominati terminatori (Terminator). Una<br />

rete locale può, a sua volta, essere connessa <strong>ad</strong> <strong>un</strong>'altre rete locale tramite <strong>un</strong> ripetitore, ovvero<br />

<strong>di</strong> <strong>un</strong> <strong>di</strong>spositivo che amplifica il segnale per ridurre il rischio <strong>di</strong> per<strong>di</strong>ta <strong>di</strong> segnale (ve<strong>di</strong> fig<br />

1.53).<br />

66


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 1.53: Rete <strong>di</strong> calcolatori<br />

Una volta definiti i capisal<strong>di</strong> <strong>di</strong> <strong><strong>un</strong>a</strong> rete thin Ehernet è possibile <strong>di</strong>segnarne il relativo<br />

Deployment Diagram:<br />

Figura 1.54: Deployment <strong>di</strong>agram finale<br />

67


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

I simboli grafici <strong>UML</strong><br />

Vistà la quantità dei simboli grafici utilizzati nei <strong>di</strong>agrammi <strong>UML</strong> sarà, sicuramente, utile<br />

fare <strong>un</strong> breve riepilogo.<br />

Elementi Strutturali<br />

Figura 1.55: Elementi strutturali<br />

Elementi Comportamentali<br />

Figura 1.56: Elementi comportamentali<br />

Relazioni<br />

Figura 1.57: Relazioni<br />

Raggruppamento<br />

Figura 1.58: Raggruppamento<br />

68


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Estensioni<br />

<br />

{Constraint}<br />

Annotazioni ed Actor<br />

Figura 1.59: Annotazioni e actor<br />

69


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

2 LE S-FUNTIONS<br />

2.1 Introduzione alle S-F<strong>un</strong>ctions<br />

Che cos’è <strong><strong>un</strong>a</strong> S-F<strong>un</strong>ction<br />

Una S-F<strong>un</strong>ction è <strong><strong>un</strong>a</strong> <strong>descrizione</strong>, <strong>di</strong> <strong>un</strong> sistema <strong>di</strong>namico, realizzata attraverso <strong>un</strong><br />

linguaggio <strong>di</strong> programmazione, il cui co<strong>di</strong>ce può essere scritto utilizzando i linguaggi Matlab o<br />

C. Le S-F<strong>un</strong>ction scritte con quest’ultimo linguaggio sono compilate come MEX-file (Memory<br />

Executable) utilizzando il comando mex <strong>di</strong>sponibile all'interno dell'ambiente Matlab.<br />

Il co<strong>di</strong>ce generato è contenuto in <strong><strong>un</strong>a</strong> libreria <strong>di</strong>namica o DLL (Dynamic Link Library), che<br />

viene invocata dal Matlab in modo <strong>di</strong>namico, ovvero Matlab, nel momento in cui Simulink ne<br />

richiede l'uso, cerca la DLL nel path <strong>di</strong> lavoro e ci si collega utilizzando le f<strong>un</strong>zioni che la DLL<br />

esporta. Una volta effettuato, il collegamento <strong>di</strong>venta stabile (la DLL risulta in permanente<br />

utilizzazione da parte del Matlab) per cui non è più cancellabile (da Explorer) o mo<strong>di</strong>ficabile<br />

(da <strong>un</strong> programma esterno a Matlab) finché dal Matlab stesso non viene eseguita l'istruzione<br />

"clear mex" o viene ricompilata <strong>di</strong> nuovo tramite l'istruzione "mex".<br />

La forma <strong>di</strong> <strong><strong>un</strong>a</strong> S-F<strong>un</strong>ction è molto generale e può descrivere sistemi continui, <strong>di</strong>screti e<br />

ibri<strong>di</strong>. Quasi tutti i modelli Simulink possono essere, quin<strong>di</strong>, realizzati come S-F<strong>un</strong>ction.<br />

Le S-F<strong>un</strong>ction vengono inglobate nei modelli Simulink utilizzando il blocco S-F<strong>un</strong>ction nella<br />

sottolibreria Nonlinear Block (Matlab 5.x) o User-Defined Blocks (Matlab 6.x). Accedendo alla<br />

finestra <strong>di</strong> <strong>di</strong>alogo del blocco è possibile specificare il nome della S-F<strong>un</strong>ction da utilizzare.<br />

Si tenga presente che qualora esistano due S-F<strong>un</strong>ction, <strong>di</strong> cui <strong><strong>un</strong>a</strong> scritta come C MEX-file e<br />

l’altra come M-file (Matlab file), sarà la prima <strong>ad</strong> essere utilizzata. Si possono utilizzare le<br />

finestre <strong>di</strong> Simulink e le relative istruzioni per inserire documentazioni inerenti al blocco,<br />

inserire parametri <strong>ad</strong><strong>di</strong>tivi e così via.<br />

Quando utilizzare <strong><strong>un</strong>a</strong> S-F<strong>un</strong>ction<br />

L’utilizzo più com<strong>un</strong>e <strong>di</strong> <strong><strong>un</strong>a</strong> S-F<strong>un</strong>ction è come blocco utente <strong>di</strong> Simulink. E’ possibile<br />

utilizzarle in svariate applicazioni, tra cui:<br />

• Aggi<strong>un</strong>ta blocchi <strong>di</strong> utilità generale a Simulink;<br />

• Inserimento co<strong>di</strong>ce C già esistente in <strong><strong>un</strong>a</strong> simulazione;<br />

70


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

• Descrizione <strong>un</strong> sistema come <strong><strong>un</strong>a</strong> sequenza <strong>di</strong> istruzioni;<br />

• Utilizzo animazioni grafiche;<br />

• Aumento della velocità <strong>di</strong> simulazione integrando co<strong>di</strong>ce C.<br />

Una stessa S-f<strong>un</strong>ction può essere utilizzata in più p<strong>un</strong>ti della stessa simulazione,<br />

mo<strong>di</strong>ficando solamente i parametri con cui la S-f<strong>un</strong>ction viene invocata.<br />

Ciasc<strong>un</strong> blocco interno <strong>ad</strong> <strong>un</strong> modello Simulink possiede le seguenti caratteristiche generali:<br />

<strong>un</strong> vettore degli ingressi u, <strong>un</strong> vettore delle uscite y, ed <strong>un</strong> vettore degli stati x, come mostrato<br />

nella seguente figura:<br />

Figura 2.1: Schema a blocchi <strong>di</strong> <strong><strong>un</strong>a</strong> s-f<strong>un</strong>tion<br />

Il vettore degli stati può contenere stati continui, <strong>di</strong>screti, o <strong><strong>un</strong>a</strong> combinazione <strong>di</strong> essi. Le<br />

relazioni matematiche tra ingressi, uscite, e stati sono espresse dalle seguenti equazioni:<br />

• Uscite: y = f 0 (t,x ,u)<br />

• Derivata: dx/dt = f d (t,x,u)<br />

• Aggiornamento: x d(k+1) = f u (t, x, u) dove x = [x c , x d ].<br />

Il vettore degli stati viene quin<strong>di</strong> sud<strong>di</strong>viso in due parti: <strong><strong>un</strong>a</strong> contenete gli stati continui e<br />

l’altra i <strong>di</strong>screti. Gli stati continui occupano la prima parte del vettore, e i <strong>di</strong>screti la seconda.<br />

Per blocchi privi <strong>di</strong> stati x è <strong>un</strong> vettore vuoto. Nei MEX-file delle S-F<strong>un</strong>ction, ci sono due<br />

vettori separati per gli stati continui e <strong>di</strong>screti.<br />

St<strong>ad</strong>i <strong>di</strong> simulazione e routine <strong>di</strong> S-F<strong>un</strong>ction<br />

Durante l’esecuzione <strong>di</strong> <strong>un</strong> modello, Simulink effettua chiamate successive ai singoli<br />

blocchi, e quin<strong>di</strong> anche alle S-F<strong>un</strong>ction, per realizzare su <strong>di</strong> essi specifiche operazioni relative<br />

allo st<strong>ad</strong>io attuale in cui si trova la computazione, es. inizializzazione del blocco, definizione<br />

dei parametri, calcolo delle uscite e così via. La successione <strong>di</strong> questi st<strong>ad</strong>i può essere<br />

visualizzata con il presente <strong>di</strong>agramma <strong>di</strong> flusso (fig. 2.2):<br />

71


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 2.2: Come Simulink esegue la simulazione<br />

L’esecuzione <strong>di</strong> questi passi è realizzata me<strong>di</strong>ante routine che eseguono il loro compito<br />

durante ciasc<strong>un</strong> passo. Queste azioni si possono classificare come:<br />

• Inizializzazione – Durante questo st<strong>ad</strong>io Simulink:<br />

1. Inizializza SimStruct, <strong><strong>un</strong>a</strong> struttura che contiene informazioni sulla S-F<strong>un</strong>ction;<br />

2. Definisce numero e <strong>di</strong>mensione delle porte <strong>di</strong> ingresso e <strong>di</strong> uscita;<br />

3. Definisce gli istanti <strong>di</strong> campionamento;<br />

4. Pre<strong>di</strong>spone aree <strong>di</strong> memorizzazione e l’array size;<br />

• Calcolo del prossimo istante <strong>di</strong> campionamento (se si sta utilizzando <strong>un</strong> passo<br />

variabile si effettua il calcolo del successivo istante <strong>di</strong> campionamento);<br />

72


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

• Calcolo dell’uscita nell’istante <strong>di</strong> campionamento principale (al completamento <strong>di</strong><br />

questa fase le uscite del blocco saranno <strong>di</strong>sponibili nell’istante <strong>di</strong> tempo attuale);<br />

• Aggiornamento degli stati <strong>di</strong>screti nell’intervallo principale (ciasc<strong>un</strong> blocco esegue<br />

l’aggiornamento degli stati <strong>di</strong>screti per il prossimo istante);<br />

• Integrazione: questa si applica a modelli con stati continui e/o attraversamenti dello<br />

zero non campionati. Se la S-F<strong>un</strong>ction lavora con stati continui il calcolo delle uscite e<br />

delle derivate della S-F<strong>un</strong>ction avviene nell’istante <strong>di</strong> tempo secondario. Se la S-<br />

F<strong>un</strong>ction ha attraversamenti dello zero non campionati, Simulink calcola le uscite e gli<br />

attraversamenti dello zero nell’istante secondario.<br />

St<strong>ad</strong>i <strong>di</strong> simulazione e routine <strong>di</strong> S-F<strong>un</strong>ction<br />

Le C-MEX S-F<strong>un</strong>ction sono realizzate come f<strong>un</strong>zioni in linguaggio C. Esiste <strong>un</strong> set <strong>di</strong><br />

routine per S-F<strong>un</strong>ction che vengono chiamate <strong>di</strong>rettamente da Simulink per eseguire il loro<br />

compito e possono essere utilizzate nella scrittura delle S-F<strong>un</strong>ction.<br />

Le routine C-MEX S-F<strong>un</strong>ction devono contenere le f<strong>un</strong>zioni definite nella tabella 2.1. La<br />

presenza <strong>di</strong> maschere predefinite (ve<strong>di</strong> sf<strong>un</strong>tmpl.c e sf<strong>un</strong>tmpl.doc, situate nella <strong>di</strong>rectory<br />

simulink/src) forniscono <strong>un</strong> <strong>ad</strong>eguato sostegno alla scrittura del co<strong>di</strong>ce. Se ne consiglia l’uso al<br />

fine <strong>di</strong> limitare errori <strong>di</strong> scrittura.<br />

St<strong>ad</strong>io della <strong>Simulazione</strong><br />

Routine S-F<strong>un</strong>ction<br />

Inizializzazione<br />

mdlInitializeSizes<br />

Calcolo istante camp. succ. (facoltativo) mdlGetTimeOfNextVarHit<br />

Calcolo uscite<br />

mdlOutputs<br />

Aggiornamento st<strong>ad</strong>i <strong>di</strong>screti<br />

mdlUpdate<br />

Calcolo derivate<br />

mdlDerivatives<br />

Fine simulazione<br />

mdlTerminate<br />

Tabella 2.1: St<strong>ad</strong>i <strong>di</strong> simulazione<br />

Una piena comprensione dei seguenti concetti aiuterà <strong>ad</strong> <strong><strong>un</strong>a</strong> corretta scrittura delle S-<br />

F<strong>un</strong>ction:<br />

• Direct feedthrough;<br />

• Ampiezza ingresso impostata <strong>di</strong>namicamente;<br />

73


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

• Impostazione tempo <strong>di</strong> campionamento e offset;<br />

Direct Feedthrough<br />

Con questo termine si definisce la caratteristica dell’algoritmo <strong>di</strong> presentare <strong>un</strong>’influenza<br />

<strong>di</strong>retta degli ingressi sulle uscite. Una S-F<strong>un</strong>ction ha questa caratteristica se:<br />

• La f<strong>un</strong>zione <strong>di</strong> uscita (mdlOutputs) è <strong><strong>un</strong>a</strong> f<strong>un</strong>zione dell’ingresso u. C’è quin<strong>di</strong> <strong>un</strong> <strong>di</strong>rect<br />

feedthrough quando le istruzioni interne a mdlOutputs utilizzano la variabile d’ingresso<br />

u. Per uscite s’intendono anche quelle grafiche (Scope, XY Graph, ecc.);<br />

• La S-F<strong>un</strong>ction ha <strong>un</strong> passo <strong>di</strong> campionamento (chiamata a mdlGetTimeOfNextVarHit)<br />

variabile <strong>di</strong>pendente da u.<br />

Un esempio <strong>di</strong> algoritmo che non richiede <strong>di</strong>rect feedthrough è il seguente:<br />

• Uscite: y = x<br />

• Derivata: dx/dt = u<br />

dove x è lo stato, dx/dt è la derivata rispetto al tempo, u è l’ingresso e y l’uscita.<br />

Impostazione <strong>di</strong>namica dell’ampiezza dell’ingresso<br />

Le S-F<strong>un</strong>ction possono essere realizzate in modo tale da prevedere <strong>un</strong>’impostazione<br />

<strong>di</strong>namica dell’ampiezza dell’ingresso, determinata cioè a tempo <strong>di</strong> esecuzione e stabilita<br />

dall’ampiezza delle uscite dei blocchi collegati alla S-F<strong>un</strong>ction, essa può essere utilizzata per<br />

definire il numero <strong>di</strong> stati continui, <strong>di</strong>screti e il numero <strong>di</strong> uscite.<br />

Le C-MEX S-F<strong>un</strong>ction consentono, quin<strong>di</strong>, <strong>di</strong> definire porte <strong>di</strong> accesso e <strong>di</strong> uscita multiple<br />

<strong>di</strong> forma vettoriale. Si analizzeranno in seguito esempi in tal senso.<br />

Impostazione del tempo <strong>di</strong> campionamento e dell’ offset<br />

Le C-MEX S-F<strong>un</strong>ction consentono <strong>un</strong> alto gr<strong>ad</strong>o <strong>di</strong> flessibilità nello stabilire quando<br />

avviene l’esecuzione fornendo il seguente insieme <strong>di</strong> scelte:<br />

74


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

• Campionamento continuo: per S-F<strong>un</strong>ction che hanno stati continui e/o zeri non<br />

campionati. In questo caso le uscite cambiano nell’istante <strong>di</strong> tempo secondario;<br />

• Tempo <strong>di</strong> campionamento continuo ma fisso nell’istante <strong>di</strong> tempo secondario: per S-<br />

F<strong>un</strong>ction che necessitano <strong>di</strong> esecuzione <strong>ad</strong> ogni passo <strong>di</strong> simulazione principale, ma<br />

non cambia valore durante quello secondario;<br />

• Tempo <strong>di</strong> campionamento <strong>di</strong>screto: per S-F<strong>un</strong>ction il cui comportamento è f<strong>un</strong>zione <strong>di</strong><br />

intervalli <strong>di</strong>screti, si può quin<strong>di</strong> definire <strong>un</strong> tempo in cui Simulink chiama il blocco ed<br />

anche <strong>un</strong> ritardo (offset) nel campionamento, es.:<br />

TimeHit = (n * period) + offset<br />

Dove n è <strong>un</strong> intero, e il suo primo valore è sempre zero;<br />

• Tempo <strong>di</strong> campionamento variabile: tempo <strong>di</strong> campionamento la cui ampiezza viene<br />

definita all’inizio <strong>di</strong> ciasc<strong>un</strong> passo <strong>di</strong> campionamento e può variare da passo a passo;<br />

• Tempo <strong>di</strong> campionamento ere<strong>di</strong>tato: quando l’S-F<strong>un</strong>ction non ha caratteristiche interne<br />

particolari, stati continui, <strong>di</strong>screti ecc., è possibile far si che assuma il tempo <strong>di</strong><br />

campionamento dei blocchi che in qualche modo ne influenzano il comportamento, <strong>ad</strong><br />

es.:<br />

1. Il blocco connesso all’ingresso<br />

2. Il blocco <strong>di</strong> destinazione<br />

3. Il tempo <strong>di</strong> campionamento più veloce nel sistema.<br />

Si potranno definire questi parametri utilizzando le routine <strong>di</strong> S-F<strong>un</strong>ction appropriate.<br />

Esempi <strong>di</strong> C-MEX S-F<strong>un</strong>ction si trovano nella <strong>di</strong>rectory simulink/src, tra questi se ne citano<br />

alc<strong>un</strong>i: timestwo.c, csf<strong>un</strong>c.c, dsf<strong>un</strong>c.c, dlimint.c, vsf<strong>un</strong>c.c, mixed.c.<br />

2.2 Guida alla scrittura delle S-F<strong>un</strong>ctions<br />

Introduzione<br />

La realizzazione <strong>di</strong> <strong><strong>un</strong>a</strong> S-F<strong>un</strong>ction me<strong>di</strong>ante linguaggio C, come già detto in precedenza,<br />

deve sottostare <strong>ad</strong> <strong><strong>un</strong>a</strong> serie <strong>di</strong> regole che hanno come scopo la realizzazione <strong>di</strong> <strong>un</strong> C MEX-file<br />

(C Matlab Executable file) che interagisca con Simulink e con l’ODE solver per l’esecuzione<br />

75


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

dei singoli passi <strong>di</strong> calcolo che portano alla simulazione del modello (definizione delle<br />

con<strong>di</strong>zioni e delle caratteristiche iniziali del blocco, calcolo delle derivate, stati <strong>di</strong>screti e uscite<br />

del blocco).<br />

Un utile strumento per la compilazione del co<strong>di</strong>ce è fornito da sf<strong>un</strong>tmpl.c, <strong>un</strong> file <strong>di</strong> co<strong>di</strong>ce<br />

C, e dal relativo file sf<strong>un</strong>tmpl.doc, entrambe presenti nella <strong>di</strong>rectory simulink/src.<br />

Un semplice esempio <strong>di</strong> C-MEX S-F<strong>un</strong>ction è il seguente:<br />

#define S_FUNCTION_NAME your_sf<strong>un</strong>ction_name_here<br />

#define S_FUNCTION_LEVEL 2<br />

#include “simstruct.h”<br />

static void mdlInitializeSizes(SimStrusct *S)<br />

{<br />

}<br />

<br />

static void mdlTerminate(SimStruct *S)<br />

{<br />

}<br />

#ifdef MATLAB-MEX_FILE /* Il file è stato compilato come MEX-file? */<br />

#include “simulink.c” /* Interfaccia tra Simulink e MEX-file */<br />

#else<br />

#include “cg_sf<strong>un</strong>.h” /* F<strong>un</strong>zione per la registrazione della*/<br />

/* generazione del co<strong>di</strong>ce */<br />

#en<strong>di</strong>f<br />

La routine mdlInitializeSizes è solo <strong><strong>un</strong>a</strong>, la prima in genere <strong>ad</strong> essere chiamata quando<br />

Simulink interagisce con la S-F<strong>un</strong>ction, delle tante routine del tipo mdl* che devono essere<br />

utilizzate nella compilazione del co<strong>di</strong>ce. Il contenuto delle suddette routine è stabilito dal<br />

programmatore e varia con il tipo <strong>di</strong> S_F<strong>un</strong>ction che viene implementata. L’ultima routine <strong>ad</strong><br />

essere chiamata da Simulink è mdlTerminate che termina l’esecuzione del blocco.<br />

Le informazioni relative alla S_F<strong>un</strong>ction sono contenute in <strong><strong>un</strong>a</strong> struttura dati chiamata<br />

SimStruct. L’inclusione nel co<strong>di</strong>ce, me<strong>di</strong>ante l’istruzione #include, del file simstruc.h fornisce,<br />

76


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

oltre alla <strong>di</strong>chiarazione della struttura, anche <strong>un</strong> insieme <strong>di</strong> macro me<strong>di</strong>ante le quali è possibile<br />

accedere, copiare e leggere dati dalla struttura.<br />

Scrittura delle C-Mex S-F<strong>un</strong>ctions<br />

Si forniranno ora dei semplici esempi <strong>di</strong> S-F<strong>un</strong>ction, dove per “semplici” si intende:<br />

contenenti quelle routine che devono essere sempre presenti anche se vuote, cioè prive <strong>di</strong><br />

co<strong>di</strong>ce. Uno <strong>di</strong> questi esempi è quello della S_F<strong>un</strong>ction timestwo che prende <strong>un</strong> ingresso e lo<br />

moltiplica per due (ve<strong>di</strong> matlabroot/simulink/src/timestwo.c).<br />

Il modello simulink che la rappresenta è il seguente (fig. 2.3):<br />

Figura 2.3: Schema simulink<br />

Il blocco S_F<strong>un</strong>ction è stato prelevato dalla libreria Simulink ed inoltre è stato mo<strong>di</strong>ficato il<br />

nome del blocco in timestwo accedendo alla finestra delle proprietà, non sono stati specificati<br />

altri parametri. Il co<strong>di</strong>ce che è stato scritto per la S_F<strong>un</strong>ction rispetta il seguente schema (fig.<br />

2.4):<br />

Figura 2.4: Schema <strong>di</strong> f<strong>un</strong>zionamento<br />

77


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

E’ necessario quin<strong>di</strong> che le suddette routine siano inserite nel co<strong>di</strong>ce della S_F<strong>un</strong>ction; in<br />

questo caso sono state <strong>di</strong>gitate all’interno <strong>di</strong> <strong>un</strong> file <strong>di</strong> nome timestwo.c.<br />

La successiva esecuzione del comando:<br />

mex timestwo.c<br />

dal prompt <strong>di</strong> Matlab permette a quest’ultimo <strong>di</strong> eseguire la compilazione e il link <strong>di</strong> questo<br />

programma, creando <strong>un</strong> file caricabile ed eseguibile da Simulink. Ciò che ne risulta è <strong>un</strong> file <strong>di</strong><br />

tipo MEX la cui estensione, se si lavora in ambiente Windows, è .dll. Il co<strong>di</strong>ce <strong>di</strong><br />

quest’esempio è dato dal seguente listato:<br />

#define S_FUNCTION_NAME timestwo<br />

#define S_FUNCTION_LEVEL 2<br />

#include "simstruc.h"<br />

static void mdlInitializeSizes(SimStruct *S)<br />

{<br />

ssSetNumSFcnParams(S, 0);<br />

if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCo<strong>un</strong>t(S))<br />

{<br />

return; /* Parameter mismatch will be reported by Simulink */<br />

}<br />

if (!ssSetNumInputPorts(S, 1)) return;<br />

ssSetInputPortWidth(S, 0, DYNAMICALLY_SIZED);<br />

ssSetInputPortDirectFeedThrough(S, 0, 1);<br />

if (!ssSetNumOutputPorts(S,1)) return;<br />

ssSetOutputPortWidth(S, 0, DYNAMICALLY_SIZED);<br />

ssSetNumSampleTimes(S, 1);<br />

ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);<br />

}<br />

static void mdlInitializeSampleTimes(SimStruct *S)<br />

{<br />

ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME);<br />

ssSetOffsetTime(S, 0, 0.0);<br />

78


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

}<br />

static void mdlOutputs(SimStruct *S, int_T tid)<br />

{<br />

int_T i;<br />

InputRealPtrsType uPtrs =<br />

ssGetInputPortRealSignalPtrs(S,0);<br />

real_T *y = ssGetOutputPortRealSignal(S,0);<br />

int_T<br />

width = ssGetOutputPortWidth(S,0);<br />

for (i=0; i


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

3. Singolo istante <strong>di</strong> campionamento. E’ necessario specificare il tempo <strong>di</strong><br />

campionamento nella routine mdlInitializeSampleTimes;<br />

4. Il co<strong>di</strong>ce è exception free. Qualora il co<strong>di</strong>ce non preveda chiamate a f<strong>un</strong>zioni<br />

esterne che interrompono l’esecuzione <strong>di</strong> Simulink è opport<strong>un</strong>o specificare<br />

questa opzione che contribuisce a rendere il co<strong>di</strong>ce più efficiente;<br />

• mdlInitializeSampleTimes: il tempo <strong>di</strong> campionamento è acquisito dal blocco che<br />

precede la S_F<strong>un</strong>ction quin<strong>di</strong> f<strong>un</strong>zionerà bene con qualsiasi blocco connesso in<br />

ingresso;<br />

• mdlOutput: il calcolo numerico. mdlOutput <strong>di</strong>ce a Simulink <strong>di</strong> moltiplicare il segnale<br />

d’ingresso per 2.0 e mettere il risultato nel segnale d’uscita. Per accedere al segnale<br />

d’ingresso si utilizza:<br />

InputRealPtrsType uptrs=ssGetInputPortRealSignaluPtrs(S,0)<br />

dove uPtrs è <strong>un</strong> vettore <strong>di</strong> p<strong>un</strong>tatori e ai cui elementi si accede così:<br />

Elementoi = *uPtrs[i]<br />

Per accedere al segnale d’uscita si utilizza:<br />

real_T *y = ssGetOutputPortRealSignal(S,0)<br />

che fornisce <strong>un</strong> array contenente i valori in uscita;<br />

• mdlTerminate: in questo caso particolare non c’è bisogno <strong>di</strong> eseguire ness<strong><strong>un</strong>a</strong> azione<br />

conclusiva;<br />

Istruzioni richieste all’inizio <strong>di</strong> <strong><strong>un</strong>a</strong> S-F<strong>un</strong>ction<br />

Ogni programma che definisce <strong><strong>un</strong>a</strong> S_F<strong>un</strong>ction deve necessariamente cominciare con il<br />

seguente blocco <strong>di</strong> istruzioni:<br />

#define S_FUNCTION_NAME your_sf<strong>un</strong>ction_name_here<br />

#define S_FUNCTION_LAVEL 2<br />

80


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

#include “simstruct.h”<br />

dove your_sf<strong>un</strong>ction_name_here in<strong>di</strong>ca il nome della S_F<strong>un</strong>ction che ci si appresta a realizzare<br />

e le altre istruzioni definiscono: la prima il tipo <strong>di</strong> livello della S_F<strong>un</strong>ction, la seconda <strong>di</strong>ce a<br />

Simulink dove trovare le macro me<strong>di</strong>ante le quali accedere alla struttura dati simstruct.<br />

Istruzioni richieste alla fine <strong>di</strong> <strong><strong>un</strong>a</strong> S-F<strong>un</strong>ction<br />

Il co<strong>di</strong>ce seguente va invece incluso al termine del main della S_F<strong>un</strong>ction:<br />

#ifdef MATLAB-MEX_FILE /* Il file è stato compilato come MEX-file? */<br />

#include “simulink.c” /* Interfaccia tra Simulink e MEX-file */<br />

#else<br />

#include “cg_sf<strong>un</strong>.h” /* F<strong>un</strong>zione per la registrazione della generazione del co<strong>di</strong>ce */<br />

#en<strong>di</strong>f<br />

Queste istruzioni provvedono <strong>ad</strong> instr<strong>ad</strong>are la S_F<strong>un</strong>ction verso l’applicazione scelta, Simulink<br />

o Real-Time Workshop.<br />

Combinazione con<strong>di</strong>zionata delle S-F<strong>un</strong>ctions<br />

La compilazione delle S_F<strong>un</strong>ction può essere effettuata nei seguenti mo<strong>di</strong>:<br />

• MATLAB_MEX_FILE : in<strong>di</strong>ca che la S_F<strong>un</strong>ction è stata realizzata come MEX-file<br />

per essere utilizzata con Simulink;<br />

• RT: in<strong>di</strong>ca che la S_F<strong>un</strong>ction è stata costruita con co<strong>di</strong>ce generato da Real-Time<br />

Workshop per applicazioni in tempo reale utilizzanti <strong>un</strong> solver a passo fisso;<br />

• NRT: in<strong>di</strong>ca che la S_F<strong>un</strong>ction è stata costruita me<strong>di</strong>ante co<strong>di</strong>ce generato da Real-Time<br />

Workshop per <strong>un</strong>’applicazione non in tempo reale che utilizza <strong>un</strong> solver a passo<br />

variabile.<br />

Gestione degli errori<br />

Durante la realizzazione <strong>di</strong> S_F<strong>un</strong>ction può essere utile introdurre dei controlli che<br />

determinino la correttezza degli eventi che si susseguono con il fine <strong>di</strong> interrompere<br />

l’esecuzione e visualizzare <strong>un</strong> opport<strong>un</strong>o messaggio <strong>di</strong> errore. Nell’esempio della f<strong>un</strong>zione<br />

81


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

timestwo non erano necessari molti controlli, si effettua solo <strong>un</strong> controllo sul numero <strong>di</strong><br />

parametri nella f<strong>un</strong>zione mdlInitializeSizes, ma per altre f<strong>un</strong>zioni potrebbe essere importante<br />

prevedere maggiori controlli. Il proce<strong>di</strong>mento da usare nel trattamento degli errori è <strong>di</strong><br />

utilizzare il seguente co<strong>di</strong>ce:<br />

ssSetErrorStatus(S,”errore rilevato dovuto a ….”);<br />

return;<br />

Si noti che la stringa <strong>di</strong> caratteri contenente il messaggio <strong>di</strong> errore deve risiedere in <strong>un</strong> area<br />

<strong>di</strong> memoria persistente. Pertanto <strong><strong>un</strong>a</strong> soluzione come quella che segue non può essere accettata:<br />

mdlOutputs( )<br />

{<br />

char msg[256]; // ERRORE: specificare “static char msg[256];<br />

sprintf(msg,”errore dovuto a %s , string );<br />

ssSetErrorStatus(S,msg);<br />

return;<br />

}<br />

L’approccio suggerito in questo paragrafo è alternativo all’utilizzo della f<strong>un</strong>zione<br />

mexErrMsgTxt la quale, in caso <strong>di</strong> errore, interrompe la S_F<strong>un</strong>ction e restituisce il controllo a<br />

Simulink, in questo caso l’S_F<strong>un</strong>ction non sarebbe exception free con la conseguenza che il<br />

co<strong>di</strong>ce non risulterà ottimizzato, come già accennato in precedenza. Si consiglia quin<strong>di</strong> <strong>di</strong><br />

evitare l’utilizzo <strong>di</strong> f<strong>un</strong>zioni come mexErrMsgTxt o mxCalloc, <strong><strong>un</strong>a</strong> f<strong>un</strong>zione per l’allocazione <strong>di</strong><br />

memoria, e <strong>di</strong> scrivere co<strong>di</strong>ce exception free utilizzando il seguente comando all’interno <strong>di</strong><br />

mdlInitializeSizes:<br />

ssSetOptions(S,SS_OPTION_EXCEPTION_FREE_CODE);<br />

Di questo ne beneficeranno le prestazione della S_F<strong>un</strong>ction. Le routine che non generano<br />

interruzioni sono quelle che accedono ai p<strong>un</strong>tatori e mo<strong>di</strong>ficano i parametri, per esempio le<br />

routine mxGetPr, mxGet<strong>Da</strong>ta, mxGetNumberOfDimensions, mxGetM, mxGetN, e<br />

mxGetNumberOfElements.<br />

Ci sono routine chiamate durante l’esecuzione della S_F<strong>un</strong>ction che potrebbero contenere<br />

interruzioni, tra cui:<br />

82


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

• mdlGetTimeOfNextVarInt<br />

• mdlOutputs<br />

• mdlUpdate<br />

• mdlDerivatives<br />

Se ne sono prive conviene specificare la nostra S_F<strong>un</strong>ction come exception free nel modo già<br />

spiegato.<br />

Se il co<strong>di</strong>ce è exception free ed è stato pre<strong>di</strong>sposto il trattamento degli errori<br />

(ssSetErrorStatus) in caso <strong>di</strong> errore Simulink interromperà l’esecuzione e visualizzando il<br />

messaggio. In caso <strong>di</strong> errore <strong>di</strong> gestione della memoria o altri errori critici, l'assenza<br />

dell'opzione SS_OPTION_EXCEPTION_FREE_CODE può portare alla chiusura <strong>di</strong> Simulink o<br />

<strong>ad</strong> <strong>un</strong> comportamento impreve<strong>di</strong>bile da parte del Matlab.<br />

2.3 Panoramica sulle Routines<br />

La sequenza in cui vengono chiamate le ruotine delle S_F<strong>un</strong>ction varia a seconda<br />

dell'ambiente (Target) per cui viene costruito l'eseguibile.<br />

Struttura <strong>di</strong> chiamata per Real Time Workshop<br />

Se si sta utilizzando Real Time Workshop per produrre il co<strong>di</strong>ce della S_F<strong>un</strong>ction non è<br />

necessario inserire nel programma tutta la struttura vista nel precedente paragrafo, ma basta<br />

rispettare il seguente schema (ve<strong>di</strong> fig. 2.5 a pagina seguente):<br />

83


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 2.5: Sequenza <strong>di</strong> esecuzione per Real Time Workshop<br />

Struttura <strong>di</strong> chiamata per modalità esterna<br />

Anche quando si esegue Simulink in modalità esterna (external mode) la sequenza <strong>di</strong><br />

chiamata <strong>di</strong> routine è <strong>di</strong>fferente e rispetta lo schema in figura 2.6:<br />

Figura 2.6: Sequenza <strong>di</strong> esecuzione in modalità esterna<br />

84


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

La chiamata alla routine mdlRTW viene effettuata <strong><strong>un</strong>a</strong> volta, quando si accede alla modalità<br />

esterna, ed ogni volta che si seleziona Update Diagram dal menu E<strong>di</strong>t del blocco S_F<strong>un</strong>ction.<br />

Trattamento dati nelle S-F<strong>un</strong>ctions<br />

I blocchi S_F<strong>un</strong>ction sono provvisti <strong>di</strong> segnali <strong>di</strong> input e output, parametri, stati interni del<br />

blocco, più aree <strong>di</strong> memoria riservate. La lettura e la scrittura dei segnali <strong>di</strong> input e output<br />

avviene tramite gli altri blocchi del modello collegati alla S_F<strong>un</strong>ction, che generalmente hanno<br />

ingressi e/o uscite vettoriali. Gli ingressi possono anche essere del tipo:<br />

• Ingressi esterni attraverso i blocchi import;<br />

• Sconnessi, se non è presente alc<strong>un</strong> segnale.<br />

Anche le uscite possono essere collegate a blocchi <strong>di</strong> tipo outport. I segnali <strong>di</strong> ingresso e<br />

uscita possono avere anche le seguenti caratteristiche:<br />

• Stati continui<br />

• Stati <strong>di</strong>screti<br />

• Aree dati <strong>di</strong> tipo reale, intero, o vettori <strong>di</strong> p<strong>un</strong>tatori<br />

Alc<strong>un</strong>i parametri possono essere forniti alla S_F<strong>un</strong>ction <strong>di</strong>rettamente nella finestra <strong>di</strong><br />

<strong>di</strong>alogo del blocco, si vedrà in seguito come.<br />

Le l<strong>un</strong>ghezze dei vari segnali e vettori può essere configurate per mezzo della routine<br />

mdlInitializeSizes. L’accesso alla struttura contenente i parametri del blocco può essere<br />

effettuato me<strong>di</strong>ante i seguenti coman<strong>di</strong>:<br />

nputRealPtrs uPtrs = ssGet InputPortRealSignalPtrs(S,in<strong>di</strong>ceporta)<br />

che fornisce in uPtrs <strong>un</strong> array <strong>di</strong> p<strong>un</strong>tatori, dove in<strong>di</strong>ceporta che è <strong>un</strong> valore intero compreso<br />

tra 0 e n-1 (con n numero <strong>di</strong> porte <strong>di</strong> ingresso). Per il generico elemento della porta si userà:<br />

*uPtrs[elem]<br />

Questi azioni corrispondono al seguente schema:<br />

85


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 2.7: Schema ingresso<br />

Per accedere all’ingresso 1 (ve<strong>di</strong> fig. 2.6):<br />

InputRealPtrs uPtrs0 = ssGetInputRealSignalPtrs(S;0)<br />

Per accedere all’ingresso 2:<br />

InputRealPtrs uPtrs1 = ssGetInputRealSignalPtrs(S;1)<br />

Figura 2.8: Modalità <strong>di</strong> ingresso<br />

86


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Come si può notare l’array <strong>di</strong> p<strong>un</strong>tatori non in<strong>di</strong>rizza necessariamente aree <strong>di</strong> memoria<br />

contigue. Per quanto riguarda il segnale d’uscita vi si può accedere nel modo seguente:<br />

real_T *y = ssGetOutputPortSignal(S,in<strong>di</strong>ceportauscita);<br />

dove in<strong>di</strong>ceportauscita ha lo stesso significato <strong>di</strong> in<strong>di</strong>ceporta visto in precedenza. Di seguito<br />

viene fornito <strong>un</strong> esempio <strong>di</strong> come accedere ai dati della porta <strong>di</strong> ingresso, leggendoli e<br />

successivamente copiandoli, senza alterazioni, nella porta <strong>di</strong> uscita, si noti che in tal caso è<br />

presente <strong>un</strong> <strong>di</strong>rect feedthrough che va quin<strong>di</strong> opport<strong><strong>un</strong>a</strong>mente specificato, come visto<br />

precedentemente.<br />

int_T element;<br />

int_T portWidth = ssGetInputPortWidth(S,inputPortIndex) ;<br />

inputRealPtrs uPtrs = ssGetInputPortRealSignalPtrs(S,inputPortIndex);<br />

real_T *y = ssGetOutputPortSignal(S,outputPortIdx);<br />

for (element=0; element


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

<strong>di</strong>alogo del blocco: Occorre determinare l’or<strong>di</strong>ne in cui i parametri vengono forniti nella<br />

finestra.<br />

Nella f<strong>un</strong>zione mdlInitializeSizes si utilizzi la macro ssSetNumSFcnParams per com<strong>un</strong>icare<br />

a Simulink il numero <strong>di</strong> parametri. Si specifichi S (è <strong>un</strong> p<strong>un</strong>tatore a SimStrusct) come primo<br />

argomento della macro ed il numero <strong>di</strong> parametri come secondo. L’accesso a questi parametri,<br />

all’interno della S_F<strong>un</strong>ction, è consentito me<strong>di</strong>ante la macro ssGetSFcnParam, specificando<br />

sempre S come primo argomento ed il numero d’or<strong>di</strong>ne del parametro come secondo.<br />

Si consideri quin<strong>di</strong> l’esempio <strong>di</strong> seguito riportato. Si inseriscano i seguenti coman<strong>di</strong> nella<br />

sezione delle definizioni:<br />

#define BASE_ADDRESS_PRM(S)<br />

#define GAIN_RANGE_PRM(S)<br />

#define PROG_GAIN(S)<br />

#define NUM_OF_CHANNELS_PRM(S)<br />

ssGetSFcnParams(S,0)<br />

ssGetSFcnParams(S,1)<br />

ssGetSFcnParams(S,2)<br />

ssGetSFcnParams(S,3)<br />

Questo co<strong>di</strong>ce definisce l’or<strong>di</strong>ne in cui i valori o i nomi dei parametri vanno inseriti nel<br />

campo S_F<strong>un</strong>ction Parameters della finestra <strong>di</strong> <strong>di</strong>alogo del blocco. La presenza <strong>di</strong> parametri<br />

forniti interattivamente deve essere specificata inserendo:<br />

ssSetSFcnParams(S,4);<br />

all’interno della f<strong>un</strong>zione mdlInitializeSizes.<br />

Cambiamento dei parametri<br />

Le routine che consentono all’utente <strong>di</strong> controllare ed elaborare i parametri aggiornati<br />

all’interno della S_F<strong>un</strong>ction sono: mdlCheckParameters, interna a mdlInitializeSizes, e<br />

mdlProcessParameters e possono essere usate solo all’interno <strong>di</strong> S_F<strong>un</strong>ction C-MEX.<br />

L’utilizzo <strong>di</strong> questa caratteristica assume <strong><strong>un</strong>a</strong> importanza rilevante quando si usa Real-Time<br />

Workshop, in tal caso deve essere attivata la f<strong>un</strong>zionalità External mode. Quest’ultima pone i<br />

dati aggiornati <strong>di</strong>rettamente nel co<strong>di</strong>ce eseguibile contenuto in memoria solo dopo che<br />

Simulink ha chiamato le precedenti routine ed effettuato le azioni che esse richiedono.<br />

88


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Me<strong>di</strong>ante le routine mdlCheckParameters e mdlInitializeSizes è infatti possibile controllare,<br />

con la prima, ed elaborare, con la seconda, i parametri aggiornati della S-F<strong>un</strong>ction. I relativi<br />

co<strong>di</strong>ci risultano essere:<br />

mdlCheckParameters<br />

#define MDL_CHECK_PARAMETERS<br />

#if defined (MDL_CHECK_PARAMETERS)<br />

static void mdlCheckParameters(SimStruct *S)<br />

{<br />

}<br />

#en<strong>di</strong>f<br />

mdlProcessParameters<br />

#define MDL_PROCESS_PARAMETERS<br />

#if defined(MDL_PROCESS_PARAMETERS)<br />

static void mdlProcessParameters(SimStruct *S)<br />

{<br />

}<br />

#en<strong>di</strong>f<br />

All’interno delle routine andrà inserito il co<strong>di</strong>ce opport<strong>un</strong>o per la validazione o<br />

l’elaborazione dei parametri aggiornati.<br />

Definizione delle caratteristiche <strong>di</strong> <strong>un</strong> blocco<br />

Il campo sizes del record SimStruct contiene delle informazioni importanti sulla S_F<strong>un</strong>ction<br />

quali il numero <strong>di</strong> ingressi, uscite, stati ed altre caratteristiche del blocco.Tale struttura è<br />

inizializzata nella f<strong>un</strong>zione mdlInitializeSizes ed i suoi valori possono essere letti e scritti<br />

me<strong>di</strong>ante delle macro.<br />

mdlInitializeSizes<br />

Come visto è la prima routine chiamata da Simulink e serve per specificare le caratteristiche <strong>di</strong><br />

<strong>un</strong> blocco (numero <strong>di</strong> ingressi, uscite, stati ecc.). Una <strong>di</strong> queste è la influenza <strong>di</strong>retta degli<br />

ingressi sulle uscite (<strong>di</strong>rect feedthrough) che va specificata settando <strong>un</strong> opport<strong>un</strong>o flag in<br />

mdlOutput mdlGrtTimeOfNextVarHit.<br />

89


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Possono essere specificati in questa f<strong>un</strong>zione anche parametri come: NumContStates,<br />

NumDiscStates, NumInputs, NumOutputs, NumRWork, NumIWork, NumPWork, NumModes e<br />

NumNonSampledZCs, dando loro valori interi non negativi che ne specificano l’ampiezza<br />

oppure specificando l’opzione DYNAMICALLY_SIZED che fa in modo che le ampiezze siano<br />

stabilite dai blocchi visti come ingressi dalla nostra S_F<strong>un</strong>ction. Ci sono macro che permettono<br />

<strong>di</strong> controllare delle informazioni, come:<br />

ssGetInputPortConnected(S), ssGetOutputPortConnected(S)<br />

che determinano il numero <strong>di</strong> porte connesse, oppure :<br />

ssSetSFcnParamNotT<strong><strong>un</strong>a</strong>ble(S,idparam)<br />

che stabilisce quali parametri non possono cambiare in corso <strong>di</strong> simulazione.<br />

Se le uscite sono <strong>di</strong>screte (ed assumono <strong>ad</strong> es. solo i valori 1 e 2) è opport<strong>un</strong>o specificare il<br />

valore SS_OPTION_DISCRETE_VALUED_OUTPUT. Nella f<strong>un</strong>zione mdlInitializeSizes è<br />

inoltre possibile specificare la frequenza <strong>di</strong> campionamento, si vedrà meglio più avanti come<br />

ciò sia possibile..<br />

Configurazione delle proprietà <strong>di</strong> I/O<br />

Nella f<strong>un</strong>zione mdlInitializeSizes si sono specificate le ampiezze delle porte come <strong>un</strong> intero<br />

non negativo. Se si specifica SS_OPTION_ALLOW_INPUT_SCALAR_EXPANSION ed <strong>un</strong><br />

intero positivo non nullo N, per <strong><strong>un</strong>a</strong> porta d’ingresso, allora l’ampiezza della rispettiva porta<br />

sarà o 1 o N.<br />

La routine ssGetInputPortWidth determina l’ampiezza attuale della porta specificata. Se<br />

specifichiamo l’opzione DYNAMICALLY_SIZED l’ampiezza della porta verrà determinata da<br />

Simulink all’atto della propagazione dei segnali durante l’esecuzione del modello.<br />

L’assegnazione delle ampiezze avviene me<strong>di</strong>ante le routine mdlSetInputPortWidth e<br />

mdlSetOutputPortWidth, se non specificate si avrà <strong><strong>un</strong>a</strong> configurazione <strong>di</strong> default (scalare). Si<br />

prendano in esame ora alc<strong>un</strong>e routine in modo più approfon<strong>di</strong>to:<br />

90


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

mdlSetInputPortSampleTime<br />

Chiamata <strong><strong>un</strong>a</strong> volta pervenuto il tempo <strong>di</strong> campionamento, nel caso in cui sia ere<strong>di</strong>tato da<br />

blocchi precedenti, deve stabilire se questo è accettabile, in tal caso si può andare avanti ed<br />

acquisire tale tempo utilizzando ssSetInputPortSampleTime, oppure no, in tal caso occorre<br />

inviare <strong>un</strong> opport<strong>un</strong>o messaggio <strong>di</strong> errore me<strong>di</strong>ante ssSetErrorStatus.<br />

mdlSetOutputPortSampleTime<br />

E’ l’equivalente della precedente per le porte d’uscita. Ovviamente in questo caso si utilizzerà<br />

ssSetOutpuPortSampleTime.<br />

mdlSetInputPortWidth<br />

Chiamata durante la propagazione delle ampiezze dei vettori per controllare la vali<strong>di</strong>tà<br />

dell’ampiezza proposta. Anch’essa deve prevedere <strong>un</strong> messaggio <strong>di</strong> errore opport<strong>un</strong>o qualora<br />

l’ampiezza fornita non sia valida.<br />

mdlSetOutputPortWidth<br />

E’ l’equivalente della routine precedente per le porte d’uscita.<br />

Impostazione dei tempi <strong>di</strong> campionamento<br />

Simulink prevede blocchi che vengono eseguiti a frequenze <strong>di</strong> campionamento <strong>di</strong>fferenti. I<br />

mo<strong>di</strong> previsti per determinare tali frequenze sono due:<br />

• Tempi <strong>di</strong> campionamento basati sul blocco (block based);<br />

• Tempi <strong>di</strong> campionamento basati sulla porta (port based).<br />

Nel primo caso la S_F<strong>un</strong>ction specifica tutte le frequenze <strong>di</strong> campionamento del blocco ed<br />

elabora ingressi ed uscite alla frequenza più elevata fra quelle specificate se ciasc<strong>un</strong> tempo <strong>di</strong><br />

campionamento è multiplo intero <strong>di</strong> quello più veloce. Nel secondo caso, invece, la S_F<strong>un</strong>ction<br />

specifica il tempo <strong>di</strong> campionamento per la porta <strong>di</strong> ingresso e <strong>di</strong> uscita. Per capire meglio i due<br />

meto<strong>di</strong> si consideri il caso <strong>di</strong> due tempi, rispettivamente 0.5 (input) e 0.25 (output) secon<strong>di</strong>:<br />

• Nel primo caso Simulink effettuerà i calcoli con <strong>un</strong> periodo <strong>di</strong> 0.25 secon<strong>di</strong>;<br />

91


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

• Nel secondo caso l’esecuzione dell’ingresso avviene <strong>ad</strong> <strong><strong>un</strong>a</strong> frequenza <strong>di</strong> 2Hz, mentre<br />

l’aggiornamento dell’uscita a 4Hz.<br />

Se quin<strong>di</strong> <strong><strong>un</strong>a</strong> specifica applicazione prevede tempi <strong>di</strong> campionamento <strong>di</strong>suguali, e si vuole<br />

evitare <strong>di</strong> dover eseguire tutti i blocchi alla frequenza più alta, è preferibile utilizzare<br />

l’impostazione port based. Per le applicazioni <strong>di</strong> tipo più com<strong>un</strong>e è com<strong>un</strong>que sufficiente<br />

l’impostazione block based.<br />

Tempi <strong>di</strong> campionamento Block based<br />

Quando si opta per <strong><strong>un</strong>a</strong> soluzione block based è necessario specificare delle informazioni. Si<br />

deve, infatti, configurare l’S_F<strong>un</strong>ction per lavorare con tempi <strong>di</strong> campionamento block based<br />

inserendo nella f<strong>un</strong>zione mdlInitializeSizes l’istruzione:<br />

ssSetNumSampleTimes(S,numsampletimes);<br />

dove numsampletimes è <strong>un</strong> numero positivo, onde specificare il numero <strong>di</strong> istanti <strong>di</strong><br />

campionamento.<br />

Poiché all’interno <strong>di</strong> questa f<strong>un</strong>zione Simulink chiama mdlInitializeSampleTimes occorre, in<br />

essa, specificare le seguenti informazioni:<br />

• Tempo <strong>di</strong> campionamento ed offset;<br />

• Chiamate a f<strong>un</strong>zioni.<br />

Nel primo caso si ricorrerà alle seguenti istruzioni:<br />

ssSetSampleTime(S, sampletimePairIndex, sample_time)<br />

ssSetOffsetTime(S, offsetTimePairIndex, offset_time)<br />

Si consulti il manuale per maggiori informazioni sulle coppie [ sample_time , offset_time ].<br />

Nel secondo si specificheranno quali elementi <strong>di</strong> uscita eseguono chiamate a f<strong>un</strong>zioni me<strong>di</strong>ante<br />

la macro ssSetCallSystemOutput.<br />

92


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Tempi <strong>di</strong> campionamento Port based<br />

Se si opta per questa soluzione occorre, invece, definire le proprietà della S_F<strong>un</strong>ction nelle<br />

seguenti routine:<br />

mdlInitializeSizes<br />

mdlSetInputPortSampleTime<br />

mdlSetOutputPortSampleTime<br />

Nella prima routine si specificheranno:<br />

ssSetNumSampleTime(S,PORT_BASED_SAMPLE_TIMES)<br />

insieme a:<br />

ssSetInputPortSampleTime(S,idx,period)<br />

ssSetInputPortOffsetTime(S,idx,offset)<br />

ssSetputputPortSampleTime(S,idx,period)<br />

ssSetOutputPortOffsetTime(S,idx,offset)<br />

La seconda e la terza routine vengono chiamate solo nel caso <strong>di</strong> tempi <strong>di</strong> campionamento <strong>di</strong><br />

tipo inherited, cioè acquisiti da altri blocchi connessi al nostro, e dovrà, quin<strong>di</strong>, prevedere<br />

controlli sull’accettabilità o meno del tempo acquisito, e, se questo è <strong>ad</strong>eguato, provvedere<br />

all’impostazione utilizzando le stesse macro della prima routine.<br />

E’ possibile anche realizzare blocchi S_F<strong>un</strong>ction che prevedano <strong>un</strong> f<strong>un</strong>zionamento<br />

multirate, per il quale si rimanda ai manuali.<br />

Configurazione <strong>di</strong> work vectors<br />

Se la S_F<strong>un</strong>ction prevede l’utilizzo <strong>di</strong> memoria persistente (cioè <strong>un</strong> area <strong>di</strong> memoria statica<br />

accessibile solo dall’istanza attuale della S_F<strong>un</strong>ction) è possibile utilizzare i work vectors al<br />

posto <strong>di</strong> variabili <strong>di</strong> tipo static o global, altrimenti accessibili da più istanze della S_F<strong>un</strong>ction,<br />

qualora fossero presenti più blocchi facenti riferimento allo stesso file C-MEX.<br />

Questa caratteristica <strong>di</strong> possedere <strong>un</strong> area <strong>di</strong> memoria privata viene detta re-entrancy. Queste<br />

aree <strong>di</strong> memoria definibili possono contenere tipi <strong>di</strong> dati interi, reali, p<strong>un</strong>tatori e dati <strong>di</strong> tipo<br />

generale (es. numero <strong>di</strong> stati continui, <strong>di</strong>screti, <strong>di</strong> mo<strong>di</strong> e così via.).<br />

93


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Le l<strong>un</strong>ghezze <strong>di</strong> tali vettori vanno specificate, come sempre, all’interno <strong>di</strong> mdlInitializeSizes<br />

con l’ausilio delle macro <strong>di</strong> sistema, tra cui:<br />

• ssSetNumContStates<br />

• ssSetNumDiscStates<br />

• ssSetNumRWork<br />

• ssSettNumIWork<br />

• ssSetNumPWork<br />

• ssSetNumModes<br />

• ssSetNumnonSampledZCs<br />

Nell’utilizzare tali macro occorre specificare:<br />

• Il valore 0 se il vettore non è utilizzato;<br />

• Un intero (>0) che ne in<strong>di</strong>ca la <strong>di</strong>mensione;<br />

• DYNAMICALLY_SIZED, qualora la sua <strong>di</strong>mensione <strong>di</strong>penda da altri blocchi, in tal caso<br />

per determinare le <strong>di</strong>mensioni dei vettori si utilizza la routine mdlSetWorkWidths.<br />

L’accesso alle strutture così definite avviene per mezzo delle macro del tipo ssGet* (es.<br />

ssGetRWork), e tramite esse si possono inizializzare i valori dei vettori, in mdlStart o in<br />

mdlInitializeCon<strong>di</strong>tions. Un caso a parte è rappresentato dai vettori mode-work e da quello<br />

degli attraversamenti (nonsampled zero crossing) utilizzato per determinare i passaggi per lo<br />

zero.<br />

Allocazione <strong>di</strong> memoria<br />

In alc<strong>un</strong>i casi la memoria messa a <strong>di</strong>sposizione dai work vector definiti nel precedente<br />

paragrafo può non essere sufficiente. In tal caso l’allocazione <strong>di</strong>namica <strong>di</strong> memoria non può<br />

essere effettuata me<strong>di</strong>ante le macro standard del MATLAB API (Application Program<br />

Interface) perché realizzate per MEX-file utilizzati da Matlab, non da Simulink. Il modo<br />

corretto per allocare memoria è, quin<strong>di</strong>, quello <strong>di</strong> utilizzare le macro calloc e free presenti nella<br />

libreria stdlib.h.<br />

Si può d<strong>un</strong>que allocare, usando calloc, ed inizializzare la memoria in mdlStart ponendo il<br />

p<strong>un</strong>tatore (ptr) a quest’area in <strong>un</strong> vettore pointer-work, come quelli visti prima, facendo:<br />

94


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

ssGetPWork(S)[i] = ptr;<br />

o collegarlo come dato utente:<br />

ssSetUser<strong>Da</strong>ta(S, ptr);<br />

Attenzione: l’area <strong>di</strong> memoria non va liberata in mdlTerminate me<strong>di</strong>ante la macro free.<br />

Inizializzazione delle S-F<strong>un</strong>ctions<br />

Questa operazione può essere effettuata per mezzo delle routine mdlStart e<br />

mdlInitializeCon<strong>di</strong>tions, per definire i work vector o i segnali d’uscita della S_F<strong>un</strong>ction. La<br />

prima routine viene chiamata da Simulink <strong><strong>un</strong>a</strong> sola volta all’inizio dell’esecuzione del modello.<br />

La seconda all’inizio della simulazione e ogni volta che viene richiesta, se permessa, la<br />

revisione degli stati.<br />

3 LO STATEFLOW MATLAB<br />

3.1 Introduzione<br />

Lo stateflow è <strong>un</strong>o strumento <strong>di</strong> sviluppo grafico per sistemi basati sulla teoria delle<br />

macchine a stati finiti ossia sistemi <strong>di</strong> controllo logici (controllore on-off, scheduler), o sistemi<br />

<strong>di</strong> supervisione (controllori <strong>ad</strong> alto livello, ecc).<br />

Una macchina a stati finiti, d<strong>un</strong>que, non è altro che la rappresentazione <strong>di</strong> <strong>un</strong> sistema a<br />

eventi <strong>di</strong>screti la cui evoluzione è regolata dal susseguirsi <strong>di</strong> con<strong>di</strong>zioni vere o false.<br />

Tr<strong>ad</strong>izionalmente gli ingegneri utilizzavano le tavole <strong>di</strong> verità per rappresentare le<br />

connessioni tra ingressi, uscite e stati. Tali tavole descrivevano la logica necessaria a<br />

controllare il comportamento del sistema preso in esame.<br />

L’approccio utilizzato da Stateflow per descrivere <strong>un</strong> sistema a stati <strong>di</strong>screti è quello <strong>di</strong><br />

modellarne il comportamento, in termini <strong>di</strong> transizioni attraverso gli stati. Lo stato attivo è<br />

determinato basandosi sul susseguirsi <strong>di</strong> eventi sotto determinate con<strong>di</strong>zioni. Pertanto le<br />

95


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

transizioni e gli stati nel loro complesso non sono altro che delle rappresentazioni grafiche<br />

basate su questo tipo <strong>di</strong> approccio.<br />

Stateflow è completamente integrato con Matlab-Simulink ed ha come caratteristica<br />

peculiare quella <strong>di</strong> consentire la valutazione e la mo<strong>di</strong>fica dei risultati e del comportamento del<br />

sistema <strong>ad</strong> ogni st<strong>ad</strong>io del progetto.<br />

Le macchine a stati finiti che questo ambiente <strong>di</strong> sviluppo permette <strong>di</strong> descrivere, sono<br />

caratterizzate da <strong>un</strong>o stato, <strong>un</strong> ingresso ed <strong>un</strong>’uscita e si connettono fra <strong>di</strong> loro me<strong>di</strong>ante delle<br />

transizioni. In particolare:<br />

• Stato: è la con<strong>di</strong>zione (modo) <strong>di</strong> f<strong>un</strong>zionamento della macchina;<br />

• Transizione: è la con<strong>di</strong>zione <strong>di</strong> cambiamento dello stato della macchina;<br />

• Ingressi: sono informazioni provenienti dall’esterno (eventi, segnali);<br />

• Uscite: sono segnali verso l’esterno il cui valore può essere f<strong>un</strong>zione degli stati o delle<br />

transizioni.<br />

Di seguito è raffigurato <strong>un</strong> esempio <strong>di</strong> controllo on-off <strong>di</strong> <strong>un</strong> forno (fig. 3.1) che evidenzia le<br />

parti caratterizzanti <strong>di</strong> <strong><strong>un</strong>a</strong> macchina a stati:<br />

Figura 3.1: Schema <strong>di</strong> <strong>un</strong> controllo on-off<br />

La macchina Stateflow è d<strong>un</strong>que <strong><strong>un</strong>a</strong> collezione <strong>di</strong> blocchi all’interno <strong>di</strong> <strong>un</strong> modello<br />

Simulink. Il modello simulink e la macchina stateflow lavorano insieme in perfetta armonia.<br />

96


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Infatti, eseguendo <strong><strong>un</strong>a</strong> simulazione, le porzioni <strong>di</strong> modello rappresentata in simulink e in<br />

stateflow vengono valutate ed eseguite automaticamente.<br />

Come noto da letteratura <strong>un</strong> modello simulink può essere costituito da <strong><strong>un</strong>a</strong> combinazione <strong>di</strong><br />

blocchi semplici, <strong>di</strong> blocchi <strong>di</strong> tipo toolbox o <strong>di</strong> blocchi stateflow. E’ importante precisare però<br />

che l’insieme <strong>di</strong> transizioni, note, eventi, stati si classificano a loro volta in oggetti grafici, linee<br />

(ossia transizioni) e blocchi (ossia stati), e in oggetti non grafici come eventi e dati. Tutti, nel<br />

loro complesso, rappresentano il cosiddetto chart (<strong>di</strong>agramma Stateflow).<br />

3.1 Stato<br />

Lo stato è rappresentato da <strong>un</strong> blocco contenente al suo interno l’appartenenza gerarchica,<br />

<strong>un</strong>’etichetta e delle azioni da effettuare a seconda del verificarsi <strong>di</strong> opport<strong>un</strong>e con<strong>di</strong>zioni. La<br />

gerarchia prevede che <strong>ad</strong> ogni stato sia associato <strong>un</strong> parente. In <strong>un</strong> <strong>di</strong>agramma stateflow che<br />

contenga <strong>un</strong> solo stato, il parente <strong>di</strong> quello stato è rappresentato dal <strong>di</strong>agramma stateflow<br />

stesso, chiamato Stateflow Diagram Rooot.<br />

Questa è la tipica struttura grafica <strong>di</strong> <strong>un</strong>o stato stateflow:<br />

Figura 3.2: Struttura <strong>di</strong> <strong>un</strong>o stato stateflow<br />

97


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

in cui è possibile identificare il campo gerarchia (p<strong>ad</strong>re, figlio), e le azioni da compiere in<br />

entrata (entry), in uscita (exit), durante la permanenza all’interno dello stato stesso (during) e<br />

al verificarsi <strong>di</strong> <strong>un</strong> determinato evento (on).<br />

In stateflow esistono due tipi <strong>di</strong> stato a seconda della decomposizione scelta. La<br />

decomposizione identifica infatti lo stato in base al tipo <strong>di</strong> stati figlio che esso può contenere al<br />

suo interno. Se tale decomposizione è esclusiva gli stati figlio potranno essere eseguiti<br />

singolarmente seguendo la legge booleana del OR. Se invece la decomposizione risulta essere<br />

parallela gli stati figlio potranno essere eseguiti contemporaneamente seguendo la legge<br />

booleana dell’AND. In tal caso lo stato p<strong>ad</strong>re verrà rappresentato graficamente con <strong>un</strong> riqu<strong>ad</strong>ro<br />

tratteggiato (ve<strong>di</strong> fig. 3.3):<br />

Figura 3.3: Esempio <strong>di</strong> stati paralleli<br />

3.2 Transizione<br />

Una transizione è <strong>un</strong> oggetto grafico, utilizzato per legare <strong>un</strong> blocco all’altro. La transizione<br />

è collegata da <strong>un</strong> lato all’oggetto sorgente, dall’altro all’oggetto destinatario. La sorgente è il<br />

p<strong>un</strong>to in cui la transizione ha origine, mentre la destinazione e il p<strong>un</strong>to in cui termina.<br />

La transizione prevede l’utilizzo <strong>di</strong> <strong>un</strong>’etichetta che in<strong>di</strong>ca le con<strong>di</strong>zioni sotto cui il sistema<br />

si muove da <strong>un</strong>o stato all’altro. Spesso è proprio il verificarsi <strong>di</strong> alc<strong>un</strong>i eventi che causa la<br />

98


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

transizione verso <strong>un</strong> nuovo stato. La figura 3.4 mostra <strong><strong>un</strong>a</strong> transizione in cui Clutch_engaged<br />

rappresenta l’evento che deve verificarsi affinché il sistema passi dallo stato neutral a quello<br />

engagered.<br />

Figura 3.4: Esempio <strong>di</strong> transizione<br />

L’etichetta nello specifico può essere costituita da (fig. 3.5):<br />

• Evento: in<strong>di</strong>ca quando <strong><strong>un</strong>a</strong> transizione <strong>di</strong>venta attiva (se non specificato, la transizione<br />

è attiva <strong>ad</strong> ogni evento);<br />

• Con<strong>di</strong>zione: viene valutata <strong><strong>un</strong>a</strong> volta che la con<strong>di</strong>zione è attivata e, se vera, la<br />

transizione viene effettuata. Nel caso in cui non fosse specificata, la con<strong>di</strong>zione<br />

verrebbe considerata sempre vera;<br />

• Azione con<strong>di</strong>zionata: viene eseguita se la con<strong>di</strong>zione è vera;<br />

• Azione della transizione: viene eseguita se la transizione è effettuata.<br />

Figura 3.5: Come scrivere <strong><strong>un</strong>a</strong> transizione<br />

Esiste inoltre <strong>un</strong> particolare tipo <strong>di</strong> transizione detta <strong>di</strong> default che specifica quale stato<br />

attivare quando vi è <strong><strong>un</strong>a</strong> ambiguità tra due o più stati esclusivi (OR) allo stesso livello<br />

gerarchico (fig. 3.6).<br />

99


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 3.6: Transizione <strong>di</strong> default<br />

Graficamente la transizione <strong>di</strong> default è rappresentata me<strong>di</strong>ante <strong><strong>un</strong>a</strong> freccia che ha come<br />

origine <strong>un</strong> p<strong>un</strong>to e come destinazione lo stato designato.<br />

3.3 Gi<strong>un</strong>zione<br />

La gi<strong>un</strong>zione permette <strong>di</strong> realizzare la struttura semantica if..then..else, ovviamente le regole<br />

semantiche dei p<strong>un</strong>ti <strong>di</strong> gi<strong>un</strong>zione si sovrappongono a quelle delle transizioni d<strong>un</strong>que se in <strong>un</strong><br />

ramo della selezione non è specificata la con<strong>di</strong>zione allora si assume <strong>di</strong> default “vera” (questo<br />

solo nel caso che le con<strong>di</strong>zioni sulle restanti transizioni siano false). Come da figura 3.7 az_A<br />

e compiuta solo se tutta la transizione è effettuata, mentre az_cond_A è compiuta solo se<br />

occorre.<br />

Figura 3.7: Esempio <strong>di</strong> gi<strong>un</strong>zione<br />

La gi<strong>un</strong>zione è <strong>un</strong> oggetto grafico, rappresentato schematicamente con <strong>un</strong> ton<strong>di</strong>no, che<br />

serve a semplificare la rappresentazione sotto forma <strong>di</strong> <strong>di</strong>agrammi e permette <strong>di</strong> generare<br />

100


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

co<strong>di</strong>ce efficiente. Le transizioni connesse alle gi<strong>un</strong>zioni prendono il nome <strong>di</strong> segmenti <strong>di</strong><br />

transizione (transition segment).<br />

Di seguito (fig. 3.8 pagina successiva) è riportato <strong>un</strong> ulteriore esempio che pone in evidenza<br />

nello specifico come sia possibile tr<strong>ad</strong>urre <strong><strong>un</strong>a</strong> con<strong>di</strong>zione if..else in <strong>un</strong> <strong>di</strong>agramma stateflow.<br />

<strong>Da</strong> <strong><strong>un</strong>a</strong> attenta analisi è possibile, inoltre, verificare come <strong><strong>un</strong>a</strong> transizione da stato a stato<br />

corrisponda esattamente con <strong>un</strong> segmento <strong>di</strong> transizione <strong><strong>un</strong>a</strong> volta completato il percorso che<br />

passa attraverso il p<strong>un</strong>to <strong>di</strong> gi<strong>un</strong>zione.<br />

Figura 3.8: Ulteriore esempio <strong>di</strong> gi<strong>un</strong>zione<br />

Una variante della gi<strong>un</strong>zione è la history j<strong>un</strong>ction ossia <strong><strong>un</strong>a</strong> gi<strong>un</strong>zione che memorizza quale<br />

sottostato sia rimasto più attivo rispetto agli altri. Se si verifica d<strong>un</strong>que <strong><strong>un</strong>a</strong> transizione <strong>ad</strong> <strong>un</strong><br />

determinato stato che sia dotato <strong>di</strong> history j<strong>un</strong>ction il sottostato selezionato, tra quelli<br />

<strong>di</strong>sponibili, sarà proprio quello che nel tempo <strong>di</strong> f<strong>un</strong>zionamento della macchina è risultato<br />

maggiormente attivo. Semplicemente quin<strong>di</strong> l’history j<strong>un</strong>ction consente <strong>di</strong> conservare lo stato<br />

della sottomacchina quando il p<strong>ad</strong>re ri<strong>di</strong>venta attivo.<br />

101


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 3.9: History j<strong>un</strong>ction<br />

3.4 Eventi<br />

Gli eventi sono alla base <strong>di</strong> <strong>un</strong>o stateflow chart, ma non sono oggetti grafici e per questo<br />

motivo non sono <strong>di</strong>rettamente rappresentati in <strong>un</strong> chart. E’ necessario definire tutti gli eventi<br />

che interessano <strong>un</strong> <strong>di</strong>agramma stateflow. Il verificarsi <strong>di</strong> <strong>un</strong> evento permette all’ambiente <strong>di</strong><br />

simulazione <strong>di</strong> selezionare <strong>un</strong>o stato e <strong>di</strong> valutarne il contenuto.<br />

Gli eventi possono essere creati e mo<strong>di</strong>ficati a ogni livello <strong>di</strong> gerarchia, usando l’Explorer<br />

all’interno <strong>di</strong> Staflow. Gli eventi si classificano in:<br />

• locali<br />

• input da Simulink<br />

• output verso Simulink<br />

• impliciti (l’enter, l’exit o il change all’interno <strong>di</strong> <strong>un</strong>o stato)<br />

3.5 <strong>Da</strong>ti<br />

Gli oggetti <strong>di</strong> tipo dati, com<strong>un</strong>emente denominati <strong>Da</strong>ta Objects sono utilizzati per<br />

memorizzare <strong>un</strong> valore numerico e sono anch’essi oggetti non grafici. Anche in questo caso è<br />

possibile mo<strong>di</strong>ficare e creare tali oggetti all’interno dell’Explorer <strong>di</strong> Stateflow. Una breve<br />

classificazione dei data object è la seguente:<br />

• locali<br />

102


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

• input da Simulink<br />

• output da Simulink<br />

• costanti<br />

• temporanei<br />

• booleani, double, interi<br />

• impliciti (assumo il valore “vero” quando lo stato a cui appartengono è attivo)<br />

Esistono inoltre, altri tipi <strong>di</strong> variabili numeriche come <strong>ad</strong> esempio la variabile tempo che<br />

assume per valore l’istante tempo e può essere utilizzata come <strong>un</strong> clock interno impostato<br />

dall’utente.<br />

4. DA <strong>UML</strong> A MATLAB: UN ESEMPIO<br />

4.1 Introduzione<br />

Si vedrà ora quali procedure <strong>ad</strong>ottare per poter realizzare <strong>un</strong> modello <strong>di</strong> simulazione Matlab-<br />

Simulink partendo da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> <strong>di</strong> <strong>un</strong> sistema <strong>di</strong> tipo ibrido. Verrà considerato<br />

come sistema <strong><strong>un</strong>a</strong> cella <strong>di</strong> lavoro da poter utilizzare in catene <strong>di</strong> montaggio industriali. Il<br />

sistema, costituito da due bracci robotici, da <strong><strong>un</strong>a</strong> rastrelliera, da <strong><strong>un</strong>a</strong> attrezzatura su cui eseguire<br />

la saldatura, da <strong>un</strong> nastro trasportatore, e da <strong>un</strong> pallet svolge ciclicamente le seguenti azioni:<br />

• Prelievo pezzo A con robot1 da rastrelliera;<br />

• Deposito pezzo A su attrezzatura <strong>di</strong> saldatura;<br />

• Prelievo pezzo B con robot1 da rastrelliera;<br />

• Deposito pezzo B su attrezzatura <strong>di</strong> saldatura;<br />

• Esecuzione saldatura a p<strong>un</strong>ti (Robot1);<br />

• Posizionamento dell’assieme su pallet (Robot2);<br />

• Ripetizione saldatura per <strong>un</strong> secondo pezzo;<br />

• Allontanamento del pallet con due pezzi saldati dalla cella.<br />

Analizzando tale cella sarà possibile modellare la <strong>di</strong>namica dei robots con <strong>un</strong>o schema<br />

Simulink tempo continuo e il f<strong>un</strong>zionamento <strong>di</strong> tutti gli altri componenti come <strong><strong>un</strong>a</strong> sequenza <strong>di</strong><br />

operazione <strong>di</strong>screte, ottenendo <strong>un</strong> sistema complessivamente Ibrido. Nella prima fase del<br />

103


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

progetto verrà elaborata <strong><strong>un</strong>a</strong> <strong>descrizione</strong> del sistema in <strong>UML</strong>, seguendo le procedure già<br />

descritte ossia la realizzazione <strong>di</strong>:<br />

• Class Diagram<br />

• State Diagram<br />

• Collaboration Diagram<br />

• Sequence Diagram<br />

In seguito, servendosi dello State Diagram, si rappresenteranno me<strong>di</strong>ante precise regole <strong>di</strong><br />

tr<strong>ad</strong>uzione le componenti <strong>di</strong>screte del sistema in ambente Stateflow. Si <strong>di</strong>scuterà della<br />

realizzazione <strong>di</strong> <strong>un</strong> blocco Simulink che descriva le componenti continue e del suo<br />

interfacciamento con il blocco stateflow. Si analizzerà inoltre, la possibilità <strong>di</strong> effettuare il<br />

passaggio <strong>UML</strong>-Matlab sfruttando <strong>di</strong>rettamente le potenzialità offerte da S-F<strong>un</strong>ction.<br />

Per concludere <strong><strong>un</strong>a</strong> breve <strong>di</strong>scussione sul problema dell’Override <strong>di</strong> variabili e sulle<br />

soluzioni, che strumenti analizzati (Matlab/<strong>UML</strong>), offrono per risolverlo.<br />

4.2 Scelta <strong>di</strong> componenti e attrezzature per l’impianto<br />

L’impianto <strong>di</strong> saldatura robotizzato richiede l’impiego <strong>di</strong> due <strong>di</strong>stinti robot con mansioni<br />

<strong>di</strong>verse. Mentre il primo, da qui in avanti denominato robot1, ha la f<strong>un</strong>zione <strong>di</strong> movimentare i<br />

pezzi, prima e dopo che questi siano sottoposti al processo tecnologico, il secondo, in<strong>di</strong>cato<br />

come robot2, esegue la saldatura vera e propria. Conviene d<strong>un</strong>que analizzare <strong>di</strong>stintamente le<br />

caratteristiche delle due macchine in f<strong>un</strong>zione <strong>di</strong> <strong><strong>un</strong>a</strong> maggiore chiarezza.<br />

Caratteristiche dei pezzi da movimentare<br />

I pezzi A e B risultano del tutto simili dal p<strong>un</strong>to <strong>di</strong> vista delle forme, <strong>di</strong>fferenziandosi nel<br />

valore <strong>di</strong> <strong><strong>un</strong>a</strong> quota: sono delle lamiere <strong>di</strong> spessore 2mm <strong>di</strong> acciaio piegate <strong>ad</strong> L, <strong>di</strong> <strong>di</strong>mensioni<br />

riportate in figura 4.6 a pagina 110. La massa dei componenti da saldare, in base alla geometria<br />

illustrata, è 3.65 kg. L’ingombro massimo, definito come il minimo parallelepipedo circoscritto<br />

all’oggetto da manipolare, si ha dopo la saldatura dei componenti A e B e risulta<br />

I A+B = 350[mm] × 350[mm] × 170[mm].<br />

104


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Ipotizzando che il gripper abbia <strong><strong>un</strong>a</strong> massa <strong>di</strong> 2 kg, dato che nelle con<strong>di</strong>zioni più gravose il<br />

robot1 deve movimentare <strong>un</strong> oggetto <strong>di</strong> massa <strong>di</strong> 3.65 kg, cautelativamente il robot1 deve avere<br />

<strong><strong>un</strong>a</strong> capacità <strong>di</strong> carico statico <strong>di</strong> almeno 10 kg.<br />

Robot1 per la movimentazione<br />

Il robot1 deve effettuare l’asservimento del robot2, destinato alla saldatura a p<strong>un</strong>ti, il che<br />

consiste nell’eseguire le seguenti operazioni <strong>ad</strong> ogni ciclo:<br />

1. prelevare pezzo A da rastrelliera, che f<strong>un</strong>ge da magazzino, e depositarlo su attrezzatura<br />

<strong>di</strong> saldatura;<br />

2. prelevare pezzo B da rastrelliera e depositarlo su attrezzatura <strong>di</strong> saldatura;<br />

3. posizionare l’assieme su pallet.<br />

Tutto ciò deve avvenire rispettando le seguenti specifiche:<br />

• Struttura cinematica: robot articolato (RRR).<br />

• Spazio <strong>di</strong> lavoro: raggio max non inferiore a 1.3 m ed ampiezza non inferiore a 150°;<br />

• Gr<strong>ad</strong>i <strong>di</strong> libertà: 5 (o 6);<br />

• Tipo <strong>di</strong> azionamento: elettrico;<br />

• Capacità <strong>di</strong> carico statica: 10 kg;<br />

• Velocità massima <strong>di</strong> movimentazione: 250°/s;<br />

• Accelerazione massima <strong>di</strong> movimentazione 100°/s 2 ;<br />

• Ripetibilità <strong>di</strong> posizionamento: almeno +/- 0.3mm.<br />

Un esempio <strong>di</strong> robot rispondente alle caratteristiche elencate è l’ABB IRB 2400/10 <strong>di</strong> cui si<br />

riporta <strong><strong>un</strong>a</strong> breve <strong>descrizione</strong>:<br />

• Capacità <strong>di</strong> carico:<br />

o Paylo<strong>ad</strong>: 10 kg.<br />

o Supplementary lo<strong>ad</strong>: 10 kg on the up-per arm; 35 kg on the base <strong>un</strong>it.<br />

• Dimensioni:<br />

o Manipulator bases: 723x600 mm<br />

105


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

o Max. reach: 1500 mm.<br />

• Positional repeatability: +/- 0.6mm (average result from ISO test).<br />

• Number of axes: 6.<br />

• Prestazioni cinematiche (working range):<br />

o Axis 1, Rotation 360°<br />

o Axis 2, Arm 200°<br />

o Axis 3, Arm 125°<br />

o Axis 4, Wrist 400° (<strong>un</strong>limited)<br />

o Axis 5, Bend 240°<br />

o Axis 6, Rotation 800° (<strong>un</strong>limited)<br />

• Prestazioni <strong>di</strong>namiche:<br />

o Max. speed:<br />

• Axis 1, Rotation 150°/s<br />

• Axis 2, Arm 150°/s<br />

• Axis 3, Arm 150°/s<br />

• Axis 4, Wrist 360°/s<br />

• Axis 5, Bend 360°/s<br />

• Axis 6, Rotation 450°/s<br />

• Weight: 380 kg.<br />

• Mo<strong>un</strong>ting position: floor.<br />

Le figure 4.1 e 4.2 mostrano rispettivamente il <strong>di</strong>agramma <strong>di</strong> carico statico e l’area <strong>di</strong><br />

lavoro del robot1:<br />

Figura 4.1: Diagramma <strong>di</strong> carico statico<br />

106


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 4.2: Area <strong>di</strong> lavoro (misure riportate in mm)<br />

Robot2 per la saldatura a p<strong>un</strong>ti<br />

Il robot2 deve effettuare la saldatura a p<strong>un</strong>ti dei pezzi A e B, il che consiste nell’eseguire le<br />

seguenti operazioni <strong>ad</strong> ogni ciclo:<br />

1. attendere che il robot1 abbia posizionato i pezzi A e B sulla tavola girevole;<br />

2. effettuare la saldatura a p<strong>un</strong>ti dei pezzi A e B.<br />

La caratteristica più importante dell’end effector è la massa. Le pinze <strong>di</strong> saldatura in<br />

commercio, avendo caratteristiche variabili in <strong>un</strong> ampio range, hanno masse molto <strong>di</strong>fferenti,<br />

tuttavia, essendo lo spessore da saldare <strong>di</strong> solo 4 mm, si sceglierà <strong><strong>un</strong>a</strong> pinza <strong>di</strong> piccola taglia e<br />

com<strong>un</strong>que con m pinza ≤ 100 kg. Non si considerano pesi aggi<strong>un</strong>tivi dovuti <strong>ad</strong> accessori dell’end<br />

effector perché il generatore <strong>di</strong> tensione che alimenta la pinza è non collocato a bordo del robot,<br />

bensì a terra, e l’<strong>un</strong>ico peso aggi<strong>un</strong>tivo è quin<strong>di</strong> dovuto ai cavi elettrici. <strong>Da</strong>to che i robot per la<br />

saldatura a p<strong>un</strong>ti hanno paylo<strong>ad</strong> elevato, possiamo trascurare nella scelta il peso <strong>di</strong> tali cavi e<br />

considerare <strong>un</strong> opport<strong>un</strong>o coefficiente <strong>di</strong> sicu-rezza sulla massa della pinza.<br />

Le specifiche da rispettare sono:<br />

107


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

• Struttura cinematica: robot articolato (RRR);<br />

• Spazio <strong>di</strong> lavoro: raggio max non inferiore a 1.5 m ed ampiezza non inferiore a 100°;<br />

• Gr<strong>ad</strong>i <strong>di</strong> libertà: 5 (o 6);<br />

• Tipo <strong>di</strong> azionamento: elettrico;<br />

• Capacità <strong>di</strong> carico statica: 110 kg;<br />

• Velocità massima <strong>di</strong> movimentazione: almeno 80°/s;<br />

• Ripetibilità <strong>di</strong> posizionamento: almeno +/- 0.2mm.<br />

Un robot rispondente a tali caratteristiche è il KUKA KR125/3 <strong>di</strong> cui se ne riporta <strong><strong>un</strong>a</strong> breve<br />

<strong>descrizione</strong>:<br />

• Capacità <strong>di</strong> carico:<br />

o Paylo<strong>ad</strong>: 125 kg.<br />

o Supplementary lo<strong>ad</strong>: 120 kg on the upper arm, 245 total <strong>di</strong>stributed lo<strong>ad</strong>.<br />

• Dimensioni:<br />

o Manipulator bases: 810x810 mm<br />

o Max. reach: 2410 mm.<br />

• Positional repeatability: +/- 0.2mm (average result from ISO test).<br />

• Number of axes: 6.<br />

• Prestazioni cinematiche (working range):<br />

o Axis 1, Rotation 370°<br />

o Axis 2, Arm 133°<br />

o Axis 3, Arm 268°<br />

o Axis 4, Wrist 700° (<strong>un</strong>limited)<br />

o Axis 5, Bend 240°<br />

o Axis 6, Rotation 700°<br />

• Prestazioni <strong>di</strong>namiche:<br />

o Max. speed:<br />

• Axis 1, Rotation 101°/s<br />

• Axis 2, Arm 101°/s<br />

• Axis 3, Arm 101°/s<br />

• Axis 4, Wrist 157°/s<br />

• Axis 5, Bend 170°/s<br />

108


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

• Weight: 970 kg.<br />

• Mo<strong>un</strong>ting position: floor.<br />

• Axis 6, Rotation 239°/s<br />

In figura 4.4 è riportata la vista laterale e in pianta dell’area <strong>di</strong> lavoro.<br />

Figura 4.3: KUKA KR125/3<br />

Figura 4.4: Area <strong>di</strong> lavoro (misure riportate in mm)<br />

109


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

End Effector dei due robot<br />

L’end effector montato sul robot1 deve permettere la corretta esecuzione delle operazioni <strong>di</strong><br />

prelievo e movimentazione dei pezzi A e B dalla rastrelliera sulla quale sono inizialmente<br />

immagazzinati, nonché il deposito sulla tavola <strong>di</strong> saldatura e, al termine dell’esecuzione del<br />

processo tecnologico <strong>ad</strong> opera del robot2, lo scarico dell’assieme e il suo posizionamento su <strong>di</strong><br />

<strong>un</strong> pallet. Il suo compito è quin<strong>di</strong> quello <strong>di</strong> asservire il robot <strong>di</strong> saldatura effettuando carico e<br />

scarico dei componenti, si sceglie a tale scopo <strong>di</strong> <strong>ad</strong>operare <strong>un</strong> gripper a quattro ventose.<br />

Per la scelta delle superfici <strong>di</strong> afferraggio dei pezzi A e B, si analizzerà <strong>un</strong>o soltanto <strong>di</strong> essi<br />

in quanto simili. La superficie 1’ si configura tuttavia come la più idonea all’afferraggio (figura<br />

4.5) per <strong>un</strong> duplice motivo:<br />

1. su <strong>di</strong> essa non vengono eseguite operazioni tecnologiche, è perciò valida sia prima che<br />

dopo la saldatura: ciò semplifica la programmazione del robot;<br />

2. è parallela al piano <strong>di</strong> appoggio: in fase <strong>di</strong> rilascio dei pezzi questo è molto importante,<br />

poiché le eventuali forze dovute al rilascio non tendono a ribaltare il pezzo in <strong>un</strong><br />

gripper a depressione.<br />

Tutte le altre superfici non sono <strong>ad</strong>atte o perché superfici <strong>di</strong> appoggio (sup. 1” e 2”), o<br />

perchè <strong>di</strong> ampiezza limitata (sup. 3’ e 3”; sup. 4’ e 4”). Il posizionamento sulla tavola <strong>di</strong><br />

saldatura risulta piuttosto delicato a causa della necessità <strong>di</strong> porre in contatto e affacciate le<br />

superfici 2” dei pezzi A e B: oltre <strong>ad</strong> <strong>un</strong>’ accurata programmazione, in questa fase, devono<br />

d<strong>un</strong>que essere pre<strong>di</strong>sposti dei riferimenti per evitare che al contatto dei pezzi ci possa essere<br />

spostamento <strong>di</strong> <strong>un</strong>o dei due con la successiva impossibilità <strong>di</strong> eseguire correttamente la<br />

saldatura.<br />

L’end effector montato sul polso del robot2 è <strong><strong>un</strong>a</strong> pinza <strong>di</strong> saldatura che deve eseguire 5<br />

p<strong>un</strong>ti <strong>di</strong> saldatura su ciasc<strong>un</strong> gruppo <strong>di</strong> pezzi A+B posizionati sulla tavola girevole dal robot1.<br />

La saldatura avviene sulle superfici 2’ dei pezzi affacciati (figura 4.5), su <strong><strong>un</strong>a</strong> lamiera <strong>di</strong><br />

spessore complessivo 2+2 mm. I p<strong>un</strong>ti <strong>di</strong> saldatura sono <strong>di</strong>sposti con regolarità secondo <strong><strong>un</strong>a</strong><br />

forma a C geometrico, con il lato l<strong>un</strong>go parallelo al piano <strong>di</strong> appoggio dell’assieme: sono in<br />

numero <strong>di</strong> tre sul lato l<strong>un</strong>go, <strong>un</strong>o posto sulla mezzeria della lamiera <strong>ad</strong> <strong><strong>un</strong>a</strong> <strong>di</strong>stanza <strong>di</strong> 25 mm<br />

dall’estremità superiore, e gli altri due <strong>di</strong>sposti simmetricamente a 150 mm da questo; mentre<br />

gli ultimi due p<strong>un</strong>ti, <strong>un</strong>o rispettivamente per parte, sono posti a formare la C <strong>ad</strong> <strong><strong>un</strong>a</strong> <strong>di</strong>stanza <strong>di</strong><br />

75 mm sulla verticale degli estremi del lato l<strong>un</strong>go.<br />

110


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Durante il processo tecnologico <strong>di</strong> saldatura il robot2 deve posizionare la pinza,<br />

eventualmente ruotando il polso qualora le <strong>di</strong>mensioni degli elettro<strong>di</strong> non fossero sufficienti a<br />

mantenere <strong>un</strong> <strong>un</strong>ico orientamento spaziale, sui p<strong>un</strong>ti in<strong>di</strong>cati realizzando la locale fusione del<br />

materiale e garantendo quin<strong>di</strong> la continuità fisica dell’assieme.<br />

Figura 4.5: Superfici <strong>di</strong> riferimento dei pezzi A e B<br />

Trasportatore<br />

In base ai dati del problema, il trasportatore ha la f<strong>un</strong>zione <strong>di</strong> allontanare dalla cella <strong>di</strong><br />

lavoro i pallets su cui sono posizionati le coppie <strong>di</strong> pezzi saldati.<br />

La definizione della geometria <strong>di</strong> ciasc<strong>un</strong> pezzo saldato può essere fatta considerando l’<strong>un</strong>ione<br />

<strong>di</strong> <strong>un</strong> pezzo A e <strong>di</strong> <strong>un</strong> pezzo B, l<strong>un</strong>go le superfici verticali 2”, attraverso la saldatura a p<strong>un</strong>ti<br />

sulle superfici 2’ (si rimanda alla figura 4.5). L’assieme assume quin<strong>di</strong> <strong><strong>un</strong>a</strong> forma a T<br />

rovesciato e presenta le seguenti <strong>di</strong>mensioni:<br />

• l<strong>un</strong>ghezza = 350 mm;<br />

• larghezza = 350 mm;<br />

• altezza = 170 mm;<br />

• spessore lamina saldata verticale = 4 mm;<br />

• spessore lamine orizzontali = 2 mm.<br />

111


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 4.6: Disegno schematico <strong>di</strong> <strong>un</strong> pezzo saldato<br />

I pezzi saldati vengono prelevati dalla tavola girevole dal robot1 per mezzo del gripper a<br />

depressione e posizionati sulla superficie superiore del pallet. <strong>Da</strong>l momento che il baricentro <strong>di</strong><br />

ogni pezzo saldato risulta prossimo al tratto verticale delle lamiere e spostato verso il pezzo A,<br />

il gripper afferra ciasc<strong>un</strong> pezzo saldato sulla superficie 1’ del pezzo A e lo posiziona sul pallet<br />

appoggiandolo sulla superficie inferiore 1’’ <strong>di</strong> <strong>di</strong>mensioni 350x350mm, con il tratto verticale<br />

delle lamiere <strong>di</strong>sposto perpen<strong>di</strong>colarmente rispetto la <strong>di</strong>rezione <strong>di</strong> avanzamento del<br />

trasportatore.<br />

Figura 4.7: Schema <strong>di</strong> <strong>di</strong>sposizione <strong>di</strong> <strong>un</strong> pezzo saldato sul pallet<br />

Il pallet deve essere realizzato in modo che entrambi i pezzi saldati trovino <strong>un</strong> opport<strong>un</strong>o<br />

riferimento <strong><strong>un</strong>a</strong> volta appoggiati sopra <strong>di</strong> esso. Si pensa <strong>di</strong> realizzare ciò avvitando sopra il<br />

112


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

pallet <strong><strong>un</strong>a</strong> sottile lamiera <strong>di</strong> 3 mm con due fori qu<strong>ad</strong>rati <strong>di</strong> <strong>di</strong>mensioni 352x352 con <strong>un</strong>o smusso<br />

1x45° sui bor<strong>di</strong> superiori per favorire l’ingresso del pezzo finale. Il trasportatore, considerando<br />

che deve garantire l’entrata e l’uscita del pallet dalla cella <strong>di</strong> lavoro, deve avere le seguenti<br />

<strong>di</strong>mensioni:<br />

• larghezza = 600 mm;<br />

• l<strong>un</strong>ghezza = 9000 mm.<br />

Si considera per como<strong>di</strong>tà che il tratto <strong>di</strong> trasportatore, presente nella cella sia lineare. A tale<br />

scopo si sceglie <strong>di</strong> utilizzare il modello GR/TR1 della F.lli Arnabol<strong>di</strong> che sembra sod<strong>di</strong>sfare<br />

tutte le specifiche. Si riportano si seguito le caratteristiche principali:<br />

• Alimentazione 220/380V, 50Hz Trifase;<br />

• Struttura in profilato d'alluminio da ;<br />

• Trasporto con catena speciale da 3/8" tripla con rullo folle <strong>ad</strong> <strong>un</strong> passo <strong>di</strong> 19.5mm;<br />

• Centraggio pallet +/- 0.2mm;<br />

• Scorrimento catena su guide in Polizene;<br />

• Motoriduttore e ten<strong>di</strong>tore posti alle 2 estremità del modulo;<br />

• Velocità <strong>di</strong> avanzamento <strong>di</strong> circa 12m/min;<br />

• Potenza installata 0.37kW;<br />

• Cavalletti <strong>di</strong> supporto in elettrosaldato <strong>ad</strong> int. <strong>di</strong> circa 2000mm.<br />

Figura 4.8: GR/TR1<br />

Considerando che il trasportatore sia facente parte <strong>di</strong> <strong>un</strong> sistema <strong>di</strong> movimentazione più<br />

ampio, sul pallet si dovrà prevedere <strong>un</strong> chip magnetico per lo stato del complessivo e l<strong>un</strong>go la<br />

linea del nastro trasportatore dovranno essere posizionati <strong>un</strong> co<strong>di</strong>ce-lettore e <strong>un</strong> co<strong>di</strong>ce-<br />

113


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

scrittore. Trascurando i dettagli geometrici meno importanti, si considera <strong>un</strong> pallet con forma e<br />

<strong>di</strong>mensioni analoghe a quelle <strong>di</strong> figura 4.9, ove i 4 fori svasati costituiscono l’innesto per il<br />

sistema <strong>di</strong> centraggio e <strong>di</strong> sollevamento del pallet quando questo si ferma <strong>di</strong> fronte al robot1.<br />

Tale gruppo, se impiegato, consente <strong>di</strong> non fermare il trasportatore quando il pallet è fermo<br />

davanti alla stazione <strong>di</strong> lavoro, senza tuttavia che la catena strusci sulla superficie inferiore del<br />

pallet, con problemi <strong>di</strong> usura e <strong>di</strong> posizionamento instabile.<br />

Tavola girevole<br />

Figura 4.9: Disegno quotato <strong>di</strong> massima del pallet <strong>ad</strong>ottato<br />

La tavola per la saldatura deve essere in gr<strong>ad</strong>o <strong>di</strong> permettere <strong>un</strong> preciso riferimento dei pezzi<br />

A e B e il bloccaggio <strong>di</strong> essi durante la saldatura per evitare eventuali spostamenti con i<br />

conseguenti errori che renderebbero il pezzo da scartare. Per la definizione delle specifiche si<br />

deve prevedere anche che la tavola sia in gr<strong>ad</strong>o <strong>di</strong> permettere <strong><strong>un</strong>a</strong> rotazione <strong>di</strong> 90° (della<br />

superficie su cui vengono posti gli oggetti da saldare) dopo che sia stato posizionato il pezzo A<br />

e <strong>di</strong> 180° dopo che sia stato posizionato il pezzo B. Per non lavorare le superfici della tavola<br />

girevole, si dovrà prevedere montato sopra <strong>di</strong> essa <strong>un</strong> supporto. Per tale tavola si deve cercare<br />

inoltre <strong>di</strong> contenere gli ingombri, compatibilmente con la possibilità <strong>di</strong> poter essere <strong>di</strong><br />

riferimento al supporto che andrà fissato sopra <strong>di</strong> esso. Il supporto dovrà presentare <strong>un</strong> incasso<br />

qu<strong>ad</strong>rato <strong>di</strong> <strong>di</strong>mensioni 352x352mm e profondo 3 mm con smusso 1x45° per consentire che i<br />

pezzi possano essere appoggiati sulla loro superficie inferiore 1”.<br />

In base alle specifiche <strong>di</strong>scusse il modello RP2E-150N dell’ANDITAUTOMAZIONE sembra<br />

essere quello più <strong>ad</strong>atto (figura 4.10). Se ne riportano le caratteristiche principali:<br />

114


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

• La tavola può essere ruotata su entrambi i lati <strong>di</strong> +/- 1350° ;<br />

• Massimo carico movimentabile: 150 kg;<br />

• Velocità <strong>di</strong> rotazione massima: 21 r<strong>ad</strong>/min;<br />

• Velocità <strong>di</strong> inclinazione: 12 r<strong>ad</strong>/min;<br />

• Momento torcente <strong>di</strong> rotazione: 147Nm ;<br />

• Momento torcente <strong>di</strong> inclinazione: 426Nm ;<br />

• Ripetibilità <strong>di</strong> posizionamento: +/- 0.2mm ;<br />

• Posizione <strong>di</strong> arresto: arbitraria.<br />

Figura 4.10: RP2E-150N<br />

Tale tavola è inoltre corredata <strong>di</strong> <strong>un</strong> supporto analogo a quello riportato in figura 4.11<br />

realizzato in acciaio e dal peso <strong>di</strong> 30Kg.<br />

Figura 4.11: Disegno 3D del supporto<br />

Vanno tuttavia utilizzati opport<strong>un</strong>i sistemi per il riferimento dei pezzi: si utilizzano a tal<br />

scopo 4 spine cilindriche <strong>di</strong> raggio 10 mm, <strong>di</strong> cui tre servono per il centraggio del pezzo A<br />

(definendo due superfici) mentre il quarto per il pazzo B (che troverà come riferimento anche la<br />

superficie 2’’ del pezzo A. Dopo che è stato posizionato il pezzo A due martinetti pneumatici si<br />

abbassano fino a gi<strong>un</strong>gere in contatto con la superficie 1’; per il pezzo B si prevede invece che i<br />

martinetti pneumati-ci ruotino attorno a <strong>un</strong> asse sulla superficie della tavola fino al contatto. Si<br />

115


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

vedano a tal scopo la Figura 4.12, in cui si mostrano le attrezzature <strong>di</strong> bloccaggio e quelle <strong>di</strong><br />

riferimento.<br />

Rastrelliera<br />

Figura 4.12: Tavola con elementi <strong>di</strong> riferimento e bloccaggio pezzo<br />

I pezzi A e B sono inizialmente immagazzinati in <strong><strong>un</strong>a</strong> rastrelliera, che deve:<br />

• garantire <strong>un</strong> corretto e stabile posizionamento degli oggetti per permettere il prelievo<br />

da parte del robot 1;<br />

• minimizzare gli ingombri;<br />

• avere <strong><strong>un</strong>a</strong> struttura tale da garantire l’alloggiamento <strong>di</strong> <strong>un</strong> numero elevato <strong>di</strong> pezzi<br />

(almeno 10).<br />

Vista la geometria dei pezzi A e B (l’assieme sarà invece depositato su <strong>un</strong> pallet), e il loro<br />

spessore limitato, conviene impiegare <strong><strong>un</strong>a</strong> rastrelliera-magazzino a sviluppo verticale (in questo<br />

modo si limitano notevolmente gli ingombri), in gr<strong>ad</strong>o <strong>di</strong> contenere due pile separate <strong>di</strong> pezzi<br />

posti <strong>un</strong>o sopra l’altro, <strong><strong>un</strong>a</strong> pila per ciasc<strong>un</strong> tipo <strong>di</strong> oggetto.<br />

Il problema del corretto posizionamento può essere risolto sfruttando la forma <strong>ad</strong> L dei<br />

pezzi: inclinando le pile in modo che la superficie 1’ formi <strong>un</strong> angolo <strong>di</strong> almeno 15° rispetto al<br />

pavimento, si riesce a garantire che gli oggetti non si spostino dalla posizione <strong>di</strong> presa a causa<br />

<strong>di</strong> fenomeni <strong>di</strong> perturbazione (vibrazioni dovute, per es., <strong>ad</strong> <strong><strong>un</strong>a</strong> pressa, o altro).<br />

116


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

La forza <strong>di</strong> gravità è infatti sfruttata come fattore attivo per evitare movimenti non voluti.<br />

Tre paratie, <strong>di</strong> cui due laterali alle pile e <strong><strong>un</strong>a</strong> centrale come elemento <strong>di</strong>visorio, impe<strong>di</strong>scono poi<br />

la traslazione laterale delle lamiere e assicurano errori <strong>di</strong> afferraggio limitati e recuperabili con i<br />

riferimenti sulla tavola <strong>di</strong> saldatura (prevedendo infatti <strong>un</strong> gioco max lamiere-paratie<br />

dell’or<strong>di</strong>ne <strong>di</strong> 1 mm, i limiti <strong>di</strong> precisione del gripper a depressione vengono ampiamente<br />

compensati). Il modello solido della rastrelliera scelta è riportato in figura 4.13.<br />

Definizione del Layout<br />

Figura 4.13: Rastrelliera<br />

Si intende ora analizzare la <strong>di</strong>sposizione dei componenti nella cella <strong>di</strong> lavoro. Innanzi tutto<br />

bisogna considerare che il robot1 deve poter essere in gr<strong>ad</strong>o <strong>di</strong> movimentare i pezzi A e B dalla<br />

rastrelliera alla tavola girevole e, al termine dell’operazione <strong>di</strong> saldatura, il pezzo saldato sul<br />

pallet. Per tale motivo, essendo il robot1 <strong>di</strong> tipo articolato e quin<strong>di</strong> dotato <strong>di</strong> moto rotoidale<br />

attorno all’asse del joint 1, bisognerà <strong>di</strong>sporre i componenti che esso dovrà raggi<strong>un</strong>gere su <strong>di</strong><br />

<strong><strong>un</strong>a</strong> circonferenza concentrica all’asse rotoidale del robot <strong>di</strong> raggio opport<strong>un</strong>o: ciò è dovuto al<br />

fatto che bisogna garantire la raggi<strong>un</strong>gibilità dei p<strong>un</strong>ti da parte del gripper 1 durante il ciclo <strong>di</strong><br />

lavoro.<br />

La soluzione <strong>ad</strong>ottata prevede che il robot2 sia posto rispetto alla tavola girevole dalla parte<br />

opposta al robot1 (ve<strong>di</strong> fig. 4.14). Nella figura si in<strong>di</strong>cano schematicamente con Ras la<br />

rastrelliera, con R1 e R2 rispettivamente il robot1 e il robot2, con TG la tavola girevole, con P<br />

il pallet e con Tr il trasportatore.<br />

117


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 4.14: Layout<br />

Si è deciso <strong>di</strong> utilizzare questa soluzione, poiché in questo modo:<br />

• si evita la possibilità <strong>di</strong> collisioni tra il robot2 e la rastrelliera, che in <strong>un</strong> impiego<br />

industriale, potrebbe svilupparsi anche <strong>ad</strong> altezze superiori a quelle del piano <strong>di</strong> lavoro;<br />

• si ha <strong><strong>un</strong>a</strong> riduzione del workspace necessario: anche se si ha <strong>un</strong> maggiore sviluppo<br />

nella <strong>di</strong>rezione <strong>di</strong> avanzamento del trasportatore, si ha <strong>un</strong> notevole gu<strong>ad</strong>agno nella<br />

<strong>di</strong>rezione <strong>ad</strong> esso perpen<strong>di</strong>colare, con <strong><strong>un</strong>a</strong> quantità minore <strong>di</strong> spazio inutilizzata;<br />

• si hanno rischi molto inferiori <strong>di</strong> <strong>un</strong> urto tra i due robot.<br />

Si prevede inoltre <strong>di</strong> posizionare la porta <strong>di</strong> accesso alla cella prossima alla rastrelliera, al fine<br />

<strong>di</strong> favorire il posizionamento dei pezzi sopra <strong>di</strong> essi, e l’<strong>un</strong>ità <strong>di</strong> governo sempre l<strong>un</strong>go lo stesso<br />

lato della cella. Si riporta nella figura 4.15 il <strong>di</strong>segno quotato del layout scelto per la cella <strong>di</strong><br />

saldatura.<br />

118


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 4.15: Disegno quotato del layout (misure in mm)<br />

4.3 Il Class Diagram<br />

Una volta scelti i componenti del sistema si procede con la realizzazione del Class Diagram<br />

che servirà a specificare quali oggetti costituiscono il sistema, e a gran<strong>di</strong> linee, le relazioni<br />

statiche che ci sono tra questi tipi <strong>di</strong> oggetti, ossia le operazioni che compiono.<br />

Il <strong>di</strong>agramma contiene pertanto <strong><strong>un</strong>a</strong> classe generica Robot e due istanze <strong>di</strong> tale classe:<br />

Saldatore e Movimentatore. Associate <strong>ad</strong> esse vi è <strong><strong>un</strong>a</strong> classe Pezzo, che è a sua volta associata,<br />

con molteplicità 2, alla classe Assemblato (composizione dei pezzi A e B). La com<strong>un</strong>icazione<br />

tra i vari elementi della cella è garantita da 3 segnali presenza_pezzo, finecorsa_nastro e<br />

presenza assemblato, inviati ai due Robot dalle classi Rastrelliera, TavolaGirevole e<br />

NastroTrasportatore. La Dinamica è trattata come <strong><strong>un</strong>a</strong> classe a se in cui andranno specificate<br />

attraverso delle Note o delle Constraint le equazioni <strong>di</strong>fferenziali che regolano il<br />

f<strong>un</strong>zionamento del braccio Saldatore e del braccio Movimentatore. Nell’esempio preso in<br />

119


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

esame si è invece scelto <strong>di</strong> lasciare la <strong>di</strong>namica come <strong><strong>un</strong>a</strong> classe vuota, realizzando in Simulink<br />

<strong><strong>un</strong>a</strong> approssimazione dei Robots. Questo perché lo scopo principale dell’esempio è<br />

semplicemente quello <strong>di</strong> mostrare le procedure da <strong>ad</strong>ottare per rappresentare in Matlab <strong>un</strong><br />

sistema ibrido generico descritto inizialmente con <strong>UML</strong>.<br />

Con tale Diagramma si è cercato <strong>di</strong> porre in risalto le interazioni statiche che avvengono tra<br />

i vari oggetti del sistema e il tipo <strong>di</strong> operazioni che essi possono compiere. Lo schema <strong>completo</strong><br />

è riportato in figura 4.16:<br />

Figura 4.16: Class Diagram – cella <strong>di</strong> lavoro<br />

120


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

4.4 State Diagram<br />

Nella realizzazione dello State Diagram si è tenuto conto che il sistema è costituito da due<br />

elementi fondamentali che risultano essere i due Robots. Il f<strong>un</strong>zionamento della cella <strong>di</strong> lavoro<br />

nel suo complesso si basa infatti sulle azioni che i due Robots devono compiere per poter<br />

effettuare la movimentazione dei pezzi e la saldatura. Le altre componenti ossia la Tavola<br />

Girevole, la Rastrelliera e il Nastro Trasportatore sono visti come degli elementi passivi <strong>di</strong> cui i<br />

Robots si servono per poter ricavare delle informazioni o per poter impartire dei coman<strong>di</strong>.<br />

Si è scelto d<strong>un</strong>que <strong>di</strong> realizzare due State Diagram:<br />

• <strong>un</strong>o per il robot Movimentatore;<br />

• <strong>un</strong>o per il robot Saldatore.<br />

Lo State Diagram del Movimentatore, il cui schema è riportato in figura 4.17, ha come p<strong>un</strong>to <strong>di</strong><br />

partenza <strong>un</strong>o stato in cui il Robot si trova in <strong><strong>un</strong>a</strong> posizione <strong>di</strong> sicurezza. Una volta ricevuto il<br />

segnale <strong>di</strong> presenza pezzi, dal sensore posto sulla rastrelliera, il robot effettua <strong><strong>un</strong>a</strong> rotazione <strong>di</strong><br />

90° per afferrare il pezzo A e successivamente <strong><strong>un</strong>a</strong> movimentazione del pezzo fino a<br />

depositarlo sulla Tavola Girevole (rotazione <strong>di</strong> altri 90°). A questo p<strong>un</strong>to dopo aver comandato<br />

la rotazione della Tavola effettua lui stesso <strong><strong>un</strong>a</strong> ulteriore rotazione <strong>di</strong> 180° per poter tornare<br />

in<strong>di</strong>etro e afferrare il secondo pezzo da movimentare dalla rastrelliera. Terminata questa prima<br />

fase il robot ritorna in posizione <strong>di</strong> sicurezza finchè non sia stata effettuata la saldatura che in<br />

questo schema è vista come <strong>un</strong>o stato <strong>di</strong> attesa.<br />

La seconda fase prevede la riesecuzione <strong>di</strong> tutte le operazioni fino al deposito sulla Tavola<br />

Girevole <strong>di</strong> ulteriori due pezzi. A questo p<strong>un</strong>to, prima <strong>di</strong> ritornare nuovamente in posizione <strong>di</strong><br />

sicurezza il Robot comanda l’allontanamento, del pallet sul quale risiedono i due assemblati,<br />

inviando <strong>un</strong> segnale <strong>di</strong> accensione al Nastro Trasportatore. Questa sequenza <strong>di</strong> stati è<br />

rappresentata in figura in modo rigoroso, per tale motivo si è reso necessario anche l’utilizzo <strong>di</strong><br />

variabili <strong>di</strong> appoggio per effettuare la com<strong>un</strong>icazione tra le varie componenti del sistema. Tali<br />

variabili così come sarà più chiaro in seguito (ve<strong>di</strong> Appen<strong>di</strong>ce A: Descrizione dello Statechart)<br />

sono essenzialmente <strong>di</strong> tre tipi:<br />

• <strong>di</strong> ingresso (esterne al <strong>di</strong>agramma)<br />

• <strong>di</strong> uscita (esterne al <strong>di</strong>agramma)<br />

121


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

• locali (interne)<br />

Figura 4.17: State Diagram Movimentatore – cella <strong>di</strong> lavoro<br />

La stessa tecnica <strong>di</strong> realizzazione è stata <strong>ad</strong>ottata anche per lo State Diagram del Robot<br />

Saldatore (fig. 4.18). E’ stato previsto come p<strong>un</strong>to <strong>di</strong> partenza <strong><strong>un</strong>a</strong> posizione <strong>di</strong> sicurezza dalla<br />

quale il robot esce per poter effettuare i 5 p<strong>un</strong>ti <strong>di</strong> saldatura sull’assemblato. Tale saldatura<br />

avviene d<strong>un</strong>que in 5 momenti <strong>di</strong>fferenti e lo spostamento del robot segue quello <strong>di</strong> <strong><strong>un</strong>a</strong> “U”<br />

capovolta. Terminata la saldatura è stato previsto <strong>un</strong>o stato per l’azzeramento della pinza<br />

saldatrice e il ritorno in posizione <strong>di</strong> sicurezza prima dell’invio al Movimentatore del segnale <strong>di</strong><br />

fine saldatura.<br />

122


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 4.18: State Diagram Saldatore – cella <strong>di</strong> lavoro<br />

123


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

4.5 Collaboration Diagram<br />

Il Collaboration Diagram visualizza lo scambio dei messaggi e segnali che avviene tra i vari<br />

componenti del sistema. Mentre con il Class Diagram si ha <strong><strong>un</strong>a</strong> visione statica della cella <strong>di</strong><br />

lavoro, con questo grafico si ha la <strong>di</strong>namica globale come visibile in figura:<br />

Figura 4.19: Collaboration Diagram – cella <strong>di</strong> lavoro<br />

4.6 Sequence Diagram<br />

Il Sequence Diagram che, app<strong>un</strong>to, permette <strong>di</strong> modellare la com<strong>un</strong>icazione tra <strong>un</strong> oggetto<br />

ed <strong>un</strong> altro in relazione al trascorrere del tempo. Si capisce subito che in questo tipo <strong>di</strong><br />

rappresentazione <strong>un</strong> ruolo cruciale viene svolto dal tempo.<br />

L'idea chiave qui è che le interazioni tra gli oggetti avvengano seguendo <strong>un</strong> or<strong>di</strong>ne ben<br />

preciso e che tale sequenza avvenga, nel tempo, dall'inizio alla fine. La realizzazione risulta<br />

abbastanza semplice, basta considerare la sequenza temporali delle interazioni che avvengono<br />

durante il f<strong>un</strong>zionamento del sistema e rappresentarle secondo la sintassi analizzata nel<br />

paragrafo 1.11. In figura 4.20 è riportato lo schema finale.<br />

124


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 4.20: Sequence Diagram – cella <strong>di</strong> lavoro<br />

4.7 Stateflow: Statechart<br />

Una volta terminata la realizzazione dei <strong>di</strong>agrammi <strong>UML</strong> si passa alla tr<strong>ad</strong>uzione del<br />

sistema in <strong>un</strong> modello <strong>di</strong> simulazione all’interno <strong>di</strong> Matlab. Pertanto si procede con la<br />

<strong>descrizione</strong> della componente continua attraverso dei blocchetti Simulink (fig. 4.21). La<br />

<strong>di</strong>namica del robot Movimentatore e del robot Saldatore è stata approssimata attraverso il<br />

modello <strong>completo</strong> <strong>di</strong> <strong>un</strong> motore. La saldatura è stata pensata come l’<strong>un</strong>ione <strong>di</strong> movimenti<br />

lineari della pinza saldatrice in aggi<strong>un</strong>ta a dei ritar<strong>di</strong>, che simulano il tempo necessario <strong>ad</strong><br />

effettuare i 5 p<strong>un</strong>ti <strong>di</strong> saldatura. Sono presenti anche dei ritar<strong>di</strong> che in<strong>di</strong>cano il tempo necessario<br />

125


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

ai segnali <strong>di</strong> risposta dei sensori presenti nel sistema (sensore <strong>di</strong> posizione, <strong>di</strong> rilevamento<br />

pezzo).<br />

La componente <strong>di</strong>screta è stata realizzata, invece, utilizzando lo Stateflow. I risultati delle<br />

operazioni compiute dal sistema sono stati rappresentati graficamente attraverso l’utilizzo <strong>di</strong> tre<br />

blocchetti Scope, come visibile in figura:<br />

Figura 4.21: <strong>Modello</strong> Simulink – cella <strong>di</strong> lavoro<br />

La <strong>descrizione</strong> dettagliata della macchina a stati e i risultati della simulazione sono riportati<br />

in Appen<strong>di</strong>ce.<br />

4.8 Riepilogo delle regole <strong>di</strong> tr<strong>ad</strong>uzione<br />

Si riportano per completezza i passaggi che devono essere effettuati per poter trasformare la<br />

<strong>descrizione</strong> <strong>UML</strong> <strong>di</strong> <strong>un</strong> sistema in <strong>un</strong> modello Matlab:<br />

126


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

1. Analisi dei componenti e delle specifiche <strong>di</strong> progetto<br />

2. Descrizione dettagliata della <strong>di</strong>namica del sistema<br />

3. Realizzazione <strong>di</strong> opport<strong>un</strong>i controllori che consentano il rispetto delle specifiche<br />

4. Scrittura del Class Diagram <strong>UML</strong><br />

5. Scrittura dello State Diagram<br />

6. Scrittura del Collaboration Diagram e del Sequence Diagram<br />

7. Realizzazione del modello Matlab (componenti continue con Simulink e <strong>di</strong>screte<br />

con Stateflow)<br />

8. Eventuale generazione <strong>di</strong> co<strong>di</strong>ce per la configurazione e la programmazione dei<br />

componenti del sistema.<br />

L’<strong>un</strong>icità <strong>di</strong> questa procedura è garantita anche grazie ai numerosi strumenti offerti da <strong>UML</strong> per<br />

realizzare la <strong>descrizione</strong> <strong>di</strong> <strong>un</strong> sistema. Tra questi assume rilevante importanza il costrutto<br />

constraint che permette <strong>di</strong> specificare <strong>ad</strong> esempio se bisogna svolgere delle operazioni prima <strong>di</strong><br />

altre o se bisogna <strong>ad</strong>ottare determinanti componenti anziché altri. La sua f<strong>un</strong>zione è quella<br />

d<strong>un</strong>que <strong>di</strong> fornire dei vincoli che garantiscano app<strong>un</strong>to le specifiche determinanti del sistema<br />

stesso e evitare l’overflow delle variabili.<br />

4.9 Sviluppi Futuri<br />

<strong>UML</strong>, che <strong>di</strong> fatto oggi è <strong>un</strong>o standard, si pone grazie alla semplicità e alla facilità d’uso al<br />

vertice tra gli strumenti che consentano <strong>di</strong> strutturare in <strong>di</strong>fferenti fasi <strong>un</strong> qualsiasi tipo <strong>di</strong><br />

progettazione. Pertanto si rivela estremamente utile nella produzione <strong>di</strong> software, o in altri<br />

campi dell’ingegneria, tra questi anche quello dell’automazione industriale. Come visto nei<br />

paragrafi precedenti, ambienti <strong>di</strong> simulazione quali Matlab offrono a programmatori esperti la<br />

possibilità <strong>di</strong> descrivere me<strong>di</strong>ante linguaggi proprietari (linguaggio Matlab) e non (es. C/C++,<br />

Java), sistemi continui, <strong>di</strong>screti o ibri<strong>di</strong> sui quali effettuare le simulazioni necessarie nelle fasi<br />

<strong>di</strong> progetto antecedenti la realizzazione vera e propria. Appare chiaro, quin<strong>di</strong>, che <strong>un</strong> ingegnere<br />

o <strong>un</strong> team prima <strong>di</strong> poter creare e sviluppare dovranno avere a <strong>di</strong>sposizione gli strumenti <strong>ad</strong>atti<br />

per poter com<strong>un</strong>icare tra <strong>di</strong> loro. Si è detto che questa com<strong>un</strong>icazione <strong>di</strong> fatto avviene spesso<br />

sulla base dell’esperienza <strong>di</strong> coloro che sopraintendono il progetto, e che hanno quin<strong>di</strong> già<br />

affrontato in passato problematiche dello stesso tipo. Se si utilizzasse <strong>UML</strong> come tramite, ossia<br />

come p<strong>un</strong>to <strong>di</strong> <strong>un</strong>ione tra chi ha il compito <strong>di</strong> descrivere e progettare e chi ha invece il compito<br />

<strong>di</strong> realizzare si potrebbero eliminare inutili e spiacevoli incomprensioni che spesso sono alla<br />

127


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

base del fallimento <strong>di</strong> <strong>un</strong> processo produttivo e <strong>di</strong> sviluppo. Nell’esempio si è visto come sia<br />

possibile, attraverso l’uso <strong>di</strong> semplici regole, passare dalla <strong>descrizione</strong> <strong>di</strong> <strong>un</strong> sistema fatta<br />

utilizzando <strong>UML</strong> <strong>ad</strong> <strong>un</strong> modello Matlab pronto per la simulazione. Uno sviluppo futuro<br />

potrebbe essere quello <strong>di</strong> racchiudere le regole <strong>di</strong> tr<strong>ad</strong>uzione da <strong>UML</strong> a Matlab in <strong>un</strong> software<br />

che permetta <strong>di</strong> generare in modo <strong>un</strong>ivoco co<strong>di</strong>ce in formato S-F<strong>un</strong>ction inserendo i parametri<br />

della <strong>di</strong>namica e fornendo i file dei <strong>di</strong>agrammi <strong>UML</strong> del sistema. Questo permetterebbe in<br />

prima istanza <strong>di</strong> descrivere <strong>un</strong> sistema attraverso <strong>un</strong> linguaggio <strong>un</strong>iversale che non risulti legato<br />

a ness<strong>un</strong> tipo <strong>di</strong> programma (Matlab, Scilab e così via) ma che attraverso regole simili a quelle<br />

utilizzate dalle S-f<strong>un</strong>ction, permetta <strong>di</strong> sfruttare quella <strong>descrizione</strong> su qualsiasi piattaforma <strong>di</strong><br />

simulazione e con qualsiasi sistema operativo (Linux, Windows). Consentirebbe inoltre <strong>di</strong><br />

rendere leggibile tale <strong>descrizione</strong> a chi<strong>un</strong>que conosca questo linguaggio pur non essendo<br />

necessariamente esperto <strong>di</strong> Informatica o <strong>di</strong> Matematica, basti pensare, <strong>ad</strong> esempio, a coloro<br />

che hanno il compito <strong>di</strong> assemblare i componenti <strong>di</strong> <strong><strong>un</strong>a</strong> catena produttiva o <strong>di</strong> realizzare<br />

semplicemente <strong>un</strong> rete <strong>di</strong> com<strong>un</strong>icazione tra <strong>di</strong> essi.<br />

128


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

In<strong>di</strong>ce delle tabelle e delle figure<br />

Figura 1.1: La vignetta dell’altalena p.5<br />

Figura 1.2: Evoluzione dell'uml p.8<br />

Figura 1.3: Meta-metamodello, metamodello e modello <strong>UML</strong> p.10<br />

Figura 1.4: Esempio delle relazioni ai vari gr<strong>ad</strong>i <strong>di</strong> astrazione tra i modelli <strong>UML</strong> p.11<br />

Figura 1.5: Frammento della sintassi astratta <strong>di</strong> <strong>UML</strong> p.13<br />

Tabella 1.1: Classificazione dei <strong>di</strong>agrammi <strong>UML</strong> p.16<br />

Figura 1.6: La classe p.19<br />

Figura 1.7: Attributi p.20<br />

Figura 1.8: Vista completa <strong>di</strong> <strong><strong>un</strong>a</strong> classe p.20<br />

Figura 1.9: Associazione p.21<br />

Figura 1.10: Classe associazione p.22<br />

Figura 1.11: Associazione riflessiva p.22<br />

Figura 1.12: Ere<strong>di</strong>tarietà p.23<br />

Figura 1.13: Aggregazione p.25<br />

Figura 1.14: Associazione composita p.25<br />

Figura 1.15: Interfaccia p.26<br />

Figura 1.16: Esempio <strong>di</strong> classe p.28<br />

Figura 1.17: La classe pagina p.29<br />

Figura 1.18: Esempio <strong>di</strong> ere<strong>di</strong>tarietà p.29<br />

Figura 1.19: La classe carattere p.30<br />

Figura 1.20: La classe tabella p.31<br />

Figura 1.21: Esempio <strong>di</strong> Class Diagram p.31<br />

Figura 1.22: Use case p.33<br />

Figura 1.23: Esempio <strong>di</strong> use case p.35<br />

Figura 1.24: Lo use case “ricarica la macchina” p.37<br />

Figura 1.25: Lo use case ritira le monete p.37<br />

Figura 1.26: Use case <strong>completo</strong> p.38<br />

Figura 1.27: Ricarica la macchina – <strong><strong>un</strong>a</strong> variante p.38<br />

Figura 1.28: Esempio <strong>di</strong> generalizzazione <strong>di</strong> <strong>un</strong> actor p.39<br />

Figura 1.29: Diagramma finale p.39<br />

Figura 1.30: State <strong>di</strong>agram p.40<br />

Figura 1.31: Esempio <strong>di</strong> state <strong>di</strong>agram p.42<br />

Figura 1.32: State <strong>di</strong>agram dettagliato p.43<br />

Figura 1.33: Descrizione della transizione p.43<br />

Figura 1.34: Sequence <strong>di</strong>agram p.44<br />

Tabella 1.2 : Messaggi per i sequence <strong>di</strong>agrams p.45<br />

Figura 1.35: Il tempo p.46<br />

Figura 1.36: La ricorsione nel sequence <strong>di</strong>agram p.47<br />

Figura 1.37: Esempio <strong>di</strong> sequence <strong>di</strong>agram p.48<br />

Figura 1.38: Vista <strong>di</strong> <strong>un</strong> collaboration <strong>di</strong>agram p.50<br />

Figura 1.39: Esempio <strong>di</strong> collaboration <strong>di</strong>agram p.51<br />

Figura 1.40: Collaboration <strong>di</strong>agram <strong>completo</strong> p.52<br />

Figura 1.41: Rami prodotti dal processo annidato p.53<br />

Figura 1.42: Activity <strong>di</strong>agram p.54<br />

129


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 1.43: Grafico decisonale p.55<br />

Figura 1.44: Merge <strong>di</strong> attività p.56<br />

Figura 1.45: Component <strong>di</strong>agram p.58<br />

Figura 1.46: Rappresentare <strong>un</strong>’interfaccia – primo modo p.59<br />

Figura 1.47: Rappresentare <strong>un</strong>’interfaccia – secondo modo p.59<br />

Figura 1.48: Music player p.59<br />

Figura 1.49: Esempio <strong>di</strong> componet <strong>di</strong>agram p.60<br />

Figura 1.50: rappresentazione <strong>di</strong> <strong>un</strong> nodo nel deployment <strong>di</strong>agram p.61<br />

Figura 1.51: Esempio <strong>di</strong> deployment <strong>di</strong>agram p.62<br />

Figura 1.52: T-connector p.63<br />

Figura 1.53: Rete <strong>di</strong> calcolatori p.64<br />

Figura 1.54: Deployment <strong>di</strong>agram finale p.64<br />

Figura 1.55: Elementi strutturali p.65<br />

Figura 1.56: Elementi comportamentali p.65<br />

Figura 1.57: Relazioni p.65<br />

Figura 1.58: Raggruppamento p.65<br />

Figura 1.59: Annotazioni e actor p.66<br />

Figura 2.1: Schema a blocchi <strong>di</strong> <strong><strong>un</strong>a</strong> s-f<strong>un</strong>tion p.68<br />

Figura 2.2: Come Simulink esegue la simulazione p.69<br />

Tabella 2.1: St<strong>ad</strong>i <strong>di</strong> simulazione p.70<br />

Figura 2.3: Schema simulink p.74<br />

Figura 2.4: Schema <strong>di</strong> f<strong>un</strong>zionamento p.74<br />

Figura 2.5: Sequenza <strong>di</strong> esecuzione per Real Time Workshop p.81<br />

Figura 2.6: Sequenza <strong>di</strong> esecuzione in modalità esterna p.81<br />

Figura 2.7: Schema ingresso p.83<br />

Figura 2.8: Modalità <strong>di</strong> ingresso p.83<br />

Figura 3.1: Schema <strong>di</strong> <strong>un</strong> controllo on-off p.94<br />

Figura 3.2: Struttura <strong>di</strong> <strong>un</strong>o stato stateflow p.95<br />

Figura 3.3: Esempio <strong>di</strong> stati paralleli p.96<br />

Figura 3.4: Esempio <strong>di</strong> transizione p.96<br />

Figura 3.5: Come scrivere <strong><strong>un</strong>a</strong> transizione p.97<br />

Figura 3.6: Transizione <strong>di</strong> default p.97<br />

Figura 3.7: Esempio <strong>di</strong> gi<strong>un</strong>zione p.98<br />

Figura 3.8: Ulteriore esempio <strong>di</strong> gi<strong>un</strong>zione p.99<br />

Figura 3.9: History j<strong>un</strong>ction p.99<br />

Figura 4.1: Diagramma <strong>di</strong> carico statico p.104<br />

Figura 4.2: Area <strong>di</strong> lavoro p.105<br />

Figura 4.3: KUKA KR125/3 p.107<br />

Figura 4.4: Area <strong>di</strong> lavoro p.107<br />

Figura 4.5: Superfici <strong>di</strong> riferimento dei pezzi A e B p.109<br />

Figura 4.6: Disegno schematico <strong>di</strong> <strong>un</strong> pezzo saldato p.110<br />

Figura 4.7: Schema <strong>di</strong> <strong>di</strong>sposizione <strong>di</strong> <strong>un</strong> pezzo saldato sul pallet p.110<br />

Figura 4.8: GR/TR1 p.111<br />

Figura 4.9: Disegno quotato <strong>di</strong> massima del pallet <strong>ad</strong>ottato p.112<br />

Figura 4.10: RP2E-150N p.113<br />

Figura 4.11: Disegno 3D del supporto p.113<br />

Figura 4.12: Tavola con elementi <strong>di</strong> riferimento e bloccaggio pezzo p.114<br />

Figura 4.13: Rastrelliera p.115<br />

Figura 4.14: Layout p.117<br />

Figura 4.15: Disegno quotato del layout p.118<br />

130


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Figura 4.16: Class Diagram – cella <strong>di</strong> lavoro p.119<br />

Figura 4.17: State Diagram Movimentatore – cella lavoro p.121<br />

Figura 4.18: State Diagram Saldatore – cella lavoro p.122<br />

Figura 4.19: Collabotation Diagram – cella lavoro p.123<br />

Figura 4.20: Sequence Diagram – cella lavoro p.124<br />

Figura 4.21: <strong>Modello</strong> Simulink – cella lavoro p.125<br />

131


da <strong><strong>un</strong>a</strong> <strong>descrizione</strong> <strong>UML</strong> a <strong>un</strong> modello Matlab-Simulink<br />

_________________________________________________________________________________________________________<br />

Bibliografia<br />

Booch G., Rumbaugh J., Jacobson J., “Unified Modeling Language User Guide”. Ad<strong>di</strong>son-<br />

Wesley, 1999.<br />

Booch G., Rumbaugh J., Jacobson J., “Unified Modeling Language Reference Manual”.<br />

Ad<strong>di</strong>son-Wesley, 1999.<br />

Comai A., tutorial “Introduzione a <strong>UML</strong>”. http://www.analisi<strong>di</strong>segno.com/uml/uml.htm#<strong>UML</strong><br />

M. Fowler. “<strong>UML</strong> Distilled”. Ad<strong>di</strong>son-Wesley, 1998.<br />

Vetti Tagliati Luca, “<strong>UML</strong> e ingegneria del software” nel sito http://www.mokabyte.it/<br />

Vetti Tagliati Luca, “<strong>UML</strong> e ingegneria del software: dalla teoria alla pratica”. Hops, 2003.<br />

Bennett S., Skelton J., L<strong>un</strong>n K., “Introduzione a <strong>UML</strong>”, Mc Graw Hill, 2001.<br />

Mathworks “Simulink: Simulation and Model Based Design” Guida a Matlab 6.<br />

Barbarisi O., “Ovierview of S-F<strong>un</strong>ctions”, Tavole Power Point, 2001.<br />

132

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!