gmd Geschrieben 12. März 2020 Geschrieben 12. März 2020 (bearbeitet) 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. 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 12. März 2020 von gmd
gmd Geschrieben 8. April 2020 Autor Geschrieben 8. April 2020 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
gmd Geschrieben 10. April 2020 Autor Geschrieben 10. April 2020 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
gmd Geschrieben 12. April 2020 Autor Geschrieben 12. April 2020 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
gmd Geschrieben 14. April 2020 Autor Geschrieben 14. April 2020 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
Eisbär Geschrieben 14. April 2020 Geschrieben 14. April 2020 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
gmd Geschrieben 15. April 2020 Autor Geschrieben 15. April 2020 Suche das program putty 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. good luck gmd
Eisbär Geschrieben 15. April 2020 Geschrieben 15. April 2020 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
gmd Geschrieben 15. April 2020 Autor Geschrieben 15. April 2020 Denke an das zweite port, kommando senden und antwort lesen ist getrennt von events lesen. Das sind zei verschiedene ports. gruss gmd
Eisbär Geschrieben 15. April 2020 Geschrieben 15. April 2020 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
gmd Geschrieben 15. April 2020 Autor Geschrieben 15. April 2020 (bearbeitet) 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 15. April 2020 von gmd
gmd Geschrieben 15. April 2020 Autor Geschrieben 15. April 2020 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
Eisbär Geschrieben 15. April 2020 Geschrieben 15. April 2020 Ich habe erst vor Kurzem mit dem MBS angefangen. Diese Einstellung finde ich nicht. Wo stellt man das denn ein? VG Eisbär
gmd Geschrieben 15. April 2020 Autor Geschrieben 15. April 2020 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
Eisbär Geschrieben 15. April 2020 Geschrieben 15. April 2020 So sollte es dann richtig sein, korrekt? VG Eisbär
gmd Geschrieben 15. April 2020 Autor Geschrieben 15. April 2020 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
Eisbär Geschrieben 15. April 2020 Geschrieben 15. April 2020 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
Eisbär Geschrieben 15. April 2020 Geschrieben 15. April 2020 Habs gestet, macht keinen Unterschied. Eigentlich müsste bereits der Wechsel zwischen Anlagen Ereignisse auslösen.
gmd Geschrieben 15. April 2020 Autor Geschrieben 15. April 2020 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
Eisbär Geschrieben 15. April 2020 Geschrieben 15. April 2020 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
Andy Geschrieben 15. April 2020 Geschrieben 15. April 2020 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
Eisbär Geschrieben 15. April 2020 Geschrieben 15. April 2020 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
Neo Geschrieben 15. April 2020 Geschrieben 15. April 2020 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
Eisbär Geschrieben 15. April 2020 Geschrieben 15. April 2020 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; }
Empfohlene Beiträge
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 erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden