1zu160 - Forum



Anzeige:
Neues von Lemke Collection - Hobbytrain / KATO

THEMA: Daten auf dem SX Bus durch externes PC Programm ändern

THEMA: Daten auf dem SX Bus durch externes PC Programm ändern
Startbeitrag
Schubi - 16.03.22 12:48
Hallo zusammen,
ich steuere meine Anlage mit Rautenhaus RMX 950 USB und Traincontroller, 9 Gold.
Nun zu meiner Frage:
Kann ich während des Betriebes durch ein selbstgeschriebenes PC Programm Daten auf dem SX Bus ändern ?
Zugriff über die COM Schnittstelle?
Hintergrund: Ich habe ein Programm geschrieben, das Waren an den Ladestellen meiner MoBa generiert, so das ich Züge zusammenstellen muss.
Wenn diese Züge fertig sind möchte ich eine vorher in TC definierte Zugfahrt ausführen lassen. Hierzu müsste ich, aus meinem Programm heraus, die Adresse im SX Bus ändern, die diese Zugfahrt im TC aufruft.
Ich vermute das es Probleme mit der COM Schnittstelle geben könnte, da ja zwei Programme gleichzeitig darauf zugreifen wollen.
Ich hoffe ich konnte deutlich machen, worum es mir geht und würde mich über Meinungen / Ideen der Experten hier freuen.
Danke im Voraus und Grüße aus Bochum
Georg Schubert

Edit: RMX System näher definiert. (USB)



Hallo Georg,

das geht durchaus und Du brauchst nicht einmal extra Hardware dafür.
Verbinde Dein Programm über com0com mit dem virtuellen SX-Interface der PC-Zentrale (empfohlene Einstellung SLX825 oder Trix-Standard verbunden mit RMX1) und schon kannst Du auf die Daten am RMX1 zugreifen und diese auch ändern.

Nachtrag: zwei Programme gleichzeitig können nicht auf den COM-Port der RMX950USB zugreifen, deshalb habe ich die virtuellen Interfaces erfunden.

Grüße
Daniel
Hallo Georg,

Bitte mehr Details zur Konfiguration... der PC mit TC ist via serieller Com-Schnittstelle mit der RMX-Zentrale verbunden?... das Programm für die Ladegut-Erzeugung läuft auf dem selben PC wie TC?

Die Com-Schnittstelle ist eigentlich eine Punkt zu Punkt Verbindung, mehrere Teilnehmer in der Kommunikation sind nicht vorgesehen, im Gegensatz zu USB oder LAN.

Schöne Grüße
Peter
Hallo Daniel,
Danke für die schnelle Antwort.
Wenn das der Weg ist, versuche ich mir jetzt mal anzueignen, wie ich die Schnittstelle dann per Visual Basic ansprechen kann.
Vielen Dank aus Bochum
Georg Schubert
Hallo Peter,
es ist so wie du vermutet hast. Verbindung: Der PC mit TC ist via serieller Com-Schnittstelle mit der RMX-Zentrale verbunden und ja, das eigene Programm läuft auf dem gleichen Rechner.

Grüße aus Bochum
Georg Schubert
Hallo Georg,

noch eleganter: Du kannst auch RMXnet benutzen und die PC-Zentrale per Netzwerk über TCP ansprechen.
Ist etwas mehr Programmieraufwand als das SX-Protokoll der seriellen Schnittstelle, aber hat deutlich mehr Möglichkeiten.
Schreib mich an, falls Du eine Protokollbeschreibung möchtest.

Seriell ist das SX-Standardprotokoll äußerst trivial:

Wert aus Adresse lesen: Ein Byte mit der Adresse senden und das Interface schickt als Antwort ein Byte mit dem Inhalt der Adresse zurück.
Beispiel mit Adresse 35:
Anfrage: 35
Antwort: 64 (Bedeutet Bit 6 ist gesetzt, was Ausgang 7 entsprechen würde).

Wert in eine Adresse schreiben: Dafür werden zwei Bytes gesendet. Erstes Byte ist die Adresse + 128, das zweite Byte der neue Wert, der für die Adresse gelten soll.
Beispiel mit o.g. Adresse 35, Du willst nun Bit 0 zusätzlich setzen:
Anfrage: 163 65
Antwort: keine

Grüße
Daniel
Hallo Georg,

Leider kenn ich TC nicht, ich hab die Software von MTTM benutzt, finde aber deine Idee sehr interessant. Ich hatte dort Fahrpläne laufen die etliche Funktionen für diese Anwendung bereitgestellet hatten, das wäre dann aber als Ersatz für dein externes Programm gedacht. Für mich war wichtig, daß die komplett manuelle Bedienung auf dem virtuellen Stellwerk möglich ist, aber automatische (Teil-) Funktionen aktiviert werden könnten. Leider musste die Anlage abgebaut werden, bevor wir uns um Themen wie Güterwagen bereitstellen / - abholen mit aufnehmen könnten.

Ich hoffe das Daniel dich bei der virtuellen Schnittstelle erfolgreich unterstützen kann, halte uns bitte auf dem laufenden.

Schöne Grüße und viel Erfolg
Peter
Hallo Daniel,
danke für dein freundliches Angebot, ich werde bei Bedarf darauf zurück kommen.
Da ich mir das Programmieren selbst beigebracht habe und dort noch am Anfang stehe, dauert es bei mir immer etwas länger, bis ich die erhaltenen Infos Umsetzen kann. (Viel "try and error"!)
Wie gesagt, ich fuchse mich jetzt erstmal in die Programmierung der seriellen Schnittstelle ein.
Ich hatte Visual Basic gewählt, da ich viel mit Buttons, Auswahlmenüs und Bilder der Güter bzw. Bilder der entsprechenden Güterwagen arbeite und es mir als Programmier-Einsteiger damit einfacher war, zu beginnen.
Wenn ich fragen habe werde ich mich melden. Danke nochmal für deine Infos.

@ Peter
Dieses "Spielen" mit der Moba macht wirklich Spaß.
Wenn ich die Verknüpfung zwischen meinem Programm und der Mobasteuerung hinbekomme wird es noch besser.
Wenn es soweit ist werde ich berichten.

Grüße aus Bochum
Georg Schubert
@Daniel:
Ich Depp, hatte ich gesagt das ich über Rautenhaus 950 USB steuere?
Werden die Com Ports hier so angesprochen, wie du es oben beschrieben hast ?
Ich muss mich entschuldigen, habe als Neuling mal wieder alle Begriffe durcheinander gehauen. Über die serielle Schnittstelle war meine Anlage verbunden, bevor ich auf RMX 950 USB geupdatet habe. Sorry
Grüße aus Bochum

Georg Schubert

Hallo Georg,

Du hast doch sicher auch die Software RMX-PC-Zentrale, oder steuerst Du über eine direkte Verbindung von TC zur RMX950USB?

Falls Du die PC-Zentrale nicht hast, bräuchtest Du ein SX-Interface, das Du an den RMX1-Bus anschließt.
Vielleicht findet sich noch irgendwo ein Trix 66842 oder Rautenhaus SLX825.

Ich würde jedoch die Lösung über die PC-Zentrale empfehlen.

Grüße
Daniel
Hallo Daniel,
ja, die RMX PC Zentrale habe ich. Letzte Version. Eine neue Version soll ja irgendwann kommen.

Ich war jetzt etwas verwirrt.
Verstehe ich es richtig, das ich die Kommunikation über den virtuellen Com Port zur Zentrale genau so programmiert wird als hätte ich eine serielle Schnittstell?

Grüße

Georg Schubert

Hallo Georg,

ok, das sind ja beste Voraussetzungen!

Du hast ja dann den TC über ein virtuelles COM-Paar mit dem virtuellen RMX-Interface der PC-Zentrale verbunden und die PC-Zentrale spricht mit der RMX950USB.

Wenn Du nun dasselbe mit dem virtuellen SX-Interface machen willst, brauchst Du nur über com0com ein weiteres COM-Paar einrichten. Einen dieser Ports ordnest Du dem virtuellen SX zu, mit dem anderen kannst Du Dein Programm verbinden.

Für Dein Programm ist das dann genau so, als hättest Du ein physisches serielles SX-Interface am PC.
Probiere es einfach mal aus und nehme zum Test meine SX1-Freeware, die Du dann mit der PC-Zentrale verbinden kannst.

Grüße
Daniel

EDIT: Typo


Hallo Daniel,
Danke für die klärenden Worte.
Das werde ich jetzt erstmal probieren.

Grüße

Georg Schubert
Hallo Daniel,
bisher habe ich meine Moba nicht über ein virtuelles RMX Interface verbunden. Es gab auf meinem Rechner einen COM4 Port welchen ich genutzt habe. Also Entweder PC Zentrale oder TC, eben über COM4. (Über die virtuelle Schnittstelle gab es früher immer wieder Probleme beim Start vom TC. Irgendwann habe ich dann entnervt aufgegeben.)
Wenn ich jetzt in dieses Thema einsteige möchte ich es aber richtig machen.

