Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

5 Toestandsdiagrammen

5.1Inleiding: game

In deze module leer je te werken met toestandsdiagrammen. Als introductie daarop kun je met de gehele klas de volgende opdracht doen.

Automaat bewaker

Wellicht heb je de volgende toestanden gevonden, ook al noem je ze waarschijnlijk anders

  1. Waakzaam, rondkijkend

  2. Alert, klar voor actie, rondkijkend

  3. Gealarmeerd, achter vijand aan lopend

  4. Verdwaasd, rondlopend

  5. Dood

Op basis van deze toestanden kun je een toestandsdiagram maken, waarin duidelijk wordt hoe de bewaker van de ene toestand in de andere komt. De getallen geven de toestanden aan zoals hierboven staat beschreven.

Je kunt in het toestandsdiagram bijvoorbeeld zien dat als de bewaker in toestand 1 is en hij ziet een vijand, dan wordt de toestand van de bewaker 2.

In de bovenstaande uitwerking zie je totaal 5 toestanden en 6 toestandsovergangen. Misschien zijn er wel meer hoor, alleen in dit korte fragment kun je ze niet allemaal zien.

Het losse pijltje naar toestand 1 betekent dat dit de begintoestand is, oftewel de initiële toestand.

5.2Toestanden en toestandsovergangen

Hieronder zie je een voorbeeld van een onderdeel van een frisdrankautomaat. Dit onderdeel houdt bij hoeveel geld de gebruiker van de automaat heeft ingeworpen. Voor het gemak gaan we uit van slechts twee munten: 50 cent en 1 euro. En alle frisdranken in de automaat kosten 2 euro.

De bollen zijn toestanden. Dit toestandsdiagram kent dus vijf toestanden. De frisdrankautomaat begint in de starttoestand, dat is in dit geval de toestand ‘Start: 0 euro’. Bij elke toestand zie je enkele overgangen. Bijvoorbeeld de overgang van de starttoestand ‘0 euro’ naar ‘0,5 euro’. Die toestandsovergang vindt plaats als de gebruiker begint met het inwerpen van een muntstuk van 50 eurocent.
Je ziet dat een toestandsovergang ook naar dezelfde toestand kan gaan. Kijk maar bij de toestand ‘2 euro’. Na de toestandsovergang ‘Inworp 50 cent’ is de toestand nog steeds ‘2 euro’.

Solution to Exercise 3

Dat kan op de volgende vier manieren:

  • 50ct + 50ct + 50ct + 50ct

  • 50ct + 1 euro + 50ct

  • 50ct + 50ct + 1 euro

  • 1 euro + 50ct + 50ct

De meeste automaten geven teveel ingeworpen muntjes direct bij het inwerpen terug. Daarom tellen we die mogelijkheden niet mee in dit antwoord.

Een toestandsovergang wordt meestal uitgevoerd op basis van informatie uit één van de sensoren. Als iemand één euro in de frisdrankautomaat doet, wordt dat door één of meerdere sensoren gedetecteerd. Hoe dat precies werkt is hierbij niet belangrijk. Uit de toestandsdiagram kun je opmaken naar welke toestand de automaat moet gaan als iemand die euromunt inwerpt.

Solution to Exercise 4
  • 1

  • 2

  • niet

5.3Acties in een toestandsdiagram

Het vorige toestandsdiagram is nog niet volledig, de gebruiker moet immers wel een frisdrank kunnen selecteren. In het volgende toestandsdiagram voegen we een overgang ‘selectie’ toe aan alle toestanden. ‘Selectie’ betekent dat de gebruiker een frisdrank kiest.

Aan een toestandsovergang kan een actie worden gekoppeld. Bij de frisdrankautomaat wordt de actie: ‘geef frisdrank’ uitgevoerd als de gebruiker een frisdrank selecteert en de toestand is: ‘2 euro’. Acties zijn altijd gekoppeld aan toestandsovergangen en niet aan toestanden. Een toestandsovergang mag één of meer acties hebben, maar dat hoeft niet. Voor het uitvoeren van acties worden vaak actuatoren gebruikt, zoals een lampje, display of motor.

In deze module gebruiken we steeds een dubbele punt om het onderscheid te maken tussen toestandsovergang en actie.

<toestandsovergang> : <actie>
Solution to Exercise 5

