Jump to content

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben (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 von Zugrol
Geschrieben

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

  • 4 Wochen später...
Geschrieben (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 von Mr.F
Geschrieben (bearbeitet)

Hallo,

Danke für die Hilfe, werde den Muster-Code durcharbeiten und das für mich brauchbare einbauen.

lg Roland

Bearbeitet von Zugrol
Geschrieben

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

Geschrieben

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.

 

 

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