Forum: PC-Programmierung [Frage] Steuergerät über COM-Schnittstelle ansprechen


von S. O. (sivroseo)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

vielleicht kann mir einer weiterhelfen.

Ich versuche über VB.Net Programm ein Regelgerät anzusprechen.
Dazwischen befindet sich ein Adapter RS232/RS485.

Mein Programm verbindet sich ohne Probleme mit dem Gerät, aber wenn ich 
meinen Befehl ausführe dann passiert gar nix.

Ich bin noch ein Anfänge auf dem Gebiet..  Ich hoffe deshalb findet man 
den Fehler sehr schnell.

Im Anhang befindet sich ein Beispiel, nachdem ich meinen Code gestaltet 
habe. (Herstellerangaben)



als erstes ermittel ich meine Checksumme über diesen Code:

    Public Sub Test_Checksumme()
        Dim Ergebnis As String
        Dim Rech As Long
        Dim a, b, c, d, e, f, g, h As String

        a = "&H" & "21"
        b = "&H" & "31"
        c = "&H" & "38"
        d = "&H" & "20"
        e = "&H" & "31"
        f = "&H" & "30"
        g = "&H" & "30"
        h = "&H" & "20"


        Ergebnis = (Hex(Val(a) + Val(b) + Val(c) + Val(d) + Val(e)+ 
Val(f) + Val(g) + Val(h)))
        Rech = CLng("&H" & Ergebnis)
        Rech = Rech * -1
        Ergebnis = Hex$(Rech - 1)


        MsgBox(Mid(Ergebnis, Len(Ergebnis) - 1, 2))

    End Sub



2. Mit diesen Buttonevent schicke ich dann das Ergebniss zum 
Steuergerät.

 Private Sub EX_Vent_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles EX_Vent.Click
        Dim Send_buffer(0 To 10) As Byte

        Send_buffer(0) = Convert.ToByte(CChar("!"))          'Befehl
        Send_buffer(1) = 31                  'Adresse
        Send_buffer(2) = 38                  'Code
        Send_buffer(3) = 20                  'Leerzeichen
        Send_buffer(4) = 31                  'Daten
        Send_buffer(5) = 30                  'Daten
        Send_buffer(6) = 30                  'Daten
        Send_buffer(7) = 20                  'Leerzeichen
        Send_buffer(8) = CByte("&H" & "A4")                  'Check
        Send_buffer(8) = 0
        Send_buffer(9) = 13                                 'Carriage 
Return

        Try
            SerialPort1.Write(Send_buffer, 0, 10)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub




Das Ergebniss sollte sein    dass sich im Code 8 das ist eine direkte 
Einstellung   der Wert 100 (31;30;30)  zu lesen sein sollte.
Aber irgendwie raff ich das nicht.

Bestimmt lacht sich ein Profi über diesen verzweifelten Versuch kaputt 
:)


Vielen Dank schonmal im vorraus.

von Frankl (Gast)


Lesenswert?

Wo machst Du die COM Schnittstelle auf (Baudrate, Stopbits, Anzahl 
Datenbits).

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nebenbei: Bist Du Dir sicher, daß das, was Du da in Deiner 
Prüfsummenfunktion treibst, irgendeinen Sinn hat?

von S. O. (sivroseo)


Lesenswert?

Hi,

'#########################################################

Die verfügbaren COM Schnittstellen werden beim laden der Form
in eine Listbox geschrieben.


Private Sub MPS_Load(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles MyBase.Load
        Dim ports As String()
        Dim port As String
        Me.Refresh()
        Windows.Forms.Cursor.Current = Windows.Forms.Cursors.WaitCursor
        Me.Text = "Suche verfügbare COM-Ports. Bitte warten"

        ports = IO.Ports.SerialPort.GetPortNames()
        If ports.Length = 0 Then
            MsgBox("Kein COM-PORT gefunden", MsgBoxStyle.Critical)
            End
        End If

        For Each port In ports
            Try
                With SerialPort1
                    .PortName = port
                    .ReadTimeout = Int32.Parse(500)
                    .Open()
                End With

            Catch es As Exception

            Finally
                If SerialPort1.IsOpen = True Then
                    COM_Liste.Items.Add(port)
                End If

                SerialPort1.Close()

            End Try
        Next port

        _SerialPort1.BaudRate = 2400
        _SerialPort1.Parity = IO.Ports.Parity.None
        _SerialPort1.DataBits = 8
        _SerialPort1.StopBits = 1
        _SerialPort1.Handshake = IO.Ports.Handshake.None
    End Sub

'#########################################################
Die Verbindung starte ich dann mit einem einfachen 'Button Click


    Private Sub CMD_Verbinden_Click(ByVal sender As System.Object, ByVal 
e As System.EventArgs) Handles CMD_Verbinden.Click

        With SerialPort1
            .PortName = COM_Liste.SelectedItem
            .ReadTimeout = Int32.Parse(500)
            .Open()
        End With

    End Sub

von S. O. (sivroseo)


Lesenswert?

[@] Rufus

naja ich glaube nicht       das wahr mein Problem     hatte solange
rumprobiert, bis ich den selben Wert wie im Beispiel hatte.

Vielleicht hast du eine Kompetentere Lösung als mein Pfusch.

Wäre Dir sehr dankbar.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.