Jump to content
gmd

Meine externe steuerung

Recommended Posts

Posted (edited)

Hallo,

habe einen anfang gemacht fuer meine eigene externe steuerung. Manche moegen fragen warum das rad neu erfinden, es gibt ja schon genuegend. Holzraeder, speichenraeder, gummiraeder, stahlraeder usw. Aber fuer den Mond buggy  musste man auch ein neues rad erfinden. 

Vorhandene konzepte haben die eigenart die gleisplaene  alle auf dem kleinsten element aufzubauen, die einzeln plaziert werden. Das ist mir einfach zu muehsam. In der zeit in der ich eine anlage beschriftet habe und manuell einen gleisplan gebaut und alles definiert habe , habe ich mir auch ein programm gebaut. 

entwurf_gleisbild.thumb.jpg.895875aa82e1b29fe8cc2e5ce7b75ee4.jpg

Ich kann ganze bloecke definieren und plazieren mit vielen automatischen funktionen dahinter. Das alles in RocRail zu machen ist mir einfach zu muehsam und eine real anlage anzusteuern mit DCC ist auch keine rocket science. Falls ich jemals wieder eine real anlage baue, was ich vorhabe, dann sowieso mit arduinos und meinem eigenen netzwerk.

 Hier die specs, die ich als ausgangspunkt definiert habe.


Streckenelemente
Einfahren optional Sperrsignal
Strecke     optional Vorsignal, optional Strassenkreuzung
Bremsen 
Halten mit/ohne Warten beinhaltet Hauptsignal
Ausfahren

Sonderelemente
Ende- mit und ohne Wenden
Kuppeln
Identifizieren
Rangierstrecke

Weichenelemente
Links
Rechts
Kreuz
Dreiweg
Schiebebuehne
Drehscheibe
Verbindung

Blockelemente
Ein blockelement ist eine kombination obiger Strecken- und Sonderelemente.
Verbindungselement
Ein verbindungselement ist eine kombination aus weichenelementen die mehrere blockelemente verbindet.
Strassenelemente
Eine kombination von block- und verbindungselementen die einen punkt zwischen A und B definieren.
Anlagenabschnitt
Ein teil einer anlage bestehend aus einem oder mehreren strassenelementen.

Blocktypen
Streckenblock
Durchfahrtblock
Umfahrblock
Ausweichblock
Parkblock
Rangierblock
Austauschblock
Halteblock
Einfahrblock
Ausfahrblock
Verbindungsblock  
Endblock
Ladeblock
Serviceblock
Trainingsblock

 

  • Jeder blocktyp hat bestimmte eigenschaften, die durch zugeordnete spezifische scripts implementiert werden. Es ist moeglich eine kombination obiger typen zu erstellen. Eigenschaften werden ueber inspektor fenster zugeordnet. 
  • Gleisplaene werden erstellt durch plazieren von block- und verbindungselementen. Einzelne strecken- oder sonderelemente gibt es nicht im gleisplan. Sie sind immer bestandteil eines blockelements. 
  • Jedes blockelement kann an jedem verbindungspunkt eines einzelelementes abgebogen werden (45 grad) um die gewuenschte geometrie the plans zu erzeugen. 
  • Verschiedene views auf den gleisplan koennen dynamisch gebildet werden. 
  • Die laufzeitumgebung unterstuetzt einen touchscreen fuer plazierungs und steuerungskommandos.
  • Blockelemente koennen farblich unterschieden werden und belegt- und reserviert anzeigen koennen ebenfalls durch verschiedenen hintergrund farben visualisiert werden. 
  • Fahrzeugbewegung wird durch animation angezeigt und wahlweise kann der fahrzeugname eingeblendet werden.
  • Signalstellungen werden innerhalb der streckenelemente angezeigt.
  • Fahrbefehle koennen ueber touchscreen eingegeben werden.
  • Es ist ziel die blockdefinition zuerst im steuerungsprogramm zu machen. Eine einzelne eingabe von gleisnamen und konatktname ist nicht erforderlich, diese werden automatisch erzeugt. Die namen werden automatisch in der MBS anlage geschrieben wenn ein "Trainingslauf" ueber den block stattfindet. Dadurch wird die verknuepfung zwischen steuerungsprogramm und anlage hergestellt. 
  • Zugkonfigurationen  koennen auf einem Trainingsblock ermittelt werden. 
  • Zuege koennen automatisch plaziert werden. Parken von unbenutzten zuegen auf einer parkflaeche ohne gleise ist moeglich.
  • Abrufen von zuegen von der parkflaeche ueber ein Einfahrblock und ablegen ueber Ausfahrblock. 

