Systeemontwerp digitale Modelbaanbesturing


Versie 0.8

Rob Hamerling
Vianen, The Netherlands

E-mail: digithalys@gmail.com
homepage: http://www.robh.nl/

Copyright © R. Hamerling, 1991, 2006
All Rights Reserved.

Niets uit dit document mag worden verveelvoudigd en/of openbaar gemaakt door middel van druk, fotokopie, elektronisch of op welke andere wijze dan ook. Evenmin mag dit document publiekelijk beschikbaar worden gesteld, zoals op een Bulletin Board of Internet Site. Het in dit document beschreven ontwerp is uitsluitend bestemd voor het maken van een besturingsprogramma voor eigen privé gebruik, voor andere doeleinden is toestemming van de auteur benodigd.

De lezer verplicht zich om fouten en onvolkomenheden te rapporteren. Vragen en suggesties ter uitbreiding of verbetering worden gaarne tegemoet gezien.


Inhoudsopgave

Bijlagen


Inleiding

Dit document bevat een ontwerp van een automatisch beveiligingssysteem voor een modelbaanemplacement uitgaande van het Märklin Digital systeem, of equivalenten daarvan. De beschrijving is zo universeel dat deze ook voor andere merken en typen computer bestuurde modelbanen bruikbaar is, zoals voor op NMRA/DCC gebaseerde systemen en de IntelliBox.

Het ontwerp omvat de beschrijving en organisatie van software voor een 'willekeurig' computersysteem, dat communiceert met een modelbaansysteem. Het is het resultaat van gezamenlijke inspanningen en creativiteit van Hans van den Asch, Rob Hamerling, en Renate de Rijk.


Doel

Dit hoofdstuk geeft een globale beschrijving van het ontwerp met doelstellingen en afbakening.

Doelgroep

Het ontwerp is bestemd voor diegenen die overwegen zelf een te computer programma schrijven voor besturing van een modelspoorbaan. Anders gezegd: dit document is niet bestemd voor diegenen die een kant en klaar modelbaanbesturingsprogramma zoeken!

Doelstelling

Dit projekt beoogt te voorzien in een ontwerp van een software gestuurde modelspoorbaan uitgaande van het Märklin Digitaal systeem. Op basis van dit ontwerp kan voor elke combinatie van computer en programmeertaal, maar ook voor andere digitale modelbaan systemen een programma worden gemaakt.

De treinen op deze baan zullen vrij lopen, en mogen hun eigen weg en snelheid kiezen. Door besturing van treinen zal de regelcomputer ervoor moeten zorgen dat geen ongelukken gebeuren.

Beïnvloeding van de treinenloop is alleen voorzien via de computer, welke ervoor dient zorg te dragen dat deze besturing binnen de vrijheidsgrenzen van het beveiligingssysteem liggen.

Uitgangspunten

Bij het opstellen van het ontwerp hebben we ons de volgende eisen opgelegd:

Grote aantallen (korte) baanvakken, en veel gelijktijdig rijdende treinen zullen hoge eisen stellen aan de performance en geheugengebruik van de computer. Voor zover mogelijk zullen hiervoor (t.z.t.) richtgetallen worden gegeven.

Randvoorwaarden

Het ontwerp gaat uit van de volgende veronderstellingen:

Dimensies

Teneinde het ontwerp toepasbaar te maken ook op minder krachtige computers worden enkele 'vrijwillige' ontwerp-grenzen in acht genomen. Deze liggen binnen de grenzen van de meeste digitale modelbaansystemen.

Deze grenzen worden voldoende ruim geacht voor de meeste particuliere modelbanen.


Definities

In dit document wordt getracht eenduidige termen te gebruiken, welke hier en daar wellicht afwijken van de gebruikelijke in (model-)spoorweg kringen. Raadpleeg Verklaring van Termen voor onze terminologie.

Baanvak, wisselstraat, kruising

Het is van groot belang om goed te begrijpen wat de termen 'baanvak' en 'wisselstraat' in dit document betekenen.

Een 'gewoon' baanvak is een rijweg zonder wissels of kruisingen. Het berijden of reserveren ervan heeft geen invloed op de (bezet of reservering-) status van andere baanvakken.

Het vrijmaken van een baanvak kan wel afhankelijk zijn van situaties op andere baanvakken.

Wisselstraten zijn op te vatten als overlappende baanvakken. Een wisselstraat heeft alle eigenschappen van een gewoon baanvak, maar het berijden of reserveren ervan heeft invloed op een of meer andere wisselstraten welke deze overlapt. In vele opzichten wordt een wisselstraat afgehandeld als een gewoon baanvak, maar in een aantal situaties dienen extra handelingen te worden uitgevoerd in verband met de invloed op andere baanvakken.

De afhandeling van een wisselstraat geschiedt aan de hand van de volgende regels:

Voorbeeld van wisselstraten

Plaatje t.b.v. begrip wisselstraat


W1 t/m W5 zijn de mogelijke rijwegen tussen A, B, C en D (heen en terug). Bij reservering van W1 moeten W3, W4 en W5 worden geblokkeerd, W2 blijft vrij voor een andere trein. Wissels 1 en 4 worden 'rechtdoor' geschakeld (indien nodig), wissels 2 en 3 worden niet geschakeld.

Zie ook Programmeertechniek gekoppelde wisselstraten voor programmeringsaspekten van deze afhandeling.

Bij kruisingen hebben we te maken met een tussenvorm van een normaal baanvak en een wisselstraat: er zijn geen wissels, maar overigens heeft het alle kenmerken van een groep wisselstraten. Wanneer een van de rijwegen wordt gereserveerd, dienen kruisende rijwegen eveneens te worden gereserveerd. Om deze reden wordt het begrip 'kruising' niet afzonderlijk gehanteerd, maar gelijk gesteld aan 'wisselstraat' zonder wissels.

Eenheden

Voor de modelbaan wordt het cgs-eenhedenstelsel gehanteerd:

centimeter
voor lengtematen en baan-coördinaten
gram
voor (gesimuleerde) massa
seconde
voor tijdsduur

Hieruit afgeleide eenheden zijn onder meer:

cm/s
voor snelheden. Achterwaartse trein-snelheid wordt in de tabellen uitgedrukt met een negatief getal.
Het is de vrijheid van de programmeur om voor snelheid te werken met de snelheidstappen van het Interface, maar een conversie naar cm/s is nodig bij berekening van remwegen en baanvakreserveringen.
cm/s²
voor versnelling en vertraging

Notes:

Op het hoogste niveau wordt het rollend materieel beschreven in de treintabel, met voor elke trein een doorverwijzing naar een of meer andere tabellen.

