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
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.