Zugrol Geschrieben 13. Juli 2019 Geschrieben 13. Juli 2019 Hallo Modellbahn-Gemeinde, Ich steuere meine Anlage hauptsächlich über VisualStudio und möchte aktuell meine Loks auslesen um ihre Geschwindigkeit und ob sie überhaupt unterwegs sind im VisualStudio zu visualisieren. Leider komme ich über die Steuerschnittstelle mit den Codes (Send_Command("350;1") zu keiner Lösung - Es kommt einfach keine vernünftige Rückmeldung (nur 1 x-beliebiges Rollmaterial). Kann mir dabei jemand helfen wie ich die Rückgabewerte von allen Loks im VisualStudio verarbeiten kann - wenn möglich mit einem kleinen Beispiel. Vielen Dank im vorhinein Roland
Zugrol Geschrieben 14. Juli 2019 Autor Geschrieben 14. Juli 2019 Ja, da war vor längerer Zeit schon einmal eine Anfrage von mir - bin bis aktuell mit allen Problemen selber fertig geworden. Nur momentan stehe ich wieder mal an. Falls mir jemand eine Hilfe anbieten kann, wäre ich sehr dankbar dafür. lg Roland
Andy Geschrieben 14. Juli 2019 Geschrieben 14. Juli 2019 VisualStudio ist eine Entwicklungsumgebung. Das sagt nichts darüber aus, mit welcher Programmiersprache Du arbeitest. Nur so läßt sich damit ja wohl gar nichts visualisieren. Bei C kann ich helfen, bei VB nicht. Andererseits hat EASY für VB ja doch alles gezeigt. Mittlerweile gibt's hier auch Posts, die beschreiben, wie man' s einfach mit Python macht. Also, hat das Kind 'nen Namen? Gruß Andy
Zugrol Geschrieben 14. Juli 2019 Autor Geschrieben 14. Juli 2019 (bearbeitet) Sorry für die fehlende Info - Arbeite mit VB und hab jetzt schon relativ viel Arbeit in das vorhandene Programm investiert. Deshalb werde ich mich noch weiter damit beschäftigen. Trotzdem Danke für die Info betreffend Python. lg Roland Bearbeitet 14. Juli 2019 von Zugrol
Andy Geschrieben 14. Juli 2019 Geschrieben 14. Juli 2019 Sorry, mit VB kann ich nicht helfen. Was ich aber für die Ansteuerung sagen kann: Es gibt ja zwei Kanäle. Dementsprechend solltest Du zwei Threads anlegen! An den Ereigniskanal brauchst Du nichts senden, der ist nur für die Ausgabe zuständig. Vergiß beim Senden das abschließende CarriageReturn IM Sendestring nicht, sonst ist der Befehl nicht komplett und nichts passiert. Nach dem Senden mit der Receivefunktion auf die Antwort warten. Wenn mal die erste einfache Anweisung mit Antwort funktioniert, dann ist der Rest nur konzentriertes Studium der Wiki, was gesendet werden muß. Es ist dann fast einfach. String zusammenbasteln, wegschicken, lauschen, auswerten. Und außerdem: Teste nichts mit der neuen V5-Beta. Da ist die Schnittstelle noch Baustelle. Gruß Andy
Mr.F Geschrieben 8. August 2019 Geschrieben 8. August 2019 (bearbeitet) Am 13.7.2019 um 19:39 schrieb Zugrol: Leider komme ich über die Steuerschnittstelle mit den Codes (Send_Command("350;1") zu keiner Lösung Hi, ich mache mir gerade eine DLL für .NET. In einer oder zwei Wochen sollte ich das fertig haben. (Wenig Zeit) Wenn es erlaubt ist DLL-Dateien hier anzubieten, werde ich sie euch hier gerne zur verfügung stellen. @Neo Wie sieht es hier mit DLLs und EXEs aus? Darf man so etwas hier im Forum verbreiten? Hier habe ich dir ein wenig Code vorbereitet(aus meinem Code zurechtkopiert), so siehst du schon mal wie du Commands versendet und die Antworten auswertest. Mit dem Code kannst du die Soll- und Ist- Geschwindigkeit setzen, wie auch auslesen(Funktionen GetVehicleSpeed und SetVehicleSpeed, beide callen SendCommand, so täte ich das dann auch bei Signalen oder Tracks machen). Ich denke mal damit solltest du klar kommen, alle Commands sind ja gut dokumentiert. Denke daran IP, Port und Name der Lok anzupassen. Imports System.Net.Sockets Imports System.Text Public Class Form1 Const IP As String = "127.0.0.1" Const CommandPort As Integer = 31285 Public Enum MBSCommandId GetVehicleSpeed = 370 SetVehicleSpeed = 371 End Enum Public Enum SpeedModes [Is] = 0 Should = 1 End Enum Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Timer1.Interval = 500 Timer1.Start() End Sub Private Sub SetVehicleSpeed(vehicleName As String, speed As Single, speedMode As SpeedModes) SendCommand(MBSCommandId.SetVehicleSpeed, {vehicleName, speedMode, speed.ToString()}) End Sub Private Function GetVehicleSpeed(vehicleName As String, speedMode As SpeedModes) As Single Return CSng(SendCommand(MBSCommandId.GetVehicleSpeed, {vehicleName, speedMode})) End Function Private Function SendCommand(commandId As Integer, Optional params() As String = Nothing) As Object Using client As New TcpClient client.Connect(IP, CommandPort) If client.Connected Then Using stream As NetworkStream = client.GetStream() Dim query As String = "" If params Is Nothing Then query = commandId & vbLf Else query = commandId & ";" For i = 0 To params.Length - 1 If i = params.Length - 1 Then query &= params(i) & vbLf Else query &= params(i) & ";" End If Next End If Dim buf() As Byte = Encoding.Default.GetBytes(query) stream.Write(buf, 0, buf.Length) If stream.CanRead Then buf = New Byte(1024) {} Dim readed As Integer = stream.Read(buf, 0, buf.Length) Dim x As String = Encoding.Default.GetString(buf, 0, readed) If x.Contains(";") Then Dim data() As String = x.Split(";") If data(0) = "1" Then Select Case commandId Case MBSCommandId.GetVehicleSpeed Return CSng(data(1).Replace(".", ",")) End Select Else Select Case commandId Case MBSCommandId.GetVehicleSpeed Return -1111.1F End Select End If End If End If End Using End If End Using Return Nothing End Function Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick Dim speedIs As Single = GetVehicleSpeed("Bahn1", SpeedModes.Is) 'ist geschwindigkeit Dim speedShould As Single = GetVehicleSpeed("Bahn1", SpeedModes.Should) ' soll -geschwindigkeit If speedIs < -1000 OrElse speedShould < -1000 Then Return '-1111.1F means an error End If 'show values as text of the form Text = speedIs & " / " & speedShould End Sub End Class Bearbeitet 8. August 2019 von Mr.F
Zugrol Geschrieben 10. August 2019 Autor Geschrieben 10. August 2019 (bearbeitet) Hallo, Danke für die Hilfe, werde den Muster-Code durcharbeiten und das für mich brauchbare einbauen. lg Roland Bearbeitet 10. August 2019 von Zugrol
Neo Geschrieben 13. August 2019 Geschrieben 13. August 2019 Hallo, Am 8.8.2019 um 18:12 schrieb Mr.F: Wie sieht es hier mit DLLs und EXEs aus? Darf man so etwas hier im Forum verbreiten? planst du die Veröffentlichung des Quellcodes? Wenn ja, dann wäre dieser sicher die bessere Wahl, VisualStudio ist in der Community-Edition ja kostenlos, sodass sich jeder Schnittstellenprogrammierer die DLL selber kompilieren kann. Viele Grüße, Neo
Mr.F Geschrieben 13. August 2019 Geschrieben 13. August 2019 Hey, ich hatte zwar dran gedacht einfach nur die DLLs(x86, x64) zu teilen, aber ich wäre auch bereit den Source hier unter MIT-License zu teilen. Ist ja kein Projekt, mit dem ich $'s generieren würde. Ich hätte aber auch Bedenken, was Runables angeht. Ich hätte zwar nicht obfuskiert, der Code wäre aus dem Kompilat also fast zu 100% wieder herstellbar mit ilspy. ( .NET-Decompiler), aber so ist uns beiden wohl bei der Sache. Ich schätze am Wochenende werde ich alles implementiert haben, muss dann nur noch mal alles durch debuggen, mache dann einen Thread auf, in dem ich dann das Projekt inkl. Support anbieten werde. Nette Grüße, Mr.F.
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