Jump to content

Meine externe steuerung


gmd

Empfohlene Beiträge

Hallo Christian,

der Einsatz von TcpListener ist hier nicht richtig. In dem du einen TcpListener erstellst, startest du einen eigenen TCP-Server und wartest mit AcceptTcpClient auf eingehende Verbindungen. Darauf kannst du aber endlos warten, weil das Studio sich nicht von selber mit deinem Listener verbindet, das Studio ist der Server und du musst die Verbindung dazu aufbauen.

Für das Empfangen von Ereignissen musst du dich wie beim Sendern mit einem TcpClient zuerst verbinden und dann statt stream.Write mit stream.ReadLine auf eingehende Ereignisse blockierend warten.

Viele Grüße,

Neo

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guter catch :) ..

Das MBS sendet einfach und das ist eigentlich auch gut so, ist aber nicht offensichtlich aus der dokumentation. 

Accept ist nur erforderlich wenn du handshake mit verschiedenen tcp hosts machen willst. In diesem fall ist das nicht noetig.

gruss

gmd

OOPS das hat sich ueberschnitten.

Bearbeitet von gmd
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Neo.

 

Danke für Hilfe.

Ich hatte das auch so verstanden, dass das Modellbahnstudio auf den angegebenen Port Nachrichten sendet, die dann von einem Listener empfangen werden.
Nun ist das aber ja aufgeklärt und ich freue mich auf die Möglichkeiten, die mir diese Schnittstelle ermöglicht.

Wenn ich einen Vorschlag machen dürfte, möchte ich anregen, dass in dem Wikiartikel "Steuerung über externe Schnittstelle" auf ein weiteres PDF verlinkt wird, in dem Code-Schnipsel enthalten sind.
Das würde den Einstieg in das Thema erleichtern.

 

VG
Christian

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 15 Minuten schrieb gmd:

Guter catch :) ..

Das MBS sendet einfach und das ist eigentlich auch gut so, ist aber nicht offensichtlich aus der dokumentation. 

Accept ist nur erforderlich wenn du handshake mit verschiedenen tcp hosts machen willst. In diesem fall ist das nicht noetig.

gruss

gmd

OOPS das hat sich ueberschnitten.

Auch Dir vielen Dank.

Und es wäre ein guter Catch, wenn ich die Texte nicht vertauscht hätte... :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Minute schrieb gmd:

Australia, aber ich bin deutsch geboren, jetzt Australian national, living in Perth.

gruss

Gmd

 

"T Traveling in a fried-out Kombi, on a hippie trail, head full of zombie ..."

Bin Fan von "Men at Work" wie Du siehst.

Schöne Grüße an die Kangurus! 9_9

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb gmd:

Guter catch :) ..

Das MBS sendet einfach und das ist eigentlich auch gut so, ist aber nicht offensichtlich aus der dokumentation. 

Accept ist nur erforderlich wenn du handshake mit verschiedenen tcp hosts machen willst. In diesem fall ist das nicht noetig.

gruss

gmd

OOPS das hat sich ueberschnitten.

Hi gmd.

Kannst Du mir bitte auch mal Deine Methode zum Senden der Kommandos schicken?

Meine Funktioniert zwar, ich fürchte aber beim Senden von Gruppen könnte die Probleme bereiten.

Danke vorab.

VG