Das ganze mache in C# mit  WPF

gruss

Gmd

 

Edited by gmd

Share this post


Link to post
Share on other sites

http://teutanic.com/CompanionUI.mp4

Hier ist ein kurzer movie, der den derzeitigen stand der dinge zeigt. Habe datenbank erstellt und angeschlossen; grundwerteinstellungen koenen definiert und verwaltet werden. Bloecke werden erkannt und verwaltet. Block monitor funktioniert, Variablen werden angezeigt und einiges mehr. Definiere auch so viel wie moeglich Hilfstexte, mehr fuer mich selbst, damit ich weiss was ich mir eigentlich bei einigen aspekten gedacht habe :). Sind noch einige  funktionen zu schraiben und auch noch einige interaktionen mit dem MBS fertigzustellen, aber das ist lediglich arbeit und kein grundsaetzliches problem.  So langsam werde ich wieder vertrauter mit der entwicklunsgumgebung. Meine programmiertage liegen schon einige zeit zurueck.

gruss

Gmd

 

Share this post


Link to post
Share on other sites

MBSCompanion.pdf

Hallo an alle die an diesem projekt interessiert sind,

Ich habe mich heute mal hingesetzt und angefangen aufzuschreiben was ich so im Kopf habe ueber das was ich mit dem 3DMBS tue. Es wird langsam zuviel im kopf, es muss raus. Ist mehr eine dokumentation fuer mich, dass ich nicht vergesse was ich eigentlich machen wollte, aber ich schreibe es so dass man es auch verwenden kann wenn man an dem projekt interessiert ist oder auch das ergebniss verwenden will. 

Ich habe das in Englisch geschrieben aus mehreren gruenden. Gross/Kleinschreibung und umlaute nerven total, insbesondere wenn man eine englische tastatur benutzt, und ausserdem koennen mehr deutsche englisch als englisch sprechende deutsch, und das 3DMBS kennt ja auch englisch..

Kann man ja durch den translator schicken wenn noetig. 

Ein paar forumites haben mich kontaktiert  und ihr interesse bekundet auch fuer persoenliche updates. Ueber das forum ist es noch einfacher im Augenblick, dann brauche ich keine emails schicken. Ausserdem kann man ja nie wissen wer interesse hat ohne dies zu aeussern. 

Ich habe das mal eben geschrieben ohne viel nachzudenken und auch nicht korrektur gelesen. Also nehmt es so wie es ist. Wird weiter ergaenzt. 

gruss

gmd

 

Share this post


Link to post
Share on other sites

Hallo,

ein weiterer update.

Ueber die schnittstelle kann man nicht ohne weiteres die strassenfahrzeuge von den bahnfahrzeugen unterscheiden usw. Das moege sich in der zukunft aendern aber derzeit eben nicht. Macht aber nichts da ich ohnehin die funktionalitaet eines fuhrparks und depots haben will. Das ist keine nahbildung des MBS katalogs sondern eine referenzliste der objekte die der erbauer auf seinen anlagen verwenden moechte. Ausserdem sind dann an die kategorien auch weitere funktionen gebunden, z.b. spezielle fahrplaene etc. Ausserdem kann man gruppen bilden die dann bestimmten funktionstypen zugeordent werden. Zum beispiel koennen fahrzeuge in kolonne fahren, oder ueberholen, oder verschwinden und nach random zeit wieder woanders auftauchen usw. 

Es ist auch denkbar gruppen zu plazieren und vieles mehr, wenn man erst mal die einzelnen angaben hat. Nun ein beispiel wie man schnell einen solchen katalog erstellen kann. Es ist denkbar einfach.

http://teutanic.com/fuhrpark.mp4

Der video zeigt das vorgehen.

Die oberflaeche kann sich einer aktivitaet anpassen und zeigt dann nur die elemente die fuer die aufgabe benoetigt werden. Das macht es einfacher den ueberblick zu behalten.

