Jump to content

Meine externe steuerung


gmd

Empfohlene Beiträge

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

 

Bearbeitet von gmd
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 4 Wochen später...

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

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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  

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

 

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.. 

Bearbeitet von gmd
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;
        }

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen.

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...