In onderstaande figuur is schematisch de samenhang tussen de voornaamste tabellen voor het rollend materieel opgenomen.

Samenhang van de tabellen voor het rollend materieel.

Overzicht tabellen rollend materieel

Trein gegevens

De gegevens, welke per trein worden vastgelegd, zijn vermeld in de onderstaande tabel.

Trein tabel
Naam Type Omschrijving
id ident Identificatie (naam of nummer)
nm string Naam van de trein
loc ident Identificatie van de actieve locomotief aan kop van de trein
ws ident- array Array van identifikaties van toegewezen wagons
ll word Totale lengte van de trein
pos ident Positie (baanvak-identificatie) van kop van de trein in actuele rijrichting
rb flag Berijdingsrichting van het baanvak ('heen' of 'terug', zie baanvaktabel). Dit gegeven kan worden afgeleid bij binnenrijden van het baanvak aan de hand van het baanvak-id van waaruit de trein afkomstig is.
tb time Tijdstip van binnenkomst in dit baanvak (o.a. voor berekening positie binnen dit baanvak)
rw word Reden van stilstand of wachten (station, baanvak bezet, claim op wisselstraat-id, etc.)
t0 time Tijdstip van tot stilstand komen
wm time Wachttijd minimaal of maximaal (afhankelijk van reden)
rrb flag Rijrichting in baanvak (heen=0, terug=1). Dit gegeven bepaalt welke van de twee groepen rijrichting afhankelijke baanvakgegevens moeten worden geraadpleegd (zie Baanvak tabel).
swns short Gewenste rijsnelheid. Dit is de snelheid welke bij voorkeur wordt aangehouden, in opdracht van 'externe' besturing (modelbaanbeheerder of dienstregeling). De snelheid wordt uitgedrukt in een positief getal voor voorwaarste beweging, en negatief voor achterwaartse beweging.
sfor short Geforceerde rijsnelheid. Deze heeft in principe dezelfde betekenis als 'swns', maar is opgelegd door 'interne' faktoren.
Wanneer er geen interne beperkende faktoren geldig zijn, bevat dit veld de waarde van 'swns'.
sact short Actuele rijsnelheid
remw word Actuele remweg.
NB: Hoewel de waarde van de 'natuurlijke of gesimuleerde' remweg kan worden afgeleid uit de overige treingegevens, is dit getal zo vaak nodig dat eenmalig berekenen bij een snelheidswisseling en opslaan in de treintabel efficiënter zou kunnen zijn. De berekening van de remweg is niet zo erg simpel, zie Berekening Remweg.
tupd time Tijdstip van laatste snelheidsverandering (in verband met simulatie van aanloop- en rem-vertraging).
sa word Gesimuleerde massa aanloop-traagheid voor gehele trein. Zie voor deze en volgende 2 variabelen de overeenkomstige variabele in Loc tabel.
su word Gesimuleerde massa rem-vertraging voor gehele trein
sw word Snelheidcorrectie voor de loc-aansturing voor gehele trein als gevolg van warmlopen (in procenten)
bva ident Array van baanvakken achteraan gereserveerd gehouden, en nog vrij te geven.
NB: Van vooruit gereserveerde baanvakken worden alleen in de baanvaktabel zelf aangegeven door welke trein ze gereserveerd zijn.
NB: Vermoedelijk redundant informatie bij continue bezetmeldsystemen.
best ident Verwijzing naar besturingsgegevens. Dit zal over het algemeen 'dienstregelingsinformatie' zijn. Zie voor details Dienstregelingstabel.
Wanneer 'random' wordt gereden is deze pointer 'nul'.

Loc gegevens

De gegevens welke per locomotief zijn vastgelegd, zijn vermeld in

Loc tabel
Naam Type Omschrijving
id string Identificatie van de loc.
ty byte Type aanduiding (zie Classificatie)
ad byte adres
ll word Lengte in cm
fu flag Funktie: aan/uit en soort (licht, stoom, koppeling, etc)
smin byte Minimum rijsnelheid (-getal)
smax byte Maximum rijsnelheid (-getal)
dtyp word decoder type (Märklin C80, C90, Lenz, DCC, etc.)
sa word Gesimuleerde massa voor aanloop-traagheid. Dit getal wordt uitgedrukt in het minimum aantal milliseconden tussen twee opeenvolgende snelheidswisselingen.
su word Gesimuleerde massa voor rem-vertraging
sw word Correctiefaktor voor de snelheid door warmlopen
sxv short- array Vertaaltabel van snelheidscommando in voorwaartse rijrichting naar werkelijke snelheid (cm/s). Gegevens benodigd voor berekening van remweg. Middels doorzoeken ook omgekeerd bruikbaar (cm/s -> commando).
sxa short- array Als sxv, maar in achterwaartse rijrichting.

Wagon gegevens

Per wagon worden de gegevens in als vermeld in vastgelegd.

Wagon tabel
Naam Type Omschrijving
id string Identificatie van de wagon
ty ident Type code aanduiding (zie Classificatie)
ad byte adres (voor zover aanstuurbaar)
ll word lengte
sa word Snelheidcorrectie: gesimuleerde massa voor aanloop-traagheid
su word Snelheidcorrectie: gesimuleerde massa voor rem-vertraging
tr ident Identifikatie van de trein waarvan deze wagon deel uitmaakt.


Funkties

Voor het ontwerp is onderscheid gemaakt tussen de volgende funktionele hoofd-elementen van een ge-automatiseerde modelbaan:

Dit ontwerp concentreert zich voornamelijk op het beveiligingssysteem en in mindere mate op besturing. Presentatie zal later verder worden uitgewerkt.

Hoofdschema

Hoofdschema programmastructuur

Benodigde Funkties Algemeen

Enkele uitgangspunten:

De volgende elementaire Technische Funkties zijn benodigd:

Voor de beveiliging zijn tenminste de volgende Logische Funkties benodigd:

Technische Funkties

Technische functies zijn tamelijk systeem-afhankelijk en zijn hier niet verder uitgewerkt.

Logische Funkties

Hieronder volgt voor enige van logische functies de pseudo code.

Baanvak reservering

Het reserveren van een baanvak of wisselstraat is onherroepelijk Maar zie wel Claim.

Reservering mag pas geschieden wanneer de trein 'goede vooruitzichten' heeft op vervolgen van zijn weg. Eenmaal gereserveerde baanvakken zullen alleen door bewegingen van deze trein weer vrijkomen.