Christian

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich verwende keine gruppenkommandos, die brauche ich derzeit nicht.

 public static void initCommandWriter()
        {

            try
            {
                commandClient = new TcpClient("127.0.0.1", 31285);
                commandClient.NoDelay = true;
                commandStream = commandClient.GetStream();
            }
            catch (SocketException e)
            {
                Console.WriteLine("\nMessage ---\n{0}", e.Message);
            }
        }
 public static string sendMessage(string message)
        {
            try
            {
                Byte[] data = System.Text.Encoding.Default.GetBytes(message);
                if (commandStream != null && commandClient.Connected)
                {
                    String responseData = String.Empty;
                    String result = String.Empty;
                    //  String fullResponse = String.Empty;
                    bool hasData = false;
                    commandStream.Write(data, 0, data.Length);


                    Thread.Sleep(50);
                    int retry = 10;
                    data = new Byte[256];
                    while (retry > 0)
                    {
                        if (commandStream.DataAvailable)
                        {
                            bool folgeLesen = false;
                            while (commandStream.DataAvailable) {
                                Int32 bytes = commandStream.Read(data, 0, data.Length);
                                responseData = System.Text.Encoding.Default.GetString(data, 0, bytes);
                                responseData = responseData.TrimEnd('\r', '\n');

                                // remove the reply code
                                string[] words = responseData.Split(';');
                                if (words[0] == "0" || words.Length == 1 && !folgeLesen)    // wir hatten eine antwort aber keine daten
                                {
                                    if (hasData)
                                        return result;
                                    else
                                        return null;
                                }
                                else
                                {
                                    if (words.Length < 3 && !folgeLesen)
                                    {
                                        if (hasData)
                                            return result;
                                        else
                                            return "1;"+words[1];                             // for now just the first parameter
                                    }
                                    else
                                    {
                                        hasData = true;
                                        result = String.Concat(result, responseData);
                                        folgeLesen = true;

                                    }
                                }
                            }

                            if (hasData)
                                return result;
                            else
                                return null;
                            
                        }
                        else
                        {
                            retry -= 1;
                            Thread.Sleep(100);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Debug.WriteLine("No  MBS" + e.Message);
            }
            Debug.WriteLine("No answer from MBS");
            return null;

        }

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Der naechste schritt ist fertig. Die blockdefinition erfolgt nach der blockerkennung. Das war der letzte video. Dieser zeigt das aber nochmals. 

In der wartezeit mache ich alle moeglichen abfragen an das MBS, das dauer derzeit etwas. Alle parameter fuer den block werden erfasst, zuglaengen, nutzlaenget etc. berechnet. 

Als block sehe ich nicht nur eine einfache strecke. Ich erlaube eine einfahrt und abzweig. Das hat viele gruende und macht die spaetere verwaltung fuer einfachere strecken leichter. Weichenstrassen werden separat unterstuetzt und das wird aehnlich aussehen wie die blockerkennung. Den fahrzeugkatalog habe ich fertig. Dann kommen die routen und zuletzt die fahrplaene mit den aktivitateten. Wenn das alles steht kann ich an diie erweiterung meine lua scripts denken, dann habe ich alle wichtigen parameter fuer die schiene.

Bin jetzt erst mal mit weiterer dokumentation beschaeftigt und ausgiebigem testen der vielen moeglichen fehlerzustaende in den konfigurationen.

Ich habe schon einige pruefungen implementiert, die es dann verhindern sollen dass man falsche definitionen machen kann. 

Aber alles zu seiner zeit. :) 

 http://teutanic.com/blockDefinition.mp4

regards

Gmd

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 18 Minuten schrieb gmd:

Wenn das alles steht kann ich an diie erweiterung meine lua scripts denken

Hi gmd.

LUA? Wozu brauchst Du die denn noch, die Schnittstelle ermöglicht doch eigentlich alles von außen zu realisieren.

Wo liegt mein Denkfehler?

VG
Christian

Link zu diesem Kommentar
Auf anderen Seiten teilen

Christian, 

im prinzip ist das richtig, aber es gibt zur zeit dinge die nicht so ohne weiteres gehen. Die schnittstelle ist aelter als die neue EV. Neo wird da etwas tun denke ich, aber das ist mir ziemlich egal im augenlick.

Ich habe einfach einen anderen ansatz. Meine blockdemo anlage zeigt das. Ich habe generisch LUA  scripte die bestimmte funktionen ausfuehren. Die werden einfach nur parametrisiert durch definitionstabellen. Am ende kann die anlage one meine steuerung laufen. Sie ist im grunde nur der generator fuer parametertabellen und verwaltet die komponenten einer anlage. Ausserdem werde ich ein gleisbildstellpult erzeugen mit einem wesentlich effizienteren editor als Rocrail. Das ist eine separate einheit die auch auf den beschreibungsdaten aufbaut und automatisch mit der anlage verbunden wird.  Theoretisch kann man die LUA scripts ohne mein programm verwenden ist aber zuviel definitionsaufwand bei schon mittleren anlagen. 

Das ganze ist so etwas wie ein baukasten. LUA liefert die grundbausteine und die verkuepfungen und mein programm liefert die gesamten parameter tabellen. Wahrscheinlich werde ich auch ein paar aktive steuerelemente haben aber die werde ich auch in einem separaten programm anordnen. Ich trenne zwischen definitionsebene und ausfuehrungsebene. Es ist ein grosses problem in Rocrail, dass das nicht klar getrennt ist, abgesehen von der verwirrenden oberflaeche, zumindest fuer mich. Ich habe einfach nicht die geduld das stundenlang auszuprobieren. Da nutze ich lieber die zeit und schreibe mein eigenes programm. 

Eine weitere ueberlegung ist, dass Neo wahrscheinlich immer etwas mehr fuer die interne EV tun wird als fuer die externe schnittstelle auch wenn man das so anlegen kann dass eben alles nach draussen gelegt werden kann. Es gibt einige punkte die in LUA schneller zu erledigen sind als ueber die schnittstelle.

Zumindest sind das die bisherigen gedanken, allerdings werde ich nochmals reflektieren wenn ich erst mal alle grunddaten habe und dann anfange komplexere ablaeufe zu implementieren. Vielleicht gibt es eine mischung von beidem. 

In jedem fall brauche ich erst mal komplette konfigurations informationen und die muessen einfach zu erheben sein, nicht einzeln definiert werden muessen.

gruss
gmd

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo gmd,

ich bin fast 69 Jahre alt und habe keine Programmierkenntnisse, weshalb ich auch nicht allzuviel von dem, was Du vorhast, verstehe. Ausgehend von dem Grundsatz, dass es keine dumme Fragen gibt, interessiert mich mal grundsätzlich: Wenn in Zukunft immer mehr Abläufe auf einer Anlage automatisiert ablaufen, wird mir da nicht der eigentliche Spielspaß aus den Händen genommen ? Wenn ich davon ausgehe, dass ich auch ohne Lua bis jetzt auf meinen Anlagen ganz gut Steuerungen hinbekommen habe, gehe ich mal davon aus, dass ich auch in Zukunft ohne Deine parametrisierten Tabellen das MBS zu meiner Zufriedenhat nutzen kann. Wenn dem hoffentlich so ist, frage ich alter Greis aber, wozu bzw. für wen Du den ganzen Aufwand treibst. Ist denn dafür ein genügend großer Bedarf absehbar ?

Schöne Grüße nach Perth

streit_ross

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der bedarf ist bei mir. Ich mache das fuer mich. Jeder hat einen anderen anspruch an spielen und das hat nichts mit dem alter zu tun. 
Manche bauen modelle (dazu haette ich nicht die geduld), manche bauen anlage mit wenig automatisierung, dabei ist der schwerpunkt auf bauen, manche automatisieren kleine details und animationen das ist alles ok. Ich mag halt viel fahrbetrieb und man kann eben nur ein paar wenige zuege beobachten und gleichzeitig steuern ohne eine form von fahrdienst.

Es gibt ja sehr machige programme zu steuerung von anlagen, wie das  ModellStellwrk, Rocrail etc.fuer groessere realanlagen oder auch virtuelle wie das 3DMBS. Mir sind diese programme einfach nicht effizient genug im zusammenhang mit dem MBS also mache ich mir mein eigenes. Wenn andere daran spass finden ok, wenn nicht auch gut. Es ist nicht mein antrieb ein neues stellwerk programm zu vertreiben. Einfach mal eine idee ausprobieren. Warum muss alles gleich kommerziell sein ? 

Mit der EV hat Neo halt eine "can of worms" aufgemacht. Ohne diese waere ich nie auf den gedanken gekommen. Erst eine scripting language eroeffnet diese moeglichkeiten wie ich sie ausprobieren moechte.

Ist das ausreichend erklaert ? 

gruss

gmd

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oder anders ausgedrückt: Der Weg ist das Ziel.
Es gab Zeiten, da habe ich monatelang nur Weichensteuerungen und Drehscheibensteuerungen mit Mikroprozessoren für die reale Moba gebaut.
Resultat: Ich kann noch nichtmal einen vollen Kreis fahren. Warum? Weil mir das tüfteln und Programmieren einfach mehr Spaß macht.
Genau so ist es mit dem MobaStudio.
Der Spaß daran sind für mich die logischen Überlegungen und Wege dorthin, wie man und was man mit der offenen Lua und COM Schnittstelle alles
anstellen kann.
So ist jeder anders. Und das ist gut so.

Gruß
Thomas
 

Bearbeitet von HaNNoveraNer
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb gmd:

im prinzip ist das richtig, aber es gibt zur zeit dinge die nicht so ohne weiteres gehen

Hi gmd.

Danke für den Einblick in Deine Überlegungen.

Ich finde LUA einfach nur schrecklich und werde wohl eher den externen Ansatz bervorzugenb.
Für das was ich vorhabe ist es aber noch ein langer Weg, also bleibt es erst mal bei LUA.

VG
Christian

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 53 Minuten schrieb streit_ross:

Wenn in Zukunft immer mehr Abläufe auf einer Anlage automatisiert ablaufen, wird mir da nicht der eigentliche Spielspaß aus den Händen genommen ?

Hallo streit_ross.

Das ist einfach eine Frage der persönlichen Vorlieben.
Dir hat es wahrscheinlich schon immer Spaß gemacht selbst alles zu schalten und mit dem Fahrregler den Zug zu steuern.

Ich (übrigens 53 Jahre alt) hatte als Jugendlicher eine Minitrix-Anlage, die große Teile meines Taschengeldes gefressen hat.
Die habe ich auch schon voll automatisiert, mit Gleiskontakten und Relais.
Als alles fertig war wurde es langweilig, der Weg war das Ziel, die technische Herausforderung.

Das Schöne an der Modellbahn ist doch, dass beides geht und im Fall des Modellbaustudios für kleines Geld.

Wenn Du Dich mal in Ruhe und schön langsam mit LUA vertraut machst und einen simplen Ansatz verfolgst, kannst Du vielleicht mit der Zeit beides verbinden.
Schalte zum Beispiel Weichen und Signale selbst, und lass LUA dafür sorgen dass die Züge am roten Signal anhalten oder abbremsen, wenn ein Streckensignal Langsamfahrt signalisiert.

Du findest hier Anleitungen und jede Menge Unterstützung.
Und wenn Du keine Lust drauf hast, dann pfeif einfach auf Automation! :)

 

VG
Christian

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo gmd,

Danke für Deine rasche Antwort. Wenn ich denn es richtig verstanden habe, bastelst Du an einem Projekt aus Eigennützigkeit und lässt andere sozusagen teilhaben an dessen Werdegang. Da finde ich es auch gut, dass ich somit die Alternative habe, aus Desinteresse/Fehlen von Kenntnissen diesen Thread außen vor zu lassen.

Nochmals Danke

streit_ross

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Eisbär,

das, was Du da schreibst, tut ja meinen alten Knochen richtig gut:)Ich hatte immer so ein Gefühl, ich verpass den Fortschritt und verschenke mir Möglichkeiten. Andererseits komme ich allein mit der neuen grafischen Oberfläche der EV in V5 gut zurecht und nutze auch solche neuen Möglichkeiten wie Gleiskontakte, Schlagwort, Ausführungsverzögerung usw. in zunehmendem Maße und ich weiß ja auch, dass selbst da Lua unter der Haube werkelt. Also nutze ich ja eigentlich Lua.9_9

Gruß

streit_ross

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