Zelfbouw software digitale aansturing: basis

Zelfbouw, wie doet het en hoe.
Plaats reactie

Onderwerp starter
Nico
Berichten: 136
Lid geworden op: 24 feb 2009 00:17
Locatie: Groningen

Zelfbouw software digitale aansturing: basis

Bericht door Nico »

Inleiding
In dit stukje zal ik uitleggen hoe ongeveer een digitaal systeem werkt, met nadruk op het SLX systeem. Daarna zal ik een voorbeeld geven hoe dit uit te werken in software.

Digitale Aansturing

Bij digitaal rijden via de computer is er sprake van 2 protocollen. Enerzijds het electronische signaal uit de centrale op de rails. Daarnaast de datastroom op de bus. Deze datastroom is feite een adressenbestand met gegevens.

Allereerst is belangrijk te begrijpen hoe de 'bus' is opgebouwd. In een bus wordt gesproken over adressen. Er is een adresbus en een databus.

De adresbus bevat alle mogelijke adressen (zegmaar de huisnummers in een straat) en de databus heeft gegevens die bij de adressen horen. Wat voor gegevens dit zijn is afhankelijk van het apparaat dat naar het adres luistert.

Het aantal adressen op een bus wordt bepaald door de grootte van de adresbus. In SLX is deze 8 bits (1 byte). Dit komt neer op 256 adressen. De databus is ook 8 bits.

Dit kun je afleiden uit het binaire stelsel. Indien je hier niet bekend mee bent, dan is het interessant en aan te raden om hierover eens wat te lezen. Maar om even op te frissen:

Code: Selecteer alles

Decimale waarde		128	64	32	16	8	4	2	1
Positie	adresbit		8	7	6	5	4	3	2	1
VB:
10000, 5e bit is WAAR, decimale waarde 16. Uitkomst = 16.
10100, 5e bit is WAAR, 3e bit is WAAR, decimale waarde 16 + 4. Uitkomst = 20.

In de windows rekenmachine zit op standje Wetenschappelijk (via Beeld) ook de mogelijkheid om binaire data in te voeren en daarna om te switchen naar decimaal en v.v..
Opmerking: In de Rautenhaus handleiding begint men vanaf bit 0. Waarom dit is, is mij ook niet geheel duidelijk, omdat er geen 0 bit is.
Als je 128+64+32+16+8+4+2+1 optelt komt je uit op 255 adressen, en aangezien 0 ook nog een adres is zit je op 256.

ECHTER, nu gebruikt SLX de 7e bit om aan te geven of het om een lees of schrijf actie gaat. Hierdoor mag je 128 aftrekken en kom je uit op 128 adressen (0 - 127).

Maken we een momentopname van een lege SLX bus, met lege databits (waarde), dan ziet deze er als volgt uit:

Code: Selecteer alles

Adres(bin)	Adres(dec)	Waarde(bin)
00000000	0		00000000
00000001	1		00000000
00000010	2		00000000
00000011	3		00000000
00000100	4		00000000
Op deze manier komen de adressen tot stand. Achter elk adres bevindt zich een waarde. Hierboven heb ik elke waarde even op 0 gezet, maar zodra de modelbaan in beweging komt zullen zich hier waardes aannemen. De waardes staan vast in het protocol.

Bij een SLX lokdecoder is de waarde als volgt opgebouwd:

Code: Selecteer alles

Bit	Actie
8	Hoorn/Tyfoon
7	Licht
6	Rijrichting
5 t/m 1	Snelheid. In SLX is deze in 31 stappen. (11111 => 31)
Zou een lok met licht aan rijden op snelheid 15, dan zal het als volgt eruit kunnen zien: 01001111. Het vetgedrukte deel is het snelheids deel.

Wisseldecoders en bezetmelders hebben veel minder data nodig. Blok is bezet JA/NEE, wissel is rechtdoor/afbuigend. Hierdoor is voor elk blok/wissel maar 1 bit nodig.

Bij SLX betekend dit dat een wisseldecoder/bezetmelder 8 wissels/blokken kan aansturen. Elke uitgang op het component correspondeert met een bit. Ook combinaties zijn mogelijk, 4 bezetmelders + 4 wissels. Het zal bij SLX bijna altijd 8 zijn, anders verspil je (kostbare) databits. Per 8 is er dus 1 adres nodig.
Opmerking: Er zijn ook bezetmelders die het adres/adressen van loks die op dat blok staan terugmelden.
Opmerking: Snelheid van servoaandrijvingen zijn vaak apart instelbaar.
Bij Rautenhaus is het zo dat er is afgesproken dat adressen 0-111 voor decoders worden gebruikt. De adressen die daarna volgen zijn systeemadressen het systeemstatus opgevraagd kan worden.

Daarnaast kan Rautenhaus ook nog de computer gebruiken om te decoders te programmeren. Hiervoor moet je wel een aantal decoderadressen inleveren en houd je 0-104 over. Dit is instelbaar, als je dit uitzet heb je je 0-111 weer terug.