Also nochmal das Handbuch zu Rate gezogen, mit Com0Com ein Com Paar generiert, RMX Interface angelegt und alles funktioniert prima. (neu COM5 und COM6).
Als nächstes, wie du geschrieben hast nochmal zwei COM Ports generiert. (COM7 und COM8) für das SX Interface.
Jetzt zu meinem Problem :
IM RMX Interf. gibt es jetzt nur noch COM 7/8). OK PC Zentrale auf COM 7 gesetzt, TC auf COM8.
Alles funktioniert wieder.
Nochmal versucht COM5 und COM6 zu erstellen.
Dies kann ich bei den Einstellungen im SX Interf. auch auswählen, aber jetzt gibt es im RMX Interf auch wieder nur COM 5 und COM6.
Ich habe über die grünen Pfeile versucht die COM Ports für die Einstellungen der Interfaces zu aktualisieren, es wird aber immer nur ein paar COM Ports angezeigt. Leider in beiden Interfaces RMX /SX immer nur die gleichen.
Was mache ich falsch?

Danke im Voraus für deine Hilfe

Grüße aus Bochum
Georg Schubert
Hallo Georg,

Du hast im com0com wahrscheinlich nur das vorhandene Paar umbenannt.

Klicke auf „Add Pair“, dann wird ein neues erstellt. Das benennst Du dann auf COM7 und COM8 um und speicherst mit „Apply“.

Damit solltest Du beide Paare haben.

Grüße
Daniel
Hallo Daniel,
manchmal kann es so einfach sein.
DANKE. Es hat funktioniert.

Grüße aus Bochum
Georg Schubert
Hallo Daniel,
du hattest mir angeboten, eine Protokollbeschreibung zu schicken.
Bei mir läuft jetzt alles (Com0Com usw.)
Ich bin mir auch im klaren, wie die Kommunikation zum Traincontroller laufen kann.
Jetzt geht es ans Programmieren des Com Ports und daberi wäre die Protokollbeschreibung sehr sinnvoll.(notwendig?)
Danke im Voraus.

Grüße aus Bochum

Georg Schubert
Hallo Peter,
falls es dich interessiert, habe ich mal eine "anschauiche" Beschreibung meines Programmes gemacht.

Teil 1
https://youtu.be/rlj83Q6PW1M

Teil 2
https://youtu.be/OOkU729OGzc

(Ist nichts besonderes, ohne jegliche Videobearbeitung)

Grüße aus Bochum

Georg Schubert
Servus Georg,

eine tolle Idee und gefällig umgesetzt. Ist das zufällig in dem Stand Freeware (mit den augenklimper)?

Viele Grüße
Martin
Hallo Georg,

das SX-Protokoll über die serielle Schnittstelle ist so trivial wie ich in #5 geschrieben habe.
Etwas ausführlicher kannst Du es hier nachlesen:
https://www.rautenhaus-digital.de/images/stories/pdf/slx825.pdf

Wichtig ist, dass Du die Daten per SerialPort.Write und SerialPort.Read als Byte-Array sendest und empfängst, nicht als String.

Die andere Protokollbeschreibung, die ich oben meinte, wäre die für RMXnet, falls Du per Netzwerkschnittstelle mit der PC-Zentrale kommunizieren möchtest.

Grüße
Daniel
Hallo Georg,

Danke für deine Erklärungen mit den beiden Videos, da hast du eine sehr umfangreiche Lösung gebaut, sehr interessanter Ansatz und ich gebe zu, das kann man nicht in der MoBa Steuerungssoftware so mit rein nehmen. Ich kannte bisher nur die Lösung der Fremo mit Güterwagenkarten um den Verkehr zu steuern. Die komplexen Produktionsabläufe mit Waren Zu- und Abgang sind richtig gut nachgebildet - Respekt wie du die Idee umgesetzt hast und egal was andere dazu sagen, es sorgt der Computer für "gesunden Stress" auf der Anlage ... nicht nur sinnbefreiter Kreisverkehr

Da die Schnittstelle wie du schreibts jetzt tut was es soll, steht dem Betrieb ja nix mehr im Weg - Danke das du deine Lösung mit uns geteilt hast.

Schöne Grüße
Peter
Hallo Martin.
Freeware würde so nicht funktionieren. Ich habe das Programm nicht "Modular" programmiert sondern die Abläufe genau so gestaltet, das sie auf meine Moba (Gleisplan) passen. Selbst wenn ich meine Moba umbauen würde, müsste ich Teile neu, bzw. umprogrammieren. Leider.
Evt. gibt es ja hier Leute, die so etwas programmieren können, das solch ein Programm flexibel an vorhandene Mobas angepasst werden kann.