Na reservering moet de trein het baanvak ook gaan berijden. Door niet meer vooruit te reserveren dan noodzakelijk is om de remweg te voltooien dan lijkt dit een triviale stelling. Er moet echter rekening worden gehouden met doorrijverplichtingen en minimum en maximum voorgeschreven baanvaksnelheden. Wanneer hiervan sprake is, moet de trein dus zover doorrijden als ie op enig tijdstip gereserveerd heeft. Alvorens te reserveren dient dus te worden nagegegaan of de trein aan zijn 'verplichtingen' kan voldoen.

Wanneer de trein door welke oorzaak dan ook tot stilstand komt vòòr het laatst gereserveerde baanvak, dienen alle reeds gereserveerde, maar nog niet bereden baanvakken onmiddellijk te worden vrijgegeven.

Reserveren van een baanvak (of wisselstraat)

  bereken remweg
         /* zie verder in dit hoofdstuk */
  verminder met al gereserveerde baanvakken
  while (rest > 0)
    selecteer aansluitend baanvak
         (zie Rijweg Selectie)
    if (vrij baanvak gevonden, of
        eerder voor deze trein gereserveerd)
      reserveer dit baanvak
      selecteer rijrichting gegevens
      verminder 'rest' met lengte baanvak
      if (doorrijverplichting)
        stel 'rest' = treinlengte (*)
      endif
    else
      afremmen
      break   /* spring uit while-loop */
    endif
  endwhile

(*) Wanneer de genoemde 'variant' van doorrijverplichting wordt toegepast, kan in plaats van 'treinlengte' de waarde '1' worden gebruikt. Dit heeft het effekt dat tenminste wordt doorgereden tot het volgende baanvak.

NB:

Rijweg selectie

Selekteren van een rijweg.

  bepaal laatst gereserveerde baanvak
  bepaal eerstvolgende aansluiting
  if (gewoon baanvak of kruising)
    if (vrij)
      reserveer
      if (kruising)
        reserveer gekoppelde baanvakken
      endif
    else
      afremmen
    endif
  else (wisselstraat)
    for (aansluitende wisselstraten in groep)
      neem eerstvolgende wisselstraat
      if (vrij en verkieselijk)   (*)
        reserveer
        for (alle gekoppelde wisselstraten)
          blokkeer wisselstraat
           /* verhoog blokkeerteller met 1 */
        endfor
        schakel wissels van deze wisselstraat
                    /* indien nodig */
      endif
    endfor
    if (geen vrije baan beschikbaar)
      afremmen
    endif
  endif

(*) Bij het selecteren van een vrije wisselstraat kan rekening worden gehouden met een random verkiezingspatroon voor een 'willekeurige' treinenloop. Hierbij kan de random selectie eventueel nog worden bijgesteld met een selectiepercentage zoals opgenomen in de baanvaktabel.

Programmeertechniek gekoppelde wisselstraten

Neem als voorbeeld een groep van 5 wisselstraten zoals in Voorbeeld wisselstraten. Stel hiervoor een onderling beïnvloedingsmatrix op, zoals hieronder

       W1 W2 W3 W4 W5
   W1   x     x  x  x
   W2      x  x  x  x
   W3   x  x  x  x  x
   W4   x  x  x  x  x
   W5   x  x  x  x  x

Wanneer een wisselstraat wordt gereserveerd (een van de wisselstraten in de linker kolom), dan dienen alle wisselstraten, waarvoor in de overeenkomstige rij van de matrix een 'x' voorkomt, te worden geblokkeerd. Het blokkeren bestaat uit het verhogen van de blokkeer-teller met 1, het de-blokkeren met het verlagen van deze teller met 1. Op deze wijze kunnen niet-bereden wisselstraten door meer dan een trein worden geblokkeerd. En het is niet nodig aan te geven door welke trein de blokkering plaats vindt. Voor vrijgeven geldt hetzelfde.

Wanneer we de matrix (kunnen) programmeren als bitstring, dan kunnen we met een eenvoudige 'OR'-bewerking de gekoppelde wisselstraten reserveren, en met een 'AND' deze weer vrij geven. Deze bewerkingen moet voor elk van de wisselstraten in de groep identiek worden uitgevoerd.

Vrijgeven van een baanvak

Het vrij komen van een 'gewoon' baanvak wordt geïnitieerd door een verandering van een terugmelding van 'bezet' (1) naar 'vrij' (0). Het vrijkomen van een baanvak zonder fysieke terugmelding kan pas met zekerheid worden vastgesteld wanneer een trein het aansluitende uitrijbaanvak vrij geeft.

  bepaal welke trein baanvak bezet hield
  if (gewoon baanvak of kruising)
    geef baanvak vrij
    geef voorgaande baanvakken vrij
    verwijder baanvak uit reserveringsarray
    if (kruising)
      geef gekoppelde baanvakken vrij
    endif
  if (voorgaande baanvak wisselstraat)
    for (alle daaraan gekoppelde wisselstraten)
      de-blokkeer wisselstraat
        /* verminder blokkeerteller met 1 */
    endfor
  endif

Bij toepassing van continue terugmelding dient bovendien nog rekening te worden gehouden met de volgende aspekten:

Bij toepassing van 'puntkontakten', in tegenstelling tot continue terugmelding, is geen sprake van 'fysieke bezetmelding', en dient volledig te worden afgegaan op 'logische' bezetmelding.

Berekening remweg

Benodigde gegevens voor berekening van de remweg zijn:

variabele omschrijving
v Actuele snelheid van de trein t gesimuleerde massa (tijd tussen 2 opeenvolgende snelheidswisselingen)
n Aantal stappen tot bereiken van snelheid 0
s Snelheidsverandering in cm/s per stap.

De formule voor de remweg bij eenparige (geleidelijke, regelmatige) snelheidsvermindering is dan:

   ½ * (v + s) * n * t

In onderstaande figuur wordt een voorbeeld gegeven.

Voorbeeld van de berekening van een remweg

Berekening remweg

Deze formule veronderstelt dat zowel de staptijd als het snelheidsverschil steeds gelijk is. Calculeer een veiligheidsmarge t.b.v. de volgende effekten:

Met deze correcties wordt in de volgende pseudocode enigszins rekening gehouden.

  neem actuele snelheid
  neem gesimuleerde massa (staplengte)
  stel remweg = 0
  stel snelheid = actuele snelheid
  while (snelheid > 0)
    vermeerder remweg met (snelheid * staptijd)
    calculeer een vertragingstijd in
    verminder snelheid met stap verschil
  endwhile

Hierin dient steeds bij elke waarde van het -snelheidsgetal de bijbehorende werkelijke (gecalibreerde) snelheid worden opgezocht, middels de vertaal-array in de loctabel.
Wanneer de positie van de trein binnen een baanvak niet precies bekend is, neem dan het ongunstigste geval: de trein bevindt zich aan het einde van het baanvak.
Bij langere baanvakken, of wanneer om andere reden terugmeldingen relatief ver uit elkaar liggen, moet rekening worden gehouden met mogelijke toename van de treinsnelheid gedurende de periode tussen opeenvolgende terugmeldingen. De remweg waarvan uitgegaan is bij betreden van het volgende baanvak is daardoor langer dan die waarmede op tijdstip van reserveren is rekening gehouden. Op dat punt kan deze dus langer zijn dan de gereserveerde baanvak ruimte.

De bovenstaande methode is bijvoorbeeld geschikt voor Märklin C80 decoders, waarbij de snelheid van de trein (vrijwel) onmiddellijk na ontvangst van het commando overeenkomt met de calibratie-snelheid. Bij toepassing van Märklin C90-decoders met ingeschakelde vertraging is dat niet het geval. Hierbij is de remweg langer dan volgens de bovenstaande berekening. Een voor decoders met ingebouwde vertraging veilige berekeningsmethode voor de remweg is de volgende:

  stel remweg = 0
  stel snelheid_1 = actuele snelheid
  while (snelheid_1 > 0)
    stel snelheid_2 = snelheid eerstlagere stap
    vermeerder remweg met (snelheid_1 + snelheid_2) / 2 * (staptijd + extra)
    stel snelheid_1 eerstlagere stap
  endwhile

Hierin is 'extra' een vertragingstijd tussen het tijdstip dat het volgende snelheidscommando moet worden gegeven en het tijdstip dat dit commando werkelijk door de loc wordt uitgevoerd (200 ms?)
NB: Bij deze methode is het noodzakelijk dat de in een loc decoder ingebouwde vertraging 'licht' is ingesteld (relatief weinig effect heeft).

Claim

Wanneer een trein een geselecteerde rijweg volgt, maar zijn weg niet kan vervolgen omdat de rijweg niet voor deze trein beschikbaar is (bezet of door een andere trein gereserveerd), kan deze trein een claim op het voor hem volgende baanvak leggen. De claim wordt niet in de baanvak-tabel maar in de treintabel vastgelegd.

Het kan voorkomen dat een baanvak door meer dan een trein wordt geclaimd (bijvoorbeeld een uitrijbaanvak na een station). Via treinclassificatie wordt een voorrangsregeling in werking gesteld Deze voorrangsregeling zal hier niet verder worden uitgewerkt.

In bedrijf stellen en afsluiten

De programmatuur voor de modelbaan bevat twee soorten informatie

De eerste categorie gegevens kunnen 'vast' in het programma worden opgenomen. Voor de tweede categorie moeten voorzieningen zijn om de inhoud van de tabellen in overeenstemming te brengen met de actuele situatie van de modelbaan. Dit is met name van toepassing op treinposities.

We onderscheiden verschillende opstart en beëindigings procedures

Deze begrippen worden hierna verder gedefinieerd en uitgewerkt.

Koude start

Een koude start is die waarbij de samenstelling van treinen en de positie van het rollend materieel overeenkomt met de 'nul.-stand van de tabellen in het beveiligingsprogramma. Dit is een situatie die in de werkelijkheid niet vaak zal voorkomen, maar wel bij de eerste tests van het programma, wanneer nog geen voorzieningen voor een warme start zijn ingebouwd.

Normale beëindiging

Bij normale beëindiging wordt het rollend materieel geleidelijk tot stilstand gebracht op een 'veilige' plaats (niet in baanvakken met doorrijverplichting of op wisselstraten, e.d.). Deze situatie wordt vervolgens opgeslagen op disk ten behoeven van de hieropvolgende warme start.

Warme start

Bij een warme start worden de tabellen in het programma opgebouwd en geïnitialiseerd met de waarden welke bij een voorgaande normale beëindiging zijn opgeslagen. Voorwaarde is uiteraard dat er geen handmatige veranderingen aan de baan of het rollend materieel heeft plaats gevonden.

Noodstop en Herstart

Die situaties, waarbij automatisch of handmatig ingrijpen nodig is, zullen in het algemeen worden gevat onder noodstop. Voorbeelden van dergelijke situaties:


Besturing

Principes

De besturing van het emplacement 'van buitenaf' is een afzonderlijke taak, welke onder controle geschiedt van de beveiligings-taak.

In principe worden alleen die commando's geaccepteerd welke binnen de vrijheidsgrenzen van het beveiligingssysteem liggen. Er is een keuzemogelijkheid voor niet uitvoerbare commando's

De eerste mogelijkheid is het eenvoudigst, maar de tweede mogelijkheid biedt mogelijkheden voor dienstregelingen! Zie ook onder Claim.

Dienstregeling

Wanneer treinen een vooraf bepaalde koers dienen te volgen, dient hiertoe de informatie te worden vastgelegd zoals opgenomen in de onderstaande tabel.

Dienstregelingstabel
Naam Type Omschrijving
id string Identificatie (naam of nummer) van de dienstregeling
kbv array Array van baanvaknummers welke de gewenste koers aangeeft. Het laatste baanvak van de array dient aan te sluiten op het eerste baanvak in de array.
ksp array Snelheid per bijbehorend baanvak in kbv.
kf array Funkties uit te voeren per bijbehorend baanvak (wachten, lokfunctie, etc).
NB: Dit veld wordt later nader uitgewerkt en dient waarschijnlijk te worden uitgebreid.


Presentatie

De presentatie van het emplacement en de treinbewegingen is een taak welke geheel los staat van de beveiliging. Er is eventueel een koppeling met de besturingstaak (bijvoorbeeld het omzetten van wissels door gebruik van muis-handelingen, o.i.d.).

Namen en/of identifikaties

Classificatie
Index Type Omschrijving
1 string "TEE loc"
2 string "Rangeerloc"
3 string "Stoomloc 2E3"
4 string etc. . .
5 string "Personen 1-e"
6 string "Personen 2-e"
7 string "Restauratie"
? string etc. . .

Tabel Baanvak Geometrie

Per baanvak en wisselstraat zijn de in vermelde gegevens opgenomen.