Met de computer

Zodra de computer verbonden is met de interface kan er dataoverdracht plaats vinden. Er kan data in en uit gaan.

Communiceren vind plaats door bits naar de bus te schrijven. Of ervanaf te lezen.

Allereerst zal er een seriële verbinding moeten worden opgebouwd over een COM poort. Bij zo'n verbinding komen een aantal parameters kijken, zoals baudrate. Ik zal straks een voorbeeld geven waarin dit allemaal uitgelegd staat.

Bij Selectrix werkt het daarna als volgt:
Data lezen:
Er worden 2 bytes (2x 8bits) achtereenvolgend naar de bus geschreven. In de eerste byte staat het adres waarvan gelezen moet worden, de waarde van de 2e byte maakt niks uit. Ik heb hem gewoon op 0 gelaten. Het is gewoon een controlebyte.

Hierna volgt direct een antwoord terug in de vorm van een databyte. Het is dan aan jou om dit te interpreteren naar hetgene wat je wilde weten van de decoder.

Data schrijven:
Om data te schrijven worden ook 2 bytes achtereenvolgend geschreven. De eerste byte krijgt nu bit 8 als WAAR mee, om aan te geven dat het om een schrijfactie gaat. Schrijven naar adres 15 zou dus als adresbyte 128 + 15 = 143 krijgen.

In de 2e byte staat de waarde. Zie ook het eerder gegeven schema over de lokdecoder.

Programmeren

Tot zover even het theoretische gedeelte. Tijd voor een voorbeeld in .NET met C#.
Mocht je het willen proberen dan kun je gratis Visual C# 2008 Express Edition downloaden. Ik in veel talen geprogrammeerd, maar de makkelijkheid van het installeren vind ik van Visual Studio toch het beste. Niet handmatig installiepakketjes uitzoeken oid. Als je het eenmaal hebt kun je direct aan de slag.

http://www.microsoft.com/express/download/
(Bij het groene blokje)

Voor nu alleen even een voorbeeldje van hoe een trein te laten rijden. Ik heb hier ook nog een voorbeeld van het uitlezen van de bus en bij de trein een geluidje te laten horen via de computer.

Start via File -> New Project een nieuwe Console Application.
AFBEELDING

Dan zie je het volgende:
AFBEELDING


Dit is de nieuwe void Main code:
Opmerking: Deze code gaat er vanuit dat locadres 1 wordt gebruikt, maar deze is makkelijk aan te passen. Zie daarvoor het commentaar in de code.

Code: Selecteer alles

        static void Main(string[] args)
        {
            System.IO.Ports.SerialPort serialPort = new System.IO.Ports.SerialPort();
            /* Baudrate hangt af van de instelling op
             * de interface. In mijn geval was het 9600. */
            serialPort.BaudRate = 9600;
            serialPort.PortName = "COM1"; // compoort.

            /* De volgende gegevens zijn specifiek aan het 
             * protocol dat gebruikt word. Deze heb ik uit 
             * de handleiding gehaald van Rautenhaus. */
            serialPort.Parity = Parity.None;
            serialPort.StopBits = StopBits.One;
            serialPort.DataBits = 8;

            /* verbinden */
            serialPort.Open();

            /* We moeten 2 bytes schrijven om de trein 
             * te laten rijden. Dit stoppen we in een array 
             * Door decimale waardes bij elkaar op te tellen en dmv
             * Convert.ToByte te doen, krijgen we de waardes in het juiste
             * formaat. Als je 64 weg zou laten zou de loc gaan rijden
             * zonder licht. */
            byte[] commandoRijden = new byte[]
            {
                Convert.ToByte(128 + 1), /* 128 schrijfcommando, naar locadres 1 */
                Convert.ToByte(64 + 10) /* 64 lichtfunctie, snelheid 10 */
            };

            /* schrijven naar de bus. de 2e parameter (0) is start 
             * van de data, maar we willen gewoon het hele commandorijden schrijven, 
             * dus schrijven we vanaf 0. Anders zou het ook niet werken trouwens.
             * 
             * 3e parameter dito, hoeveel willen we schrijven. Het hele commando graag ;) */
            serialPort.Write(commandoRijden, 0, commandoRijden.Length);

            /* We wachten 2 sec en stoppen de trein daarna. */
            System.Threading.Thread.Sleep(2000);

            byte[] commandoStoppen = new byte[]
            {
                Convert.ToByte(128 + 1), /* 128 schrijfcommando, naar locadres 1 */
                Convert.ToByte(0) /* 0, geen snelheid, geen licht */
            };
            serialPort.Write(commandoStoppen, 0, commandoStoppen.Length);

            /* sluiten. is niet perse nodig maar wel netjes. */
            serialPort.Close();
        }
Zet dit erin, en druk op het groene pijltje. Het programma zal als het goed is draaien en daarna weer afsluiten. Onderwijl rijd de trein natuurlijk.