Grüße aus Bochum

Georg Schubert
Hallo Daniel,
ich nochmal. (Die Nervensäge meldet sich wieder)

Das Schreiben auf den SX -Bus funktioniert nun, mit

Dim Zugf As Byte() = {208, 1}    und    SerialPort1.Write(Zugf, 0, 2)
wird die Adresse 80/1 geschaltet. Funktioniert. DANKE. Ein Teilziel erreicht.

Mit der Abfrage der Adresse, habe ich so meine Probleme.
Du hast geschrieben zur Abfrage muss ich nur das Adress-Byte schicken, und es kommt eine Antwort, ebenfalls, 1Byte.

In deiner verlinkten Rautenhaus Beschreibung, steht : Zum Lesen, muss das Adress-Byte PLUS ein beliebiges Bit geschickt werden.
Irgendwie bekomme ich das nicht hin. Mir ist die Vorgehensweise nicht ganz klar, da du auch schreibst, ich muss mit "SerialPort.Write" und SerialPort.Read" arbeiten.

Versuch die Adresse 80/4 auf "on" (Bit gesetzt) abzufragen:

Dim ABF As Byte() = {80} "und"  SerialPort1.Write(ABF, 0, 1) dann

SerialPort1.Read(ABF, 0, 1)    
  
Hier würde ich als Ergebnis eine 0 oder 1 erwarten. Funktioniert nicht.

Ist es evt. nötig die Abfrage nach Serrialport1.Write........, mit
"Data Receive" fortzuführen und nicht mit SerialPort1.Read ?

Danke im Voraus für deine Hilfe.

Grüße aus Bochum

Georg Schubert

Hallo Georg,

mein Fehler, da hat mich mein Gedächtnis im Stich gelassen.
Es müssen natürlich auch beim Lesen zwei Byte gesendet werden, der Inhalt des zweiten Byte kann beliebig sein, aber man nimmt i.d.R. eine 0.

Also, Lesen von Adresse 80:

Const TIMEOUT As Integer = 100 '100ms Timeout
Dim wait_time as Integer
Dim ABF As Byte() = {80, 0}
Dim result as Byte
SerialPort1.Write(ABF, 0, 2)
wait_time = 0 'Timeout zurücksetzen
'Warten bis Antwort im ReceiveBuffer liegt
While SerialPort1.BytesToRead() = 0 And wait_time < TIMEOUT
    'Hier in die While-Schleife noch ein Thread.Sleep(1) einbauen, sonst werden unnötig CPU-Ressourcen verbraten. Imports System.Threading im Header nicht vergessen.
    Thread.Sleep(1)
    'Timeout-Zähler erhöhen
    wait_time += 1
End While
If SerialPort1.BytesToRead() = 1 Then
    SerialPort1.Read(ABF, 0, 1)
    result = ABF(0)
Else
    'Hier eine Fehlerbehandlung einbauen
    'Wenn keine Bytes oder mehr als eines im ReceiveBuffer liegen, stimmt was nicht!
End If

Ich hoffe, damit kommst Du weiter!

Grüße
Daniel

EDIT: Verbesserungen, siehe unten


Hallo Daniel,
vielen, vielen Dank für das Listing.
Ich werde es damit versuchen.
So langsam verstehe ich die ganzen Zusammenhänge.
Danke nochmal dafür.

Wie schön das es solch tolle Modellbahner hier im Forum gibt.

Grüße aus Bochum
Georg Schubert
Hallo Georg,

gerne geschehen!

Ich habe den Code noch leicht verändert. Es ist nach der While-Schleife besser, nochmal die Bytes im ReceiveBuffer zu prüfen, statt den Timeout. Außerdem sollte auf exakt 1 Byte im ReceiveBuffer geprüft werden, denn wenn mehr drin sind, dann ist etwas faul.

Grüße
Daniel
Hallo Daniel,
es hat geklappt.
Alles funktioniert, wie es soll.
Vielen Dank nochmal.

Grüße aus Bochum

Georg Schubert
Hallo Georg,

freut mich, dass es funktioniert!
Kannst mich gerne auch direkt anschreiben, wenn Du weitere Fragen hast.

Grüße
Daniel


Nur registrierte und eingeloggte User können Antworten schreiben.
Einloggen ->

Noch nicht registriert? Hier können Sie Ihren kostenlosen Account anlegen: Neuer N-Liste Account





Zum Seitenanfang

© by 1zu160.net;