Baanvak en wisselstraat coördinaten
Naam Type Omschrijving
id string Identificatie
X1, Y1 short x- en y-coördinaat van beginpunt ('heen.-richting)
Xn, Yn short x- en y-coördinaat van volgpunten
0, 0 short eind-aanduiding van array (bij array met variabele lengte)


Bijlagen


A. Verklaring van Termen

Eenheden

flag
Indicator welke 2 standen kan innemen: 0 of 1 (een enkel bit, of een 'char' met '0' of '1').
char
Character, of geheel getal waarde zonder teken (0 t/m 255)
byte
Geheel getal van 8-bits met teken (-128 t/m +127).
short
(integer) Geheel getal van 16 bits, of gelijkwaardige vorm, met een bereik van -32768 (-2^15) t/m +32767 (2^15 - 1)
word
Geheel getal van 16-bits zonder teken-bit, met een bereik van 0 t/m 65535 (2^16 - 1)
ident
Variabele voor object identifikatie. De type-invulling wordt aan de programmeur overgelaten. Een 'byte' of 'word' lijken de meest voor de hand liggende typen voor deze variabele.
long
Geheel getal van 32 bits, of gelijkwaardige vorm, met een bereik van -2147483648 (-2^31) t/m +2147483647 (2^31 - 1).
dword
(doubleword) Geheel getal van 32 bits zonder teken met een bereik van 0 t/m +4294967295 (2^32 - 1)
time
Tijdstip of tijdsduur. Tijdsduur wordt uitgedrukt in milliseconden, tijdstip in een relatief getal in milliseconden t.o.v. een fictief begintijdstip (bijv. systeem- of programma-start).
Variabelen van het type 'time' gebruiken dus een oplossend vermogen van 0.001 seconde (milliseconde). De nauwkeurigheid kan, afhankelijk van de toegepaste computer en Operating Systeem, een veelvoud hiervan zijn (bijv. MS/PC-DOS: 55 ms).
array
Rij van gegevens (tabel). Het type van de array dient eveneens gespecificeerd te worden (short, structure, etc.). De lengte van de array wordt aangegeven door tevoren gedefinieerde dimensie (aantal elementen), of door een 'null.-waarde aan het einde van de array.
string
Rij (array) characters t.b.v. namen, teksten, e.d.. De precieze uitvoering is afhankelijk van de programmeertaal, en kan dan ook een pointer naar een string zijn.
structure
Combinatie van een aantal bij elkaar behorende gegevens. Een entry in een tabel of een record in een file zijn veel voorkomende vormen van een structures (type in BASIC).

Modelbaancomponenten

Baanvak
Railverbinding met enkelvoudig beginpunt en enkelvoudig eindpunt. Het is de kleinste besturingseenheid voor beveiligingsdoeleinden.
Wisselstraat
Eén van de mogelijke rijwegen door een groep van rijwegen, welke elkaar onderling deels overlappen ten gevolge van aanwezige wissels. Zie voor een verdere toelichting het hoofdstuk Baanvak, wisselstraat, kruising.
Emplacement
Samenstel van een 1 of meer baanvakken in bepaalde volgorde, welke onder de hoede van de regelende computer staan. In de meeste gevallen zal dit de gehele modelbaan omvatten.
Wagon
Ongemotoriseerd, onscheidbaar gekoppeld aantal assen zonder onderscheid van voor- of achter-kant.
Loc (Locomotief)
Gemotoriseerd, onscheidbaar gekoppeld aantal assen, met aanwijsbare voor- en achterkant. Een uitgerangeerde loc is nog geen trein. Wanneer een 'losse' loc gaat deelnemen aan het verkeer wordt het een trein.
Wagenstel
Combinatie van 1 of meer (tijdelijk) gekoppelde wagons in bepaalde volgorde, met aanwijsbare voor- en achter-kant.
Trein
Samenstel van 1 locomotief en 0 of meer wagenstellen.
NB: Dit ontwerp voorziet dus niet in een faciliteit van treinen met meer dan een loc.
Snelheidscorrectie
Faktor waarmede de aanstuursnelheid moet worden vermenigvuldigd om de werkelijke snelheid te verkrijgen.

Status-aanduidingen en -wijzigingen

Bezet
Een baanvak is 'bezet' wanneer vaststaat dat er zich een trein (of obstakel) in het baanvak bevindt. Bij een rail-systeem met continue terugmelding is dat tamelijk eenduidig, bij systemen met punt-kontakten (baanvak-in/uit) signalen, moet dat uit deze signalen alsmede dimensies en bewegingsrichting van treinen worden afgeleid.
Reservering
Wanneer een trein een baanvak wil berijden, dient een reservering te worden gepleegd (in de baanvaktabel). Dit kan alleen wanneer het baanvak: NB: Een bezetmelding zonder reservering kan voorkomen door een doorschoten trein, een verloren wagon, een niet-omgegane wissel, een ander voorwerp, e.d.
Blokkering
Wanneer wisselstraten worden bereden, worden een of meer andere wisselstraten in een groep niet toegankelijk. Dit noemen we blokkering, in tegenstelling tot reservering wordt niet bijgehouden door welke trein het baanvak is gereserveerd. Daar een wisselstraat door meer dan een trein kan zijn geblokkeerd, wordt alleen een blokkeringsteller verhoogd of verlaagd.
Claim
Wanneer een trein een baanvak wenst te berijden, maar daartoe nog niet is gerechtigd, kan de trein een claim op het baanvak leggen. In de treintabel wordt bijgehouden welk baanvak geclaimd is (kan er maar een zijn), in de baanvak tabel wordt alleen vastgelegd dat het baanvak geclaimd is. Wanneer het baanvak vrijkomt, kan (evt via een prioriteits-systeem) toekenning geschieden aan een van de treinen die (nog) een claim op dat baanvak hebben uitstaan.
Vrijgeven
Het ongedaan maken van een reservering. Het baanvak kan dus nog steeds bezet of geblokkeerd zijn:
Doorrijverplichting
van een baanvak geeft aan dat de trein niet in dat baanvak tot stilstand mag komen (stopverbod).
Een mogelijke variant hiervan is dat bij stilstand van een trein kop of staart ervan niet in het baanvak mogen staan. Deze variant is handig wanneer er geen permanente terugmelding op dat baanvak wordt toegepast. Hiermede kan onduidelijkheid over de positie van de trein worden voorkomen wanneer aangrenzende baanvakken wel terugmelden.

B. Programma Ontwikkeling

Hierbij enige aanwijzingen voor de ontwikkeling van een programma.

Plan van aanpak

De opgave is voor een niet ervaren programmeur, of wanneer men nooit eerder een 'real-time'-programma heeft geschreven, niet eenvoudig. Wanneer men het plan heeft om een vrij uitgebreide modelbaan (veilig) te besturen, dan is de hoeveelheid werk in het begin niet goed te overzien. Deze bijlage bevat enige aanwijzingen om goed en vlot een begin te kunnen maken.

Algemene raadgevingen

Enkele algemene adviezen voor het ontwikkelen van een eigen modelbaan besturingsprogramma zijn:

Stappenplan

Maak een stappenplan. Begin met een absoluut minimum en bouw dat later uit. Op deze wijze is het gemakkelijker begin-problemen snel op te lossen. Fout-verschijnselen worden niet vertroebeld door allerlei ingewikkelde afhankelijkheden.

Voor een goed begin wordt de volgende aanpak aanbevolen

  1. Maak een aantal elementaire bouwelementen voor het programma, en test deze afzonderlijk. Hiertoe kunnen worden gerekend Kijk eens rond (in clubs, Bulletin Board Systemen, Internet sites) of er wellicht bestaande bouwstenen zijn. Een voorbeeld hiervan is kort beschreven in DigiAPI. Hiervan is door de ontwerpers van dit systeem gebruik gemaakt voor het vervaardigen van het opstellen van het testprogramma.
  2. Maak de meest eenvoudige proefbaan: bijvoorbeeld een ovaal zonder wissels, maar met tenminste 4 baanvakken en bijbehorende bezet meldingen De werkelijke baan mag natuurlijk best uitgebreider worden uitgevoerd, maar dat hoeft het programma niet te 'weten'.
  3. Stel de meest elementaire vorm van de tabellen op voor deze baan. Kies uit de in dit ontwerp genoemde tabellen die welke absoluut noodzakelijk zijn:
  4. Laat eventueel uit de begintabellen voorlopig die velden weg welke niet absoluut noodzakelijk zijn, zoals:
  5. In procesbesturing is vaak nauwelijks in te schatten welke aktiviteiten in het programma plaatsvinden. Bouw daarom vanaf het begin statistische tellingen in, welke goed van pas zullen komen voor:
    debugging
    te weten hoe vaak gebeurtenissen optreden en hoevaak routines worden doorlopen kan het analyseren van fouten aanmerkelijk versnellen.
    optimalisering
    de meest gebruikte routines komen het eerst voor uitdunning in aanmerking (uiteraard mede afhankelijk van de hoeveelheid werk per routine).
    Naast deze statistiek kan het ook handig zijn om 'belangrijke' gebeurtenissen te loggen (in een logfile of op het display).
  6. Test het begin-programma met 1 enkele trein.
    Laat de trein rijden, en bekijk of ie blijft rijden op de gewenste snelheid (en terugmeldingen van de baan dus correct worden afgehandeld).
    Werken noodstop en doorstart procedures?
    Kijk dan of de trein goed reageert op bezet-signalen (met handmatige bezetmelding, bijvoorbeeld een losse wagon). Stopt ie op tijd bij een bezetmelding, en vervolgt ie weer zijn weg wanneer de bezetmelding wordt opgeheven?
    Laat de trein ook stilhouden en terugrijden (kop/staart wisseling), en controleer of alle voorgaande tests ook in omgekeerde richting naar wens verlopen.

Wanneer deze eerste fase met succes is afgesloten, pas dan is het tijd te gaan denken aan uitbreidingen. Er is geen vaste volgorde of methode aan te geven, dat is een vrij persoonlijke keuze. Waarschijnlijk is de hieronder aangegeven volgorde een voor de hand liggende:

Hierna wordt een aantal methoden besproken om de toch wel ingewikkelde uitbreidingen voor meer-treinen-gebruik te programmeren.

Blokschema

In is een schema van een mogelijke programma-organisatie opgenomen. In dit schema wordt met 'afzonderlijke taken' aangegeven welke functies met een multi-tasking operating system ook inderdaad losse taken kunnen zijn. In werkelijkheid kan dit anders zijn ingericht!

Ter toelichting de volgende korte omschrijving van de verschillende taken

Tabellen
Geen taak, maar de gemeenschappelijke set van gegevens welke door verschillende onderdelen van het programma worden geraadpleegd en bijgewerkt.
centrale besturing
'Mainline' van het programma, welke o.m. zorgt voor initialisatie, opstarten van sub-taken en later de afsluiting. In dit module zijn tevens diverse service routines opgenomen, zoals voor het genereren van trein- en wissel-commando's, welke door andere taken kunnen worden aangeroepen.
keyboard
Analyseren van toestaanslagen, en bijwerken van tabellen, wanneer de input geaccepteerd kan worden
display
Weergeven van status van de modelbaan
train etc.
Elke trein wordt bestuurd door zijn 'eigen' subtaak.
bezetmeldingen
Verwerken van terugmeldingen in zijn algemeen in de baanvak-tabellen, en signaleren van treintaken over specifieke bezet- of vrij-meldingen welke voor die trein van belang zijn.
wissel-queue
Versturen van wisselcommando's naar de baan Deze taak wordt aangestuurd via een event-queue vanuit de de centrale service routines.
DigiAPI-driver
Groep routines voor communicatie met de -box. Andere taken leveren hier hun commando's in ter fysieke versturing naar de baan. DigiAPI zorgt voor orderlijke afhandeling (buffering, serialisatie, etc.). Tevens verzorgt deze driver het uitlezen van de terugmelders. Zie voor details DigiAPI.

NB: In het schema zijn alleen de runtime taken opgenomen. Een aantal taken ontbreken nog, zoals:

Structuur van een modelbaan programma

plaatje programma organisatie

Plaatsbepaling

In onderstaande figuur is schematisch aangegeven de samenwerking tussen de treintaken en de terugmeldtaak. Hierbij is een strikte scheiding van werkzaamheden en verantwoordelijkheden toegepast.

Taak-synchronisatie treinen <-> terugmeldingen

Plaatje Taaksynchronisatie

Strikte en ordelijke scheiding van werk en verantwoordelijkheden verhoogt betrouwbaarheid en handhaaft de prioriteiten in een multi-tasking omgeving.

Plaatsbepaling bij bezetmelding

Plaatje plaatsbepaling bij 'baanvak-bezet' melding

Kop van de trein komt nieuw baanvak binnen. Uit baanvakreserevering wordt afgeleid welke trein binnenkomt. Plaatsbepaling van kop van trein is eenduidig. Terugmeldtaak signaleert betreffende treintaak, welke de benodigde aktie neemt volgend uit de nieuwe plaatsbepaling.

Plaatsbepaling bij vrijmelding

Staart van de trein verlaat een baanvak. Uit baanvakreserevering wordt afgeleid welke trein dat was. Treintaak bepaalt uit dit signaal mede de plaats van de kop van de trein aan de hand van trein en bezette baanvaklengtes.

Meervoudige Wachttoestanden

De meeste technische functies zijn op zichzelf relatief eenvoudig. Maar er zijn maatregelen nodig om deze correct en efficiënt uit te voeren.

We hebben met een modelbaan te maken met een 'real-time' omgeving waar vele (sub-)processen gelijktijdig plaats vinden. In het algemeen moet ernaar worden gestreefd het programma nooit in een harde 'wait' te laten komen ten gevolge van een wait in een enkel sub-proces. Wachtsituaties welke zich kunnen voordoen zijn bijvoorbeeld:

De term wachten dient niet letterlijk te worden genomen, maar ongeveer te worden opgevat als: doe zolang iets anders totdat het tijd is om deze functie te vervolgen. Dit vereist een goede organisatie van het programma, omdat er veelal van meer dan een 'wachttijd' gelijktijdig sprake is.

Er is sprake van tenminste 2 soorten wacht-perioden en daarmede mogelijke aanpak voor de programma-organisatie:

Deze soorten wachttijden zullen gelijktijdig en in meervoud voorkomen op een modelbaan. De kunst is om geen (computer-)tijd te verspillen met onnodig wachten (geen 'hard-wait' en 'spin-loops'). Hiervoor zijn verschillende technieken mogelijk, zoals:

event-queue
Dit is een op tijd gesorteerde rij van te verwachten gebeurtenissen.
Er wordt altijd maar op 1 bepaalde gebeurtenis gewacht, namelijk de eerstvolgende gebeurtenis, en dat is die welke vooraan in de wachtrij staat. Van tevoren is dus ook bekend met welke functie het programma na de 'wait' moet worden vervolgd. Wanneer de betreffende wachttijd is verstreken schuiven alle events een plaatsje op, en wordt de betreffende functie uitgevoerd. Wanneer daartoe aanleiding is wordt door deze functie een of meer nieuw event ingevoegd in de rij bestaande events, afhankelijk van het verwachte tijdstip. En dan is het wachten op de nu eerste gebeurtenis in de rij.
wait-list
Dit is een lijst van te verwachten gebeurtenissen, waarvan niet tevoren bekend is wanneer deze zullen optreden, dus ook niet in welke volgorde.
Wanneer 1 van de gebeurtenissen in de lijst optreedt moet het programma vervolgen met de 'bijbehorende' functie. Er is een indicatie nodig van welke gebeurtenis is opgetreden om de juiste vervolgfunctie te kunnen selecteren. De af te handelen gebeurtenis wordt uit de lijst verwijderd, en de betreffende functie mogelijk afgewerkt. Meestal zal de zojuist aangeroepen functie aanleiding geven tot het wachten op een nieuwe gebeurtenis, welke aan de wachtlijst wordt toegevoegd, waarna het proces zich herhaalt.
multi-tasking
Hierbij wordt een programma opgesplitst in een aantal losse taken, welke onafhankelijk van elkaar, en schijnbaar gelijktijdig in uitvoering zijn.
Een 'subtask' is eigenlijk een gewoon programma, of bepaalde vorm van een subroutine van een hoofdprogramma, dat wordt opgestart en een eigen leven gaat leiden, alsof deze het enige programma in de computer is. Multitasking kan redelijkerwijze alleen worden toegepast wanneer het gebruikte operating systeem daartoe de voorzieningen heeft. Bijvoorbeeld OS/2, W95/98 en Linux hebben uitgebreide voorzieningen, MS/PC-DOS niet.

Enkele voordelen van multitasking:

Multitasking kan het programma vereenvoudigen, maar is op zichzelf niet zaligmakend.

In alle gevallen dienen de uit te voeren functies zo kort mogelijk te zijn om het geheel goed te kunnen uitvoeren (iedere subtask een kans te geven aan de beurt te komen).

In een modelbaan programma, waarvoor dit document een ontwerp beschrijft, zijn eigenlijk alle bovengenoemde technieken van toepassing. Hiernavolgend een aantal voorbeelden als toelichting.

Event-queue

Als voorbeeld van programma-organisatie met 'wait-list' wordt bediening van een groep wissels genomen, met in acht neming van bekrachtigingstijden.

  while (wissels te bedienen)
    stuur wissel commando
    wacht bekrachtigingstijd
    ....
    ....  (enige andere aktie)
    ....
    endwhile
  endwhile
  stuur afschakelcommando

NB: Gedurende de wisselbekrachtigingstijd kunnen andere commando's door het Interface worden geaccepteerd.

Wait-list

Als voorbeeld van programma-organisatie met gebeurtenissen waarvan het tijdstip niet bekend is, wordt de verwerking van terugmeldingen (bezetsignalen) genomen:

  for (forever)
    while (alle onveranderd)
      stuur S88 lees-commando
      wacht tot antwoord binnenkomt
      ....
      ....  (enige andere aktie)
      ....
    endwhile
    for (elke signaalwisseling)
      bepaal welke signaal-wijziging
      werk baanvaktabel bij
      ...
      ...
    endfor
  endfor

Voor de bepaling van de voortgang van een trein zal de betreffende treinbesturings-functie regelmatig de baanvaktabel raadplegen voor wijzigingen in bezetmeldingen. Een signaalwijziging kan tevens(!) voorkomen in de waitlist van de trein-besturingsfunctie, en daardoor de nodige aktie teweeg brengen, maar dan voor een bepaalde trein.

Multi-tasking

Een voorbeeld van programma-organisatie waarbij 'multi-tasking' een voor de hand liggende methode is, is het besturen van treinen.
Elke trein is een enkelvoudig object, welke op zichzelf een simpele functie heeft te vervullen Deze functie is in principe gelijk voor elke trein op het emplacement, alleen bevindt elke trein zich op een bepaald tijdstip op een andere plaats op de baan. Voor elke trein gelden dezelfde regels ('programma').

Door voor elke trein een afzonderlijke subtask te starten, kunnen treinen gelijktijdig en onafhankelijk van elkaar hun weg volgen, en wachten op die gebeurtenissen die specifiek en alleen voor hunzelf van belang zijn. Ze 'bekijken' alleen voor zichzelf de effekten van bezetmeldingen, wisselstanden, reserveringen van baanvakken, etc, welke door de diverse treinen afzonderlijk in de baanvaktabel worden bijgehouden.


C. Hulpmiddelen voor Programmaontwikkeling

Om een vlotte start mogelijk te maken is een poging gedaan om hulpmiddelen te verzamelen of eventueel zelf te vervaardigen en beschikbaar te stellen aan aankomende modelbaan programmeurs. De oogst is tot nu toe niet daverend.

De hieronder vermelde software en documentatie is verkrijgbaar op verschillende internet sites, o.a.

Homepage Rob Hamerling
http://www.robh.nl/

Hulpprogrammatuur

DigiAPI

DigiAPI is een Application Programmers Interface voor C-language en QuickBASIC op IBM compatible PC's. Het is een pakket van Rob Hamerling voor enkele basisfuncties van een modelbaan besturingsprogramma, zoals

Er zijn een aantal vormen van hetzelfde API (Application Programming Interface) beschikbaar: voor OS/2 en voor DOS. Het is mogelijk om met dezelfde mainline source een OS/2 of DOS uitvoering van een besturingsprogramma te genereren. Een voorbeeld hiervan is inbegrepen in het pakket.

DigiAPI heeft in zichzelf een multi-tasking opbouw. Onder OS/2 wordt gebruik gemaakt van standaard multi-threading faciliteiten van OS/2, onder DOS wordt via hardware en DOS interrupts een vorm van multitasking bereikt. Het basis-effect is in beide gevballen gelijk: de main-task draait onafhankelijk van de achtergrond taken.

Kosten: Fl 45,- eenmalige "Shareware"-bijdrage.

Probleem Determinatie

DigiTrace

Dit is een onderdeel van het DigiAPI pakket (zie DigiAPI), welke de door dat programma te produceren trace-records formatteert, ongeveer als weergegeven in de onderstaande figuur.

Voorbeeld van een formatted trace van DigiAPI


      tijd    I/O  cmd  data beschrijving
 ------------ ---  ---  ---- --------------------------------------
       45.050                 Start van de trace (DigiAPI OS/2 1.x)
       +0.045  O    1A    13  Loc 19: snelheid 10 ; Funktie=ON
       +0.350  O    22    3F  wissel 63: afbuigen
       +0.760  O    20        wissel afschakelen
       +1.850  O    C0        uitlezen S88: met reset
       +4.850  O    82        uitlezen S88 1 t/m 2
       +4.881  I        1801  S88  1 ON=4,5,16
       +4.881  I        090E  S88  2 ON=5,8,13,14,15
       +5.000  O    61        STOP

Een alternatief 'datascope.-achtig programma is in ontwikkeling, welke beide bovengenoemde programma's combineert tot een ' scope'. Daarmede wordt het mogelijk een 'monitor' te plaatsen tussen een willekeurige besturingscomputer en , waarbij de communicatie 'real-time' wordt geïnterpreteerd.

DigiScope

Dit is een programma dat op een PC met 2 asynchrone communicatie poorten de mogelijkheid geeft om de communicatie tussen een computer (met modelbaanbesturingsprogramma) en het Interface vast te leggen en te analyseren. Dit programma geeft een weergave van de verstuurde en ontvangen data op het computerscherm, op twee manieren:

Daarnaast kan de informatie ook in een trace file worden vastgelegd welke hetzelfde interne formaat heeft als de trace van DigiAPI. Dus later kan met het daarbij geleverde DigiTrace programma, de tracefile worden geformatteerd in het formaat van DigiAPI.

Toepassing van DigiScope onafhankelijk van de toegepaste computer en modelbaan.

Aftakken datastromen

Aftakken datastromen

Het scherm van DigiScope

Screen capture van DigiScope

De linker helft van het scherm geeft een 'dump'- en geinterpreteerd 'character'-formaat van de data. De rechterhelft van het scherm geeft een pseudo-grafisch overzicht van de actuele situatie van treinsnelheden, wisselstanden en terugmeld-kontakten.
Tevens wordt bij benadering de bezettingsgraad van de verbinding weergegeven.

DigiScope vereist een PC met OS/2 Warp 4.0 of hoger, en 2 communicatiepoorten. Via COM1 worden de commando's naar het Interface afgetapt, via COM2 de data vanaf het Interface.

Kosten: geen (voor evaluatie versie)


D. Tests

Ten behoeve van test en demonstraties is de HCCM Digitaal Test/Demo-baan opgezet. Deze baan is tevens bedoeld om programma's op basis van dit ontwerp te testen.

Testbaan

De opbouw van de HCCM Digitaal Test/Demo-baan is schematisch weergegeven in de onderstaande figuur:

HCCMD Test/Demo-baan

Plattegrond test/demo baan

Dit emplacement kan worden beveiligd met 3 Feedback Encoder met 16 contactpunten (zoals Märklin S88) en bestuurd d.m.v. 4 wissel decoders met elk 4 wissel-aansluitingen (zoals Märklin K83). Voor seinen zijn nog eens 12 seindecoders benodigd.

Software

Software is ontwikkeld voor de HCCM Digitaal Test/Demo-baan op verschillende computersystemen en in verschillende programmeertalen.


E. Samenvatting van wijzigingen

Dit document is een werk-document voor communicatie tussen de leden van de ontwerpgroep. Na elke bespreking worden de vorderingen in dit document verwerkt en wordt een nieuw volgnummer toegekend. Hieronder de belangrijkste wijzigingen:

0.0 (28/09/1992)
Eerste verschijning van dit document.
0.1 (12/10/1992)
Wijzigingen en uitbreidingen n.a.v. 28/9 bespreking.
0.2 (2/11/1992)
Wijzigingen en uitbreidingen n.a.v. 12/10 bespreking.
0.3 (23/11/1992)
Wijzigingen en uitbreidingen n.a.v. 2/11 bespreking.
0.4 (23/11/1992)
Voorlopige afsluiting na 21/11/92 bespreking. Het is tijd om het ontwerp in praktijk te brengen!
0.5 (24/4/1992)
Veranderingen naar aanleiding van bijeenkomsten van de gehele Digitaal-groep op 19/12/1992, 23/1/1993, 17/4/1993 en de software ontwerpgroep op 8/2/1993.
Toevoeging van een bijlage Programma Organisatie met aanwijzingen voor methoden voor 'real-time' programmeren.
Eveneens toevoeging van een plan van aanpak.
Begin april loc-tabel gewijzigd: alle snelheidsaanduidingen positief en negatief te specificeren (positief is vooruit). Hiermede vervalt de noodzaak voor de flag gewenste rijrichting, maar nog wel is nodig een flag voor laatst geschakelde rijrichting (om te bepalen of een wijzig-rijrichting commando nodig is alvorens vanuit stilstand op te trekken.
Aantal definities toegevoegd en deze verhuisd naar nieuwe Verklaring van Termen.
0.6 (20/5/1995)
Doordat twee van de drie deelnamers aan deze ontwerpstudie inmiddels uit beeld zijn, zijn de volgende uitbreidingen het restultaat van ervaringen bij de programma-ontwikkeling door Rob Hamerling. Deze veranderingen zijn mogelijk specifiek van toepassing op zijn programma en de omgeving waarop dat draait.
0.7 (20/7/1998)
Wijzigingen met betrekking tot gebruik van DigiAPI of de library van RailRoad&Co van Jürgen Freiwald, in plaats van het verouderde MKLAPI. De typische systeem of protocol afhankelijkheden worden door DigiAPI volledig voor het eigenlijke besturingsprogramma gemaskeerd. Als gevolg daarvan worden verschillende entities welke tot nu toe waren gebaseerd op nu systeem-onafhankelijk opgeslagen.
0.8 (8/3/2000)
Conversie van dit document naar HTML formaat.