Download hier het project:
http://www.powerscriptzone.nl/nico/mode ... gitaal.zip

Succes!


Gebruikersavatar

shoven
Berichten: 6103
Lid geworden op: 14 dec 2008 21:06
Locatie: Walcheren

Re: Zelfbouw software digitale aansturing: basis

Bericht door shoven »

Hoi Nico,

Leuk om dit te zien, is redelijk straightforward eigenlijk.
Begrijp ik goed dat je data op je seriele bus knalt en die wordt vervolgens opgepikt door je centrale? En als de centrale iets (terug)meldt, hoe gaat dat? Heb je een aparte thread of zo die continu staat te luisteren of er iets binnenkomt op de poort (of wacht op interrupts)?
Staat in de handleiding beschreven wat je allemaal kunt zenden en ontvangen, het hele protocol?


Steven

Hier is mijn baan op het forum
Hier is mijn vorige baan op het forum
Hier is mijn voor-vorige baan op het forum
>>> Filmpjes van de baan

Onderwerp starter
Nico
Berichten: 136
Lid geworden op: 24 feb 2009 00:17
Locatie: Groningen

Re: Zelfbouw software digitale aansturing: basis

Bericht door Nico »

shoven schreef:Hoi Nico,

Leuk om dit te zien, is redelijk straightforward eigenlijk.
Begrijp ik goed dat je data op je seriele bus knalt en die wordt vervolgens opgepikt door je centrale? En als de centrale iets (terug)meldt, hoe gaat dat? Heb je een aparte thread of zo die continu staat te luisteren of er iets binnenkomt op de poort (of wacht op interrupts)?
Staat in de handleiding beschreven wat je allemaal kunt zenden en ontvangen, het hele protocol?
Bedankt voor je compliment ;)

1. Je leest en schrijft direct op de bus in feite (wellicht dat er elektronisch nog een vertaling in zit, maar het is zo goed als direct).

2. Terugmeldingen zijn niet event based. Dus je zou in een aparte thread constant alle adressen moeten nalopen om veranderingen te detecteren. Volgens mij kan een seriele poort (met usb of zonder) sowieso niet zomaar gegevens sturen naar de computer, omdat het 'eenbaans'-verkeer is. Als de hardware dan continu zou schrijven naar de computer zou je niet meer kunnen lezen. Ik dacht dat dit wel kan met een parallelle poort. Maar correct me if I'm wrong.

Mocht ik wel gelijk hebben dan zou het voor de hardware ook mogelijk moeten zijn om na een bepaald commando alle veranderingen terug te sturen. Maarja, of dit geimplementeerd is weet ik niet, hangt ook van het digitale systeem af.

3. In een goede handleiding staat dit grotendeels beschreven. Sowieso het protocol. Al zijn er ook dingen waar ik zelf achter kwam.

Om even punt 2 wat uit te diepen: in de praktijk zou ik zelf denk ik de bus gaan simuleren op de computer in aparte thread om veranderingen voor alle adressen steeds verwerken (lezen + schrijven). En de tijd bijhouden om conflicten te voorkomen.


Gebruikersavatar

shoven
Berichten: 6103
Lid geworden op: 14 dec 2008 21:06
Locatie: Walcheren

Re: Zelfbouw software digitale aansturing: basis

Bericht door shoven »

Punt 2 snap ik niet. Want met S88 terugmelders en Koploper aangesloten via je USB of COM poort moet je ook signalen terug krijgen, anders weet Koploper niet waar je treinen zijn en zitten je bezetmelders er voor piet snot. Dus hoe zit dat dan, want ik neem aan dat jij ook zoiets nodig zult hebben? (ik ben erg nieuwsgierig van aard merk je ;) )


Steven

Hier is mijn baan op het forum
Hier is mijn vorige baan op het forum
Hier is mijn voor-vorige baan op het forum
>>> Filmpjes van de baan

Onderwerp starter
Nico
Berichten: 136
Lid geworden op: 24 feb 2009 00:17
Locatie: Groningen

Re: Zelfbouw software digitale aansturing: basis

Bericht door Nico »

shoven schreef:Punt 2 snap ik niet. Want met S88 terugmelders en Koploper aangesloten via je USB of COM poort moet je ook signalen terug krijgen, anders weet Koploper niet waar je treinen zijn en zitten je bezetmelders er voor piet snot. Dus hoe zit dat dan, want ik neem aan dat jij ook zoiets nodig zult hebben? (ik ben erg nieuwsgierig van aard merk je ;) )
Haha, gezonde instelling, heb ik ook ;)

Mijn digitale systeem in ieder geval, geeft de bezetmelder bij sporen die bezet zijn dit direct door aan de bus. Maar niet naar de computer. Ik moet dus zelf uit de bus een adres uitlezen en daarmee nagaan of een blok bezet is of niet.

Wat software in dit geval zou doen is constant controleren wat de status van een blok is.


Plaats reactie