Mehrkreistemperaturregler Feller Engineering MCS Steuerung über RS485-Schnittstelle Empfangsmethode

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von fraju.

    Mehrkreistemperaturregler Feller Engineering MCS Steuerung über RS485-Schnittstelle Empfangsmethode

    Hallo,
    bin noch relativ am Anfang bei der Visual Basic-Programmierung, also erst seit 4 Wochen. Habe vorner nur Java programmiert, deshalb verzeiht mir etwaige Anfängerfehler =)

    Es geht um ein Schulprojekt, bei dem über den Mehrkreistemperaturregler MCS von Feller Engineering das Auftreten von Fehlern über die Twitter-API gesendet wird und dass sich über Twitter der entsprechende Regler steuern lässt.
    Von uns dreien im Team ist nun meine erste Aufgabe, die Werte und Fehler auf einer interaktiven Benutzeroberfläche auszugeben, dies ist mein Teil des Prototyps für das fertige Programm.

    Das Senden von Befehlen habe ich über die SendSerialData()-Methode von MSDN realisiert, was auch funktioniert, habe dazu eine Methode für die Prüfsummenberechnung geschrieben. Dies klappt auch, aber wenn ich darauf die Empfangsmethode verwende, die laut meinem Projektbetreuer in der Firma auch funktionieren müsste, kommt keine Antwort vom Regler, habe dazu ebenfalls eine Methode aus dem MSDN verwendet, ReceiveSerialData(), und sie nach meinen Anforderungen umfunktioniert, wobei das Telegramm des Reglers zeichenweise gelesen werden soll. Auch die Übertragungsdaten für die serielle Verbindung stimmen.
    Wenn nach dem Senden eines Telegramms (was auch geschehen muss damit der Regler antwortet) die Empfangsmethode aufgerufen wird, hakt es an der ReadChar()-Methode, die kein Zeichen vom Regler empfängt, sieht man in der schrittweisen Ausführung. Dabei reagiert die TimeoutException, welche diesen Fall abfängt.
    Habt ihr noch eine Idee, wie man dieses Problem lösen konnte ? Habe schon etliche Foren, Google und das MSDN, was mir bisher eine sehr große Hilfe war, durchkämmt, aber bisher hat nichts wirklich geholfen. Habe mal meinen Programmcode beigefügt.

    Danke im Voraus
    Florian

    Quellcode

    1. Public Class frm_reglerkommunikation
    2. Private Sub cmd_senden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_senden.Click
    3. Dim antwort As String
    4. Dim befehl As String
    5. befehl = txt_befehl.Text
    6. Call SendSerialData(befehl & CheckSum(befehl) & ChrW(3))
    7. antwort = ReceiveSerialData()
    8. txt_antwort.Text = antwort
    9. End Sub
    10. Sub SendSerialData(ByVal data As String)
    11. Using com1 As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort("COM1", 9600, IO.Ports.Parity.None, 8, IO.Ports.StopBits.One)
    12. com1.WriteLine(data)
    13. com1.Close()
    14. End Using
    15. End Sub
    16. Function ReceiveSerialData() As String
    17. Dim returnStr As String = ""
    18. Dim Incoming As Integer
    19. Dim IncomingChar As Char
    20. Dim com1 As IO.Ports.SerialPort = Nothing
    21. Try
    22. com1 = My.Computer.Ports.OpenSerialPort("COM1", 9600, IO.Ports.Parity.None, 8, IO.Ports.StopBits.One)
    23. com1.ReadTimeout = 200
    24. Do
    25. Incoming = com1.ReadChar()
    26. IncomingChar = ChrW(Incoming)
    27. returnStr = returnStr & IncomingChar
    28. Loop Until ((IncomingChar = ChrW(3)) Or (IncomingChar = ChrW(6)) Or (IncomingChar = ChrW(21)))
    29. Catch ex As TimeoutException
    30. returnStr = "Zeitüberschreitung"
    31. Finally
    32. If com1 IsNot Nothing Then com1.Close()
    33. End Try
    34. com1.Close()
    35. Return returnStr
    36. End Function
    37. Function CheckSum(ByVal str As String) As String
    38. Dim chr As Char
    39. Dim intSum As Integer
    40. 'String in CharArray Umwandeln
    41. Dim chrArray As Char() = str.ToCharArray()
    42. 'Jedes Zeichen in ASCII-Wert umwandeln und zu Summe addieren
    43. For Each chr In chrArray
    44. intSum = intSum + Strings.Asc(chr)
    45. Next chr
    46. 'Summe in Hex-String Wandeln und letzten 2 Stellen zurückgeben
    47. Return Strings.Right(Hex(intSum), 2)
    48. End Function
    49. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kickman12“ ()

    Auch ohne Schleife funktioniert die Einlesemethode für ein Zeichen nicht, sehr schade aber danke.

    die Methode ReadByte() gibt ebenfalls keinen Wert zurück, es kommt auf die übliche TimeoutException.
    Habe den Begriff Threshold Wert noch nie gehört, was ist das ?