Handboek · hoofdstuk 45Systems engineering en het V-model
Eisen, architectuur en bewijs vormen samen één beheerde systeemversie
Het brein van Habitat verbindt warmte, energie, metingen en operator. Een goede component is nog geen goed geheel. Je maakt eisen meetbaar, verdeelt verantwoordelijkheden en ontwerpt het bewijs waarmee een systeemversie wordt aanvaard.

- Je kan functionele en niet-functionele eisen toetsbaar en traceerbaar formuleren.
- Je kan architectuur en interfacecontracten vanuit eisen afleiden.
- Je kan verificatie en validatie aan het V-model koppelen.
- Je kan trade-offs met harde voorwaarden en gevoeligheidsanalyse uitvoeren.
- Je kan configuraties, wijzigingen en acceptatiebewijzen beheersen.
Van behoefte naar afgebakend systeem
Een gebruiker wil een bewoonbaar station met bruikbare plantproductie en weinig operatorwerk. Dat is nog geen eis voor één computer. Kies de systeemgrens: het stationsbrein omvat centrale planning en logging, gekoppeld aan lokale regelaars. De 12 V-module en het 48 V-stationsnet houden eigen actuatoren en energiebalansen.
Leg stakeholders, gebruiksomstandigheden en succescriteria vast. Een operator wil herstelbare storingen; een onderhoudsmedewerker wil versieherkomst; een gebruiker wil het bedoelde comfort. Een architectuur is een antwoord op die behoeften. Begin daarom niet met ‘koop een Pi’ als onbesproken oplossing. Maak aannamen zichtbaar en onderzoek wat bij een grenswijziging mee moet veranderen.
Een eis bevat gedrag, grens en toets
Een goede eis noemt onderwerp, meetbare prestatie, omstandigheden en acceptatiegrens. ‘Snel en betrouwbaar’ is niet toetsbaar. ‘De centrale logger markeert een telemetriemeting ouder dan 90 s als verouderd, gemeten aan het opgegeven meettijdstip’ heeft wel een concrete betekenis. Leeftijd en klokfout moeten daarbij afzonderlijk worden beheerd.
Houd iedere eis atomair genoeg om één status te kunnen geven. Vermijd een zin die zowel klimaatkwaliteit, energiebesparing als onderhoud regelt. Geef een uniek ID, bron, rationale, eigenaar en toetsmethode. Een gekozen grens is eerst een ontwerp- of proefcriterium; een groen vinkje vraagt daadwerkelijk bewijs op de bedoelde versie.
| eisveld | voorbeeld |
|---|---|
| ID | RN-01 |
| gedrag | markeert verouderde telemetrie |
| grens | leeftijd >90 s |
| conditie | meetklok geldig en herkomst bekend |
| bewijs | grensgevallen en klokfoutinjectie |
Een reactietijd zonder startgebeurtenis, belasting en meetmethode blijft dubbelzinnig.
Een vage klimaatwens herschrijven
- gebruiksscenario en lokale regeling bestaan
- scheid toetsbare eisen en aannamen
- 1Maak comfort een systeemdoel met temperatuurband, buitengebied, bezetting en meetplaats. Zonder dat domein kan ‘altijd’ niet worden beoordeeld.
- 2Maak energiebeheer een aparte eis met basislijn en vergelijkbaar proefweer. Maak een interface-eis die vastlegt dat centrale voorstellen door de lokale eigenaar worden begrensd.
- 3Voorbeeldcriterium RN-02: bij wegvallen van de centrale verbinding blijft de lokale klimaatlus gedurende een afgesproken proefduur uitvoeren, met gemelde gedegradeerde status. Tijdduur en prestatieband worden vooraf gekozen en daarna getoetst.
Functioneel en niet-functioneel beïnvloeden elkaar
Een functionele eis vraagt wat gebeurt: plannen, loggen, alarmeren of een voorstel weigeren. Een niet-functionele eis beschrijft kwaliteit of beperking: tijd, nauwkeurigheid, beschikbaarheid, onderhoud, energie of beveiliging. Beide sturen architectuur. Een logfunctie met onbeperkte blokkerende schrijftijd kan een regelfunctie onbruikbaar maken.
Beschrijf eisen in waarneembare termen. Een percentile-eis voor rekentijd vraagt hardware, bestandsgrootte, belasting, meetduur en uitgesloten onderhoudsfasen. Een deterministische deadline vraagt een andere analyse dan een gemiddeld snelle uitvoering. Beveiligings- en privacyvoorwaarden kunnen harde selectiepoorten zijn.
| voorbeeld-ID | soort | toets |
|---|---|---|
| RF-01: lever energieplan | functioneel | planstructuur/horizon |
| RF-02: grens vermogenvoorstel | functioneel/interface | onder-, boven- en niet-eindige waarden |
| RN-03: voorstel maximaal 60 s geldig | tijdkwaliteit | vervalgrens en toekomstige tijd |
| RN-04: reproduceer versie | beheerkwaliteit | manifest terugbouwen |
Traceerbaarheid is tweerichtingsverkeer
Van iedere behoefte ga je naar systeem- en deeleisen, ontwerpbesluiten en bewijsstukken. Omgekeerd moet een implementatiedetail terug te voeren zijn op een behoefte of gemotiveerde technische keuze. Zo herken je een ontbrekende toets én een onnodige functie.
Een teststatus hoort bij versie, configuratie, testmethode en resultaat. ‘Getest’ zonder identiteit kan een oude interface betreffen. Eén eis kan analyse, inspectie en proef tegelijk nodig hebben. Een unit-test voor een berichtvalidator bewijst geen netwerkbeschikbaarheid of thermische prestatie van het volledige station.
| behoefte | eis | ontwerp | bewijs |
|---|---|---|---|
| herstelbaar beheer | RF-03 replay weigeren | boot/ID en verval | T-03 + herstartproef |
| actuator begrensd | RF-02 | lokale eigenaar | T-02 + hardwaretest |
| bruikbaar klimaat | H-CLIM | model/lus/sensor | dag-nachtvalidatie |
| reproduceerbaarheid | RN-04 | manifest en hashes | rebuild/restore |
Een trace die haar grens toont
- e39 vereenvoudigde stationsheater als contractvoorbeeld
- bewijs en ontbrekend bewijs
- 1Een unittest toetst −1,0,2000,2001 W en NaN. Daarmee is het softwarebereik aangetoond voor die validatorversie.
- 2Een integratietest controleert dat een afgekeurd voorstel niet via een tweede route de lokale eigenaar bereikt. Een hardwareproef controleert de daadwerkelijke vermogensbegrenzing en storingreactie.
- 3Een SSR die kortgesloten blijft is geen invoerbereikfout. Daarvoor is een afzonderlijk technisch beveiligingsontwerp en bewijs nodig. De 2000 W betreft het e39-voorbeeld, niet de 800 W-moduleconvector.
Architectuur verdeelt eigenaarschap
De centrale Pi plant en logt; lokale controllers voeren hun eigen snelle regel- en beveiligingsfuncties uit. Energievoorstellen gaan door een expliciete supervisorinterface. De bestaande Mega van de module, luchtknoop en energiecontrollers behouden hun bussen, adressen en pin-eigenaars.
Kies functies, datastromen, grenzen en foutverantwoordelijkheid vóór de fysische bekabeling. Een gedeelde logger mag geen deadline van de lokale regeling opeisen. De twee energienetten wisselen informatie en eventueel expliciet beschreven energie uit; hun verbruiken en bronnen worden niet dubbel geteld. Koppel een storing aan de functie die haar detecteert, begrenst en aan de operator verklaart.
| functie | eigenaar | contract |
|---|---|---|
| snelle klimaatlus | lokale controller | eigen sensor/actuator |
| dagplanning | centrale predictor/planner | voorstel met horizon |
| toestemming | supervisor en lokale eigenaar | rol, tijd, modus, bereik |
| logging | centrale logger | kwaliteit/versie, niet blokkeren |
| beveiliging | onafhankelijk ontworpen pad | eigen storingbewijs |
Interfaces zijn meer dan stekkers
Een interfacecontract bevat fysische signalen, elektrische niveaus en eenheden, maar ook timing, eigenaarschap, foutstatus en versies. Een MQTT-bericht met temperatuur moet vertellen welke toestand en meetplaats bedoeld zijn. Een leeg meetveld is geen nul graden.
Definieer commando-ID, bron, boot-ID, meettijd, vervaltijd, modus en bevestiging. Een ontvangen bevestiging kan ontvangst of uitvoering betekenen; leg het verschil vast. Bij herstart moet replaybeleid niet vergeten worden: de kleine lesvalidator bewaart alleen een set in RAM en toont dus nog geen volledige herstartbeveiliging. Een productiecontract vraagt boot/sequence, duurzame toestand of een aantoonbaar nieuwe sessie.
| onderdeel | voorbeeld |
|---|---|
| data | temp_C, meettijd, kwaliteit |
| voorstel | id, rol, modus, vermogen, TTL |
| antwoord | aanvaard/geweigerd met reden |
| fout | verlopen, bereik, onbekende versie |
| fysiek | bus, adres, niveau en actor-eigenaar |
Eisen in een echt contractprogramma
De vijf tests refereren aan eis-ID's en toetsen grensgevallen met een expliciete klok. De uitkomst is een voorstelstatus, geen pinactie. Tijd is relatieve monotone tijd; logs krijgen daarnaast UTC+1. Een echt geïntegreerde versie vraagt lokale uitvoering, herstartcontract en fouttests. De canonieke config en SHA-256 identificeren deze configuratie; zij bewijzen geen inhoudelijke juistheid.
from dataclasses import dataclassimport math,unittest,json,hashlib,io@dataclass(frozen=True)class Voorstel: id: str tijd_s: float modus: str vermogen_W: float ttl_s: float=60.class Supervisor: # Contractvoorbeeld voor de e39-stationsheater, geen pinbesturing. def __init__(self): self.gezien=set() def beoordeel(self,p,nu,modus): if not isinstance(p,Voorstel): return False,"schema" if not isinstance(p.id,str) or not p.id: return False,"id" if not all(not isinstance(v,bool) and isinstance(v,(int,float)) and math.isfinite(v) for v in (p.tijd_s,p.vermogen_W,p.ttl_s,nu)): return False,"niet-eindig" if not 0<p.ttl_s<=60: return False,"ttl" if not 0<=nu-p.tijd_s<=p.ttl_s: return False,"tijd" if p.modus not in ("DAG","NACHT") or p.modus!=modus: return False,"modus" if not 0<=p.vermogen_W<=2000: return False,"bereik" if p.id in self.gezien: return False,"dubbel" self.gezien.add(p.id) return True,"voorstel-goedgekeurd"class Eisen(unittest.TestCase): def test_RF02_grenzen(self): for w,ok in [(-1,False),(0,True),(2000,True),(2001,False)]: self.assertEqual(Supervisor().beoordeel(Voorstel("a",10,"DAG",w),10,"DAG")[0],ok) def test_RN03_tijd(self): for tijd,ok in [(9,False),(10,True),(70,True),(70.001,False)]: self.assertEqual(Supervisor().beoordeel(Voorstel("a",10,"DAG",500),tijd,"DAG")[0],ok) def test_RF03_replay(self): s=Supervisor(); p=Voorstel("a",10,"DAG",500) self.assertTrue(s.beoordeel(p,11,"DAG")[0]) self.assertEqual(s.beoordeel(p,12,"DAG"),(False,"dubbel")) def test_RF04_modus(self): self.assertEqual(Supervisor().beoordeel(Voorstel("a",10,"NACHT",500),11,"DAG"),(False,"modus")) def test_RF02_niet_eindig(self): for v in (float("nan"),float("inf")): self.assertFalse(Supervisor().beoordeel(Voorstel("a",10,"DAG",v),11,"DAG")[0])res=unittest.TextTestRunner(stream=io.StringIO()).run(unittest.defaultTestLoader.loadTestsFromTestCase(Eisen))print("contracttests",res.testsRun,"fouten",len(res.errors)+len(res.failures))config={"telemetrie_s":60,"leeftijd_s":90,"voorstel_ttl_s":60,"eigenaar":"lokale-regelaar"}canon=json.dumps(config,sort_keys=True,separators=(",",":"))print("config",canon)print("configsha256",hashlib.sha256(canon.encode()).hexdigest())assert res.wasSuccessful()contracttests 5 fouten 0
config {"eigenaar":"lokale-regelaar","leeftijd_s":90,"telemetrie_s":60,"voorstel_ttl_s":60}
configsha256 a1af993a3928302047806313be9d7061030b8f7358dfd8f0fb42a2f3b0756988Het V-model koppelt ontwerp aan bewijs
Links specificeer en ontwerp je van gebruikersdoel naar systeem, interfaces en componenten. Onderin realiseer je de onderdelen. Rechts toets je componenten, integreer je interfaces, verifieer je systeemeisen en valideer je het beoogde gebruik. De lijnen over de V verbinden de bronvraag met passend bewijs.
Een testontwerp begint bij het schrijven van de eis. Daardoor kunnen proefopstelling, meetbereik en instrumenten tijdig worden voorzien. Iteratie blijft mogelijk: een integratiefout kan de interface terug naar review sturen. Het model ordent bewijsniveaus en is geen verplicht lineair tijdschema.
Verificatie is niet hetzelfde als validatie
- de softwaretoets en sensorproef zijn geslaagd
- welke vraag blijft open?
- 1Verificatie kan geslaagd zijn: de gespecificeerde band is uitgevoerd. Validatie kan toch falen: de functie ondersteunt het echte teeltdoel onvoldoende.
- 2Ga terug naar behoefte en randvoorwaarden, niet alleen naar een softwarebug. Onderzoek teelt, meetplaats en het bedoelde dag/nachtregime met passende referentie.
- 3Een eiswijziging krijgt rationale, impactanalyse en nieuwe toetsen. Het oude groene resultaat geldt uitsluitend voor de oude eis/configuratie.
Een trade-off begint met harde voorwaarden
Vergelijk haalbare alternatieven op dezelfde functie en systeemgrens. Harde voorwaarden zoals lokale actuatorbeheersing worden eerst gecontroleerd. Een alternatief dat daar niet aan voldoet wordt geen winnaar door een goedkope prijs.
Gebruik daarna criteria met een gedocumenteerde schaal en gewichten. Scores zijn beoordelingen, geen nauwkeurige fysische kansen. Vermijd dubbeltellen van hetzelfde voordeel onder meerdere namen. Noteer bronnen, onzekerheid en gevoeligheid. Een robuuste keuze verandert niet bij iedere kleine aannamenwijziging.
| alternatief | sterk punt | belangrijk onderzoek |
|---|---|---|
| A Pi + lokale MCU | functies verdeeld | interfaces en terugval |
| B alleen Pi | eenvoudige centrale doos | faalt lokale eigenaarseis |
| C twee Pi + lokale MCU | centrale reserve | gemeenschappelijke oorzaak, extra beheer |
Scores en gevoeligheid uitrekenen
De scores 0–5 zijn expliciete fictieve ontwerpbeoordelingen. B wordt door een harde eis uitgesloten. De gevoeligheidsproef verhoogt alleen het gewicht van betrouwbaarheid en houdt overige verhoudingen vast. Zij toont wanneer een andere prioriteit A en C gelijkwaardig maakt.
import numpy as npcriteria=["betrouwbaarheid","onderhoud","kosten","energie","reactie"]w=np.array([.30,.25,.20,.15,.10])scores=np.array([[4,4,4,4,3],[2,3,5,5,5],[5,3,2,2,4]],float)namen=["A Pi+lokaleMCU","B alleenPi","C tweePi+lokaleMCU"]for n,v in zip(namen,scores@w): print(n,"score",round(v,3))restA=scores[0,1:]@w[1:]/.7restC=scores[2,1:]@w[1:]/.7grens=(restA-restC)/(scores[2,0]-scores[0,0]+restA-restC)print("A/C gelijk bij gewicht betrouwbaarheid",round(grens,6))print("B voldoet niet aan harde eis lokale actuator-eigenaar")A Pi+lokaleMCU score 3.9 B alleenPi score 3.6 C tweePi+lokaleMCU score 3.35 A/C gelijk bij gewicht betrouwbaarheid 0.548387 B voldoet niet aan harde eis lokale actuator-eigenaar
Een keuze met een breekpunt
- overige gewichten proportioneel
- besluit en gevoeligheid
- 1De resterende gewogen gemiddelden zijn A=3,857143 en C=2,642857. Gelijkheid geeft 4r+3,857143(1−r)=5r+2,642857(1−r).
- 2Oplossen geeft r=0,548387. Bij r=0,55 wordt C nipt beter volgens deze scores.
- 3Onderzoek of zo'n gewichtsverandering werkelijk past bij de gebruiksbehoefte. Extra centrale computers delen mogelijk voeding, software of netwerk; de score 5 is geen bewezen onafhankelijke redundantie.
Configuratiebeheer bewaart het geheel
Een systeemversie omvat software, firmware, schema, pin/adreslijst, kalibratie, modelparameters, datasets en eisen. Een Git-commit alleen is onvoldoende als de dataset of ingestelde sensorcorrectie buiten het repository verandert. Bewaar een manifest met identifiers, hashes, toolversies en verantwoordelijke.
Een baseline bevriest een samenhangende referentie. Een wijzigingsverzoek beschrijft trigger, betrokken eisen/interfaces, risico, toetsimpact en terugrol. Maak de testomgeving reproduceerbaar en vergelijk werkelijk gebruikte configuratie met het manifest. Een hash toont identiteit; hij zegt niet dat een bestand goed of bevoegd is.
| manifestveld | doel |
|---|---|
| commit/firmware | implementatie |
| eisen/interfaceversie | betekenis |
| kalibratie/model | rekenwaarden |
| dataset en hash | proefherkomst |
| test-ID/resultaat | bewijs |
| terugrolbaseline | herstel |
Een kleine sensorwijziging heeft systeemimpact
- hardwareplaats gelijk
- lokale regeling en centralelog gebruiken de waarde
- wijzigingsroute
- 1Leg referentiemeting, onzekerheid, datum en kalibratieversie vast. Bepaal welke regel-, alarm- en modeltests door de offset veranderen.
- 2Pas precies één aangewezen correctielaag aan: dubbele correctie lokaal én centraal verschuift −0,6 K. Toets ruwe en gecorrigeerde logvelden en interfacebetekenis.
- 3Voer relevante acceptatietoetsen opnieuw uit en koppel hun resultaten aan de nieuwe baseline. Bewaar terugrol en controleer wat historische dataherberekening vraagt.
Systems engineering houdt verschillende experts samen
Een fictieve review van Habitat vindt geen groot algoritmeprobleem, maar een interfacefout: de planner noemt elektrisch vermogen, terwijl de warmtebalans thermisch vermogen verwacht. Beide teams hebben hun eigen component correct getest. De systeemreview legt een COP- en eenhedencontract vast en verlangt een integratieproef.
Deze manier van werken is ook zichtbaar in het primaire NASA Systems Engineering Handbook: systeemontwerp, productrealisatie en technisch beheer worden met elkaar verbonden. De les past die gedachte op een klein station toe en claimt geen NASA-procescertificering. Geraadpleegd 30-09-2026.
| lokale waarheid | systeemvraag |
|---|---|
| vermogen klopt | welke grens en eenheid? |
| sensor klopt | tijd, meetplaats en ijking? |
| softwaretest groen | welke versie en interface? |
| score hoog | bedoeld gebruik echt geholpen? |
Het bewijsregister
| bewijssoort | kan aantonen | grens |
|---|---|---|
| inspectie | schema/manifest overeenstemming | geen dynamische prestatie |
| analyse | balans/timing onder aannamen | aannamen toetsen |
| test | gedrag in proefgebied | geen onbeperkt altijd |
| demonstratie | bruikbaarheid in scenario | aanvullende meetgrenzen |
Het stationsbrein wordt een toetsbare versie
Eisen bepalen hoe algoritmen, lokale controllers en operator samenwerken. De integratieproef gebruikt één samenhangende baseline en houdt beide energienetten herkenbaar.
Contracten en verantwoordelijkheden.
Tijd, berichten en lokale eigenaar.
Begrensde AI-rol.
Storingseisen en onafhankelijkheid.
Rapport en projectbewijs.
Habitat krijgt een eisenboom met unieke ID's, architectuur/interfaces, testmatrix en versiebeheer. Voorbeeldcriteria worden pas behaalde eisen na centrale simulatie- en hardwareproef; er wordt geen veiligheidscertificaat uit de lescode afgeleid.
In het kort
- Behoeften worden meetbare eisen met eigenaar en bewijs.
- Architectuur verdeelt functies en interfaceverantwoordelijkheid.
- Verificatie toetst eisen; validatie toetst bedoeld gebruik.
- Trade-offs vergelijken haalbare opties en tonen gevoeligheid.
- Configuratiebeheer bewaart eisen, realisatie en bewijs als één versie.
Wat je nu kent
- functionele eis
- Een beschreven dienst of handeling die het systeem moet leveren.
- niet-functionele eis
- Een kwaliteit, beperking of randvoorwaarde van die dienst.
- verificatie
- Aantonen dat de gerealiseerde versie aan de gespecificeerde eisen voldoet.
- validatie
- Aantonen dat het systeem voor het beoogde gebruik geschikt is.
- baseline
- Een vastgelegde samenhangende versie als referentie voor bouwen en beoordelen.