09.03.2014 Views

Prosjekt: Rational Rose RT - Institutt for teknisk kybernetikk - NTNU

Prosjekt: Rational Rose RT - Institutt for teknisk kybernetikk - NTNU

Prosjekt: Rational Rose RT - Institutt for teknisk kybernetikk - NTNU

SHOW MORE
SHOW LESS

Create successful ePaper yourself

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

<strong>NTNU</strong>, <strong>Institutt</strong> <strong>for</strong> <strong>teknisk</strong> <strong>kybernetikk</strong>/<br />

SINTEF Elektronikk og <strong>kybernetikk</strong>, Avd. Reguerlingsteknikk<br />

Øyvind Stavdahl 2000<br />

Trygve Lunheim 2000<br />

VUE3001-1<br />

Sanntidsprogrammering<br />

<strong>Prosjekt</strong><br />

Modellering av heisstyring med<br />

<strong>Rational</strong> <strong>Rose</strong> RealTime<br />

,QQOHGQLQJ<br />

ITKs heislab benyttes i flere øvinger i flere fag. I denne øvingen skal vi kun bruke lab’en som<br />

et prosesseksempel; øvingen går ut på å modellere (beskrive) funksjonaliteten til heisens styresystem<br />

ved hjelp av CASE-verktøyet 5RVHÃ5HDO7LPH (heretter 5RVHÃ57) fra 5DWLRQDOÃ6RIWZDUHÃ<br />

&RUS<br />

2PÃ5RVHÃ57<br />

<strong>Rose</strong> <strong>RT</strong> er basert på en utvidet versjon av modelleringsspråket UML. Utvidelsen gjør det mulig<br />

å beskrive systemfunksjonalitet på en så komplett måte at <strong>Rose</strong> RealTime er i stand til å omsette<br />

modellen til høynivå programkode (<strong>for</strong>eløpig C eller C++) som så kan kompileres og simuleres/<br />

kjøres på en PC og et antall andre maskinvare- og operativsystemplatt<strong>for</strong>mer. I denne øvingen<br />

skal vi imidlertid bare bruke <strong>Rose</strong> <strong>RT</strong> som modelleringsverktøy samt genererer C++-kode <strong>for</strong><br />

gitt operativsystem og kompilator, vi skal ikke kjøre/simulere modellen.<br />

1¡GYHQGLJÃIRUKnQGVNXQQVNDS<br />

Øvingsteksten <strong>for</strong>utsetter en viss grunnleggende kjennskap til UML-relaterte begreper og <strong>Rose</strong><br />

<strong>RT</strong> ut over det som beskrives i det følgende. Bruk <strong>Rose</strong> <strong>RT</strong>s on-line hjelpesystem flittig - dette<br />

er omfattende og oversiktlig.<br />

$EVWUDNVMRQVQLYnHUÃLÃ5RVHÃ57<br />

I <strong>Rose</strong> <strong>RT</strong> opereres med modell- og systemspesifikasjoner på flere nivåer med hensyn på abstraksjon/teknologiavhengighet.<br />

Dette muliggjør gjenbruk av modeller på tvers av maskin- og<br />

operativsystemplatt<strong>for</strong>mer.<br />

Følgende nivåer kan identifiseres:<br />

80/QLYnÃMed en utvidet UML-modell modelleres blant annet systemets HVVHQVLHOOHÃORJLNN,<br />

dvs. systemets logiske virkemåteÃbeskrevet uten å ta unødvendig hensyn til teknologiske<br />

<strong>for</strong>hold som maskinvareplatt<strong>for</strong>m etc.<br />

UML kan benyttes helt fra utviklingsprosjektets aller første stadium, der en typisk benytter<br />

XVHFDVHV til å dele inn systemets interaksjoner med omverdenen etter hvilken funksjonalitet<br />

som benyttes i ulike scenarier. Delfunksjonalitet tilordnes så ulike <strong>for</strong>mer <strong>for</strong> klasser (stere-


SIE3050 Sanntidsprogrammering s. 2<br />

otyper) kalt NDSVOHU, SRUWHU, SURWRNROOHUÃosvÃDisse klassenes relasjoner (arv/generalisering,<br />

aggregering etc.)modelleres med et hensiktsmessig antall NODVVHGLDJUDPPHU (&ODVVÃ'LD<br />

JUDPV). Interaksjon (kommunikasjon) mellom objektene kan konkretiseres med VHNYHQVGLD<br />

JUDPPHU der dette bidrar til oversikten.<br />

Kapslenes indre tilstandsdynamikk modelleres i 7LOVWDQGVGLDJUDPPHU (6WDWHÃ'LDJUDPV), ett<br />

diagram <strong>for</strong> hver kapsel. Til hver tilstandstransisjon knyttes WULJJHUV, dvs. en spesifiserer<br />

hvilke meldinger på hvilke porter som skal aktivere den enkelte transisjon. Til en transisjon<br />

kan en også knytte DNVMRQHU som kapselen skal utføre når den aktuelle transisjonen <strong>for</strong>etas.<br />

Separate aksjoner kan også knyttes til hhv. inngang til/utgang fra enhver tilstand i modellen.<br />

Aksjoner defineres direkte med C/C++-syntaks, og består typisk av datamanipulasjon og/<br />

eller utsendelse av et antall utgående meldinger gjennom kapselens port(er).<br />

I kapsler som inneholder underkapsler (aggregering), benyttes et VWUXNWXUGLDJUDP (6WUXFWXUHÃ<br />

'LDJUDP) til å modellere meldingsutveksling mellom kapslene. Denne diagramtypen inngår<br />

ikke i standard UML. Strukturdiagrammet er ekvivalent med det som i Strukturert Analyse<br />

(SA) omtales som et GDWDIO\WGLDJUDP, men benytter en noe annerledes grafisk syntaks.<br />

Kapslene 1 tilsvarer det som i SA kalles prosesser, og dataflyten defineres ved å <strong>for</strong>binde<br />

parvis kompatible porter (dvs. porter som har samme protokoll men konjugerte roller) på<br />

kommuniserende kapsler.<br />

.ODVVHGLDJUDPPHU, WLOVWDQGVGLDJUDPPHU (med spesifiserte triggere og aksjoner) samt VWUXN<br />

WXUGLDJUDPPHU danner grunnlaget <strong>for</strong> senere generert programkode. Øvrige modellelementer<br />

(som use-casediagrammer og sekvensdiagrammer) benyttes kun som hjelpemidler<br />

til å få oversikt over den aktuelle problemstillingen.<br />

.RPSRQHQWQLYnÃNår systemets essensielle logikk er modellert, kan modellen deles inn i<br />

logiske NRPSRQHQWHU (&RPSRQHQWV). En komponent er et subsett av det totale systemets<br />

funksjonalitet som vi ønsker å gruppere sammen, gi en samlebetegnelse og endelig kompilere<br />

og lenke til et kjørbart program eller et bibliotek.<br />

Den enkleste måten å definere en komponent på, er å bruke <strong>Rose</strong> <strong>RT</strong>s innebygde Component<br />

Wizard, som finnes under Build-menyen. Wizard’en lar oss spesifisere hvilke deler av<br />

totalmodellen som skal inngå i komponenten (“Top Capsule”), samt hvilket operativsystem<br />

og hvilken kompilator, lenker, debugger etc. vi ønsker å benytte når komponenten skal bygges.<br />

Dette må spesifiseres <strong>for</strong> at <strong>Rose</strong> <strong>RT</strong> skal vite hvilket bibliotek som senere skal lenkes<br />

inn <strong>for</strong> å danne et ferdig kjørbart system 2 .<br />

,QVWDQVQLYnÃNår hele systemets funksjonalitet er <strong>for</strong>delt på et antall komponenter, må komponentene<br />

instansieres og <strong>for</strong>deles på aktuelle maskinvareplatt<strong>for</strong>mer.<br />

Dette gjøres ved å åpne et 'HSOR\PHQWÃ'LDJUDP, deklarere en ny 3URFHVVRU, definere prosessorens<br />

(egentlig: platt<strong>for</strong>mens) fysiske prosessorfamilie og operativsystem, og så instansiere<br />

den aktuelle komponenten på den aktuelle prosessoren.<br />

For små systemer som skal kjøres på en enkelt datamaskin vil det være aktuelt å definere en<br />

enkelt komponent med hele systemets funksjonalitet og instansiere denne samlet. Dersom<br />

1. Egentlig er der kapselUROOHU som modelleres i strukturdiagrammene; En kapselrolle refererer til en gitt<br />

kapsels grensesnitt (porter), og enhver kapsel avledet av den angitte kapsel kan fyllle kapselrollen.<br />

Hvilken kapsel som faktisk instansieres i den aktuelle rollen kan avgjøres senere – til og med utsettes<br />

til UXQWLPH (dynamisk instansiering)!<br />

2. Biblioteket inneholder realisering av en enkel hendelsesorientert sanntidskjerne med meldingskøer<br />

etc., som må ligge “i bunnen” av systemet vårt <strong>for</strong> at kapsler skal kunne kommunisere og prosessere<br />

meldinger. Dette biblioteket benytter bl.a. funksjonskall til den aktuelle kompilatorens standardbibliotek,<br />

og må der<strong>for</strong> tilpasses den aktuelle programvareplatt<strong>for</strong>men.


SIE3050 Sanntidsprogrammering s. 3<br />

systemet skal distribueres på flere (identiske eller ulike) platt<strong>for</strong>mer, er det derimot nødvendig<br />

å dele inn i et tilsvarende sett komponenter og instansiere disse i henhold til den<br />

aktuelle distribusjon. (QÃNDQÃLPLGOHUWLGÃJMHUQHÃRSHUHUHÃPHGÃIOHUHÃSDUDOOHOOHÃNRPSRQHQWHUÃRJÃ<br />

LQVWDQVHUÃPHGÃVDPPHÃHOOHUÃRYHUODSSHQGHÃVXEVHWWÃDYÃV\VWHPHWÃ'HWWHÃJM¡UÃGHWÃPXOLJÃnÃWHVWHÃ<br />

XWÃKHOHÃV\VWHPHWÃSnÃHQÃHQNHOWÃPDVNLQÃW\SLVNÃXWYLNOLQJV3&HQÃI¡UVWÃRJÃGHUHWWHUÃGLVWULEXHUHÃ<br />

GHWÃSnÃHWÃDQWDOOÃDQGUHÃSODWWIRUPHU 1 <br />

3HUVRQKHLVÃÃIXQNVMRQHOOÃVSHVLILNDVMRQ<br />

Heisen skal betjene fire etasjer. Inne i heisen finnes det et panel med ILUHÃNQDSSHU hvor en kan<br />

velge hvilken etasje man skal til. Bak hver knapp ligger det et O\VVLJQDO som skal settes når<br />

knappen er trykket. Lyset i knappen skal slukkes når heisen har nådd den angitte etasjen. På<br />

samme panel er det en VWRSSNQDSS som skal nullstille alle etasjebestillinger og stoppe heisen.<br />

Heisen inneholder også en REVWUXNVMRQVI¡OHU (berøringsføler). Når denne gir utslag skal heisen<br />

stoppe (og døren åpnes hvis heisen er ved en etasje).<br />

Ved hver etasje finnes en HWDVMHGHWHNWRU. Når heisen har nådd ønsket etasje skal døra åpnes og<br />

holdes åpen i minst 3 sekunder. )LUHÃODPSHU viser hvilken etasje heisen er (eller sist var) i.<br />

I hver etasje er det to WU\NNQDSSHU merket 233 og 1('. Første etasje har bare 233-knapp og<br />

fjerde etasje har bare 1('-knapp. Når en av disse knappene er trykket skal heisen gå til vedkommende<br />

etasje. Hvis heisen allerede har et oppdrag, skal den kunne stoppe og ta med passasjerer<br />

som skal i samme retning. 233- og 1('-knappene har innebygd lys. Lyset skal tennes<br />

når knappen trykkes og slukkes når heisen kan ta med passasjerer i ønsket retning fra vedkommende<br />

etasje.<br />

Pådrag til heisen gis ved et analogt signal til en elektrisk motor. I tillegg angir et digitalt signal<br />

retningen på motoren. Figur 1 viser en modell av heisen.<br />

1. Vel og merke dersom en har mekanismer <strong>for</strong> meldingsutveksling på tvers av platt<strong>for</strong>mene (via et nettverk).


SIE3050 Sanntidsprogrammering s. 4<br />

)LJXUÃÃ6NLVVHÃDYÃKHLVODEHQÃ<br />

Endestopp<br />

Heisstyring<br />

DA1<br />

DIR<br />

EN<br />

Motordriver<br />

Endestopp<br />

4. etg.<br />

NED<br />

3. etg.<br />

NED<br />

OPP<br />

2. etg.<br />

NED<br />

OPP<br />

1. etg.<br />

OPP<br />

S<br />

Dør<br />

åpen<br />

Obstruksjon<br />

1 2 3 4


SIE3050 Sanntidsprogrammering s. 5<br />

2SSJDYHU<br />

D 8VHFDVHV<br />

Ta utgangspunkt i den funksjonelle spesifikasjonen i <strong>for</strong>rige avsnitt og definer DNW¡UHU (DFWRUV)<br />

og use-cases som til sammen “utspenner” hele spesifikasjonen (dvs. de tekstlige beskrivelsene<br />

av samtlige use-cases skal til sammen inneholde/realisere alle funksjonelle krav/spesifikasjoner<br />

som er angitt).<br />

Tegn use-case-diagram(-mer) v.h.a. <strong>Rose</strong> <strong>RT</strong> og dokumenter use-casene i feltet merket “Documentation”<br />

nederst i vinduet.<br />

E<br />

2EMHNWDUNLWHNWXU<br />

Velg et passende sett av klasser (kapsler, porter, protokoller) som til sammen kan realisere systemets<br />

funksjonalitet.<br />

Tegn et (eller flere) klassediagram(-mer) som viser klassene og deres relasjoner. Dokumenter<br />

hvilken delfunksjonalitet som er tenkt tilordnet hver klasse (“Documentation”-feltet nederst i<br />

vinduet).<br />

Modeller kapslenes oppførsel v.h.a. tilstandsdiagrammer og deres samarbeid (kommunikasjon)<br />

v.h.a. strukturdiagrammer. Spesifiser triggere og aksjoner <strong>for</strong> transisjoner og tilstander.<br />

7LSV<br />

- Anta at det <strong>for</strong>eligger driverprogramvare <strong>for</strong> heismotoren, slik at motoren kan styres<br />

ved å sende meldingene 2SSRYHU, 1HGRYHU og 6WRSS til driveren. Modeller dette grensesnittet<br />

som en kapsel med én port og en relevant protokoll.Vurder hvilke andre elektromekaniske<br />

komponenter (knapper, lysindikatorer o.s.v.) som kan/bør abstraheres på<br />

tilsvarende måte som motoren.<br />

- Protokoller (klasser av stereotypen 3URWRFRO) brukes egentlig bare til å definere et<br />

sett meldinger som kan sendes/mottas gjennom porter tilordnet den aktuelle protokollklassen.<br />

En protokoll kan likevel gjerne ha et tilstandsdiagram som dokumenterer<br />

hvordan protokollen er tenkt benyttet, dvs. typiske/mulige signalsekvenser etc. Det<br />

genereres imidlertid ingen kode ut fra et slikt diagram, det er bare tenkt som en dokumentasjon<br />

av protokollen. Tilstandsmaskinene som faktisk skal benytte protokollen, må<br />

ligge i de kommuniserende kapslene.<br />

- Bruk aggregering og generalisering/arving på en hensiktsmessig måte. Tenk objektorientert<br />

– arving kan være et alternativ til å innføre logisk redundans i modellen.<br />

- Definer en toppkapsel som innkapsler alle de øvrige; dette er nødvendig <strong>for</strong> senere å<br />

kunne definere en NRPSRQHQW <strong>for</strong> hele systemet, jfr. oppgave c).<br />

F<br />

.RPSRQHQW<br />

Resultatet av de <strong>for</strong>egående oppgavene skal være en komplett analysemodell. Vi skal nå definere<br />

en komponent basert på analysemodellen, og knytte denne opp mot et bibliotek tilpasset en<br />

konkret programvareplatt<strong>for</strong>m.<br />

Definer en komponent som omfatter hele systemet ditt.<br />

Spesifiser C++ som komponentens kodespråk, “toppkapslen” fra oppgave b) som WRSOHYHOÃ<br />

FRPSRQHQW og “NT40T.x86-VisualC++6.0” (hvis dette er oppsettet ditt) som &RQILJXUDWLRQ.


SIE3050 Sanntidsprogrammering s. 6<br />

Generer C++-kode <strong>for</strong> komponenten via menyen %XLOG, evt. ved å klikke på hammer-ikonet eller<br />

ved å trykke F7.<br />

7LSV<br />

- En <strong>Rose</strong> <strong>RT</strong>-modell kan inneholde flere komponenter. Før Build-operasjonen kan<br />

utføres må vi der<strong>for</strong> spesifisere hvilken komponent som skal buildes. Dette gjøres<br />

enklest ved å høyreklikke på den aktuelle komponentens ikon i modellbrowserens<br />

&RPSRQHQWÃ9LHZ, og velge 6HWÃ$VÃ$FWLYH. Modellbrowseren viser den aktive komponentens<br />

navn med uthevet skrift.<br />

- Dersom Build-prosessen gir et uhensiktsmessig antall feilmeldinger, kan kapslene<br />

konsistenssjekkes enkeltvis ved å definere separate komponenter <strong>for</strong> kapslene og<br />

builde dem hver <strong>for</strong> seg.<br />

Som en øvelse kan du kikke gjennom den genererte koden <strong>for</strong> å få en føling med at den faktisk<br />

implementerer “ditt” system.<br />

På dette stadiet kan Build-prosessen settes til også å omfatte kompilering, slik at eventuelle syntaksfeil,<br />

udefinerte symboler etc. i aksjonskoden (koden som definerer aksjoner i <strong>for</strong>bindelse<br />

med tilstander og tilstandstransisjoner) kan detekteres.<br />

G<br />

,QVWDQV<br />

Vi skal nå ta skrittet helt ut og NM¡UH komponenten vår (siden vi skal kjøre den på en PC som<br />

ikke er tilknyttet den fysiske heisen, refererer vi gjerne til det vi skal gjøre som en VLPXOHULQJ).<br />

Vi må der<strong>for</strong> spesifisere hva slags platt<strong>for</strong>m GHQQHÃLQVWDQVHQÃDYÃNRPSRQHQWHQ skal kjøre på, inkludert<br />

prosessor- og operativsystemfamilie.<br />

Definer en ny prosessor (høyreklikk på 'HSOR\PHQWÃ9LHZ i modellbrowseren, og velg så 1\<br />

3URVHVVRU). Åpne den nye prosessorens spesifikasjonsvindu (dobbeltklikk på prosessorikonet)<br />

og sett feltet &38 til “x86” og feltet 26 til “Windows-NT”.<br />

Instansier komponenten fra oppgave c) på den nye prosessoren ved å “dra-og-slippe” komponenten<br />

på prosessorens ikon.<br />

I større prosjekter vil det kunne <strong>for</strong>eligge flere komponenter instansiert på flere prosessorer<br />

samtidig. For oversiktens skyld kan instansieringen illustreres ved et 'HSOR\PHQWÃ'LDJUDP.<br />

Modellbrowseren inneholder som default et slikt diagram med tittelen 'HSOR\PHQWÃ9LHZ0DLQ;<br />

åpne dette diagrammet og dra-og-slipp prosessorikonet på diagrammet <strong>for</strong> å få en grafisk representasjon<br />

av prosessoren og den nye komponentinstansen.<br />

H<br />

6LPXOHULQJ<br />

Kjør systemetÃved å velge %XLOG5XQ eller ved å klikke på ikonet merket med et lyn.<br />

7LSV<br />

- En <strong>Rose</strong> <strong>RT</strong>-modell kan inneholde flere instanser. Før Run-operasjonen kan utføres<br />

må vi der<strong>for</strong> spesifisere hvilken instans som skal kjøres. Dette gjøres enklest ved å<br />

høyreklikke på den aktuelle instansens ikon i modellbrowserens 'HSOR\PHQWÃ9LHZ, og<br />

velge 6HWÃ$VÃ$FWLYH. Modellbrowseren viser den aktive instansens navn med uthevet<br />

skrift.<br />

Dersom kompilering, lenking og oppstart av går greit, vil <strong>Rose</strong> <strong>RT</strong> nå sette opp et DOS-vindu<br />

(konsoll) <strong>for</strong> den nye prosessen. I <strong>Rose</strong> <strong>RT</strong>-vinduet vises nå et debuggings-grensesnitt der vi<br />

bl.a. aktivt kan starte/stoppe og single-step’e systemet, injisere meldinger til/logge meldinger<br />

fra systemets porter osv. Det henvisese til <strong>Rose</strong> <strong>RT</strong>-dokumentasjon <strong>for</strong> detaljer rundt debugge-


SIE3050 Sanntidsprogrammering s. 7<br />

rens virkemåte og betjening.<br />

Evaluer modellen din ved å injisere meldinger, logge meldingstrafikk, generere sekvensdiagrammer<br />

etc. og sammenlikne modellens oppførsel med funksjonsbeskrivelsen i oppgaveteksten.<br />

I<br />

,QQOHYHULQJ<br />

Besvarelsen skal bestå av:<br />

- en epost evt. diskett med <strong>Rose</strong> <strong>RT</strong>-modellen du/dere har laget, samt<br />

- eventuelle utskrift av automatisk genererte sekvensdiagram(-mer) og annet som sannsynliggjør<br />

at modellen tilfredsstiller oppgavens funksjonsbeskrivelse.<br />

³3RVWÃ/DEEXP´<br />

Vi har nå simulert vår systemmodell på en PC. Legg merke til at veien herfra og til OHYHULQJV<br />

IHUGLJÃSURGXNW er kort, og i prinsippet kun innebærer følgende arbeidsoperasjoner:<br />

- valg av maskinvareplatt<strong>for</strong>m (mikrokontrollerkort med den nødvendige I/O-kapasitet),<br />

- implementasjon av I/O-drivere <strong>for</strong> betjeningsorganer, indikatorer og motor (som <strong>for</strong>eløpig<br />

bare er “tomme” kapsler),<br />

- instansiering av systemet på den aktuelle prosessortypen,<br />

- kompilering og nedlasting til target.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!