Objekte werden plaziert, koenen gelesen werden, sollten beim lesen bereits der richtigen kategorie zugeordnet werden (das kann auch manuell einzeln geschehen) , und werden dann als selektion gemeinsam in den fuhrpark gestellt unter der vorgewaehlten kategorie ... done ..

Wenn die objekte jetzt im fuhrpark stehen werden sie verwendet um lese ergebnisse zu identifizieren. Wenn loks gelesen werden kann ich dann die strassenfahrzeuge sofort erkennen und aussortieren, usw. Das ist also etwas grundaufwand, ist aber simple.

 

gruss

gmd  

Share this post


Link to post
Share on other sites

Hallo,

hier is ein weiterer movie. Ich verwende diese movies auch als dokumentationshilfe fuer jeden schritt fuer mich selbst. Mein gedaechtnis ist auch nicht mehr was es mal war :).

http://teutanic.com/blockDetection.mp4

Vor diesem video laeuft ein schritt BENENNUNG, der erstmal dafuer sorgt dass alle namen fuer die zu bearbeitende anlage eindeutig sind, zumindest gleise,weichen,kontakte und signale.

Derzeit muessen die kontakte nocht plaziert werden, aber in einer spaeteren version werde ich das auch noch automatisieren, dann muss man nur noch feineinstellen. 

Wenn die namen eindeutig sind dann erfolgt die block erkennung wie im movie. So werden alle bloecke auf der anlage abgefahren..

Der naechste schritt ist die erkennung von weichen strassen und dann die routen. Dann kann ich alles in drei tabellen beschreiben und meine blockverwaltung laeuft egal wie gross die anlage ist. Ich habe eine riesige testanlage mit allen schikanen :). Die ware real irgendwo um 200qm oder mehr. Damit werde ich das konzept irgendwann testen, derzeit allerdings noch in kleinen schritten, stueck fuer stueck.

gruss

gmd

 

 

 

 

Share this post


Link to post
Share on other sites

Hallo gmd.

Ich habe heute versucht ein kleines Programm zu schreiben, dass die Kommadosendung und den Ereignisempfang via TCP/IP testen soll.
Für den Ereignisempfang habe ich einen TCP/IP-Listener geschrieben, der am Port 31286 lauscht.

Kommando sende klappt prima, aber ich empfange leider keine Ereignisse.
Ich habe mit einem zweiten Programm eine Testnachricht an das andere Programm geschickt (und die Nachricht wurde erfolgreich empfangen.
Die Porteinstellung im Modellbahnstudio habe ich auch schon überprpft.

Hast Du einen Tip für mich?

 

Viele Grüße
Christian

Share this post


Link to post
Share on other sites

Suche das program putty 

putty.jpg.82bebc7080dbd657d132285574e023eb.jpg

Definiere eine verbindung, siehe oben. Dann geben ein kommando ein wenn das console fenster oeffnet. Hier im beispiel

100; und dann enter. Im programm brauchst du dafuer "100;/n"   /n fuer newline.

Ueberpruefe deine strings. Ausserdem findest du im Wiki beispiele fuer schnittstellen. Ich hatte auch ein beispiel in C#

gepostet. Kommando senden und ereignisse lesen finden auf zwei verschiedenen ports statt. Siehe Wiki externe schnitstelle.

capture.thumb.jpg.624ae2596e674a90a582bb3fad75cc80.jpg

good luck

gmd

Share this post


Link to post
Share on other sites

Hi gmd.

Danke für Deine Mühe.
Leider hilft mir das nicht weiter.


Ich bin professioneller Softwareentwickler und hatte den Listener für die Ereignisse bereits mit einem selbstgeschriebenen Programm überprüft.
Er nimmt einwandfrei Nachrichten auf dem vorgesehen Port an und gibt sie korrekt aus.


Kommados senden war nie ein Problem, das hatte sofort funktioniert.

Ich versuche jetzt herauszufinden warum der Listener nichts von den Ereignissesen vom Modellbaustudio empfängt.
Aber die Wiki ist ein guter Tipp, da schaue ich mal rein.

VG
Eisbär

Share this post


Link to post
Share on other sites

Denke an das zweite port, kommando senden und antwort lesen ist getrennt von events lesen. Das sind zei verschiedene ports.

gruss

gmd

 

Share this post


Link to post
Share on other sites

Danke für den Tip!

Der Port stimmt aber, es ist der dafür vorgesehe Port und ich habe im Modellbahnstudio geprüft, ob dort der richtige Port eingetragen ist.

VG
Eisbär

Share this post


Link to post
Share on other sites
Posted (edited)

das ist wirklich merkwuerdig, hast du die Animation an ? Ich meine das ist eine bloede frage aber manchmal steckt der stecker nicht in der steckdose :)