Uitleg

De automaat houdt bij hoeveel geld (50 cent en 1 euro-muntstukken) er is ingeworpen. Pas als het totaal gelijk is of meer dan 2 euro kan de gebruiker een frisdrank selecteren. De automaat geeft geen geld terug (niet een erg klantvriendelijke automaat dus).

5.4Tabel met toestandsovergangen

Voor het overzicht laten we de toestandsovergangen die naar dezelfde toestand verwijzen ook wel eens weg, zoals hieronder.

Het is echter wel verstandig om goed na te denken over wat er in alle gevallen gebeurt. Bijvoorbeeld, wat gebeurt er in toestand ‘1 euro’ als de gebruiker een frisdrank selecteert? Door over alle mogelijkheden na te denken voorkom je fouten die je later veel tijd kosten om te herstellen. Je kunt dat ook in een tabel weergeven door alle toestanden te combineren met alle mogelijke toestandsovergangen. Daarbij geef je voor alle mogelijkheden aan wat de nieuwe toestand wordt.

Toestand ↓ / Toestandsovergang →Inworp 50 centInworp 1 euroSelectie
Start:0 euro0,5 euro1 euro
0,5 euro1 euro
1 euro
1,5 euro
2 euro

In de bovenstaande tabel zie je alle toestanden in de linker kolom. Je ziet ook alle mogelijke gebeurtenissen in de bovenste rij. Voor iedere combinatie moet de tabel beschrijven wat de nieuwe toestand wordt. Dit kan dus ook dezelfde toestand blijven. De tabel hierboven is nog niet volledig ingevuld.

Solution to Exercise 6

Uitleg

Toestand ↓ / Toestandsovergang →Inworp 50 centInworp 1 euroSelectie
Start:0 euro0,5 euro1 euro
0,5 euro1 euro1,5 euro0,5 euro
1 euro2 euro2 euro1 euro
1,5 euro2 euro2 euro1,5 euro
2 euro2 euro2 euro0 euro: geef frisdrank

5.5Verbreding: Toestandsovergang bij gebeurtenis of status

In het voorbeeld van de frisdankautomaat is er een toestandsovergang als er wat gebeurt. De gebeurtenis is het inwerpen van een muntje. De gebeurtenis duurt kort, het is een moment waarop je het muntje inwerpt. Je kunt je voorstellen dat het inwerpen het moment is waarop het muntje tegen een drukknopje komt. Het moment dat het muntje tegen de drukknop komt, verandert de drukknop van niet-ingedrukt naar wel-ingedrukt. Een gebeurtenis is dus een verandering van een waarde. De waarde is in dit geval niet-ingedrukt of wel-ingedrukt.

Je kunt een toestandsdiagram ook anders maken. Een toestandsovergang vindt dan niet plaats bij een verandering van een waarde, maar als een sensor (bijvoorbeeld een drukknop) een bepaalde waarde heeft. Je hebt dan twee keer zoveel toestanden nodig. Elke keer als er de schakelaar wordt ingedrukt door een muntje ga je naar een volgende toestand waarin gewacht wordt tot het muntje verder valt. Voor een mens duurt dat wachten zo kort dat je het niet eens merkt, maar voor de computer in de frisdrankautomaat duurt dat wachten best lang. Als het muntje verder is gevallen, dan staat de schakelaar weer in de niet-ingedrukt stand. Je gaat dan naar de toestand met het nieuwe bedrag.

Je kunt dus kiezen voor twee soorten toestandsovergangen:

  1. als er een verandering van een waarde is (een gebeurtenis)

  2. als er een bepaalde waarde wordt gezien (status)

Bij het voorbeeld van de frisdrankautomaat in dit hoofdstuk hebben we gewerkt met manier 1 (gebeurtenissen), omdat we dan minder toestanden hoefden te gebruiken. In het volgende hoofdstuk Toestandsdiagrammen (opdrachten) zul je beide manieren tegen komen.

In het hoofdstuk Van toestandsdiagram naar code gebruiken we vooral manier 2 (status), omdat toestandsdiagrammen die gemaakt zijn op manier 2 gemakkelijker om te zetten zijn in code.

5.6Regels voor een toestandsdiagram

Een toestandsdiagram is gebonden aan strenge regels: