Scuola Politecnica e delle Scienze di Base Corso di Laurea Magistrale in Ingegneria Informatica Tesi di Laurea Magistrale in Ingegneria del Software PROGETTAZIONE MODEL-DRIVEN DI UN SISTEMA EMBEDDED INDUSTRIALE Anno Accademico 2013/2014 Relatore Ch.mo Prof Stefano Russo correlatore Ing. Domenico Di Leo Ing. Bruno Busco candidato Francesco Pascale Matr. M63000092 A mia Madre e a mio Padre, i miei punti di riferimento. L'ingegnere Il Grigio del cielo annebbia i miei pensieri. L'aria fredda mi avvolge in una bolgia di gelo. Eppure sono lì, non mi muovo, non mollo nonostante l'ardua fatica che mi aspetta sono disposto a lottare fino all'ultimo. Ce la farò! vincerò il buio dell'ignoto. Francesco Pascale Dal libro “Racconti di villana gioventù” Edizioni “Il Saggio” Castellamare - Dicembre 2013 Indice Indice ..................................................................................................................................................IV Indice delle figure ................................................................................................................................ 5 Indice delle tabelle ............................................................................................................................... 7 Introduzione ......................................................................................................................................... 8 Capitolo 1: Metodologie Model Driven ............................................................................................. 10 1.1 MDA.................................................................................................................................... 10 1.2 Development ....................................................................................................................... 13 1.3 Testing ................................................................................................................................. 17 1.4 Standard ............................................................................................................................... 19 1.4.1 CWM................................................................................................................................. 19 1.4.2 UML .................................................................................................................................. 20 1.4.3 MOF .................................................................................................................................. 21 1.4.4 XMI ................................................................................................................................... 23 Capitolo 2: Il linguaggio di modellazione SysML ............................................................................. 24 2.1 BDD ......................................................................................................................................... 31 2.2 IBD ........................................................................................................................................... 42 2.3 RD ............................................................................................................................................ 44 Capitolo 3: Strumenti di supporto ...................................................................................................... 50 3.1 Eclipse-Papyrus ........................................................................................................................ 50 3.2 IBM Rational Rhapsody Developer ......................................................................................... 52 Capitolo 4: Caso di studio .................................................................................................................. 58 4.1 Il sistema TOD ......................................................................................................................... 58 4.2 Requisiti ................................................................................................................................... 61 4.3 Scelta dei linguaggi e degli strumenti ...................................................................................... 62 4.4 Analisi: Modellazione SysML ................................................................................................. 63 4.4.1 Requirements Diagram ................................................................................................ 63 4.4.2 Definition Block Diagram e Internal Block Diagram .................................................. 68 4.4.3 Allocazione dei requisiti .............................................................................................. 78 4.5 Realizzazione con Rhapsody ................................................................................................... 83 4.5.1 Sviluppo con profilo FunctionalC ................................................................................ 83 4.5.2 Generazione del codice e simulazione della parte dinamica........................................ 95 4.5.3 Sviluppo con modello a Oggetti................................................................................... 99 Conclusioni ...................................................................................................................................... 106 Sviluppi Futuri ................................................................................................................................. 109 Bibliografia ...................................................................................................................................... 110 Ringraziamenti ................................................................................................................................. 111 IV PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Indice delle figure Figura 1: Model Driven Architecture................................................................................................. 13 Figura 2: I livelli e le trasformazioni nell’MDA ................................................................................ 14 Figura 3: Storia del SysML ................................................................................................................ 25 Figura 4: Rappresentazione degli insiemi UML e SysML ................................................................ 26 Figura 5: Struttura a blocchi dell’UML e SysML .............................................................................. 29 Figura 6: Esempio BDD Strutturato................................................................................................... 32 Figura 7: Esempio notazione BDD .................................................................................................... 34 Figura 8: Vista di due interfacce con le rispettive operations e receptions in un BDD ..................... 36 Figura 9: Modello flow-port in un BDD ............................................................................................ 36 Figura 10: Esempio di instanza in un BDD ....................................................................................... 38 Figura 11: Esempio di composizione in un BDD .............................................................................. 38 Figura 12: Attori in un BDD .............................................................................................................. 39 Figura 13: Esempio di definizione di tipo in un BDD ....................................................................... 40 Figura 14: Esempio di constraint in un BDD ..................................................................................... 41 Figura 15: Esempio di commenti in un BDD .................................................................................... 42 Figura 16: Esempio di IBD ................................................................................................................ 44 Figura 17: Un esempio di Requirements Diagram............................................................................. 45 Figura 18: Layout Eclipse-Papyrus .................................................................................................... 52 Figura 19: Layout IBM Rational Rhapsody Developer per C ........................................................... 55 Figura 20: Comparazione tra Class Diagram e File Diagram ............................................................ 56 Figura 21: Comparazione tra Sequence Diagram e Message Diagram ............................................. 56 Figura 22: Comparazione tra Activity Diagram e Flow Chart Diagram ............................................ 57 Figura 23: Architettura del TOD ........................................................................................................ 58 Figura 24: RD dei gruppi di requisiti HLR ........................................................................................ 64 Figura 25: RD dei requisiti del gruppo GEN ..................................................................................... 65 Figura 26: RD dei requisiti del gruppo SVR...................................................................................... 65 Figura 27: RD dei requisiti del gruppo HMI...................................................................................... 66 Figura 28: RD dei requisiti del gruppo EST ...................................................................................... 67 Figura 29: RD dei requisiti del gruppo DRV ..................................................................................... 68 Figura 30: BDD piattaforma MDSETH ............................................................................................. 69 Figura 31: TOD Block ....................................................................................................................... 70 Figura 32: Componenti del TOD ....................................................................................................... 70 Figura 33: IBD TOD .......................................................................................................................... 71 Figura 34: BDD TODMA .................................................................................................................. 72 Figura 35: Composizione del TODMA ............................................................................................. 73 Figura 36: TODMA IBD.................................................................................................................... 74 Figura 37: HMI BDD ......................................................................................................................... 76 5 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 38: Composizione HMI .......................................................................................................... 76 Figura 39: HMI IBD .......................................................................................................................... 77 Figura 40: Tracciabilità dei requisiti negli artefatti ........................................................................... 78 Figura 41: Allocazione dei requisiti rispetto al blocco Tod Management Agent .............................. 79 Figura 42: Allocazione dei requisiti rispetto al blocco Tod Control Server ...................................... 80 Figura 43: Allocazione dei requisiti rispetto al blocco HMI ............................................................. 80 Figura 44: Allocazione dei requisiti rispetto al blocco Add-On ........................................................ 81 Figura 45: Allocazione dei requisiti rispetto al blocco driver Tod .................................................... 81 Figura 46: RD dei gruppi di requisiti con vista delle relazioni .......................................................... 82 Figura 47: RD dei requisiti del gruppo GEN con vista delle relazioni ............................................. 82 Figura 48: File Diagram TODMA ..................................................................................................... 84 Figura 49: State Chart todControlServer con FunctionalC ................................................................ 86 Figura 50: State Chart todManagementAgent con FunctionalC ........................................................ 86 Figura 51: Message Diagram Beep .................................................................................................... 88 Figura 52: Message Diagram LampOnOff ........................................................................................ 89 Figura 53: Message Diagram Diagnostic ........................................................................................... 90 Figura 54: Message Diagram Set Uri ................................................................................................. 91 Figura 55: Message Diagram Get Uri ................................................................................................ 92 Figura 56: Message Diagram Touch Screen Calibrator ..................................................................... 93 Figura 57: Message Diagram Brightness Regulation ........................................................................ 94 Figura 58: Esempio di simulazione dello State Chart con richiesta di beep ...................................... 96 Figura 59: Esempio di simulazione dello State Chart con richiesta di Touch Screen Calibrator ...... 97 Figura 60: Esempio di simulazione dello State Chart con richiesta di Lamp On/Off ....................... 97 Figura 61: Simulazione di situazione di errore in una richiesta ......................................................... 98 Figura 62: Simulazione di situazione di scadenza del lifetime di una richiesta ................................ 98 Figura 63: Class Diagramm del TODMA .......................................................................................... 99 Figura 64: Object Model Diagram del TODMA ............................................................................. 100 Figura 65: State Chart TodControlServer Object Based .................................................................. 101 Figura 66: State Chart TodManagementAgent Object Based .......................................................... 102 Figura 67: Test Architecture TODMA............................................................................................. 103 Figura 68: Automatic Test Generetor (ATG) .................................................................................. 104 6 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Indice delle tabelle Tabella 1: Software Requirements Specification TODMA…………………………………………61 Tabella 2:Vantaggi e Svantaggi……………………………………………………………………106 7 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Introduzione Questa tesi tratta la progettazione di sistemi software industriali di tipo embedded con metodologie guidate dai modelli (model-driven). Le tecniche model-driven sono metodologie di sviluppo e testing del software ormai sufficientemente mature per essere introdotte ed utilizzate all'interno dei contesti industriali. Tali metodologie sono state applicate con successo in numerosi campi dell’ingegnerizzazione del software. Pur essendo molto promettenti in termini di riduzione di tempi e costi di sviluppo e di qualità e manutenibilità dei prodotti software, in molti contesti industriali esse trovano difficoltà di applicazione per via rischi che le aziende percepiscono come ancora connessi alla loro adozione in luogo di metodologie più tradizionali. Tra i fattori di rischio vi sono i tempi e i costi della formazione per dotare i progettisti dei necessari skill, l’esigenza di adottare appositi strumenti software di supporto alla progettazione – dal costo spesso elevato e non sempre disponibili in forma integrata. Il lavoro di tesi analizza lo stato dell’arte nella modellazione e progettazione modeldriven, e lo stato della tecnologia relativamente agli strumenti software per gestire in maniera integrata le varie fasi di un processo di sviluppo e testing guidato dai modelli. La tesi si concentra poi sulla progettazione di un sistema software embedded, considerando un caso di studio reale di interesse dell’azienda Ansaldo Breda, leader italiana per la costruzione di treni e metropolitane ad uso civile. Nel Capitolo 1 si analizza lo stato dell’arte della metodologie di sviluppo e testing guidate dai modelli, con particolare riferimento ai linguaggi standard oggi maggiormente in uso. Nel Capitolo 2 è descritto il linguaggio di modellazione SysML. Nel Capitolo 3 8 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO sono descritti i più diffusi tool di supporto, utilizzati anche nel caso di studio. Nel Capitolo 4 è descritto il caso di studio e ne è mostrata la progettazione SysML e la realizzazione con gli strumenti di supporto scelti. Infine sono discusse le conclusioni che il caso di studio consente di trarre sull’introduzione di metodologie model-driven nel contesto di interesse. 9 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Capitolo 1: Metodologie Model Driven 1.1 MDA Model Driven Architecture (MDA) è una famiglia di standard correlati, gestiti dallo Object Management Group1, e intesi a consentire un approccio integrato allo sviluppo del software, in cui la realizzazione di modelli possa essere considerata parte del processo di implementazione[1]. I modelli, la modellazione e la Model-Driven Architecture sono la base di una serie di approcci di sviluppo noti come Model-Driven Development2 (MDD). I modelli sono usati per ragionare sul dominio del problema e progettare una soluzione. Le relazioni tra questi modelli forniscono una rete di dipendenze che registrano il processo con cui si crea una soluzione, e aiutano a capirne le modifiche in qualsiasi punto del processo di sviluppo. Oltre a creare questi modelli, si è in grado di definire le regole per automatizzare molti dei passaggi necessari per convertire una rappresentazione del modello ad un altro, per il tracciamento tra elementi del modello, e per analizzare le caratteristiche importanti dei modelli. Questo stile di MDD è chiamato Model-Driven Architecture. L'approccio MDA è ampiamente discusso nel processo di sviluppo software di oggi come un modo per aumentare la qualità, l'efficienza e la predicibilità dello sviluppo del software su larga scala. 1 L'Object Management Group (OMG) è un consorzio creato nel 1989 con 440 aziende quali Microsoft, HP, NCR, SUN, con l'obiettivo di creare un sistema di gestione di un'architettura distribuita. Gli standard più importanti che sono stati proposti riguardano l'architettura CORBA, il linguaggio di modellazione UML e lo standard XMI. 2 Model-Driven Development è una metodologia di sviluppo software che si focalizza sulla creazione di modelli o astrazioni più vicina a particolari concetti di dominio piuttosto che a concetti di computazione o di algoritmica. La si intende come incremento della produttività massimizzando la compatibilità tra i sistemi, semplificando il processo di progettazione, e promuovendo la comunicazione tra individui e il lavoro di gruppo sul sistema. 10 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO I modelli forniscono astrazioni di un sistema fisico e permettono agli ingegneri di ragionare sul sistema per concentrandosi su quelli rilevanti. Tutte le forme di ingegneria si basano su modelli come base essenziale per capire i sistemi reali complessi. I modelli sono utilizzati in molti modi: per prevedere le qualità del sistema, per ragionare sulle proprietà specifiche quando si modificano gli aspetti del sistema, e per comunicare le caratteristiche del sistema alle parti interessate. I modelli possono essere sviluppati come un’anticipazione del sistema fisico che verrà poi implementato, o possono derivare da un sistema esistente o di un sistema in fase di sviluppo come un aiuto per comprendere il suo comportamento. Ci sono molti aspetti interessanti; a seconda di quello che è considerato rilevante, i vari concetti di modellazione e notazioni possono essere utilizzati evidenziando uno o più particolari prospettive o punti di vista di quel sistema. Può nascere l’esigenza di trasformare i modelli in altre forme di rappresentazione oppure in altri modelli e il modello trasformazioni può facilitare questo. In altri casi, una trasformazione converte i modelli che offrono una prospettiva particolare tra i livelli di astrazione, di solito da una più astratta di meno astratto vista aggiungendo ulteriori dettagli, fornite dalle regole di trasformazione. Le relazioni tra questi modelli forniscono una rete di dipendenze che realizzano il processo mediante il quale una soluzione è stata creata, e aiuta a comprendere le implicazioni dei cambiamenti in qualsiasi punto in questo processo. Se definiamo i tipi di modelli che devono essere prodotti, e applichiamo con un certo rigore la semantica precisa di questi modelli, siamo in grado di definire le regole per: • Automatizzare molti passi necessari per convertire una rappresentazione modello all'altro. • Tracing tra elementi del modello. • Analizzare le caratteristiche principali dei modelli. Nel 2001 l'OMG ha adottato il Model Driven Architecture come un approccio per 11 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO l'utilizzo di modelli di sviluppo del software. I suoi tre obiettivi primari sono la portabilità, interoperabilità e riusabilità attraverso la separazione dell’architettura dalla sua effettiva realizzazione. Un aspetto fondamentale della MDA è la sua capacità di affrontare il ciclo di sviluppo completo, che copre l'analisi e la progettazione, la programmazione, il controllo, l'assemblaggio dei componenti così come la realizzazione e la manutenzione. MDA non è una nuova specifica OMG, ma piuttosto un approccio allo sviluppo del software che è realizzato da specifiche OMG pre-esistenti quali l'Unified Modeling Language3 (UML), MetaObject Facility4 (MOF) e Common Warehouse Metamodel5 (CWM). Altre tecnologie adottate che sono di interesse sono il profilo UML per Enterprise Distributed Computing Object6 (EDOC), compresa la sua mappatura di EJB7, e la CORBA Component Model8 (CCM). Con le nuove piattaforme e tecnologie costantemente emergenti, il paradigma MDA consente il rapido sviluppo di nuove specifiche che lo sfruttano e che ne semplifica il processo di integrazione. In questo modo MDA fornisce una soluzione completa e strutturata per l'interoperabilità delle applicazioni e la portabilità di queste. La modellazione precisa nel dominio della soluzione UML fornisce il vantaggio di catturare la sua proprietà intellettuale inerente alla specifica in modo tecnologicamente neutrale. Come illustrato in Figura 1, l'OMG prevede MDA per comprendere una gamma completa di servizi "pervasivi", che si trovano comunemente nelle applicazioni distribuite moderne [2]. 3 UML (Unified Modeling Language, "linguaggio di modellazione unificato") è un linguaggio di modellazione e specifica basato sul paradigma object-oriented. 4 Il Meta-Object Facility (MOF) è uno standard per l'ingegneria guidata dal modello dell’OMG. 5 Common Warehouse Metamodel (CWM) definisce una specifica per la modellazione di metadati per i relazionali, non-relazionali, multidimensionali, e la maggior parte di altri oggetti ritrovati in un ambiente di data warehousing.. 6 Enterprise Distributed Object Computing (EDOC) è uno standard dell’OMG a supporto del calcolo distribuito che utilizza l’MDA e Service-Oriented Architecture. 7 Enterprise JavaBean (EJB) sono i componenti software che implementano, lato server, la logica di business di un'applicazione web all'interno dell'architettura/piattaforma Java EE espletando servizi a favore della parte di front-end ovvero per la logica di presentazione di un'applicazione web. 8 CORBA Component Model (CCM) è una specifica per la creazione di un server-side scalabile, indipendente dalla lingua, transazionale, multi-utente e per applicazioni aziendali sicure. 12 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 1: Model Driven Architecture 1.2 Development Nel mondo dell’ingegneria del software, la modellazione ha una ricca tradizione. Le innovazioni più recenti si sono concentrate sulle notazioni e sugli strumenti che consentono agli utenti di esprimere le prospettive di un sistema, e di esprimere queste prospettive in modi che possono essere facilmente mappati all’interno del codice in uno specifico linguaggio di programmazione compilato per una particolare piattaforma di un particolare sistema operativo. Lo stato attuale di questa pratica utilizza il linguaggio di modellazione unificato (UML), come la notazione di modellazione primaria. L'UML permette ai team di sviluppo di catturare una serie di caratteristiche importanti di un sistema. Le trasformazioni tra questi modelli sono principalmente manuali, anche se alcuni strumenti possono essere utilizzati per gestire i rapporti in riferimento alla tracciabilità e alla dipendenza tra elementi del modello in base a delle linee guida [1]. Un modo utile per la caratterizzazione è quello di esaminare i diversi modi in cui i modelli 13 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO vengono trasformati in codice sorgente. Questo è illustrato nella Figura 2 che mostra lo spettro di approcci di modellazione in uso oggi. Ogni categoria identifica un particolare uso di modelli che aiuta gli sviluppatori a creare applicazioni in esecuzione (codice) per una piattaforma specifica, e a gestire il rapporto tra i modelli usati ed il codice generato. Figura 2: I livelli e le trasformazioni nell’MDA Un aspetto fondamentale dell'approccio MDA è riconoscere che le trasformazioni possono essere applicate alle descrizioni astratte di alcuni aspetti di un sistema per aggiungere ulteriori dettagli a tale descrizione, perfezionare tale descrizione per essere più concreti, o per la conversione tra rappresentazioni. Alcuni concetti importanti in riferimento all’approccio MDA sono: • Distinguere diversi tipi di modelli ci permette di pensare al software e allo sviluppo del sistema come una serie di parametri tra rappresentazioni di modelli differenti. Questi modelli e i loro parametri sono una parte critica della metodologia di sviluppo per le situazioni che includono i parametri tra i modelli che rappresentano diversi aspetti del sistema, aggiungendo ulteriori dettagli a un modello, o la conversione tra diversi tipi di modelli. 14 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO • Un modo per prendere in considerazione i modelli è di classificarli in termini di come esplicitamente rappresentano aspetti delle piattaforme in considerazione. In tutto il ciclo di sviluppo del software ci sono importanti vincoli impliciti dovuti alla scelta del linguaggio,dell’ hardware, della topologia di rete, dei protocolli di comunicazione e delle infrastrutture, e così via. Ognuno di questi può essere considerato come elemento della soluzione "piattaforma". Un approccio MDA ci aiuta a concentrarci su ciò che è essenziale per la soluzione in fase di progettazione separato dai dettagli della particolare"piattaforma". • La nozione di ciò che è una "piattaforma" è piuttosto complessa, e fortemente dipendente dal contesto. Ad esempio, in alcune situazioni la piattaforma può essere il sistema operativo e le utilità associate; in altre situazioni, può essere una infrastruttura tecnologica rappresentata da un modello di programmazione ben definito come J2EE 9o .NET10; in altre situazioni è un caso particolare di una topologia hardware. Qualunque cosa noi consideriamo la "piattaforma", è importante pensare più in termini di modelli a diversi livelli di astrazione utilizzati per scopi diversi, piuttosto che essere troppo specifici così definire che cosa significa una "piattaforma". Le trasformazioni tra i diversi modelli assumono quindi un ruolo centrale nell’MDA in quanto si richiede quasi sempre una grande quantità di lavoro nel definire queste trasformazioni, che spesso richiedono conoscenze specialistiche del dominio aziendale, le tecnologie utilizzate per l'attuazione, o entrambi. Efficienza e qualità dei sistemi possono essere migliorate mediante l'acquisizione queste trasformazioni in modo esplicito e riutilizzare in modo coerente le soluzioni. Dove i diversi modelli astratti sono ben definiti, è possibile utilizzare le trasformazioni standard. Ad esempio, tra modelli di progettazione espressi in UML e implementazioni in J2EE possiamo usare frequentemente i modelli di 9 In informatica la Java Platform, Enterprise Edition o Java EE (conosciuta, prima della versione 5, col nome di Java 2 Enterprise Edition o J2EE) è una piattaforma software di programmazione principalmente sviluppata in linguaggio di programmazione Java e ampiamente utilizzata nella programmazione Web. 10 La suite di prodotti .NET (tutto in lettere maiuscole, pronunciato dotnet) è un progetto all'interno del quale Microsoft ha creato una piattaforma di sviluppo software, .NET, che è una versatile tecnologia di programmazione ad oggetti. 15 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO trasformazione ben compresi da UML a J2EE che possono essere applicati in modo coerente, convalidato e automatizzato. Alla base di queste rappresentazioni del modello, e a sostegno delle trasformazioni, i modelli sono descritti in una serie di metamodelli. La capacità di analizzare, automatizzare, e trasformare i modelli richiede un chiaro, inequivocabile modo di descrivere la semantica dei modelli. Quindi, i modelli intrinseci di un approccio di modellazione devono essere descritti in un modello, che noi chiamiamo un metamodello11. Così, per esempio, la semantica e la notazione di UML viene descritta in metamodelli. Produttori di strumenti si rivolgono ai metamodelli standard di UML quando vogliono implementare UML in un modo standard. Ad esempio, il metamodello UML descrive in dettaglio il significato preciso di una classe, il significato di un attributo, e il significato delle relazioni tra questi due concetti. L'OMG ha riconosciuto l'importanza dei metamodelli della semantica formale per la modellazione essenziale per il loro uso pratico. Come risultato, l’OMG definito un insieme di livelli metamodeling, e definito un linguaggio standard per esprimere metamodelli, Facility Meta-Object (MOF). Un metamodello MOF si usa per definire formalmente la sintassi astratta di un insieme di costrutti di modellazione. I modelli e le trasformazioni tra di essi saranno specificati utilizzando standard aperti. Attraverso standard come CORBA12, IIOP13, UML, e CWM l'industria del software sta godendo di un livello di interoperabilità dei sistemi che in precedenza era impossibile, inoltre,come strumento di interoperabilità è agevolato anche a seguito di strumenti di interscambio, come MOF e XMI. 11 La Metamodellazione o Meta-modellazione (in inglese Metamodeling), in Ingegneria del Software e in Ingegneria dei Sistemi è l'analisi, la costruzione e lo sviluppo di strutture, regole, vincoli, modelli e teorie applicabili e utili per la modellazione di classi predefinite di problemi. 12 CORBA (Common Object Request Broker Architecture) è uno standard sviluppato da OMG per permettere la comunicazione fra componenti indipendentemente dalla loro distribuzione sui diversi nodi della rete o dal linguaggio di programmazione con cui siano stati sviluppati. 13 La specifica IIOP definisce un insieme di regole di formattazione dei dati, chiamato CDR (Common Data Representation), che è su misura per i tipi di dati supportati nella Definition Language CORBA IDL (Interface). 16 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO 1.3 Testing Il Model Based Testing (MBT) è diventato un po 'una parola d'ordine in questi ultimi anni, e questo termine viene usato per una vasta gamma di tecniche di generazione di test[3]. Di seguito sono riportati i quattro approcci principali conosciuti come test modelbased: 1 Generazione dei dati di input di test da un modello nel dominio 2 Generazione di casi di test da un modello di ambiente 3 Generazione di casi di test con predittori di un modello di comportamento 4 Generazione di script di test di prove astratte Quando l’MBT è usato per la generazione dei dati di input di test, il modello sono le informazioni nel dominio dei valori di input e la generazione dei test prevede la selezione e la combinazione di un sottoinsieme di questi valori per produrre dati di input di test. Nel secondo caso l’MBT utilizza un diverso tipo di modello, che descrive l'ambiente previsto della System Under Test (SUT)14. Il terzo caso dell’MBT è la generazione di casi di test eseguibili che includono informazioni di predizione, come ad esempio i valori di output attesi della SUT, o qualche controllo automatico sui valori di uscita effettivi per vedere se queste sono corrette. Il quarto caso dell’MBT è molto diverso: si presume che ci viene data una descrizione astratta di un caso di test, come ad esempio un diagramma di sequenza UML o una sequenza di chiamate di procedura ad alto livello, e si concentra sulla trasformazione che astrae il test case in uno script di test di basso livello che è eseguibile. Definiamo quindi l’MBT come l'automazione della progettazione di black-box test. La differenza dal solito black-box test è quindi che piuttosto che scrivere manualmente i test basati sulla documentazione, si crea un test basato su un modello del comportamento 14 I modelli possono essere utilizzati per rappresentare il comportamento desiderato di un sistema in prova (SUT), o per rappresentare le strategie di sperimentazione e di un ambiente di test. 17 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO SUT atteso, che cattura alcuni dei requisiti. Quindi vengono utilizzati gli strumenti MBT per generare automaticamente i test di quel modello specifico. Possiamo quindi dire che il Model-Based Testing è l'automazione della progettazione di black-box test. Una volta che abbiamo un modello del sistema da testare, possiamo utilizzare uno degli strumenti di MBT per generare automaticamente una suite di test. Ora ci sono alcuni strumenti di test basati su modelli commerciali e accademici disponibili, sulla base di una varietà di metodi e notazioni. Molti degli strumenti consentono di guidare il processo di generazione del test per controllare il numero di prove prodotte o per concentrare gli sforzi di test su alcune aree del modello. L'uscita del generatore del test case sarà un insieme di casi di test astratti, ciascuno dei quali è una sequenza di operazioni con i valori di input associate a valori di uscita previsti (predittore). Cioè, i casi di test generati saranno espressi in termini di operazioni astratte e dei valori utilizzati dal modello. Il passo successivo è quello di trasformare (concretizzare) i casi di test astratti in script di test eseguibili. Questo può essere fatto dagli strumenti di model-based testing, utilizzando alcuni modelli e tabelle di conversione fornite dal test engineer. Le risultanti sono dei test eseguibili che possono essere prodotti direttamente in un linguaggio specifico di programmazione, come ad esempio i test JUnit 15in Java16, o in un linguaggio dinamico come Python17o Tcl18, o in un linguaggio di scripting di prova dedicato. 15 JUnit è un framework di unit testing per il linguaggio di programmazione Java Java è un linguaggio di programmazione orientato agli oggetti, specificatamente progettato per essere il più possibile indipendente dalla piattaforma di esecuzione. 17 Python è un linguaggio di programmazione dinamico orientato agli oggetti utilizzabile per molti tipi di sviluppo software 18 In informatica Tcl (acronimo di Tool Command Language), è un linguaggio di scripting creato da John Ousterhout generalmente considerato di facile apprendimento (rispetto ai linguaggi della sua generazione), ma allo stesso tempo potente. 16 18 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO 1.4 Standard Come detto in precedenza esistono vari standard che vengono usati nell’approccio Model Driven Architecture. La chiave del successo dell'integrazione e dell'interoperabilità risiede nell'uso intelligente e nella gestione dei metadati19 per tutte le applicazioni, piattaforme, strumenti e banche dati. La gestione dei metadati e l'integrazione può essere realizzata attraverso l'utilizzo di norme fondamentali MDA della OMG: CWM, MOF, XMI, UML e SysML[4]. 1.4.1 CWM Il Common Warehouse Metamodel (CWM) definisce una rappresentazione di metadati sia business che tecnici che spesso si trovano nel dominio del data warehousing20e del business analysis21 [CWM]. È usato come base per l’interscambio di istanze di metadati tra sistemi eterogenei e sistemi multi-vendor di software (cioè, per integrare le informazioni di data warehousing e business analysis "supply chain"). CWM è in realtà composto da un certo numero di metamodelli costituenti che rappresentano le risorse di dati, analisi, data warehousing, e le componenti fondamentali di un tipico ambiente di data warehousing/business. CWM rappresenta un approccio model-based per l'interscambio dei metadati tra i sistemi software. I metadati condivisi tra i prodotti sono formulati in termini di modelli di dati che sono coerenti con uno o più metamodelli CWM. Un prodotto di esportazione dei metadati attraverso la formulazione di un modello delle sue strutture interne di metadati in un formato stabilito dalla CWM. La varietà di metamodelli forniti da CWM è abbastanza completa per modellare un 19 Un metadato (dal greco μετὰ "oltre, dopo" e dal latino datum "informazione" - plurale: data), letteralmente "(dato) oltre un (altro) dato", è un'informazione che descrive un insieme di dati. 20 Un data warehouse (o DW, o DWH) (termine inglese traducibile con magazzino di dati) è un archivio informatico contenente i dati di un'organizzazione, progettati per consentire di produrre facilmente analisi e relazioni utili a fini decisionali-aziendali. 21 Business analysis è una disciplina di ricerca che identifica le esigenze aziendali e determina le soluzioni ai problemi di business 19 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO intero data warehouse. L’utilizzo di strumenti CWM-aware, in un istanza di data warehouse potrebbe essere generato direttamente da un warehouse model. Ognuno dei strumenti utilizza quelle parti del modello di cui può farne uso. Ad esempio, un server di database relazionale utilizzerà la parte relazionale del modello e lo userà per costruire il suo catalogo. Allo stesso modo, un server OLAP22 cercherà il modello per i metadati OLAP e lo userà per definire lo schema multidimensionale. I modelli CWM sono descritti per essere molto generici, rappresentazioni esterne di metadati condivisi. I metadati che non facilmente si adattano al formato CWM (ad esempio, i metadati altamente specifici) vengono gestite sia attraverso meccanismi di estensione standard forniti da CWM, attraverso le estensioni al nucleo metamodello CWM, o alltraverso l’uso di prodotti specifici di default. 1.4.2 UML UML è un linguaggio di modellazione e specifica basato sul paradigma object-oriented. Il nucleo del linguaggio fu definito nel 1996 da Grady Booch, Jim Rumbaugh e Ivar Jacobson (detti "i tre amigos") sotto l'egida dello Object Management Group, consorzio che tuttora gestisce lo standard UML. Il linguaggio nacque con l'intento di unificare approcci precedenti (dovuti ai tre padri di UML e altri), raccogliendo le migliori prassi nel settore e definendo così uno standard industriale unificato. L'UML svolge un'importantissima funzione di "lingua franca" nella comunità della progettazione e programmazione a oggetti. Gran parte della letteratura di settore usa UML per descrivere soluzioni analitiche e progettuali in modo sintetico e comprensibile a un vasto pubblico. L'ultima versione del linguaggio, la 2.0, è stata consolidata nel 2004 e ufficializzata da OMG nel 2005. UML 2.0 riorganizza molti degli elementi della versione precedente (1.5) 22 OLAP, acronimo che sta per l'espressione On-Line Analytical Processing, designa un insieme di tecniche software per l'analisi interattiva e veloce di grandi quantità di dati, che è possibile esaminare in modalità piuttosto complesse 20 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO in un quadro di riferimento ampliato e introduce molti nuovi strumenti, inclusi alcuni nuovi tipi di diagrammi. Sebbene OMG indichi UML 2.0 come la versione "corrente" del linguaggio, la transizione è di fatto ancora in corso; le stesse specifiche pubblicate da OMG sono ancora non completamente aggiornate e il supporto dei tool a UML 2.0 è, nella maggior parte dei casi, appena abbozzato. La notazione UML è semi-grafica e semi-formale; un modello UML è costituito da una collezione organizzata di diagrammi correlati, costruiti componendo elementi grafici (con significato formalmente definito), elementi testuali formali, ed elementi di testo libero. Ha una semantica molto precisa e un grande potere descrittivo. Il linguaggio è stato progettato con l'obiettivo esplicito di facilitare il supporto software alla costruzione di modelli e l'integrazione di questo supporto con gli ambienti integrati di sviluppo. OMG, in particolare, gestisce una famiglia di standard correlata a UML, detta Model Driven Architecture (MDA), che ha lo scopo di fornire le fondamenta concettuali e semantiche per lo sviluppo di ambienti evoluti di round-trip engineering in cui la modellazione UML, in qualche misura, possa sostituire di fatto la programmazione tradizionale. Sebbene questo obiettivo sia ancora da raggiungere, molti IDE23comprendono strumenti di modellazione in UML e forniscono meccanismi automatici di traduzione parziale dei diagrammi UML in codice e viceversa. Viceversa, molti ambienti software dedicati alla modellazione in UML consentono di generare codice in diversi linguaggi. 1.4.3 MOF Meta Object Facility (MOF) è uno standard OMG di definizione di un linguaggio astratto comune per la specifica di metamodelli. 23 Integrated Development Environment ovvero IDE è un software che, in fase di programmazione, aiuta i programmatori nello sviluppo del codice sorgente di un programma. 21 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO MOF è nettamente orientato agli oggetti. Esso definisce gli elementi essenziali, la sintassi e la struttura di metamodelli che vengono utilizzati per costruire modelli object-oriented di sistemi discreti. MOF serve da modello comune di entrambi i metamodelli CWM e UML. In particolare, la specifica MOF prevede: · Un modello astratto degli oggetti MOF generici e le loro associazioni. · Un insieme di regole per mappare qualsiasi metamodello basato su MOF per le interfacce indipendenti dalla lingua (definita in CORBA IDL). L'implementazione di queste interfacce per un dato metamodello è utilizzato per accedere e modificare qualsiasi modello sulla base di tale metamodello. · Regole che definiscono il ciclo di vita, la composizione, e la semantica di chiusura degli elementi di metamodelli basati su MOF. · Una gerarchia di interfacce. Questi definiscono operazioni generiche per scoprire e manipolare modelli basati su metamodelli MOF-compliant, ma le cui interfacce mappate sono sconosciute. Il potere di MOF è quello di consentire a metamodelli dissimili (che rappresentano diversi domini) di poterli utilizzare in maniera interoperabile. La semantica MOF generalmente definisce servizi di repository24 di metadati che supportano la costruzione del modello, la sua evuluzione, e aggiornamento, in cui i modelli si allocano con le istanze di qualche particolare metamodello. In particolare, il sostegno del MOF per la semantica del ciclo di vita di un modello. Ad esempio, metamodelli di nuova concezione possono essere persistenti nel repository MOF e combinati con metamodelli esistenti secondo la semantica di composizione del ciclo di vita MOF. Interfacce del modello e le implementazioni predefinite possono essere generate e messe a disposizione per l'ambiente. Implementazioni predefinite sono 24 Un repository è un ambiente di un sistema informativo, in cui vengono gestiti i metadati, attraverso tabelle relazionali; l'insieme di tabelle, regole e motori di calcolo tramite cui si gestiscono i metadati prende il nome di metabase. 22 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO ulteriormente rafforzate con l'inserimento di ulteriore logica programmata, o scritti a mano o generate da strumenti o tools. 1.4.4 XMI XML Metadata Interchange (XMI) è uno standard OMG che associa il MOF al W3C eXtensible Markup Language 25 (XML). XMI definisce le regole di come tag XML vengono utilizzati per rappresentare serializzati modelli MOF-compatibili in XML. Metamodelli basati su MOF sono convertiti in XML Document Type Definition26 (DTD) e modelli sono tradotti in documenti XML che sono coerenti con le loro DTD corrispondenti. XMI risolve molti dei problemi che si incontrano quando si cerca di utilizzare un linguaggio basato su tag per rappresentare oggetti e le loro associazioni. Inoltre, il fatto che XMI è basato su XML significa che entrambi i metadati (tag) e le istanze che descrivono (contenuto dell'elemento) possono essere confezionati insieme nello stesso documento, permettendo alle applicazioni di poter comprendere le istanze tramite il loro metadati. La comunicazione tra i contenuti è selfdescribing27 e intrinsecamente asincrona. Per questo motivo l’interscambio basato su XMI è così importante, in ambienti eterogenei distribuiti. 25 XML (sigla di eXtensible Markup Language) è un linguaggio di markup, ovvero un linguaggio marcatore basato su un meccanismo sintattico che consente di definire e controllare il significato degli elementi contenuti in un documento o in un testo. 26 Il Document Type Definition (definizione del tipo di documento) è uno strumento utilizzato dai programmatori il cui scopo è quello di definire le componenti ammesse nella costruzione di un documento XML. 27 In informatica self-document o self-describing denota un descrittore comune per il codice sorgente e le interfacce utente che seguono alcune convenzioni definite per la denominazione e struttura. 23 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Capitolo 2: Il linguaggio di modellazione SysML Con il termine Systems Modeling Language (SysML) si intende un’estensione UML utilizzata per la modellazione di sistemi software e hardware. SysML Supporta la definizione di specifiche, analisi, progettazione, validazione e verifica sia di sistemi e sottosistemi, che possono includere software, hardware, processi. Systems Modeling Language (SysML) è quindi un linguaggio per la modellazione visuale per applicazioni di Ingegneria dei Sistemi. SysML è un’estensione di UML 2, ed è definito come un profilo UML 2 ( per Profilo si intende la personalizzazione UML che utilizza stereotipi, Tagged values, e vincoli.). Nella figura seguente è mostrata la storia cronologica in ordine di tempo dell’evoluzione del’espressioni semantiche (Figura 3): 24 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 3: Storia del SysML La specifica SysML è stata creata dai SysML Partners, un gruppo di sviluppatori di tool software e aziende leader nel settore, che nel 2003 si organizzarono per creare un dialetto di UML per Ingegneria dei Sistemi chiamato SysML (Systems Modeling Language). I SysML partner realizzarono SysML come specifica open source per soddisfare i requisiti di "UML per Ingegneria dei Sistemi" della OMG RFP, e le loro specifiche includono una licenza open source per la distribuzione e l'uso. SysML è stato originariamente sviluppato come un progetto open source nel 2003, in risposta a "UML per Ingegneria dei Sistemi" di OMG RFP(Request of Proposal). SysML contiene nove tipi di diagrammi, sette dei quali condivide in comune con la sua lingua madre, insieme con una notazione tabellare (tabelle di allocazione.) La specifica SysML è disponibile per il download, e comprende una licenza open source per la distribuzione e l'uso. La revisione più recente è SysML v 1.3 [11]. SysML è definito come un dialetto (profilo) di UML 2.x, il linguaggio di modellazione standard nel settore per le applicazioni software-intensive. Il vantaggio di definire SysML 25 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO come un profilo UML è che si può riutilizzare la notazione relativamente matura e la semantica di UML 2.x, che molti produttori di strumenti di modellazione hanno già attuato. Lo svantaggio di specificare SysML come un profilo UML è che SysML eredita molti dei problemi connessi con UML 2.x, come notazione la complessa, la semantica imprecisa, e uno standard di interoperabilità di schema disfunzionale (XMI). In figura (Figura 4) sono mostrati i due macroinsieme SysML e UML e la loro intersezione: Figura 4: Rappresentazione degli insiemi UML e SysML SysML offre ai sistemisti i seguenti vantaggi rispetto UML per impianti System-toSystem, nello specifico: • SysML esprime la semantica di Ingegneria dei sistemi (interpretazioni delle notazioni) meglio di quanto non faccia UML. Si riduce la distorsione del software UML e aggiunge due nuovi tipi di diagrammi per la gestione dei requisiti e analisi delle prestazioni: rispettivamente, Diagrammi Requisito e Diagrammi parametrici. • SysML è più piccolo e più facile da imparare rispetto UML. Il linguaggio globale è più piccolo misurata in tipi di diagrammi (9 vs 13) e costrutti totali. 26 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO • Costrutti di gestione del modello SysML supportano la specifica di modelli, opinioni, punti di vista e che sono architettonicamente allineati con IEEE-Std-1471-2000 (IEEE Metodo raccomandato per la descrizione architettonica di Sistemi Software-Intensive). Come detto in precedenza, SysML non è una lingua indipendente; si tratta di un profilo, o estensione UML creato appositamente per l'ingegneria dei sistemi. UML è stato progettato per essere un linguaggio di modellazione standard per il dominio del software. Nonostante sia stato in gran parte utilizzato UML per la modellazione dei Sistemi, questo poneva dei grandi limiti. Ad esempio, i modelli UML possono contenere elementi di tipo dati. Gli Ingegneri software possono utilizzare un tipo di dati (ad esempio, numero intero) in un modello UML per specificare il tipo di un attributo all'interno di una classe, il tipo di un oggetto che può fluire attraverso un'attività, e il tipo di un parametro all'interno di un'operazione. I Sistemisti, tuttavia, si preoccupano di altri tipi che possono fluire all’interno di un sistema. Il concetto di DataType semplicemente non era sufficiente. Pertanto, SysML introduce un nuovo tipo di elemento del modello chiamato ValueType, che estende il concetto di DataType per fornire un termine più neutro per una più ampia gamma di tipi nel dominio dell’ingegneria dei sistemi. Un ValueType quindi può essere inteso come una specifica “qualità” attribuita ad un elemento del mio modello. Questa qualità può essere definita da tipi già stabiliti, come string e boolean per UML, oppure essere definita da zero (es. enumerazione). SysML Partners fu fondata e diretta da Kris Kobryn, che in precedenza aveva presieduto il team di specifica della 1.x UML e UML 2.0. Kobryn ha coniato il nome della lingua "SysML" (abbreviazione di "Systems Modeling Language"), ha progettato il logo originale SysML, e ha organizzato il team di progettazione del linguaggio di base come un progetto open source. Sandy Friedenthal, presidente del Ingegneria dei Sistemi Special Interest Group OMG, è stato vice presidente durante l'inizio del progetto. 27 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Nel 2001, prima che SysML Partnes venne creato e mentre Kobryn era ancora leader UML2 Partners, David W. Oliver (1932-2011), co-presidente del INCOSE Model Driven Design Working Group si avvicinò a Kobryn circa l’idea dell’UML for Systems Engineering. Impressionato dalla passione e competenza per modellazione visuale di Dave, e riconobbe che le componenti software e componenti hardware di un sistema potessero avere più in comune di quanto si potesse pensare. Kobryn successivamente ha diretto il team UML2 Partners per cercare di ridurre gradualmente gli aspetti softwarecentric all’interno della bozza per la specifica UML 2.0. Senza questo noioso ma indispensabile lavoro di ristrutturazione della specifica UML 2.0, sarebbe stato impensabile che il progetto di specifica open source SysMl sarebbe stato completato in così poco tempo. Ci sono nove tipi di diagrammi SysML (5 dei quali condivisi con UML) [12]: • Block definition diagram (BDD) • Internal block diagram (IBD) • Use case diagram • Activity diagram • Sequence diagram • State machine diagram • Parametric diagram • Package diagram • Requirements diagram Nella figura seguente (Figura 5) è riportata la struttura di derivazione di ogni diagramma: 28 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 5: Struttura a blocchi dell’UML e SysML I Diagrammi possono essere così brevemente descritti: • Il block definition diagram (BDD) è usato per visualizzare elementi come blocchi e tipi di valore (elementi che definiscono i le cose che possono esistere in un sistema operativo) e le relazioni tra questi elementi. Usi comuni per un BDD includono la visualizzazione di alberi di gerarchia di sistema e alberi di classificazione. • L’ internal block diagram (IBD) viene utilizzato per specificare la struttura interna di un unico blocco. Più precisamente, una IBD mostra le connessioni tra le parti interne di un blocco e le interfacce tra di esse. • Lo use case diagram è utilizzato per trasmettere i casi d'uso che un sistema esegue e gli attori che interagiscono tra di loro. Un use case diagram è una vista in black-box dei servizi che un sistema esegue in collaborazione con i suoi attori. • L’ activity diagram viene utilizzato per specificare un comportamento, con un focus sul flusso di controllo e la trasformazione di input in output attraverso una sequenza di 29 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO operazioni. Diagrammi di attività sono comunemente usati come strumento di analisi per comprendere ed esprimere il comportamento desiderato di un sistema. • Il sequence diagram viene utilizzato per specificare un comportamento, con un focus su come le parti di un blocco interagiscono tra loro attraverso chiamate a funzioni e segnali asincroni. sequence diagram sono comunemente utilizzati come strumento di progettazione dettagliata per specificare precisamente un comportamento come input per il ciclo di vita in fase di sviluppo. I sequence diagram sono anche un eccellente meccanismo per specificare i casi di test. • lo state machine diagram viene utilizzato per specificare un comportamento, con un focus sul set di stati di un blocco e le possibili transizioni tra questi stati in risposta al verificarsi degli eventi. Uno state machine diagram, come un sequence diagram, è una indicazione precisa del comportamento di un blocco che può servire come input per la fase di sviluppo del ciclo di vita. • Un parametric diagram è usato per esprimere come con uno o più vincoli, equazioni e disequazioni, sono legati alle proprietà di un sistema. Parametric diagram supporta l’engineering analyses, comprese le prestazioni, l'affidabilità, la disponibilità, il potere, la massa e il costo. Parametric diagram possono essere utilizzati anche per sostenere gli studi commerciali di candidati architetture fisiche. • Un package diagram viene utilizzato per visualizzare il modo in cui un modello è organizzato sotto forma di una gerarchia di pacchetto. Un package diagram può anche mostrare gli elementi del modello che i pacchetti contengono e le dipendenze tra i pacchetti e gli elementi del modello contenuto. • Un requirements diagram viene utilizzato per visualizzare i requisiti basati su testo, le relazioni tra i requisiti (di contenimento, derivazione requisito, e copia), e le relazioni tra requisiti e gli altri elementi del modello che soddisfano, verificano, e raffinano. Di seguito andremo ad analizzare i diagrammi SysML, con particolare attenzione verso i Block Definition Diagram, Internal Block Diagram e Requirements Diagram, rifacendoci 30 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO alle descrizioni e alle notazioni presentate negli esempi di Delligatti [12], il quale prende ad esempio un sistema satellitare, per poi andare nello specifico della nostra applicazione. 2.1 BDD Lo scopo di creare un BDD è quello di modellare un molteplice numero di elementi di un sistema e di relazionarli tra di loro, che siano componenti Hardware o Software e vedere le varie relazioni e interazioni tra di essi. Gli elementi che compongono un block definition diagram sono: -package -model -modelLibrary -view -block -constraintBlock L'elemento base di un BDD e il package il quale rappresenta il namespace del nostro progetto. Come prima cosa definiamo il nostro package che rappresenterà l'ambito di sviluppo e tutti i suoi componenti . Di seguito (Figura 6) viene riportato un semplice BDD: 31 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 6: Esempio BDD Strutturato 32 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Un blocco è l'unità di base della struttura in SysML. È possibile utilizzare un blocco per modellare qualsiasi tipo di entità all'interno del sistema di interesse o nell'ambiente esterno del sistema. Si noti la distinzione tra definizione e la creazione di istanze (che SysML riferisce come "uso"). Questa distinzione è uno dei concetti fondamentali di progettazione di sistema, ed è un modello che ricorre spesso in SysML. Alcuni tipi di elementi del modello (ad esempio blocks, value types, constraint blocks) rappresentano definizioni di tipi; altri tipi di elementi del modello (ad esempio, part properties, value properties, constraint properties) rappresentano istanze di tali tipi. Per analogia, un progetto di una casa è una definizione di un tipo di casa; ad ogni casa un costruttore , basandosi sul progetto, costruirà una casa per ogni lotto di terreno, il quale sarà un'istanza distinta di quel tipo. Un blocco rappresenta un tipo di entità, e non un caso. Ad esempio, è possibile creare un blocco denominato DesktopWorkstation nel modello di sistema. Tale blocco rappresenterebbe un tipo che definisce un insieme di proprietà come monitor, tastiera, mouse, CPU, produttore, spazio su disco, costi che sono comuni a tutte le istanze. Ogni workstation desktop che un azienda IT acquisterà per ogni ufficio sarà un'istanza distinta di quel blocco DesktopWorkstation. Si può facilmente capire la differenza tra elementi di definizione ed elementi di utilizzo in un modello di sistema. Elementi di definizione hanno un nome solo (ad esempio, DesktopWorkstation); elementi di utilizzo hanno un nome e un tipo, separati da due punti (ad esempio, SDX1205LJD: DesktopWorkstation). La notazione di un blocco è un rettangolo con lo stereotipo «blocco» che precede il nome nel vano nome (Figura 7): 33 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 7: Esempio notazione BDD Vi sono due tipi di caratteristiche: caratteristiche strutturali (note anche come proprietà) e le caratteristiche comportamentali. Ecco i componenti facoltativi che è possibile visualizzare in ogni blocco: • Parts • References • Values • Constraints • Operations • Receptions • Standard ports (in SysML v1.2 and earlier) • Flow ports (in SysML v1.2 and earlier) • Full ports (in SysML v1.3) • Proxy ports (in SysML v1.3) • Flow properties (in SysML v1.3) • Structure Le caratteristiche strutturali servono a descrivere il nostro modello in base alle parti di cui è composto. Ci sono cinque tipi di caratteristiche strutturali (conosciuto anche come 34 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO proprietà) che un blocco può possedere: • Part properties • Reference properties • Value properties • Constraint properties • Ports Part properties rappresentano una struttura che è interna ad un blocco. Un blocco è composto dalle sue part properties. Questa relazione esprime la proprietà. Una Reference properties rappresenta una struttura che è esterna ad un blocco. Value properties può rappresentare un quantitativo (di un certo tipo), un valore booleano o una stringa. Le Value properties sono particolarmente utili in combinazione con le proprietà di vincolo per costruire un modello matematico del sistema. Constraint properties rappresentano generalmente delle relazioni matematiche (equazioni o disequazioni) che vengono impostate su un insieme di value properties. Una Port è un tipo di proprietà che rappresenta un punto di interazione distinto al confine di una struttura attraverso la quale entità esterne che possono interagire con struttura sia per fornire o per richiedere un servizio o per scambiare materia, energia o dati. SysML v1.2 (e precedenti) definisce due tipi di porte ovvero standard-port e flow-port, che è possibile aggiungere a un blocco per specificare diversi aspetti della sua interfaccia. Una standard-port consente di specificare un punto di interazione con un focus sui servizi che un blocco fornisce o richiede; una flow-port consente di specificare un punto di interazione con un focus sui tipi di materia, energia o dati che possono fluire dentro e fuori 35 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO di un blocco. Il modello Standard-port definisce i servizi che un blocco fornisce o richiede a un punto di interazione sul suo confine. Si divide in interfacce richieste e interfacce offerte. Le interfacce richieste rappresentano le cose che vengono ricevute dal blocco, mentre le interfacce offerte rappresentano le operazioni che possono essere effettuate dal blocco (Figura 8). Figura 8: Vista di due interfacce con le rispettive operations e receptions in un BDD Il modello flow-port definisce le flow-specification. Come un blocco, una flowspecification è un elemento di definizione che definisce un insieme di proprietà di flusso che può fluire dentro o fuori di flow-port (Figura 9). Figura 9: Modello flow-port in un BDD Nella maggior parte dei progetti di modellazion non è sufficiente specificare solo le parti, i riferimenti, i vincoli, le proprietà, e le porte di un blocco. Sono importanti, ma che trasmettono solo un aspetto del design. 36 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Un aspetto altrettanto importante è l'insieme di comportamenti che un blocco può avere. Si trasmettere questo aspetto della progettazione con l'aggiunta di caratteristiche comportamentali ad un blocco. SysML offre due tipi di caratteristiche comportamentali: operations and receptions. Un' operations rappresenta un comportamento che un blocco esegue quando un client invoca un servizio. Un’operations viene richiamata quando si scatena un evento di tipo chiamata. Un receptions rappresenta un comportamento che un blocco esegue quando un client invia un segnale che lo attiva. Una receptions viene richiamata quando si scatena da un evento di tipo segnale. La differenza sostanziale tra i due sta nel tipo di evento che scatena l’azione, ovvero nel primo caso avrò una lista di operazioni che il mio blocco può effettuare e che possono essere richiamate, mentre nel secondo caso avrò una lista di segnali di ricezione i quali quando attivi scateneranno una serie di operazioni definite nel blocco(Figura 7). Un’altra parte importante nella modellazione dei sistemi sono le relazioni che si possono modellare tra i vari blocchi. Ci sono tre tipi principali di relazioni che possono esistere tra blocchi: associazioni, generalizzazioni e le dipendenze. Le associazioni rappresentano dei legami tra 2 o più entità, le generalizzazioni identifica la specializzazione di un particolare blocco, mentre le dipendenze indicano una relazione nella quale un entità dipende da un’altra entità. Vi sono poi 2 tipi di associazione: Reference Association e Composite Association. Una Reference Association tra due blocchi significa che può esistere una connessione tra istanze di tali blocchi in un sistema operativo e queste istanze possono accedersi a vicenda per qualche scopo attraverso la connessione. Una Composite Association tra due blocchi indica la decomposizione strutturale. Un'istanza del blocco è costituita da un certo numero di istanze dei blocchi di cui è composto (Figura 10 e Figura 11). 37 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 10: Esempio di instanza in un BDD Figura 11: Esempio di composizione in un BDD 38 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Vi sono poi altri oggetti di cui può essere composto un BDD, e sono: gli attori, i ValueType e i commenti. Un attore rappresenta qualcuno o qualcosa che ha una interfaccia esterna con il sistema. Il nome di un attore trasmette un ruolo svolto da una persona, un'organizzazione o un altro sistema quando interagisce con il sistema (Figura 12). Figura 12: Attori in un BDD Come un blocco, un valueType è un elemento di definizione che definisce generalmente un tipo di quantità. È possibile utilizzare un valueType spesso in un modello. Il più delle volte, esso appare come il tipo di una valueType, che è una sorta di caratteristica strutturale dei blocchi (Figura 13). 39 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 13: Esempio di definizione di tipo in un BDD Come un blocco, un Constraint Blocks è un elemento di definizione di uno che definisce un'espressione di vincolo booleana (un'espressione che deve restituire true o false). Il più delle volte, l'espressione di vincolo si definisce in un Constraint Blocks è un'equazione o una disuguaglianza: una relazione matematica che consente di vincolare le proprietà del valore di blocchi (Figura 14). 40 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 14: Esempio di constraint in un BDD Un commento è un elemento del modello. È costituito da un singolo attributo: una stringa di testo chiamato corpo. È possibile trasmettere tutte le informazioni necessarie al corpo di un commento, ed è possibile allegare un commento ad altri elementi su un diagramma per fornire ulteriori informazioni su di loro (Figura 15). 41 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 15: Esempio di commenti in un BDD 2.2 IBD Lo schema a blocchi interno (IBD) ha una stretta relazione con il BDD. È possibile visualizzare i vari elementi su una IBD per esprimere aspetti della struttura di un sistema che integrano gli aspetti dei BDD (Figura 16). L’IBD permette di avere una visione interna di ogni singolo blocco contenuto all’interno dei BDD per definirne gli aspetti strutturali e comportamentali di ogni sua singola parte. 42 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Gli elementi che compongono un IBD sono: Part Properties Reference Properties Connectors Item Flows Una Part Properties IBD ha lo stesso significato di Part Properties di un blocco su un BDD: Rappresenta una struttura che è interna al blocco e di cui il blocco è composto. La notazione per una Part Propertiessu IBD è un rettangolo con un bordo continuo. Una Reference Properties su IBD ha lo stesso significato di una Reference Properties di un blocco su un BDD: Rappresenta una struttura che è esterno al blocco e che serve al blocco per qualche scopo, sia per invocare comportamenti o scambiare materia, energia o dati. Un Connectors tra due parti in un IBD associa l’idea di un collegamento fisico tra le due entità le quale comunicheranno tra di loro in maniera opporutuna. È possibile specificare un nome e tipo per un Connectors per trasmettere ulteriori informazioni sul mezzo che collega queste due strutture. Un Item Flows rappresenta un tipo di materia, energia, o dati che scorre tra due strutture all'interno di un sistema. La notazione per un flusso oggetto su un IBD è compilato freccia triangolare su un connettore che unisce due porte di flusso. Il tipo che il flusso voce rappresenta compare nell’etichetta accanto alla freccia sul connettore; l'etichetta deve contenere il nome di un blocco, tipo di valore, o il segnale che esiste da qualche parte nel modello di sistema. 43 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 16: Esempio di IBD 2.3 RD Un altro tipo di schema essenziale SysML è il diagramma requisiti. I progettisti utilizzano in genere sei tipi di relazioni per stabilire la tracciabilità tra i requisiti in materia di tracciabilità dai requisiti alle strutture e ai comportamenti del modello di sistema. È possibile utilizzare diverse notazioni sui diagrammi dei requisiti di esprimere queste relazioni, e ognuno ha punti di forza e di debolezza. I requisiti di un sistema informano su ogni altro aspetto del suo design. Il diagramma requisiti è il mezzo primario di SysML per il trasporto di questo genere di 44 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO informazioni. Nella figura seguente (Figura 17) vi è riportato un esempio di un tipico Requirements Diagram relativo ad un particolare sottoinsieme del nostro sistema: Figura 17: Un esempio di Requirements Diagram Li elementi base che compongono il nostro diagramma sono: • package • model 45 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO • modelLibrary • view • requirement L'elemento del modello che è chiamato nell'intestazione del diagramma è il namespace predefinito per gli elementi mostrati nell'area dei contenuti. Un namespace è semplicemente un elemento del modello dove sono contenuti gli altri elementi del modello. Ciò significa che un namespace può avere elementi nidificati all’interno di esso nella gerarchia del modello. Un namespace è un concetto che ha senso solo all'interno del modello del sistema e non nel caso specifico. Soffermandoci sugli elementi di un RD, andiamo ad analizzare nel dettagli i package e i requirement. I package come visto in precedenza sono dei contenitori di requisiti che rappresentano una parte del nostro sistema in esame. Si può vedere nella Figura 17 che ogni package è associato ad un namespace specifico. I requisiti invece rappresentano l’unità principale del nostro diagramma. Rappresentano le specifiche fornite dal cliente le quali poi verranno mappate all’interno del nostro sistema. Il Requirement block è un blocco rettangolare che al suo interno conterrà il’ID e il Text entrambi di tipo string. L’ID identifica in maniera univoca il requisito mentre il Text rappresenta il testo del requisito associato. Nella pratica però un requisito non è formato solo da queste due proprietà: vi sono tutta una serie di proprietà (ad esempio logica, prioritaria, metodo di verifica, criticità) che potrebbero essere o no di interesse a seconda del particolare caso di applicazione. Ad oggi SysML tratta solo le proprietà di ID e Text, ma mette a disposizione lo strumento dei commenti per poter aggiungere in maniera opportuna ulteriori notizie ai requisiti. Un elemento importante e fondamentale nel RD sono le relazioni tra i requisiti: ci sono sei tipi di relazioni tra i requisiti: contenimento, tracciabilità, derivazione di requisito, 46 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO raffinare, soddisfazione, e verifica. Queste relazioni stabiliscono la rintracciabilità all'interno del modello, che è di solito un requisito processo nelle organizzazioni sistemi di ingegneria. Come detto in precedenza, una parte importante dei diagrammi dei requisiti, sono le relazioni tra i requisiti e gli elementi del nostro sistema. Adesso andremo ad analizzare uno per uno ogni tipo di relazione e andremo a capirne l’importanza e l’uso all’interno del nostro diagramma. Un package è una sorta di namespace; può contenere altri elementi denominati all'interno della gerarchia del modello. Un requisito è anche una sorta di namespace; esso, inoltre, può contenere altri elementi denominati all'interno della gerarchia del modello. Ma ha un vincolo che un pacchetto non ha: Un requisito può contenere solo altri requisiti. Di qui il concetto di relazione di contenimento, ovvero: è una relazione di contenimento nel senso di raggruppare i requisiti per insiemi o gruppi di requisiti. Questa relazione server ad avere sia una vista più chiara del nostro sistema (dividere i requisiti in gruppi ne facilita la comprensione) sia perché in questo modo è più facile risalire, in un sistema complesso, alle specifiche. Tale relazione viene mostrata all’interno del nostro diagramma da una linea terminante con un cerchio al cui interno vi è il simbolo di somma (Figura 17). Formalmente, la relazione di tracciabilità è una sorta di dipendenza. La notazione di una relazione di trace è la stessa di quella di un-una dipendenza, ovvero linea tratteggiata con una freccia aperta, a meno «trace» come stereotipo applicato ad esso (Figura 17). Il rapporto trace, tuttavia, è un rapporto debole. Esso trasmette nient'altro che una dipendenza base ovvero: Una modifica all'elemento fornitore (alla fine freccia) può comportare la necessità di modificare l'elemento client (alla fine della coda). Una relazione di derivazione di requisito è un altro tipo di dipendenza. La notazione di una relazione di derive requirement è quindi uguale a quello per una dipendenza, ma ha il 47 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO «deriveReqt» come stereotipo applicato ad esso(Figura 17). Questo tipo i relazione indica che un requisito è derivato da un altro, nella misura in cui i requisiti derivati (dal fornitore) vengono aggiunti per meglio definire i requisito da cui viene derivato (fornito dal cliente). Una relazione di refine è un altro tipo di dipendenza. La notazione di una relazione di raffinazione è lo stesso di quello per una dipendenza, ma con «refine» come stereotipo applicato ad esso(Figura 17). Questo tipo di relazione sta ad indicare un raffinamento della specifica del cliente definita dal fornitore SysML non impone vincoli sui tipi di elementi che possono comparire alle due estremità in una relazione di refine. La convenzione comune, tuttavia, è quello di perfezionare un testo, requisito funzionale utilizzando un caso d'uso. Un caso-uso più precisamente, accompagnato dai suoi dettagli di specifica, cosa che il solo testo non può fare. Una relazione di soddisfa è un altro tipo di dipendenza. La notazione di una relazione di satisfy è la stessa di quella per una dipendenza, ma con «satisfy» come stereotipo applicato ad esso(Figura 17). Questa relazione deve avere un requisito all'estremità del fornitore. SysML impone vincoli sul tipo di elemento che può apparire sul lato client. Per convenzione, tuttavia, l'elemento client è sempre un blocco. Questa relazione sta ad indicare come vengono allocati i requisiti rispetto ai blocchi componenti il nostro sistema. Una relazione di verifica è un altro tipo di dipendenza. La notazione per una relazione di verify è lo stesso di quello per una dipendenza, ma con «verify» come stereotipo applicato ad esso(Figura 17). Come la relazione di satisfy, la relazione di verify deve avere un requisito all'estremità del fornitore. SysML impone vincoli sul tipo di elemento che può apparire sul lato client. Per convenzione, tuttavia, l'elemento client è sempre un test case. Un test case è semplicemente un comportamento che si definisce da qualche parte nel modello che si crea al fine di invocare la funzionalità di una particolare struttura per verificare se si soddisfa uno o più dei requisiti ad esso assegnati. Un test case può essere 48 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO uno qualsiasi dei tre tipi di comportamenti: di attività, di interazione, o macchina a stati. Tuttavia, un test case è spesso modellato come un'interazione (e visualizzato su un diagramma di sequenza). 49 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Capitolo 3: Strumenti di supporto Vi sono vari tipologie di software a nostra disposizione che si possono utilizzare per realizzare un progetto simile. Infatti abbiamo tool che permettono la progettazione e la realizzazione di un sistema fino alla generazione del codice, altri che arrivano alla generazione dei test pattern, altri ancora che utilizzano standard open source quali XMI e altri che presentano formati proprietari (es SCADE che rappresenta i dati in un proprio formato) e altri che implementano il paradigma UML2. In questo lavoro di tesi sono stati utilizzati i programmi Eclipse-Papyrus e IBM Rational Rhapsody Developer, questo perché con il primo si è realizzata la progettazione del sistema tramite il paradigma SysML mentre con il secondo a partire dal primo si è passati alla realizzazione del sistema e alla generazione del codice ad esso annesso. Esaminiamo ora le caratteristiche dei programmi e dei tool, ovvero Eclipse con il tool di sviluppo per SysML Papyrus e IBM Rationa Rhapsody Developer. 3.1 Eclipse-Papyrus Esistono vari programmi e tool Open Source i quali offrono all’utilizzatore la possibilità di modellare un sistema utilizzando il paradigma SysML. Nel nostro caso è stato utilizzato Eclipse Papyrus in quanto facile da usare sia come tempi di apprendimento sia per la velocità di realizzazione di un semplice progetto. Eclipse è un ambiente di sviluppo integrato multi-linguaggio e multipiattaforma. Ideato da un consorzio di grandi società 50 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO quali Ericsson, HP, IBM, Intel, MontaVista Software, QNX, SAP28 e Serena Software. Eclipse può essere utilizzato per la produzione di software di vario genere, si passa infatti da un completo IDE per il linguaggio Java (JDT, "Java Development Tools") a un ambiente di sviluppo per il linguaggio C++ (CDT, "C/C++ Development Tools") e a plugin che permettono di gestire XML, Javascript, PHP29 e persino di progettare graficamente una GUI30 per un'applicazione JAVA (Eclipse VE, "Visual Editor"), rendendo di fatto Eclipse un ambiente RAD. Il programma è scritto in linguaggio Java, ma anziché basare la sua GUI su Swing, il toolkit grafico di Sun Microsystems, si appoggia a SWT31, librerie di nuova concezione che conferiscono ad Eclipse un'elevata reattività. La piattaforma di sviluppo è incentrata sull'uso di plug-in, delle componenti software ideate per uno specifico scopo, per esempio la generazione di diagrammi UML, ed in effetti tutta la piattaforma è un insieme di plug-in32, versione base compresa, e chiunque può sviluppare e modificare i vari plug-in. Tra i vari plug-in vi è anche Papyrus. Papyrus mira a fornire un ambiente integrato e user-consumable per la modifica di ogni tipo di modello EMF e in particolare per sostenere UML e linguaggi di modellazione correlati come SysML. Papyrus fornisce editor di diagrammi per linguaggi di modellazione basati su EMF tra i quali UML 2 e SysML e la possibilità di integrare questi editor (GMF-based o non) con altri strumenti MBD e MDSD. Papyrus offre anche un supporto molto avanzato di profili UML che consente agli utenti di definire editor per DSL33 basate sullo standard UML 2. La caratteristica principale di Papyrus per quanto riguarda quest'ultimo punto è un insieme di potenti meccanismi di personalizzazione che possono essere sfruttate per creare prospettive Papyrus definiti dall'utente e dargli lo stesso aspetto grafico di un editor di DSL puro[5]. La figura 18 mostra l’aspetto dell’ambiente Eclipse-Papyrus. 28 Società leader mondiali nel campo dell’informatica Linguaggi di programmazione utilizzati soprattutto per lo sviluppo web 30 L'interfaccia grafica utente, nota anche come GUI (dall'inglese Graphical User Interface), comunemente abbreviata in interfaccia grafica, è un tipo di interfaccia utente che consente all'utente di interagire con la macchina controllando oggetti grafici convenzionali. 31 Un toolkit grafico è un insieme di strumenti software concepiti per facilitare e uniformare lo sviluppo di interfacce grafiche (GUI) 32 E’ un programma non autonomo che interagisce con un altro programma per ampliarne le funzioni 33 Il Domain-specific language (in sigla DSL) o Linguaggio specifico di Dominio nello sviluppo software e nell'ingegneria di dominio è un linguaggio di programmazione o un linguaggio di specifica dedicato a particolari problemi di un dominio, a una particolare tecnica di rappresentazione e/o a una particolare soluzione tecnica 29 51 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 18: Layout Eclipse-Papyrus Papyrus fornisce inoltre un supporto completo al SysML per consentire model-based system engineering. Esso include un'implementazione del profilo statico SysML e gli editor grafici specifici richiesti per SysML. Consente quindi di poter creare in maniera immediata diagrammi quali: Block Definition Diagram, Internal Block Diagram, Parametric Diagram e Requirements Diagram (definiti nel dettaglio nel capitolo 4). 3.2 IBM Rational Rhapsody Developer Oltre ai programmi Open Source esistono quelli non Open Source, ovvero a pagamento con licenza d’utilizzo. Nel nostro caso è stato utilizzato IBM Rational Rhapsody Developer. IBM Rational Rhapsody offre sviluppo e progettazione collaborativi per Systems Engineers e sviluppatori software, creando software e sistemi integrati o in tempo reale. Questa soluzione consente a sviluppatori e progettisti di analizzare e verificare i requisiti, di progettare rapidamente i prototipi e di fornire applicazioni più coerenti 52 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO utilizzando Systems Modeling Language (SysML) e Unified Modeling Language (UML). La famiglia di prodotti Rational Rhapsody include una serie di versioni incentrate sulle esigenze dei progettisti dei sistemi e degli sviluppatori di software integrati[6] Rational Rhapsody Developer fornisce[7]: Generazione completa delle applicazioni integrate — genera il codice comportamentale per i grafici di stato e le risorse di sviluppo per automatizzare la creazione delle applicazioni. Sviluppo grafico, test basati sui modelli e simulazione — consente di utilizzare l'esecuzione per convalidare in anticipo i progetti. Tracciabilità dei requisiti — memorizza i requisiti negli elementi di progettazione e nei test case per fornire le informazioni di tracciabilità all'interno del modello. Collaborazione dei team — consente ai team di collaborare per gestire la complessità di sviluppo di progetti coerenti in ambienti diversi (operazione non prevista con Eclipse-Papyrus). Supporto dei ciclo di vita e di software aggiuntivi — si integra con gli altri prodotti IBM Rational per lo sviluppo completo del ciclo di vita dei prodotti. Inoltre, è possibile estendere le funzionalità di Rational Rhapsody Developer con software aggiuntivi opzionali. Come detto IBM Rational Rhapsody Developer per C ha al suo interno il profilo FunctionalC. Rhapsody in C offre un ampio set di funzionalità per gli sviluppatori in grado di impiegare tecnologie abilitanti fondamentali in un ambiente naturale, facile da usare. Rhapsody è un ambiente unico ed efficiente per i sistemi, il software e la testabilità. Esso consente di eseguire queste operazioni[8]: Analisi: durante la quale è possibile definire, analizzare e validare i requisiti di sistema. Progettazione: durante il quale è possibile specificare e progettare l'architettura. Implementazione di: durante il quale è possibile generare automaticamente il codice, 53 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO e poi costruire e gestire all'interno del prodotto Rhapsody. Esecuzione dei modelli: durante le quali è possibile animare il modello sull'host34 locale o un obiettivo remoto per eseguire il debug a livello di progettazione all'interno di viste animate. Rhapsody è provvisto di un tool per la generazione automatica di una Test Architecture in grado di testare il progetto in maniera automatica che, agendo sui diagrammi che ne descrivono il comportamento dinamico del sistema definiti dall’utente, genera i casi di test per effettuare valutazioni sulla coverage . Nel nostro caso oltre al profilo standard OO (Object Oriented) è stato utilizzato il profilo FunctionalC specifico per lo sviluppo di sistemi con codice imperativo come il C. Nello specifico il profilo FunctionalC di Rhapsody in C per la codifica C quindi, permette all'utente di modellare funzionalmente un'applicazione utilizzando costrutti familiari come i file, le funzioni, chiamate grafici e diagrammi di flusso. Il profilo FunctionalC per lo sviluppatore C fornendo i seguenti schemi: Build Diagram per mostrare come il software deve essere costruito. Call Graph Diagram grafico per mostrare la relazione delle chiamate di funzione così come il rapporto dei dati. File Diagram per mostrare come i file interagiscono uno con l'altro (in genere come viene creata la struttura #include). Flow Chart per mostrare una funzione o un'operazione di classe e per la generazione di codice. Message Diagram da visualizzare come la funzionalità dei file può interagire tramite messaggistica (chiamate di funzione sincrona o di comunicazione asincrona). Inoltre è anche possibile creare diagrammi di attività, diagrammi di stato, e usare i use case diagram (gli stessi di UML) quando si utilizza il profilo FunctionalC[9]. Nella figura 34 Terminale collegato ad una rete o più in particolare ad Internet. 54 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO seguente (Figura 19) vediamo un tipico layout di Rhapsody Developer per C: Figura 19: Layout IBM Rational Rhapsody Developer per C All’interno del nostro progetto è possibile definire file, funzioni e variabili. Le funzioni poi si dividono in 3 tipi in Rhapsody: Reception, Operation e Trigger Operation. Le Operation sono azioni che svolgono delle operazioni e che vengono invocate tramite chiamata a funzione all’interno del codice; le Trigger Operation sono funzioni che invece vengono attivate da eventi e svolgono al loro interno delle operazioni; Le Reception sono funzioni che servono a catturare gli eventi per poi registrarli e renderli disponibili ad altri. Di notevole importanza è la possibilità comparare i diagrammi forniti dal profilo FuctionalC con quelli UML. Infatti noteremo come tre dei precedenti diagrammi siano simili a quelli definiti dai profili UML. Il File Diagramm non è altro che il Class Diagramm UML per C, dove le classi diventano i file, i metodi diventano le funzioni, le variabili restano tali e le associazioni tra le classi diventano le relazioni di inclusione tra i file. Questa grossa similitudine è resa necessaria in quanto in un profilo FunctionalC sarebbe impossibile creare un Class Diagramm in quanto in C si ragiona per file e non per classi. In questo modo otteniamo un diagramma che possiamo facilmente ricondurre in 55 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO maniera concettuale ad un Class Diagram. In Figura 20 sono mostrati un Class Diagram sulla sinistra e un File Diagram sulla destra: Figura 20: Comparazione tra Class Diagram e File Diagram Stesso discorso vale per il Message Diagram che altro non è che il Sequence Diagram. In questo caso anche i nomi e le convenzioni sono del tutto uguali tra i due. Nella Figura 21 sono mostrati un Sequence Diagram sulla sinistra e un Message Diagram sulla destra: Figura 21: Comparazione tra Sequence Diagram e Message Diagram Il Flow-Chart serve per la descrizione comportamentale delle azioni che devono essere eseguite da una funzione all’atto della sua invocazione. Questo diagramma produce in 56 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO output il codice della funzione. Questo diagramma è molto simile all’Activity Diagram UML ed infatti da questo ne deriva la struttura. Nella Figura 22 vediamo un esempio di comparazione tra un Activity Diagram a sinistra e un Flow Chart Diagram a destra: Figura 22: Comparazione tra Activity Diagram e Flow Chart Diagram Gli altri diagrammi servono per meglio definire il profilo FunctionalC in quanto il Build Diagram serve per definire come le varie componenti di codice devono essere assemblate per costruire l’eseguibile e che tipo di compilatore si deve usare mentre il Call Graph Diagram serve per mostrare la relazione delle chiamate di funzione così come il rapporto dei dati. 57 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Capitolo 4: Caso di studio 4.1 Il sistema TOD Il nostro sistema in esame si basa su un caso di studio fornito dall’azienda AnsaldoBreda. L’architettura di massima presente nel documento SRS[10] è presentata in Figura 23, dove notiamo la presenza dei componenti principali del nostro sistema ovvero: Il Tod Management Agent, la Human Interface Machine e la Diagnostic Base Unit. Figura 23: Architettura del TOD Il sistema in esame si sviluppa sulla piattaforma MDS-ETH (monitor and diagnostic system – ethernet). Essa è responsabile del monitoraggio e della diagnostica di tutti i dispositivi meccanici ed elettronici a bordo treno. Tutti i componenti HW e SW interagiscono tra loro grazie ad una rete ethernet su base TCP/IP. 58 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO TOD – Train Operator Display è l’interfaccia uomo macchina del sistema e consente ai vari utenti di interagire con il sistema diagnostico. E’ costituito da un PC-panel dotato di touch screen ed interfaccia Ethernet. Nel TOD è integrato un sistema di controllo della luminosità dello schermo che consente di adattarla automaticamente in funzione della luce ambientale o in modalità manuale. Nel TOD è integrato un sistema sonoro che consente di emettere beep. I TOD sono posizionati dove è necessario all’interno del veicolo. Le posizioni tipiche sono sui banchi di manovra delle cabine di guida. Altri TOD possono essere utilizzati nella postazione del capotreno o all’interno di armadi per l’uso da parte del personale manutentore. I TOD possono essere di formato diverso, tipicamente da una dimensione minima di 10” fino ad una dimensione di 19”. I TOD vengono riconosciuti ed identificati dal server centrale di diagnostica unicamente in base all’indirizzo IP che viene loro assegnato. DBU – Diagnostic Base Unit costituisce l’unità server del sistema. E’ costituita da un PC per uso ferroviario in formato rack 19” che può essere collocato in un armadio del veicolo. La DBU è dotata di due connessioni Ethernet e di una connessione al bus di veicolo MVB. La DBU raccoglie le informazioni diagnostiche da tutte le centraline dei sottosistemi mediante i bus MVB ed Ethernet. E’ un browser web che presenta l’interfaccia all’utente. Carica pagine HTML dal server ed esegue il codice javascript in esse contenuto. Attraverso il codice javascript il browser interroga continuamente il server DBU per l’aggiornamento dei dati sulla pagina. TODMA – TOD Management Agent è un Applicazione Web server per l’accesso alle funzioni specifiche del TOD. Consente di visualizzare una o più pagine HTML per le seguenti funzioni: 1) Calibrazione touch screen. 2) Impostazione sistema di controllo automatico/manuale della luminosità. 59 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO TODMA implementa comandi che consentono alla DBU di eseguire operazioni sul TOD come: 1) Diagnostica sullo stato del servizio 2) Forzamento accensione/spegnimento illuminazione del monitor 3) Esecuzione beep di sistema 4) Reindirizzamento dei contenuti visualizzati dall’HMI Il TODMA comunica direttamente con la DBU, ossia riceve delle richieste http direttamente dalla DBU. La comunicazione fra DBU e HMI, invece, avviene in maniera indiretta ossia il TODMA reindirizza l’HMI verso la DBU (vedi Figura 23). HMI – Human Machine Interface è l’interfaccia uomo macchina che presenta i dati di diagnostica all’operatore. Richiede pagine HTML al server DBU ed esegue il codice javascript in esse contenuto. Attraverso il codice javascript il browser interroga continuamente il server DBU per l’aggiornamento dei dati sulla pagina. TST – Touch Screen Tuning è una applicazione che consente di tarare il touch screen. Può essere attivata da linea di comando all’interno del terminale del TOD o mediante una chiamata CGI effettuata dal HMI sul TODMA. Quando viene attivata si apre a schermo intero sovrapponendosi allo schermo della HMI che rimane in background. La taratura avviene chiedendo all’utente di premere in vari punti dello schermo. I parametri della taratura sono salvati sul file system del TOD. Alla fine dell’operazione l’applicazione viene chiusa e ritorna visibile lo schermo della HMI. TD – TOD Driver sono delle funzioni di libreria per permettono di utilizzare i driver del TOD. Il TODMA chiama queste funzioni quando riceve un relativo comando dal server DBU. 60 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO 4.2 Requisiti In Tabella 1 sono elencati i requisiti di alto livello riportati nel documento dei requisiti ufficiale del modulo da noi sotto esame, definiti all’interno dell’SRS35 [10]. Tabella 1: Requisiti software del sistema TODMA ID Requisito Testo del requisito HLR_GEN_001 Il modulo TODMA deve essere compilato e collegato staticamente al modulo SW TOD control server che è in esecuzione sul TOD. Il TOD control server deve interagire con il modulo TODD della DBU, i Driver del TOD e l’HMI attraverso esclusivamente il modulo TODMA Il TODMA riceve richieste dal modulo TODD del server DBU e dal modulo HMI tramite URI All’avvio, Il TODMA non deve conoscere l’indirizzo del server DBU Il TODMA deve ricavare l’indirizzo del server DBU da un’apposita richiesta Il TODMA deve tenere una sessione con una sola DBU fin tanto che questa è attiva. Il TODMA considera la DBU attiva se l’intervallo di tempo che intercorre fra due richieste consecutive ricevute dalla DBU è minore o uguale al tempo lifetime. Superato il tempo lifetime la sessione si considera terminata. Il tempo lifetime è fornito dalla DBU quando contatta il TODMA tramite un’apposita richiesta ed è espresso in secondi Il TODMA può avviare una nuova sessione con una nuova DBU se la sessione precedente è stata terminata Ad una richiesta effettuata dal modulo TODD della DBU, il TODMA deve far emettere un beep al TOD Ad una richiesta effettuata dal modulo TODD della DBU, il TODMA deve far accendere e avviare l’ HMI se non è già attiva oppure deve spegnere l’illuminazione del monitor e terminare l’HMI Ad una richiesta effettuata dal modulo TODD della DBU, il TODMA deve fornire una diagnostica sullo stato del servizio Ad una richiesta effettuata dal modulo TODD della DBU, il TODMA deve forzare l’HMI ad una determinata URI HLR_GEN_002 HLR_GEN_003 HLR_SRV_001 HLR_SRV_002 HLR_SRV_003 HLR_SRV_004 HLR_SRV_005 HLR_SRV_006 HLR_SRV_007 HLR_SRV_008 HLR_SRV_009 HLR_SRV_0010 35 Gruppo di appartenenza Requisiti Generali Requisiti Generali Requisiti Generali Servizi forniti dal modulo TODMA Servizi forniti dal modulo TODMA Servizi forniti dal modulo TODMA Servizi forniti dal modulo TODMA Servizi forniti dal modulo TODMA Servizi forniti dal modulo TODMA Servizi forniti dal modulo TODMA Servizi forniti dal modulo TODMA Servizi forniti dal modulo TODMA Servizi forniti dal modulo TODMA Software requirements specification (SRS) è una descrizione completa del comportamento di un sistema da sviluppare. 61 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO HLR_SRV_0011 HLR_SRV_0012 HLR_SRV_0013 HLR_SRV_0014 HLR_SRV_0015 HLR_SRV_0016 HLR_HMI_001 HLR_HMI_002 HLR_HMI_003 HLR_HMI_004 HLR_EST_001 HLR_EST_002 HLR_EST_003 HLR_EST_004 HLR_DRV_001 HLR_DRV_002 Quando richiesto dall’utente tramite interazione manuale con l’HMI, il TODMA deve avviare un processo di taratura del touch screen (TST architettura) Il TODMA può terminare e ripristinare l’esecuzione dell’HMI in qualsiasi istante Il TODMA deve indicare una pagina statica locale all’HMI (vedi HLR_EST_003) Nel caso in cui non vi sia una connessione attiva tra la DBU e il TODMA, Il TODMA deve indicare al modulo HMI una pagina statica locale, contenente il logo AB, da visualizzare IL TODMA deve far visualizzare al modulo HMI l’ultima URI nel caso in cui venga ripristinata la connessione IL TODMA deve segnalare la presenza di un operatore alla DBU nel caso in cui lo schermo fosse spento L’HMI è in esecuzione sul TOD e deve visualizzare pagine HTML provenienti dal modulo TODD della DBU L’HMI visualizza pagine il cui l’indirizzo è fornito dal modulo TODMA del TOD (comunicazione indiretta) L’HMI è dotato di un’estensione browser che gestisce la interazione tra l’HMI e il TODMA L’HMI deve in qualsiasi momento visualizzare il logo AB nel caso in cui venga richiesto dal modulo TODMA L’estensione è un ADD-ON presente sul browser il quale interagisce con il modulo TODMA richiedendo ciclicamente la URI alla quale collegarsi All’avvio del browser verrà indicata dal TODMA una pagina statica da caricare, presente in locale Se all’avvio il TODMA non fornisce alcuna URI verrà visualizzata la pagina statica presente in locale L’estensione deve contattare ciclicamente il TODMA per farsi fornire la URI alla quale collegarsi L'emissione del beep di cui al requisito HLR_SERV_001 deve essere effettuata tramite funzioni di libreria specificate dal fornitore del TOD L’accensione o lo spegnimento del monitor di cui al requisito HLR_SERV_002 deve essere effettuata tramite funzioni di libreria specificate dal fornitore del TOD Servizi forniti dal modulo TODMA Servizi forniti dal modulo TODMA Servizi forniti dal modulo TODMA Servizi forniti dal modulo TODMA Servizi forniti dal modulo TODMA Servizi forniti dal modulo TODMA Funzionalità dell’HMI Funzionalità dell’HMI Funzionalità dell’HMI Funzionalità dell’HMI Estensione HMI Estensione HMI Estensione HMI Estensione HMI Utilizzo dei DRIVER Utilizzo dei DRIVER 4.3 Scelta dei linguaggi e degli strumenti Per lo sviluppo del caso di studio si è scelto di procedere con una modellazione Model62 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Driven con SysML utilizzando Eclipse-Papyrus e IBM Rational Rhapsody Developer. Questa scelta è dovuta principalmente a due motivi: Il primo concettuale, in quanto dovendo realizzare un componente software fortemente legato ai componenti hardware presenti nel sistema questo ha reso necessario una trattazione del problema di tipo ModelDriven con SysML; in secondo luogo perché ad oggi metodologie Model-Driven Based sono ormai mature per essere utilizzate in ambito industriale. Tutto quanto visto in precedenza quindi risulta essere adatto al nostro caso di studio. Per quanto riguarda i programmi e tool utilizzati la scelta è stata fatta in quanto Eclipse-Papyrus permette una migliore e più immediata realizzazione sugli aspetti di modellazione SysML di un componente mentre IBM Rational Rhapsody Developer per C è stato usato in quanto integra in se la generazione del codice C, requisito fondamentale dato che nel nostro caso specifico dobbiamo arrivare alla generazione di un software scritto in tale linguaggio. La scelta di dividere la parte di progettazione e modellazione con un programma e quella di generazione del codice da un’altra è stata fatta in quanto si voleva valutare la possibilità di importare/esportare modelli realizzati con Papyrus in Rhapsody e viceversa. Ad oggi questa cosa non è ancora possibile in quanto i tool a disposizione di Rhapsody per l’importazione di file di tipo XMI o UML2 non sono funzionanti. Questo ovviamente non costituisce un problema in quanto è possibile realizzare tutto con Rhapsody (modellazione SysML e generazione del codice) oppure potremmo trovarci nel caso in cui si deve realizzare solo la modellazione di un sistema e non per forza anche la generazione del codice. 4.4 Analisi: Modellazione SysML 4.4.1 Requirements Diagram Partendo dai requisiti del sistema[10] come prima cosa si sono analizzati i requisiti e le relazioni tra di essi. Il Requirements Diagram (RD) è un ottimo strumento che permette di capire come i requisiti sono organizzati gerarchicamente e relazionati tra loro e come sono allocati nei rispettivi blocchi definiti nel nostro sistema. In riferimento alla tabella 1 63 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO del Capitolo 4 il RD relativo ai gruppi di requisiti HLR (requisiti di alto livello) mostrato in figura 24: Figura 24: RD dei gruppi di requisiti HLR Notiamo come i requisiti di alto livello siano stati tutti divisi in gruppi di requisiti riguardanti cinque aree tematiche principali, ovvero quelli sulla parte generale, quelli sui servizi offerti dal modulo TODMA, quelli riguardanti l’HMI, quelli riguardanti l’Estensione (ADD-ON) ed infine quelli riguardanti i driver del TOD. Nel diagramma in figura 24 vediamo come questi gruppi siano in relazione di decomposizione con quello che può essere definito il macro gruppo dei requisiti di alto livello (relazione di decomposizione definita nel paragrafo 2.3). Vediamo ora come sono in relazione tra di essi i requisiti di ogni gruppo, partendo dai requisiti generali. In figura 25 vediamo il diagramma relativo ai requisiti generali: 64 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 25: RD dei requisiti del gruppo GEN Vediamo subito che dal requisito HLR_GEN_001 deriva il requisito HLR_GEN_002 dal quale deriva il requisito HLR_GEN_003. La relazione di derivazione è definita anche’essa nel paragrafo 4.3 e ci sta ad indicare che un requisito è derivato da un altro in modo tale definire con maggior dettaglio il requisito da cui da cui è derivato. Proseguendo abbiamo in Figura 26 il diagramma dei requisiti dei servizi offerti dal TODMA: Figura 26: RD dei requisiti del gruppo SVR 65 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Come nel caso precedente vediamo che tutti i requisiti compongono il gruppo HLR_SRV e sono tutti derivati dal requisito HLR_GEN_003. Questo sta ad indicarci che all’interno del gruppo di requisiti HLR_SRV tutti i requisiti sono tutti di “pari livello” ovvero non ci sono relazioni di derivazione o di decomposizione tra di essi. Vi è poi il diagramma dei requisiti dell’HMI mostrato in Figura 27: Figura 27: RD dei requisiti del gruppo HMI A differenza del precedente diagramma, vediamo che questo è molto strutturato, in quanto vi sono delle relazioni di derivazione con altri requisiti di gruppi diversi. Tutti i requisiti HLR_HMI compongono il gruppo dei requisiti HMI e il requisito HLR_HMI_001 deriva dal requisito HLR_SRV_005 (freccia tratteggiata), il requisito HLR_HMI_002 e il requisito HLR_HMI_003 derivano dal requisito HLR_GEN_003 ed infine il requisito HLR_HMI_004 deriva dal requisito HLR_SRV_014. Abbiamo poi il diagramma dei requisiti dell’Estensione mostrato in Figura 28: 66 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 28: RD dei requisiti del gruppo EST Anche questo come il precedente è molto strutturato ed infatti tutti i requisiti HLR_EST compongono il HLR_EST_001, gruppo HLR_EST_002 e dei requisiti HLR_EST_004 dell’estensione e i deriva no dal requisiti requisito HLR_HMI_003, mentre il requisito HLR_EST_003 deriva dal requisito HLR_SRV_013. In ultimo vi è il diagramma dei requisiti dei driver del TOD mostrato in Figura 29: 67 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 29: RD dei requisiti del gruppo DRV Anche in questo caso abbiamo un diagramma strutturato ed infatti tutti i requisiti HLR_DRV compongono il gruppo dei requisiti dei driver del TOD e il requisito HLR_DRV_001 è derivato dal requisito HLR_SRV_007 HLR_DRV_002 è derivato dal requisito HLR_SRV_008. mentre il requisito Come visto quindi ogni requisito è in relazioni con gli altri e con essi compongono quelle che sono le specifiche di alto livello del nostro sistema. Il Requirements Diagram è in grado oltre di farci modellare i requisiti come visto in precedenza anche di farci modellare questi in relazione ad componenti del nostro sistema, realizzati in precedenza. 4.4.2 Definition Block Diagram e Internal Block Diagram A questo punto si definisce l’architettura di alto livello tramite i Block Definition Diagram dove vengono definiti i blocchi del sistema, composto dal TOD e dai dispositivi con cui interagisce (DBU – Diagnostic Based Unit, sensori, attuatori). Nella Figura 30 vediamo 68 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO come si modellano questi componenti usando gli stereotipi a nostra disposizione: Figura 30: BDD piattaforma MDSETH Come vediamo i due blocchi sono contenuti all’interno di un package che funge da namespace del nostro progetto. All’interno dei blocchi poi notiamo le varie properties nelle quali sono presenti le definizioni delle flow port in riferimento al flusso di informazione che deve viaggiare tra un componente ed un altro. Infatti notiamo che dalla DBU vi sono i tre flussi in uscite che corrisponderanno rispettivamente alle richieste di emissione di un beep, di accensione o spegnimento della lampada del TOD e del reindirizzamento della pagina attualmente visualizzata dal TOD. Sul TOD invece queste risulteranno delle port in ingresso. Vi è poi il flusso che indica la richiesta di diagnostica, e risulta essere in ingresso/uscita in quanto ad una richiesta vi è sempre una risposta e quindi in entrambi i casi il flusso è in entrambe le direzioni. Vi è poi da notare la relazione di associazione che lega i due blocchi la quale ci indica che ad un DBU possono essere collegati uno o più TOD e questo collegamento avviene su bus (o rete) Ethernet. Andando poi ad analizzare nel dettaglio il blocco del TOD vediamo nella Figura 31 un ingrandimento del blocco e la rappresentazione su di esso dei porti: 69 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 31: TOD Block Da questa vista notiamo una delle proprietà di SysML: si riesce a cogliere, grazie alle porte e al tipo di dato che le attraversa, il senso di flusso di esecuzione e del tipo di informazione che passa attraverso i vari moduli. Procedendo nell’analisi andiamo a vedere come è strutturato il blocco TOD. Esso è composto da una serie di elementi i quali cooperano per svolgere le azioni che il TOD deve compiere. Nella Figura 32 vediamo la composizione del TOD: Figura 32: Componenti del TOD 70 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Notiamo che ogni componente è associato al TOD tramite una relazione di composizione uno a uno che sta ad indicare che il TOD è composto da un elemento denominato PcSpeaker (componente hardware) un elemento denominato LampScreen(componente Hardware) un elemento denominato TODMA (componente Software) un elemento denominato HMI (componente Software) e un elemento denominato TouchScreenController (componente Software). Come possiamo notare i blocchi di cui è composto il TOD possono essere sia hardware sia software. La descrizione tramite flow port dei suoi componenti è descritta nell’IBD del TOD mostrato nella seguente immagine(Figura 33): Figura 33: IBD TOD In questa vista vediamo come interagiscono tra di loro i vari componenti del TOD. In questo modo è possibile stabilire in che modo e quali azioni vengono generate e quali sono le parti in gioco che cooperano per il raggiungimento dell’obiettivo. Alle quattro azioni viste in precedenza, provenienti dall’esterno si notano ora altre tre azioni interne provenienti dall’HMI che sono: La regolazione della luminosità, la richiesta del programma di Touch Screen Calibrator e la richiesta con risposta del reindirizzamento, tutte, comprese quelle esterne, che sono servite dal modulo TODMA il quale costituisce il core del nostro sistema. Il blocco TODMA è quindi responsabile dell’elaborazione delle 71 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO richieste e quindi delle azioni da compiere ed infine delle risposte da fornire qual’ora siano richieste. Vediamo che le richieste di regolazione della luminosità e di accensione o spegnimento della lampada del TOD vanno a confluire nel modulo hardware LampScreen che altro non è che la scheda video del TOD; la richiesta di emissione del beep va a confluire nel modulo hardware PcSpeaker che altro non è che lo speaker presente sulla scheda madre ed infine la richiesta di touch screen calibrator va a confluire nel modulo hardware Touch Screen Controller che altro non è che il monitor del TOD. Oltre a queste richieste il TODMA soddisfa anche le richieste di redirect da parte della DBU la quale non fa altro che indicare una nuova pagina alla quale l’HMI dovrà visualizzare, la richiesta di redirect da parte dell’HMI che altro non è che la richiesta al TODMA, se presente, della pagina fornita in precedenza dalla DBU con risposta affermativa se presente negativa in caso contrario ed infine la richiesta con risposta della diagnostica da parte della DBU al TOD. In questo modo abbiamo definito il comportamento degli elementi interni del TOD. Notiamo da subito che i flussi di informazione provenienti dall’esterno e dall’HMI verso il TODMA sono tutti di tipo string, mentre quelli uscenti dal TODMA ed entranti nei dispositivi hardware sono di tipo bitstring. Questo perché nel primo caso abbiamo segnali di tipo stringhe mentre nel secondo abbiamo segnali di tipo bit che si traducono in comandi hardware. Andiamo ora a vedere la composizione del blocco TODMA rappresentato in Figura 34: Figura 34: BDD TODMA Vediamo come le porte di ingresso e di uscita presenti all’interno del diagramma 72 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO precedente vengono riportate ugualmente ai bordi esterni del blocco TODMA. Andiamo ora a vedere la composizione del blocco TODMA rappresentato in Figura 35: Figura 35: Composizione del TODMA Come si può vedere dalla figura, il bloco TODMA è composto da tre elementi che sono: DriveTod, TodManagementAgent e il TodControlServer. Il blocco DriveTod altro non è che la libreria con cui i componenti hardware vengono controllati, il blocco TodControlServer è un server il quale riceve richieste provenienti dall’esterno del modulo TODMA e la smista alla relativa funzione del modulo TodManagementAgent che ne realizza la logica di funzionamento richiesta. Questi blocchi costituiscono insieme il nostro sistema software e realizzano tutte le operazioni richieste al bloccoTODMA, ed in particolare il modulo TodManagementAgent risulta essere il core vero e proprio del nostro sistema. Come vediamo in Figura 36 l’associazione che unisce il blocco TODMA agli altri è di composizione con cardinalità 1 a 1 e quindi si capisce subito che ogni blocco di cui è composto è istanziato una sola volta. Andiamo ora a visualizzare l’IBD del TODMA e 73 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO quindi come i flussi di informazione viaggiano tra i moduli per realizzare le operazioni mostrato in figura 30: Figura 36: TODMA IBD Come si può vedere da questo diagramma tutte le richieste che giungono dall’esterno vengono gestite dal modulo TodControlServer (TCS) il quale a seconda della specifica richiesta invoca una corrispettiva funzione del modulo TodManagementAgent(TMA) e se necessario questo invoca una corrispettiva funzione del modulo DriverTod(DT). Vediamo ora passo dopo passo ogni singola azione richiesta e il suo flusso all’interno del nostro modulo TODMA: 1. Alla richiesta di emissione di un beep (reqBeepAction) proveniente dall’esterno il modulo TCS invoca la corrispettiva funzione di elaborazione del modulo TMA (reqElaborationBeep) il quale fatte le dovute operazioni invocherà a sua volta la corrispettiva funzione del modulo DT (reqCommandBeep) il quale eseguirà il comando che andrà esternamente al modulo TODMA verso il blocco PcSpeaker che provvederà all’emissione del beep ad una data frequenza e di una determinata durata. 2. Alla richiesta di accensione o spegnimento del monitor del TOD (reqLampOnOffAction) proveniente dall’esterno il modulo TCS invoca la corrispettiva funzione di elaborazione del modulo TMA (reqElaborationLampOnOff) il quale fatte le dovute operazioni invocherà a sua volta la corrispettiva funzione del modulo DT (reqCommandLampOnOff) il quale poi fatte le dovute operazione eseguirà il comando che andrà esternamente al modulo TODMA verso il 74 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO blocco LampScreen per lo spegnimento o l’accensione del monitor del TOD. 3. Alla richiesta di regolazione della luminosità del monitor del TOD (reqBrightnessRegulationAction) proveniente dall’esterno il modulo TCS invoca la corrispettiva funzione di elaborazione del modulo TMA (reqElaborationBrightnessRegulation) il quale fatte le dovute operazioni invocherà a sua volta la corrispettiva funzione del modulo DT (reqCommandBrightnessRegulation) il quale poi fatte le dovute operazione eseguirà il comando che andrà esternamente al modulo TODMA verso il blocco LampScreen per la regolazione della luminosità del monitor del TOD. 4. Alla richiesta di regolazione del Touch Screen del monitor (reqTouchScreenCalibratorAction) proveniente dall’esterno il modulo TCS invoca la corrispettiva funzione di elaborazione del modulo TMA (reqElaborationTouchScreenCalibrator) il quale fatte le dovute operazioni eseguirà il comando che andrà esternamente al modulo TODMA verso il blocco TouchScreenController per la regolazione del Touch Screen del monitor. 5. Alla richiesta di diagnostica del stato del TOD (reqDiagnosticAction) proveniente dall’esterno il modulo TCS invoca la corrispettiva funzione di elaborazione del modulo TMA (reqElaborationDiagnostic) il quale fatte le dovute operazioni restituirà al chiamante le informazioni di diagnostica corrente sullo stato del TOD. 6. Alla richiesta di redirect dell’HMI da parte della DBU (reqSetUriAction) proveniente dall’esterno il modulo TCS invoca la corrispettiva funzione di elaborazione del modulo TMA (reqElaborationRedirectSetUri) il quale farà al suo interno le dovute elaborazioni. 7. Alla richiesta di redirect dell’HMI da parte dell’HMI (reqGetUriAction) proveniente dall’esterno il modulo TCS invoca la corrispettiva funzione di elaborazione del modulo TMA (reqElaborationRedirectGetUri) il quale fatte le dovute operazioni restituirà al chiamante la risposta con la pagina alla quale collegarsi, se presente. Si esamina nel seguito il modulo HMI e quali sono le operazioni che svolge nell’interazione con il modulo TODMA. La Figura 37 mostra il blocco HMI. 75 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 37: HMI BDD Le porte di ingresso e di uscita sono le stesse che sono state definite nel IBD del TOD e che corrispondono ad altrettante porte di ingresso e di uscita nel blocco TODMA. Di particolare interesse è il diagramma di composizione dell’HMI che ci fa capire meglio la sua struttura interna a livello di componenti (Figura 38): Figura 38: Composizione HMI 76 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Dalla Figura 38 vediamo che il blocco HMI è composto da due blocchi: Add-on e ConfigurationPage. L’Add-On non è altro che un componente software presente all’interno dell’HMI il quale è responsabile di effettuare la richiesta di redirect al TODMA e di elaborare la sua risposta mentre il blocco ConfigurationPage è la pagina dalla quale si può richiedere la calibrazione del Touch Screen e la regolazione della luminosità. Notiamo nel diagramma che vi è anche la presenza di un altro elemento, ovvero l’operatore, che nel nostro diagramma è stato modellato come un attore che ha una relazione di tipo uso con il blocco ConfigurationPage. Come visto anche in precedenza, anche il questo caso sia il blocco Add-On che il blocco ConfigurationPage sono in relazione di composizione con il blocco HMI e hanno cardinalità 1. Andiamo a visualizzare ora il IBD del HMI mostrato in Figura 39: Figura 39: HMI IBD Vediamo come avviene all’interno del blocco HMI il flusso di informazione che dall’interno va verso l’esterno e viceversa. Notiamo che il blocco ConfigurationPage è responsabile di inoltrare le richieste di Calibrazione del Touch Screen e di regolazione della Luminosità del monitor del TOD al blocco TODMA mentre il blocco Add-On è 77 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO responsabile dell’inoltro della richiesta di redirect della pagina corrente dell’HMI e di elaborare la risposta proveniente dal blocco TODMA. 4.4.3 Allocazione dei requisiti Vediamo ora come dalla modellazione RD si sia passati all’allocazione dei requisiti e alla loro tracciabilità in relazione ad particolare blocco del nostro sistema che soddisfa li soddisfa. In Figura 40 vediamo come ogni gruppo di requisiti sia in relazione al particolare blocco che ne realizza le funzionalità: Figura 40: Tracciabilità dei requisiti negli artefatti Vediamo infatti come sostanzialmente i blocchi da noi considerati siano cinque ovvero: l’ADD-ON, l’HMI, il drivertod, il todmanagementagent e il todcontrolserver. Questi blocchi definiti in precedenza realizzano tutti i requisiti richiesti e in particolare il blocco ADD-ON soddisfa il gruppo di requisiti HLR_EST, HLR_GEN e HLR_SRV; il blocco 78 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO HMI soddisfa il gruppo di requisiti HLR_EST, HLR_HMI, HLR_GEN e HLR_SRV; il blocco drivertod soddisfa il gruppo di requisiti HLR_DRV, HLR_GEN e HLR_SRV; il blocco todmanagementagent soddisfa il gruppo di requisiti HLR_EST, HLR_HMI, HLR_GEN e HLR_SRV; il blocco todcontrolserver soddisfa il gruppo di requisiti HLR_EST, HLR_HMI, HLR_GEN e HLR_SRV. Vista così la cosa appare ancora molto confusa in quanto non vi è la possibilità di dire un blocco quale requisito soddisfa rispetto allo specifico requisito e non al gruppo di requisiti. Infatti si è proceduto a realizzare altri cinque diagrammi, ognuno per ogni modulo in questione i quali mostrassero la reale relazione tra un blocco e un requisito. Questo passaggio è necessario e fondamentale per il tracciamento dei requisiti all’interno del nostro sistema in quanto solo in questo modo possiamo capire quale requisito ogni modulo deve realizzare e come questo poi viene mappato all’interno del nostro codice che andremo a generare. Nelle Figure 41-42-43-4445 sono mostrati i RD relativi ai blocchi todmanagementagent, todcontrolserver, hmi , add-on e drivetod e i requisiti che stanno in relazione con loro tramite l’associazione di satisfy: Figura 41: Allocazione dei requisiti rispetto al blocco Tod Management Agent 79 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 42: Allocazione dei requisiti rispetto al blocco Tod Control Server Figura 43: Allocazione dei requisiti rispetto al blocco HMI 80 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 44: Allocazione dei requisiti rispetto al blocco Add-On Figura 45: Allocazione dei requisiti rispetto al blocco driver Tod 81 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Oltre a questo tipo di vista sarebbe stato anche possibile creare un altro tipo di diagramma questa volta sfruttando i diagrammi già elaborati in precedenza, aggiungendo manualmente i link relativi alle relazioni che ogni requisito ha con i blocchi e con gli altri requisiti. Come vediamo nelle Figure 46 e 47 relativi ai diagrammi mostrati in precedenza nelle Figure 24e 25 questa può essere realizzata in maniera più rapida e immediata: Figura 46: RD dei gruppi di requisiti con vista delle relazioni Figura 47: RD dei requisiti del gruppo GEN con vista delle relazioni 82 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Ovviamente questo secondo modo di procedere notiamo subito che è molto più indicato se vogliamo osservare un diagramma composto da pochi requisiti. Già ad esempio un diagramma composto da 16 requisiti come quello in figura 36 poco si presta a rappresentazioni di questo tipo. 4.5 Realizzazione con Rhapsody 4.5.1 Sviluppo con profilo FunctionalC Una volta definito il modello e le parti di cui è composto si passa alla realizzazione con il programma IBM Rational Rhapsody Developer per C con il functionalC (descritto nel paragrafo 3.2) e tramite esso abbiamo definito da prima definito il suo file diagram per la parte statica, successivamente gli state chart per la parte dinamica ed infine abbiamo generato il codice, poi abbiamo visto i vari flussi di esecuzione tramite i message diagram ed infine con il tool di animazione abbiamo simulato diversi casi reali di funzionamento. Come prima cosa andiamo a vedere come è stato modellato il File Diagram all’interno del nostro ambiente e quali sono le varie relazioni tra i file che lo compongono. In Figura 48 è mostrato il File Diagram del TODMA: 83 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 48: File Diagram TODMA Nel diagramma precedente vediamo come ogni blocco interno del nostro TODMA descritto precedentemente (paragrafo 4.4.2) nel nostro sistema corrisponda ad un file .c il quale avrà un suo corrispettivo file .h (non mostrato nel File Diagram). Quindi il TodManagementAgent, il TodControlServer e todLib (precedentemente chiamato driverTod) sono a tutti gli effetti dei file con al loro interno delle funzioni e delle variabili. Notiamo come vengono mappati i flussi di informazione (flow port di ogni blocco definiti nel paragrafo 4.4.2) con le corrispettive funzioni che li realizzano. Notiamo che all’interno di ogni file sono presenti vari elementi: Le funzioni, le variabili e gli eventi. Le funzione sono collegate ai porti di ingresso di ogni blocco definito nella Figura 30, infatti abbiamo che per il TodControlServer si hanno 7 funzioni relative a reqBeepAction, reqBrightnessRegulationAction, reqDiagnosticAction, reqGetUriAction, reqSetUriAction, reqTouchScreenCalibratorAction e reqLampOnOffAction e che hanno lo stesso nome, così come per il TodManagementAgent reqAndRespElaborationDiagnostic, si hanno 7 funzioni relative a reqAndRespElaborationRedirectGetUri, 84 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO reqElaborationRedirectSetUri, reqElaborationBeep, reqElaborationLampOnOff, reqElaborationTouchScreenCalibrator e che hanno lo stesso nome ed infine per il TodLib si hanno 3 funzioni relative a reqCommandBeep, reqCommandLampOnOff e reqCommandBrightnessRegulation che hanno lo stesso nome, in questo modo verranno mappate le funzioni in relazione alle flow port presenti nei diagrammi DBB e IBD e ad ogni funzione poi verrà associato il requisito o i requisiti che esso soddisfa presenti nei diagrammi RD. Tutto questo serve a mostrare che vi è una diretta corrispondenza tra quanto modellato con SysML e quanto poi realizzato a valle. Vi è la presenza di un altro tipo di elementi: gli eventi. Questi non sono costrutti specifici del nostro modulo ma ci servono per descrivere la parte dinamica del nostro modello, ovvero rappresentano tutto l’insieme dei possibili eventi esterni che possono avvenire e che ai quali sono associate delle azioni da compiere. Come definito nel paragrafo 3.2 sappiamo che vi sono vari tipi di funzione: nel nostro caso le funzioni del todControlServer sono di tipo operazionale mentre quelle del todManagementAgent di tipo trigger operation, questo perché sul todControlServer agiranno degli eventi (esterni) i quali richiameranno le operazioni del file che a loro volta faranno scattare le trigger operation relative al modulo todManagementAgent che poi eseguiranno le azioni vere e proprie. Tutto questo server a rendere l’idea che il modulo todControlServer fa da server del nostro sistema e quindi riceve ed elabora le richieste che gli arrivano mentre il todManagementAgent fa da manager del sistema in quanto una volta elaborate le richieste attivano le corrispettive funzioni che poi realizzeranno l’elaborazione vera e propria e se richiesto una chiamata a funzione esterna al modulo. Altra cosa che notiamo sono le relazioni di inclusione tra i file nel quale si evince che il todManagementAgent include i file H del todLib e del todControlServer in questo modo riusciamo a descrivere a pieno il nostro sistema. Una volta modellata la parte statica del nostro sistema andiamo a realizzare la parte dinamica. Come detto in precedenza le due parti attive all’interno del nostro sistema sono: 85 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO il todControlServer e il todManagementAgent. Per ognuno di questi file quindi si è provveduto a realizzare uno state chart che ne descrivesse il comportamento dinamico (Figura 49 e figura 50): Figura 49: State Chart todControlServer con FunctionalC Figura 50: State Chart todManagementAgent con FunctionalC Nei due diagrammi in figura precedente vediamo una certa somiglianza: questo è dovuto al fatto che entrambi i moduli considerati sono stati progettati con quasi le stesse caratteristiche a livello di porte (Figura 30) e questo ci viene riportato pari anche nel 86 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO modello dinamico. Quindi il numero degli stati è lo stesso e anche il numero delle transizioni a meno di un ciclo di loop presente sullo stato work in Figura 50 che spiegheremo a breve. Il nostro sistema così modellato parte con un evento evStrart sul todManagementAgent che richiamerà la funzione di init del modulo e scatenerà il trigged operation startTodControlServer sul todControlServer che farà avviare anche questo modulo. I moduli si troveranno nello stato di wait(todControlServer) e nello stato di work(todManagementAgent) fin quando uno degli eventi esterni agirà sul todControlServer, oppure l’evento interno evWorkEnd agirà sul todManagementAgent terminando il modulo e scatenando la trigger operation sul modulotodControlServer la quale anche essa terminerà il modulo. Gli eventi esterni che possono agire sul nostro sistema sono: evReqBeep, evReqLampOnOff, evReqDiagnostic, evReqSetUri, evReqTouchScreenCalibrator, evReqBrightness. Tutti evReqGetUri. questi eventi agiscono direttamente sul modulo todControlServer. Vi è poi un timer associato alla transizione che genera un ciclo di loop sullo stato work del todManagementAgent: questo è stato inserito per rispecchiare i requisito HLR_SRV_003 presente nella tabella 1 che ci dice che soltanto un agente esterno (in questo caso la DBU) alla volta può interagire con il nostro sistema. Questo viene fatto attraverso un parametro identificativo che viene passato dagli eventi che vengono generati sul sistema che caratterizza in maniera univoca l’interlocutore. Una volta memorizzato questo parametro qualsiasi richiesta proveniente dall’esterno del TOD, se proveniente da un altro interlocutore viene rifiutata altrimenti viene accettata. Detto ciò il nostro ciclo di loop, tramite un timer, libera la variabile nel caso in cui dal’ultima richiesta sia passato un tempo limite definito come lifetime (tabella 1). Per meglio definire il flusso di esecuzione e i vari componenti in gioco, all’interno del nostro sistema si definiscono i message diagram relativi ad ogni evento esterno possibile sul sistema. Mostriamo in figura 51 il message diagram dell’evento evReqBeep: 87 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 51: Message Diagram Beep Notiamo come Rhapsody prima di evolvere tra i vari stati istanzi i tre oggetti (file) da noi modellati. Notiamo come una volta istanziati gli oggetti gli state chart di entrambi abbiano una transizione di defalut che li porterà nello stato di ready. Il flusso di esecuzione sparte con l’evento interno evStart(descritto in precedenza) che avvia i moduli todControlServer(TCS) e todManagementAgent(TMA). L’evento esterno evReqBeep con i parametri di tempo frequenza e ip(identificativo dell’interlocutore) vengono mandati al 88 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO TCS il quale elaborerà la richiesta e la invierà alla rispettiva funzione del TMA. A questo punto il TMA invocherà la funzione di libreria che ci permetterà poi di pilotare l’hardware per l’emissione del beep con i parametri di tempo e frequenza. Una volta finito il flusso di esecuzione il TCS ritornerà nello stato di wait mentre il TMA nello stato di work. In Figura 52 è presente il message diagram dell’evento evReqLampOnOff: Figura 52: Message Diagram LampOnOff Il flusso di esecuzione parte con l’evento interno evStart che avvia i moduli TCS e TMA. 89 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO L’evento esterno evReqLampOnOff con i parametri di lamp(monitor acceso spento) e ip(identificativo dell’interlocutore) vengono mandati al TCS il quale elaborerà la richiesta e la invierà alla rispettiva funzione del TMA. A questo punto il TMA invocherà la funzione di libreria che ci permetterà poi di pilotare l’hardware del monitor per accendere o spegnere lo schermo. Una volta finito il flusso di esecuzione il TCS ritornerà nello stato di wait mentre il TMA nello stato di work. In figura 53 è presente il message diagram dell’evento evReqDiagnostic: Figura 53: Message Diagram Diagnostic 90 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Il flusso di esecuzione parte con l’evento interno evStart che avvia i moduli TCS e TMA. L’evento esterno evReqDiagnostic con il parametro ip(identificativo dell’interlocutore) vengono mandati al TCS il quale elaborerà la richiesta e la invierà alla rispettiva funzione del TMA. A questo punto il TMA elaborerà la richiesta e fornirà in uscita la diagnostica sullo stato delle variabili locali. Una volta finito il flusso di esecuzione il TCS ritornerà nello stato di wait mentre il TMA nello stato di work. In figura 54 è presente il message diagram dell’evento evReqSetUri: Figura 54: Message Diagram Set Uri 91 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Il flusso di esecuzione parte con l’evento interno evStart che avvia i moduli TCS e TMA. L’evento esterno evReqSetUri con i parametri uri(valore della uri da impostare) e ip(identificativo dell’interlocutore) vengono mandati al TCS il quale elaborerà la richiesta e la invierà alla rispettiva funzione del TMA. A questo punto il TMA elaborerà la richiesta e imposterà la variabile lasturisetValue al valore contenuto in uri . Una volta finito il flusso di esecuzione il TCS ritornerà nello stato di wait mentre il TMA nello stato di work. In figura 55 è presente il message diagram dell’evento evReqGetUri: Figura 55: Message Diagram Get Uri 92 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Il flusso di esecuzione parte con l’evento interno evStart che avvia i moduli TCS e TMA. L’evento esterno evReqGetUri viene mandato al TCS il quale elaborerà la richiesta e la invierà alla rispettiva funzione del TMA. A questo punto il TMA elaborerà la richiesta e fornirà in uscita il contenuto della variabile lasturisetValue . Una volta finito il flusso di esecuzione il TCS ritornerà nello stato di wait mentre il TMA nello stato di work. In figura 56 è presente il message diagram dell’evento evReqTouchScreenCalibrator: Figura 56: Message Diagram Touch Screen Calibrator 93 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Il flusso di esecuzione parte con l’evento interno evStart che avvia i moduli TCS e TMA. L’evento esterno evReqTouchScreenCalibrator viene mandato al TCS il quale elaborerà la richiesta e la invierà alla rispettiva funzione del TMA. A questo punto il TMA elaborerà la richiesta e avvierà il relativo programma di Touch Screen Tunning . Una volta finito il flusso di esecuzione il TCS ritornerà nello stato di wait mentre il TMA nello stato di work. In figura 57 è presente il message diagram dell’evento evReqBrightnessRegulation: Figura 57: Message Diagram Brightness Regulation 94 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Il flusso di esecuzione parte con l’evento interno evStart che avvia i moduli TCS e TMA. L’evento esterno evReqBrightnessRegulation con il parametro lum(luminosità) vengono mandati al TCS il quale elaborerà la richiesta e la invierà alla rispettiva funzione del TMA. A questo punto il TMA invocherà la funzione di libreria che ci permetterà poi di pilotare l’hardware del monitor per la regolazione della luminosità della lampada dello schermo. Una volta finito il flusso di esecuzione il TCS ritornerà nello stato di wait mentre il TMA nello stato di work. Nella realtà dei fatti i diagrammi di stato visti singolarmente danno luogo ad un unico flusso di esecuzione in cui c’è un solo “start” dei modulo (es. TMA). 4.5.2 Generazione del codice e simulazione della parte dinamica Per la generazione del codice, una volta settato il build file in maniera appropriata, con il tasto generate and make, si genera il codice e si costruisce l’eseguibile. Valutando il codice generato, vediamo che sono stati prodotti 20 file nella cartella di cui 5 sono i sorgenti con i rispettivi file .C .H e .obj, un makefile, un file di configurazione d’ambiente di Rhapsody, un Incremental Linker File, un Program File Database e l’applicativo finale. Le righe di codice C generate in totale sono 2304. Una volta generato il codice è possibile arrivare la simulazione modello mettendo in esecuzione l’eseguibile creato dal make. Grazie ai tool di animazione di Rhapsody possiamo effettuare una simulazione guidata generando una serie di eventi e vedendo il loro output finale a video. Nell’esempio mostrato in figura 58 vediamo come sia stato possibile simulare la richiesta e la successiva risposta a video di emissione di un beep di una certa durata ad una certa frequenza: 95 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 58: Esempio di simulazione dello State Chart con richiesta di beep Notiamo nella figura seguente che sono state stampate a video le scritte contenenti i valori impostati per la simulazione. Questo è stato possibile in quanto Rhapsody ci da la possibilità di definire manualmente il codice all’interno delle funzioni. Ovviamente essendo questo un prototipo, la nostra simulazione si ferma con la realizzazione di una stampa a video della risposta alla richiesta, ma volendo industrializzare il software basterebbe riempire le funzioni al loro interno con i costrutti necessari affinché si possano eseguire realmente le dovute operazioni. Nel nostro caso però, utilizzando la funzione di sistema Beep(frequenza,tempo), siamo riusciti realmente a simulare l’emissione di un beep. In altri casi come ad esempio la richiesta di calibrazione del touch screen o lo spegnimento o accensione dello schermo, questo si è tradotto solamente in una stampa a video come mostrato in figura 59 e figura 60: 96 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 59: Esempio di simulazione dello State Chart con richiesta di Touch Screen Calibrator Figura 60: Esempio di simulazione dello State Chart con richiesta di Lamp On/Off Notiamo infine nelle simulazioni che vengono rispettati sia i criteri per garantire un’unica connessione tra il TODMA e l’esterno sia che dopo un tempo lifetime questa connessione in assenza di richieste venga rilasciata. Nella figura 61 e figura 62 vediamo le simulazioni 97 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO di questi stati di errore: Figura 61: Simulazione di situazione di errore in una richiesta Figura 62: Simulazione di situazione di scadenza del lifetime di una richiesta 98 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Il profilo FunctionalC di Rhapsody ci permette si una buona descrizione del nostro progetto generando codice C ma non ci permette di definire in maniera automatica una Test Architecture per effettuare i test sul nostro componente, a meno che non si voglia definire l’architettura manualmente, cosa che richiederebbe troppo tempo. Si vede quindi che oltre alla limitazione dei diagrammi che si possono utilizzare vi è anche quest’altra limitazione che ne fa del profilo FunctionalC non il miglior metodo per approcciarci a questo tipo di progettazione. Ovviamente, com’è in questo caso, se dobbiamo produrre codice C impostato con uno stile di programmazione imperativa, ad oggi utilizzando Rhapsody è l’unico modo, ma svincolandoci da questo requisito esistono altri modi per poter realizzare questo applicativo. 4.5.3 Sviluppo con modello a Oggetti Un’alternativa all’approccio visto fin’ora è quello di modellare il nostro sistema non utilizzando il profilo FunctionalC ma un profilo Object-based così da generare codice C a oggetti. Questa soluzione ci viene comoda rispetto alla precedente in quanto potendo sfruttare tutte le caratteristiche dell’UML a differenza del FunctionalC che è molto limitato, questo ci permette di poter meglio descrivere il nostro sistema e sfruttare a pieno le funzionalità offerte da Rhapsody. In questa versione vediamo il Class Diagram relativo al nostro sistema (Figura 63): Figura 63: Class Diagramm del TODMA 99 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Vediamo come a differenza del file diagram in Figura 48 qui sia possibile modellare le interfacce offerte e le interfacce richieste per ogni classe. All’interno di ogni iterfaccia poi abbiamo definito le operazioni che vengono offerte o che sono richieste dall’esterno. Questo ci rende molto di più l’idea di port in ingresso e port in uscita presenti nel diagramma IBD in Figura 30. Le relazioni poi tra le classi sono delle semplici associazioni e notiamo anche la presenza delle interfacce nel nostro diagramma. Questo ci consente di capire meglio intuitivamente cosa stiamo andando a fare e dove soprattutto. Il TODMA è modellato come una classe al cui interno vi sono le istanze delle classi TodManagementAgent, TodControlServer e TodLib. All’interno delle classi TODControlServer, TODMannagmentAgent e TodLib abbiamo poi gli stessi state chart presenti in Figure 49 e 50 con le stesse funzionalità. Vediamo poi la presenza in questo diagramma degli attori esteri: infatti in questo modo possiamo descrivere con quali oggetti le nostre interfacce parlano e nel nostro caso quindi abbiamo la DBU, il programma di Calibrazione del Touch Screen e le periferiche Hardware del PcSpeaker e del Monitor. Il nostro progetto diventa quindi più leggibile e più comprensibile e in Figura 64 vediamo l’Object Model Diagram con gli oggetti istanziati. Si nota come il componente TODMA parli attraverso le interfacce con le istanze degli attori esterni Peripherals, DBU e TouchScreen. Figura 64: Object Model Diagram del TODMA Come detto le funzioni sono le stesse ed anche il flusso di esecuzione, per ovvi motivi, deve essere lo stesso. In Figure 65 e 66 vediamo gli State Chart del TodControlServer e 100 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO TodManagementAgent che ne descrivono il comportamento dinamico. Sono del tutto identici agli State Chart in Figure 59 e 60 tranne che per quanto riguarda lo State Chart del TodControlServer che a differenza del precedente non è stato modellato con gli stati ma con i messaggi. Questo perché invece di andare a definire le operazioni da compiere all’interno delle transizioni del nostro grafico si è utilizzato l’oggetto “send action” all’interno di Rhapsody che rappresenta in corrispondenza di un evento l’invio di un messaggio “evento” ad un altro State Chart con la possibilità di inviare dei paramentri. Questo rende meglio l’idea handler associata al concetto di server che dato un evento esterno smista l’elaborazione della richiesta ad un apposito gestore. Figura 65: State Chart TodControlServer Object Based 101 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 66: State Chart TodManagementAgent Object Based A questo punto una volta definita la descrizione completa del nostro componente e definite la parti sviluppate manualmente dal programmatore che in questo caso risultano avere gli stessi costrutti del caso precedente sviluppato in FunctionalC passiamo alla simulazione dei nostri State Chart e alla verifica del corretto funzionamento. Vediamo che rispetto al caso precedente, sono stati prodotti ben 73 file nella cartella di cui 66 sono i sorgenti con i rispettivi file .C .H e .obj che rappresentano tutti gli oggetti, le classi, le interfacce e le istanze del nostro progetto, un makefile, un file di configurazione d’ambiente di Rhapsody, un Incremental Linker File, un Program File Database e l’applicativo finale. Le righe di codice C generate in totale sono all’incirca 8000. Risulta evidente che nel modellare meglio il nostro progetto ne paghiamo in termini di quantità di file e linee di codice prodotte. Ultimo passo dovrebbe poi essere quello di realizzare grazie ai tool di Rhapsody una Test Architecture per la generazione automatica di casi di test (tramite l’ATG di Rhapsody) per valutarne la coverage. Purtroppo con un modello C Object Based non è possibile realizzare questa operazione automaticamente con l’ATG. Si è reso quindi necessari ala traduzione del nostro progetto in C++. Questa operazione può essere realizzata 102 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO automaticamente dal tool di traduzione di Rhapsody. Ovviamente non tutto il codice viene tradotto automaticamente: quello definito dall’utente deve essere modificato manualmente. Ad esempio al puntatore "mesi sostituisce il puntatore implicito "this", all'underscore per separare i namespace si sostituisce l'operatore di risoluzione (es.: TodLib_function => TodLib::function). Una volta tradotto il progetto e trasformato in C++ è possibile generare la Test Architecture automaticamente direttamente sul nostro componente TODMA come vediamo in Figura 67 Figura 67: Test Architecture TODMA Come vediamo dalla figura si ha all’interno del nostro TestContext il SUT il quale tramite gli interlocutori con il sistema che sono la DBU, le Periphericals e il TouchScreen effettuerà tramite l’Automatic Test Generator (ATG) il test di coverage degli elementi di cui si vuole effettuare la verifica. Una volta poi definisti i diagrammi di sequenza (uguali ai message diagram visti nel sottoparagrafo precedente) che ne descrivono il comportamento e i messaggi da scambiare tra i vari componenti si può passare alla simulazione tramite l’ATG. In Figura 68 è mostrato un esempio di simulazione. 103 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Figura 68: Automatic Test Generetor (ATG) Vediamo che rispetto al caso precedente, sono stati prodotti 70 file nella cartella di cui 63 sono i sorgenti con i rispettivi file .C .H e .obj che rappresentano tutti gli oggetti, le classi, le interfacce e le istanze del nostro progetto, un makefile, un file di configurazione d’ambiente di Rhapsody, un Incremental Linker File, un Program File Database e l’applicativo finale. Le righe di codice C generate in totale sono all’incirca 8000. Vediamo che nel modello C++ vi è poca differenza rispetto al modello OO in quanto a file prodotti e a linee di codice generate. Questo risulta essere in accordo a quanto ci si aspetta in quanto restano 2 stili di programmazione simili e quindi il prodotto finale ci si aspetta sia simile in qualche modo alla metrica da noi considerata. In questo modo molto semplice ed immediato si può definire un componente utilizzando un approccio Object Based e sfruttando a pieno le potenzialità dello strumento Rhapsody. Come vantaggio oltre ad avere la possibilità di utilizzare l’UML vi è anche la possibilità rispetto al profilo FunctionalC di poter creare un test Architetture del componente che ci da la possibilità di testare in maniera automatica il componente e validarlo senza grosso dispendio di energia e risorse mentre per contro abbiamo che se voglio sviluppare in C in 104 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO maniera classica devo usare per forza il profilo FuncitionalC. Questa è un alternativa alla progettazione vista prima. Ce ne potrebbero essere molte altre che sfruttano la programmazione ad oggetti che sicuramente hanno un livello di astrazione ancora più ampio. 105 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Conclusioni In questo lavoro di tesi sono stati trattati gli argomenti di Model Driven Architecture con particolare attenzione allo standard SysML. Abbiamo visto qual è lo stato dell’arte di queste metodologie e quali sono oggi gli strumenti a supporto. Abbiamo poi applicato ad un caso reale le tematiche trattate e si è visto come sia possibile sviluppare e modellare in un contest aziendale tali tecniche. Si è giunti quindi alla realizzazione dei diagrammi del nostro sistema e quindi alla fase finale di generazione del codice. Di seguito viene riportata una tabella riepilogativa che elenca i vantaggi e gli svantaggi di questo tipo di approccio. Tabella 2: Vantaggi e Svantaggi Vantaggi Migliore tracciabilità dei requisiti Maggiore livello di integrazione tra le varie fasi di progettazione Early Verification in fase di simulazione Migliore efficienza ed efficacia totale Svantaggi Codice generato automaticamente potrebbe non rispettare le Policy aziendali Maggiore tempo di startup iniziale per l’apprendimento di nuove tecnologie Vincolati al tipo di prodotto utilizzato Licenze non open source costose Come possiamo notare in questa tabella sono elencati tutta una serie di pro e contro i quali sono stati valutati. Andando a vedere i vantaggi notiamo che sicuramente vi è una migliore tracciabilità dei requisiti in quanto adottando lo standard SysML e generando poi I relative 106 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO codice partendo dai diagrammi, riusciamo a mantenere traccia di ogni singolo requisite dalla sua scrittura fino alla sua implementazione come funzione di un file c o come metodo di una classe; vi è poi un maggiore livello di integrazione tra le varie fasi questo deriva dalla definizione stessa di Model Driven ovvero ogni fasi di progettazione e realizzazione e collegata alla precedente e alla successive e questo facilita sicuramente la cooperazione tra gli sviluppatori ma sopratutto riesce a facilitare il lavoro di tracciabilità di tutto il ciclo di sviluppo del software; vi è poi una migliore e più rapida verifica di quanto sviluppato attraverso le simulazioni del progetto, infatti potendo testare rapidamente il comportamento ci si rende subito conto se vi sono errori di modellazione e/o progettazione oppure no; infine si una maggiore efficienza ed efficacia totale è dovuta alla maggiore consapevolezza che ogni sviluppatore in questo senso ha del progetto ed ad una maggiore chiarezza di intervento nel caso in cui di debba andare ad operare ad un livello specifico di sviluppo e dato che utilizzando questo modo di procedure si è quasi costretti ad intervenire sui diagrammi e no sul codice si ha anche una minore probabilità di errore. Oltre ai vantaggi andiamo a considerare quelli che sono gli svantaggi di tale approccio: Un problema che potrebbe sorgere è quello di avere la necessità di individuare punto per punto tutte le linee di codice prodotto dal programma di sviluppo: questo può creare qualche difficoltà, in base al tipo di prodotto utilizzato, in quanto il codice generato automaticamente potrebbe non corrispondere alle specifiche di Policy di scrittura del codice d’azienda che lo utilizza; altro punto dolente è sicuramente la fase di apprendimento da parte degli sviluppatori di nuovi tool o tecnologie la quale richiederà da parte di un azienda un costo iniziali in termini di denaro e di tempo maggiore; altro punto dolente è il vincolo di utilizzare un software specifico per lo sviluppo, infatti sappiamo che l’utilizzo di un programma piuttosto che un altro in quanto a seconda del programma utilizzato vi possono essere delle limitazioni in termini di servizi offerti (vedi ad esempio l’importazione di file XMI in Rhapsody cap 4.4.3) oppure potrebbero avere dei costrutti interni che non possono essere utilizzati (vedi ad esempio il flow chart in Rhapsody cap 107 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO 4.4.3); infine c’è da tener conto dei costi delle licenze per I programmi non open source che sicuramente vanno ad incidere molto sulla valutazione finale da parte di un azienda. 108 PROGETTAZIONE DEL SOFTWARE DI UN SISTEMA EMBEDDED CRITICO Sviluppi Futuri I Possibili sviluppi futuri a questo lavoro di tesi sono qui elencati: Valutare lo svolgimento di un progetto simile utilizzando ambienti di sviluppo differenti come ad esempio Matlab. Valutare lo svolgimento dello stesso progetto da parte di due sviluppatori con lo stesso background conoscitivo, uno che utilizza l’approccio visto in questa tesi, un altro che utilizza un approccio classico, ovvero programmando “a mano”, per capire quali possono essere i vantaggi in termini di tempo e risorse di questo approccio. Ampliare l’analisi effettuata inserendo maggiori dettagli sull’implementazione fisica del componente, come ad esempio definire nello specifico le reali funzioni che l’applicativo deve effettuare linkando tutte le librerie che servono, integrandolo all’interno del contesto in cui dovrà poi essere utilizzato ed infine testarlo accuratamente, così da fornire non un prototipo ma un prodotto finito. Proporre uno sviluppo di tipo Object Based piuttosto che imperativo come impostazione di progetto per sfruttare a pieno tutte le potenzialità UML e avere la possibilità di costruire un Test Architecture per il test automatico del componente. 109 Bibliografia [1] Alan W. Brown, Jim Conallen, and Dave Tropeano, Introduction: Models, Modeling, and Model-Driven Architecture (MDA), Springen, 2005. [2] Frank Truyen, The Fast Guide to Model Driven Architecture, The Basics of Model Driven Architecture (MDA), Cephas Consulting Corp, January 2006. [3] Mark Utting and Bruno Legeard, Pratical Model-Based Testing (MBT) a tools approach, Elsevier, 2007. [4] John D. Poole, Model-Driven Architecture: Vision, Standards And Emerging Technologies, Position Paper Submitted to ECOOP 2001 - Workshop on Metamodeling and Adaptive Object Models, Hyperion Solutions Corporation, Aprile 2001. [5] eclipse.org, http://www.eclipse.org/papyrus, acceduto il 14 settembre 2014. [6] ibm.com, http://www-03.ibm.com/software/products/it/ratirhapfami/, acceduto il 14 settembre 2014. [7] ibm.com, http://www-03.ibm.com/software/products/it/ratirhap, acceduto il 14 settembre 2014. [8] IBM, Rhapsody Tutorial C, Telelogic, 2008. [9] IBM, Rhapsody User Guide, Telelogic, 2008. [10] Francesco Pascale, Domenico Di Leo, Stefano Russo, Specifica dei Requisiti Software del modulo TODMA, Critiware s.r.l. per AnsaldboBreda s.p.a. , 2014. [11] http://www.sysmlforum.com, http://www.sysmlforum.com/sysml-faq, acceduto il 3 Settembre 2014. [12] Lenny Delligatti, SysML Distilled, Addison-Wesley, November 2013. 110 Ringraziamenti I Miei più vivi ringraziamenti vanno al Chiarissimo professore Stefano Russo al quale devo il merito di avermi portato a conseguire questo mio secondo importante traguardo. Ringrazio altresì l’Ingegnere Domenico Di Leo e l’Ingegnere Bruno Busco i quali si sono dimostrati sempre molto disponibili e professionali durante tutto il periodo della tesi. Un ringraziamento va anche a tutti i Docenti, i Ricercatori, i Collaboratori e i Tesisti del Laboratorio MOBILAB del Dipartimento di Ingegneria Elettrica e Tecnologie dell’Informazione dell’Università degli Studi di Napoli “Federico II” che mi hanno ospitato durante il periodo del mio lavoro. In particolare vorrei ringraziare l’Ingegnere Fabio Scippacercola, il quale mi ha dato una grossa mano in un momento critico del mio percorso di tesi. Vorrei ringraziare la mia famiglia che mi è sempre stata vicina in questi anni universitari. Ai miei genitori non posso fare altro che dedicare tutto ciò che ho fatto, perché solo grazie a loro che oggi mi trovo qui. A mia sorella Maria Grazia va tutto il mio entusiasmo e la mia determinazione affinché riesca anche lei a raggiungere i suoi obiettivi. A mia sorella Valeria, ad Amilcare ed al piccolo Luca, a mia Nonna, a mia Zia Pia, a mio Zio Cosimo e a Lucia vanno tutti i miei più sentiti ringraziamenti per avermi supportato e sopportato. A mio Cugino Marco, a mia Zia Anna e alle mie cugine ed a tutti i miei zii e 111 cugini, grazie, siete la mia famiglia. Alla mia ragazza, Enrica, ringraziarti solamente sarebbe poco. Mi hai aiutato forse nel momento peggiore di questo mio percorso, ed oggi se mi ritrovo qui è anche grazie a te. Grazie di cuore. Ringrazio i miei amici di corso, Emanuele, Mario e Claudio, con i quali ho condiviso gioie e dolori. Ringrazio l’Associazione ASSI (Associazione degli Studenti d’Ingegneria) dell’Università degli Studi di Napoli “Federico II” per gli splendidi anni passati insieme. Infine vorrei ringraziare tutte quelle persone, amici e conoscenti, i quali pur non avendo influito direttamente nel mio percorso di studi, sono stati per me di grande aiuto e fonte di ispirazione. Ringrazio il Dottor Gennaro Fiore e il Cavaliere Giuseppe Barra per quanto mi hanno dato. Ringrazio i miei amici di sempre, Vincenzo (Taty), Marco Antonio, Emanuele, Luigi, Cosimo, Gennaro, Vincenzo Masillo, Antonio Fiume, Nello, Dario, Emanuele (Zeta), Matteone. Ringrazio gli amici dell’AGA, Carmine, Luca, Francesco, Walter, Antonello, Daniele, Gianfranco, Alessandro, Pietro, Angelo, Mimmo e Pasquale. Anche se il lavoro ci porta a stare lontani, resteremo sempre l’AGA. Ringrazio tutti gli amici di Eboli, dell’Università di Salerno, dell’Università di Napoli, quelli d’Italia e quelli del resto del mondo. A tutte le persone che mi vogliono bene e anche a tutti quelli che oggi non sono potuti essere qui, vi ringrazio. 112