Wenn nichts passiert kannst du nichts lesen :) 

gruss

gmd


        public static void readData()
        {
            TcpClient client = null;
            NetworkStream eventStream = null;
            try
            {
                client = new TcpClient("127.0.0.1", 31286);
                eventStream = client.GetStream();
            }
            catch (Exception e)
            {
                Debug.WriteLine("MBS nicht gefunden" + "\nMessage ---\n{0}", e.Message);
            }
            try
            {
                while (client != null && eventStream != null)
                {
                    Byte[] data = new Byte[1024];
                    String responseData = String.Empty;
                    // Read the event data
                    Int32 bytes = eventStream.Read(data, 0, data.Length);
                    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);

                    MainUI.Dispatcher.Invoke(new Action(() => addMessage(responseData)));
                }
            }
            catch (Exception e)
            {
                Debug.WriteLine("\nMessage ---\n{0}", e.Message);
            }
        }

das ist der reader, mehr braucht man nicht und funktioniert zuverlaessig.. 

Edited by gmd

Share this post


Link to post
Share on other sites

ja, es gibt noch ein setting Animation aber das ist hier nicht gemeint, das schaltet den edit mode ab. 

Nennen wir es Play modus .. der muss an sein

gruss

gmd

 

Share this post


Link to post
Share on other sites

Ich habe erst vor Kurzem mit dem MBS angefangen.

Diese Einstellung finde ich nicht.
Wo stellt man das denn ein?

VG
Eisbär

Share this post


Link to post
Share on other sites

mbs.thumb.jpg.6d32764f6a447fe8e6e6e802e9ed579f.jpg

Das linke ist edit on/off und nur Animation  das rechte ist PLAY. das ist das wichtige fuer die ereignisse.. Das linke ist 

nur ein displaymodus und edit off

gruss

gmd

 

Share this post


Link to post
Share on other sites

das edit order Animation ist egal fuer events, nur das play ist relevant, das hast du ja jetzt auf an. 

Du brauchst aber auch etwas was sich bewegt, ein fahrzeug das faehrt, sonst bekommst du keine events.

gruss

gmd

 

Share this post


Link to post
Share on other sites

Ich habe es immer mit dem Schalten einer Weiche versucht.
Aber auch ein fahrender Zug schaltende Signale, etc. bewirken nichts.

Dabei fällt mir aber was ein.
Könnte es sein, dass wenn Ereigenisse mit Lua behandelt werden, diese gar nicht mehr an extern ausgelöst werden?
Die Anlage mit der ich testen ist nämlich hoch automatisiert.

VG
Christian

Share this post


Link to post
Share on other sites

Habs gestet, macht keinen Unterschied.
Eigentlich müsste bereits der Wechsel zwischen Anlagen Ereignisse auslösen.

Share this post


Link to post
Share on other sites

nein, das ist egal, du hast einen grundsaetzlichen fehler irgendwo... pruefe deinen listener 

siehe meinen code, diese schnittstelle ist wirklich simple und sollte eigentlich nicht soviele schmerzen bereiten

geh nochmal alles von vorne gruendlich durch. Und mach dir eine eigen kleine testanlage, ein gleis und eine lok reichen

gruss

gmd

 

Share this post


Link to post
Share on other sites

Vielen Dank für Deine Hilfe.
ich baue heute Abend mal Deinen Code ein und schaue ob es damit klappt.
Würde mich aber wundern, weill ich ja miot einem anderen Programm getestet habe ob der Listener auf dem Port lauscht.

VG

Christian

Share this post


Link to post
Share on other sites

Hallo Christian,
arbeitest Du denn auch mit zwei Ports? Kommando- und Ereignisport sind zwei verschiedene!
Ob Ereignisse vorliegen, kannst Du im MBS im Ereignisprotokoll sehen.

