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.
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.
Dit hoofdstuk geeft een globale beschrijving van het ontwerp met doelstellingen en afbakening.
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!
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.
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.
Het ontwerp gaat uit van de volgende veronderstellingen:
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.
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.
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:
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.
Voor de modelbaan wordt het cgs-eenhedenstelsel gehanteerd:
Hieruit afgeleide eenheden zijn onder meer:
Notes:
Componenten van een modelbaan worden in tabellen vastgelegd. De volgende tabellen zijn voorzien:
Teneinde zoveel mogelijk programmeertaal onafhanklijk te zijn, maar niettemin het effectief gebruik van de mogelijkheden van elke taal mogelijk te houden, worden de veldaanduidingen gebruikt, waarvan de definitie is opgenomen in Verklaring van Termen.
In de beschrijvingen van de tabellen in de hoofdstukken Emplacement Gegevens en Gegevens Rollend Materieel is geen rekening gehouden met specifieke taal of eigenschappen van compiler of computer hardware t.a.v. optimaal gebruik van het geheugen e.d.. Wel is in een aantal gevallen de minimum grootte van een veld aangegeven, maar de namen en volgorde van de velden, en zelfs het wel of niet opnemen ervan, wordt aan de programmeur overgelaten.
In deze sectie worden de gegevens gedefinieerd betreffende de modelbaan, in een volgende sectie betreffende het rollend materieel.
De gegevens zijn opgenomen in een aantal tabellen, welke elk voor zich een groep gegevens bevatten. De organisatie in verschillende tabellen is enerzijds bedoeld om een scheiding te krijgen tussen logisch groepen van gegevens, anderzijds om geheugenbezetting (enigszins) te optimaliseren. Er worden algemene tabellen gebruikt wanneer er sprake is van een enkele groep gegevens voor de gehele baan (bijv. wissels), en specifieke tabellen wanneer er meer dan een tabel wordt gebruikt voor bepaalde groepen gegevens. Aan de hand van de toelichting verderop zal het onderscheid verder duidelijk worden.
De volgende emplacementtabellen zijn voorzien:
Op het hoogste niveau wordt een emplacement beschreven in de baanvak-tabel, met voor elk baanvak een doorverwijzing naar een of meer andere tabellen. De doorverwijzing geschiedt naar een specifieke tabel of een algemene tabel (met naar keuze een pointer of een index). Wanneer doorverwijzing niet van toepassing is, heeft het betreffende veld geen betekenis.
In de onderstaande figuur is schematisch de samenhang tussen de voornaamste tabellen van een emplacement opgenomen.
Samenhang van tabellen voor baanvakken/wisselstraten en wissels.
Verwijzingen naar coördinatentabel en andere minder relevante tabellen, zijn niet opgenomen.
Toelichting:
Per baanvak of wisselstraat zijn de in onderstaande tabel vermelde gegevens opgenomen.
Zie voor een verklaring van de type-aanduiding Verklaring van Termen.
| Naam | Type | Omschrijving |
|---|---|---|
| id | ident | Identificatie van het baanvak.
NB: De S88 terugmeldeenheid is rechtstreeks gekoppeld aan deze entry in de tabel. |
| nm | string | Naam van het baanvak. |
| ll | short | Rail-lengte. |
| ty | flag | Type ('gewoon' baanvak of wisselstraat). |
| kl | flags | Klasse: station, hoofdspoor, nevenspoor, ontkoppelrail, etc. |
| bz | flag | Bezetstatus (vrij=0, bezet=1) Dit signaal is alleen bruikbaar bij systemen met continue terugmelding, zoals bij het -drierail systeem. |
| st | ident | Status: gereserveerd door trein-'id' (vrij=0, onbekend=-1).
Wordt door reserveringroutines ingevuld met trein-id, en bij
gepasseerde trein vrijgegeven.
NB: Reservering mag alleen plaatsvinden wanneer niet-gereserveerd door een andere trein en niet fysiek bezet. Indien het een wisselstraat betreft mag deze niet geblokkeerd zijn. Deze variabele mag door terugmeldroutines worden ingevuld met .-1' (onbekend object) wanneer bezetmelding plaats vindt zonder dat er een reservering was gepleegd. Eveneens mag het worden vrijgegeven ('0') wanneer het baanvak kennelijk fysiek niet meer bezet is. |
| bt | short | Blokkeringsteller. Geeft aan door hoeveel treinen deze wisselstraat is geblokkeerd in verband met het berijden van gekoppelde wisselstraten. Zie o.a. Rijweg Selectie. |
| bz | flag | Bezet indicatie volgens terugmeldingssysteem (vrij=0, bezet=1). Deze flag geeft de fysieke toestand van het baanvak aan. Op baanvakken zonder S88-terugmeld signalering is dit veld dus altijd 0. Moet bij reservering door trein worden geraadpleegd, maar wordt bij vrijgeven (bij gepasseerde trein) niet gewijzigd door trein-routines, maar uitsluitend door S88 terugmeldroutines. |
| rr | flag | Rijrichting in welke in gebruik of waarin gereserveerd is (0=heenweg, 1=terugweg). Geeft aan welke set rijrichting-afhankelijke gegevens van het baanvak van toepassing zijn (zie hieronder). Dit veld moet worden gezet bij reservering, maar behoeft niet te worden ge-reset bij vrijgeven van het baanvak. |
| rl | ident- array | Identificatie van gekoppelde wisselstraten (die welke worden geblokkeerd door berijden van een andere wisselstraat). |
| ws | ident- array | Wissel-id's en bijbehorende stand van elke wissel. Voor een gewoon baanvak en kruisingen is dit een lege array. |
| geo | ident | Verwijzing naar entry in tabel Baanvak en Wissel coördinaten. |
| Gegevens rijweg 'heen' | ||
| h.bv | ident | Identificatie van het aansluitende baanvak of de eerste van een groep aansluitende wisselstraten. |
| h.smin | short | Minimum rijsnelheid (-waarde) |
| h.smax | short | Maximum rijsnelheid (-waarde). |
| h.scor | word | Snelheidscorrectie (in procenten: helling-op: >100, helling-af: <100). |
| h.drv | flag | Doorrijverplichting (verplicht doorrijden=1)
Er mag niet worden stilgestaan in een baanvak met doorrijverplichting.
Een variant van het gebruik hiervan kan de volgende interpretatie zijn sommige wissels). Het is aan te bevelen om hiervoor een beperkte doorrijverplichting in te stellen om geen onzekerheid te laten bestaan over de positie van de kop of staart van de trein ('staat trein wel of niet in dat baanvak?'). Wanneer de trein een bezetmelding geeft op zowel een voorgaand als een volgend baanvak, mag wel worden stilgestaan, want dat is een eenduidige toestand. |
| h.rnd | array | Percentage voor automatische (random) wisselstraatselectie (combinatie van wisselstraat-id en percentage). Wanneer een gewoon baanvak volgt is dit een baanvak-id met het getal 100, wanneer meer dan een volgend baanvak gekozen kan worden is dit een array van baanvak-id met bijbehorend kanspercentage. De som van alle te kiezen vervolgwegen dient 100 te zijn! |
| h.adrg | byte | adres van het groen/rood baanvak-sein |
| h.ador | byte | adres van het oranje baanvak-sein |
| h.xy | short | Coördinaten van het sein (aan begin van het baanvak!) voor presentatiedoeleinden. Voor beide seinen worden dezelfde co-ordinaten gebruikt. |
| Gegevens rijweg 'terug' (toelichting bij heenweg-specifikatie) | ||
| t.bv | ident | Identificatie van het aansluitende baanvak of een van de aansluitende wisselstraten. |
| t.smin | short | Minimum rijsnelheid |
| t.smax | short | Maximum rijsnelheid |
| t.scorr | word | Snelheidscorrectie (helling op / af) |
| t.drv | flag | Doorrijverplichting |
| t.rnd | short | Percentage voor automatische (random) wisselstraatselectie |
| t.adrg | byte | adres van het groen/rood baanvak-sein |
| h.ador | byte | adres van het oranje baanvak-sein |
| t.xy | short | Coördinaten van het sein voor presentatiedoeleinden. |
De coördinatentabel is in dit ontwerp afgescheiden van de baanvaktabel. Dit biedt de programmeur de vrijheid om deze achterwege te laten, wanneer geen (pseudo) grafische beeldscherm presentatie wordt toegepast. De beschrijving van de coördinatentabel is opgenomen in Presentatie.
Per wissel zijn de in vermelde gegevens opgenomen.
| Naam | Type | Omschrijving |
|---|---|---|
| id | ident | Identificatie van de wissel |
| ty | flag | type (code voor links-afbuigend, rechts-afbuigend, etc) |
| st | flag | actuele stand |
| st0 | flag | beginstand |
| ad | byte | adres |
| kt | word | Bekrachtigingstijd.
NB: Gedurendende de bekrachtigingstijd mogen geen andere wissel-bedienings-commando's worden verstuurd, wel andere commando's. |
| xy | short | x en y coördinaten van de wissel (voor presentatiedoeleinden). |
Voor de terugmelding van S88 signalen naar baanvakken dient een tabel (een simpele array is voldoende) te worden opgenomen.
| Naam | Type | Omschrijving |
|---|---|---|
| id | ident | Identificatie (nummer of naam) van het S88 signaal. Dit kenmerk is eigenlijk het volgnummer van de S88 1 tot 31) en het nummer daarbinnen (1 t/m 16). Het is mogelijk om dit veld weg te laten wanneer deze tabel als array wordt uitgevoerd. |
| b1 | ident | Identificatie van het inrij-baanvak. |
| b2 | ident | Identificatie van het uitrij-baanvak (alleen nodig voor moment-schakelaars als terugmeldingssignaalgever). |
Wanneer op de modelbaan gebruik gemaakt wordt van baanvak-bezet meldingen (continue signaal, zoals bij drie-rail systeem mogelijk is), kan worden volstaan met alleen de b1-entry in deze tabel.
Wanneer op de modelbaan momentschakelaars worden toegepast, dan dient aan de hand van de rijrichtinginformatie te worden bepaald welk baanvak wordt binnengereden.
| Naam | Type | Omschrijving |
|---|---|---|
| id | ident | Identificatie van het artikel |
| nm | string | Naam |
| ad | byte | adres |
| ty | byte | Type artikel |
In deze sectie worden de gegevens gedefinieerd van de beweegbare delen van de modelbaan.
Hierbij gelden dezelfde algemene regels betreffende de gegevens als omschreven in het hoofdstuk voor het emplacement.
De volgende tabellen zijn voorzien:
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.
De gegevens, welke per trein worden vastgelegd, zijn vermeld in de onderstaande 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'. |
De gegevens welke per locomotief zijn vastgelegd, zijn vermeld in
| 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. |
Per wagon worden de gegevens in als vermeld in vastgelegd.
| 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. |
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
Enkele uitgangspunten:
De volgende elementaire Technische Funkties zijn benodigd:
Voor de beveiliging zijn tenminste de volgende Logische Funkties benodigd:
Technische functies zijn tamelijk systeem-afhankelijk en zijn hier niet verder uitgewerkt.
Hieronder volgt voor enige van logische functies de pseudo code.
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:
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.
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.
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.
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
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).
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.
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.
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.
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.
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.
Die situaties, waarbij automatisch of handmatig ingrijpen nodig is, zullen in het algemeen worden gevat onder noodstop. Voorbeelden van dergelijke situaties:
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.
Wanneer treinen een vooraf bepaalde koers dienen te volgen, dient hiertoe de informatie te worden vastgelegd zoals opgenomen in de onderstaande tabel.
| 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. |
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.).
| 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. . . |
Per baanvak en wisselstraat zijn de in vermelde gegevens opgenomen.
| 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) |
Hierbij enige aanwijzingen voor de ontwikkeling van een programma.
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.
Enkele algemene adviezen voor het ontwikkelen van een eigen modelbaan besturingsprogramma zijn:
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
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.
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
NB: In het schema zijn alleen de runtime taken opgenomen. Een aantal taken ontbreken nog, zoals:
Structuur van een modelbaan programma
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
Strikte en ordelijke scheiding van werk en verantwoordelijkheden verhoogt betrouwbaarheid en handhaaft de prioriteiten in een multi-tasking omgeving.
Plaatsbepaling bij bezetmelding
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.
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:
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.
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.
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.
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.
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.
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.
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.
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
Het scherm 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)
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.
De opbouw van de HCCM Digitaal Test/Demo-baan is schematisch weergegeven in de onderstaande figuur:
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 is ontwikkeld voor de HCCM Digitaal Test/Demo-baan op verschillende computersystemen en in verschillende programmeertalen.
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: