VB6 - Terminalsensoren mit Winsock abfragen

  • VB6

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von martin66.

    VB6 - Terminalsensoren mit Winsock abfragen

    hei an alle VBler,

    habe ein kleines Problem:
    ich will ein Programm zum Auslesen von Messwerten über IP schreiben.
    Mein Ansatz war das klassische Chat-Programm.
    Die Messterminals haben einen integrierten Web-Server. An diesen Terminals sind bis zu 4 Sensoren angeschlossen.
    Die Messwerte kann/könnte man folgendermassen auslesen:
    Verbinden zum Messterminal aufbauen (IP+Port+Protokoll).
    Anschließend sendet man z.B. für Sensor 1: sensorwert.1 <CR> <LF>
    Man sollte darauf einen Antwortstring mit dem Wert erhalten.
    Leider funktioniert das nur wenn ich einen Connect-Button (für den Verbindungsaufbau) erstelle und den Abfragestring dann in einem Textfeld eingebe (wie beim klassischen Chat Beispiel).
    Im txt_Change Ereignis des Textfeldes habe ich dann mein Winsock.Senddata xx stehen. Dann und nur dann wird das DataArrival ausgelöst ?! Ich möchte dieses auslesen aber z.B. mit dem Timer automatisieren bzw. möchte andere Terminals (= andere IP) abfragen.
    Ich habe schon mehrere Stunden mit div. Versuchen verbracht und habe auch in keinem Forum dazu eine Info gefunden.
    Wäre super, wenn jemand einen Tipp für mich hätte.

    danke
    martin
    An der Geschwindigkeit kanns nicht liegen! Meine Vermutung ist, dass du nicht daruf wartest, dass eine Verbidnung zusatnde kommt.
    Ich kann mir aber leider noch kein näheres Bild machen, wie dein Code momentan aussieht, um dir die Fehlerstelle zu zeigen. Es wäre hilfreich, wenn du den Code mal posten könntest!

    Jue ;)
    Wenn ich dir mal so zuhöre, Jue, bi ich der meinung, dass da jemand eine Schleife vergessen hat.


    Dim Beenden as Boolean

    Private Sub Form_Activate()
    Do
    DoEvents
    'Überprüfung hier!
    Loop Until(Beenden = false)
    Unload Me
    End Sub

    Private Sub cmdEnde_Click(...)
    Beenden = true
    End Sub


    Das wäre jetzt ne schleife, bei der du deinen Code bei dem Kommentar einsetzen musst (vom Prinzip her)
    Hallo an Alle und Danke für Euer Interesse an meinem Problem.

    Wie Jue und Mad Andy vermuten ist mein Problem nicht die Geschwindigkeit, sondern dass ich vergebens auf eine Antwort vom Messterminal warte.
    Wenn ich lt. dem klassischen Chat-Beipiel (Connect Button betätigen und dann einfach Text in ein Textfeld eingeben (in meinem Fall den Auslesestring)) vorgehe, dann funktioniert es!?! Ich will diese Abfrage aber nicht jedesmal manuell eingeben, auch andere Terminals abfragen bzw. in regelmäßigen Intervallen (timer) die werte autom. erhalten und wegschreiben ...
    Da es mit dem Chat-Beispiel funkioniert, Antwort (=Messwert) kommt promt, gehe ich von einem Fehler in meinem Source aus. Zu Beginn dacht ich einfach nur vbCrLf anhängen, eine schleife darüber und es müsste passen, leider wars dass nicht :-((

    So nun genug geschwafelt, hier mein code:

    '******************************
    Private Sub cmd_Connect_Click()
    If cmd_Connect.Caption = "Connect" Then
    StatusBar1.Panels.Item(3).Text = Stat_Winsock(Winsock1.State)
    txt_Transmit.Text = ""
    '***Winsock1.RemoteHost = txt_RemoteHost.Text
    Winsock1.RemoteHost = "192.168.1.199"
    Winsock1.RemotePort = 4000
    Winsock1.Protocol = sckTCPProtocol
    Winsock1.Connect
    cmd_Connect.Caption = "Disconnect"
    txt_Transmit.Text = "messung.com"
    Else
    Winsock1.Close
    cmd_Connect.Caption = "Connect"
    End If
    StatusBar1.Panels.Item(3).Text = Stat_Winsock(Winsock1.State)
    End Sub

    Private Sub Disconnect_EthBox()
    Winsock1.Close
    End Sub

    Public Sub cmd_sensor_Click(Index As Integer)
    Winsock1.Close
    Winsock1.RemoteHost = A_Sensoren(Index, 5)
    Winsock1.RemotePort = 4000
    Winsock1.Protocol = sckTCPProtocol
    Winsock1.Connect
    StatusBar1.Panels.Item(3).Text = Stat_Winsock(Winsock1.State)
    lbl_Sensorname.Caption = A_Sensoren(Index, 1)
    lbl_Sensoreinheit.Caption = A_Sensoren(Index, 4)
    'lbl_Ort.Caption = A_Sensoren(Index, 3)
    txt_Transmit.Text = (Change_Port(Index + 1))
    End Sub

    Public Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim Zeilenlaenge, Gleich1, Gleich2, Semikol1, Semikol2 As Integer
    Dim tmp1, tmp2 As String

    Winsock1.GetData Sensor_Antwort
    Zeilenlaenge = Len(Sensor_Antwort)
    Gleich1 = InStr(1, Sensor_Antwort, "=")
    Semikol1 = InStr(1, Sensor_Antwort, ";")
    If Gleich1 <> 0 Then
    tmp1 = Mid(Sensor_Antwort, (Gleich1 + 1), (Semikol1 - Gleich1) - 1)
    If tmp1 <> 1 Then MsgBox "Fehlerhafter Sensorwert!", vbExclamation, "ACHTUNG - Sensorprobleme"
    Gleich2 = InStrRev(Sensor_Antwort, "=")
    Semikol2 = InStrRev(Sensor_Antwort, ";")
    If Gleich2 <> 0 Then
    tmp2 = Mid(Sensor_Antwort, (Gleich2 + 1), (Semikol2 - Gleich2) - 1)
    txt_Sensorwert.Text = tmp2
    End If
    End If
    End Sub

    Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, _
    ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, _
    ByVal HelpContext As Long, CancelDisplay As Boolean)

    MsgBox Description, 16, "Problem"
    CancelDisplay = True
    End Sub

    Private Sub txt_Transmit_Change()
    On Error Resume Next
    Winsock1.SendData txt_Transmit.Text & vbCrLf 'Chr13=CR=Enter, Chr10=LF=Zeilenvorschub
    DoEvents
    End Sub



    Modul1.bas:
    ========
    Public Function Change_Port(Nr As Integer)
    Select Case Nr
    Case 1
    Change_Port = "messung.com1.1"
    Case 2
    Change_Port = "messung.com1.2"
    Case 3
    Change_Port = "messung.com1.3"
    Case 4
    Change_Port = "messung.com1.4"
    Case 5
    Change_Port = "messung.com2.1"
    Case 6
    Change_Port = "messung.com2.2"
    Case 7
    Change_Port = "messung.com2.3"
    Case 8
    Change_Port = "messung.com2.4"
    Case 9
    Change_Port = "messung.com3.1"
    Case 10
    Change_Port = "messung.com3.2"
    Case 11
    Change_Port = "messung.com3.3"
    Case 12
    Change_Port = "messung.com3.4"
    End Select
    End Function
    '***********************************

    PS: Die Anfrage an das Terminal lautet z.B.: "messung.com1.1" & vbCrLf

    Anwort könnte sein: "valid=0;value=20.0"

    ... so funktioniert aus leider zur zeit nur manuell


    danke
    martin
    Ich hoff mal dein Code bisher richtig verstanden zu haben. Deshalb noch ein paar Fragen:
    1. Was ist A_Sensoren ???
    2. Wenn du dich per Connect-button verbindest sendest du "messung.com" an den Rechner 192.168.1.199 . Soll das so sein?

    So, dann mach bitte unter allen "Winsock1.Connect"-Zeilen ein "DoEvents", nur um sicher zustellen, dass dein Rechner nicht zu schnell ist ;)
    Ansonsten kann ich dir Raten MSG-Boxen zum Testen in den Code einzubauen!

    Jue ;)
    Hallo Jue,

    hier die Antwort auf Deine Fragen:
    1) A_Sensoren ist ein Array mit allen Sensordaten (IP, Name, Port, ...)
    2) ich sende z.B. an Sensor1 am Messterminal 192.168.1.199 folgenden String: "messung.com1.1", für Sensor2 dann "messung.com1.2" bis "messung.com1.4" für Sensor4. Es kann aber auch mehrere Messterminals geben ...
    als Antwort könnte dann z.B. "valid=0;value=20.0"
    sein.

    Ich habe die "DoEvents" eingebaut, hatte aber keine Auswirkung :(
    Habe ich sonst noch eine Möglichkeit (außer mit winsock) über IP Daten zu versenden und zu empfangen? ?(

    Danke für Deine Interesse.
    martin
    Wenn du eine Möglichkeit hast, wie du das mit nem Button machst, kannst du einfach den "Send"-Button-Code in nen Timer Kopieren.

    Ich würde es so machen:
    Du sendest mit einem Timer folgende Nachrichten:
    "Messwert1=" & Messw1Variable
    "Messwert2=" & Messw2Variable
    "Messwert3=" & Messw3Variable
    usw...

    (Nach Chatbeispiel nur ohne Button sondern mit Timer)



    und nacher fragst du mit dem Clientprogramm ab, welche nachricht angekommen ist:

    VarName = mid(Eingangsstring, 1, len("Messwert1"))
    Value = mid(Eingangsstring, len("Messwert1")+1)

    Select Case VarName
    Case "Messwert1"
    Messwert1 = Temp
    Case "Messwert2"
    Messwert2 = Temp
    Case "Messwert3"
    Messwert2 = Temp
    usw...
    End Select
    ich messe temperatur, luftfeuchtigkeit, spannung, kontakt, ...

    und nun die teilweise erfreuliche nachricht: konnte das problem zwar nicht direkt lösen, habe aber über umwegen mein ziel erreicht!

    und zwar habe ich einen globalen connect button eingefügt, der die verbindung zum messterminal aufbaut. mit einem textfeld und weiteren sensorbuttons sowie dem click-ereignis löse ich die buttons aus und komme auch zu meinen messdaten.
    als es dann manuell funktionierte, habe ich die abfrage noch um einen timer ergänzt.

    leider etwas umständlich, aber so funktioniert es ;-))
    muß nur noch die funktion zum wechseln auf andere messterminals (= andere IP) schreiben.

    danke für eure ideen und anregungen

    martin :)