Gruß
  Andy

Share this post


Link to post
Share on other sites

Hallo Andy.

Vielen Dank für den Versuch zu helfen.
Das habe ich aber alles berücksichtigt und geprüft.

Der Dialog heute Morgen mit gmd hat mich aber auf eine ID gebracht, ich probiere das heute Abend mal aus.
Ich denke das Modellbahnstudio geht beim Versenden über TCP/IP nicht ganz sauber vor.

Mein Listener ist so aufbebaut wie das üblich ist und stellt eine Akzeptanzanfrage an das Modellbaustudio.
Die wird offenbar aber nicht beanwortet und deswegen wartet der Listener bis zum Sankt-Nimmerleins-Tag auf eine Antwort.

Der Code, den gmd heute gepostet hat macht das nicht und funktioniert bei ihm.
Wenn meine Vermutung stimmt wird es bei mir mit seinem Code auch klappen.

VG

Christian
 

Share this post


Link to post
Share on other sites

Hallo Christian,

vor 3 Minuten schrieb Eisbär:

Mein Listener ist so aufbebaut wie das üblich ist und stellt eine Akzeptanzanfrage an das Modellbaustudio.

was verstehst du darunter? Womöglich ist ein wenig Code hilfreich.

Viele Grüße,

Neo

Share this post


Link to post
Share on other sites

Hi Neo.

Natürlich gerne.
Nachstehend findest Du meinen Code für das Senden und Empfangen.
Beides ist basierend auf den Beispielen aus der Microsoft MSDN aufgebaut und kommuniziert einwandfrei miteinander.

Beim Versuch Nachrichten vom Modellbaustudio zu kriegen bleibt der Code auf der Aweisung
TcpClient client = server.AcceptTcpClient();
stehen.

Sendet eine Anwendung mit einem Senderaufbau wie meinem, dann funktioniert der Listener einwandfrei.

        /// <summary>
        /// Runs the TCP/IP listener.
        /// </summary>
        private void runListener()
        {
            IPAddress ipAddress = null;
            TcpListener server = null;
            Byte[] data = new Byte[256];
            int bytesReceived = default(int);
            string message = null;

            try
            {
                ipAddress = IPAddress.Parse("127.0.0.1");

                server = new TcpListener(ipAddress, 31286);

                server.Start();

                while (true)
                {
                    TcpClient client = server.AcceptTcpClient();

                    message = string.Empty;

                    using (NetworkStream stream = client.GetStream())
                    {
                        while ((bytesReceived = stream.Read(data, 0, data.Length)) != 0)
                        {
                            message += Encoding.ASCII.GetString(data, 0, bytesReceived);
                        }
                    }

                    MessageFromModellTrain?.Invoke(this, new ModelTrainEventArgs(message));

                    client.Close();
                }
            }
            catch (SocketException ex)
            {
                MessageFromModellTrain?.Invoke(this, new ModelTrainEventArgs($"SocketException: {ex.Message}"));
            }
            catch (Exception ex)
            {
                MessageFromModellTrain?.Invoke(this, new ModelTrainEventArgs($"Exception: {ex.Message}"));
            }
            finally
            {
                if (server != null)
                { server.Stop(); }
            }
        }

        /// <summary>
        /// Sends a TCP/IP message.
        /// </summary>
        /// <param name="message">The message.</param>
        /// <returns><see cref="System.String"/>.</returns>
        public string SendMessage(String message)
        {
            string result = null;
            Byte[] data = null;
            Int32 bytesReceived = default(Int32);

            try
            {
                data = System.Text.Encoding.ASCII.GetBytes(message);

                using (TcpClient client = new TcpClient("127.0.0.1", 31285))
                using (NetworkStream stream = client.GetStream())
                {
                    stream.Write(data, 0, data.Length);

                    data = new Byte[256];
                    bytesReceived = stream.Read(data, 0, data.Length);
                    result = System.Text.Encoding.ASCII.GetString(data, 0, bytesReceived);
                }
            }
            catch (SocketException ex)
            {
                result = $"Fehler: '{ex.Message}'";
            }
            catch (Exception ex)
            {
                result = $"Socket-Fehler: '{ex.Message}'";
            }

            return result;
        }

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×