LibNoDave Verbindung trennen

noeppkes

Level-1
Beiträge
150
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe das LibNoDave Beispiel ür VB6 ausprobiert.
Die Verbindung wird einwandfrei hergestellt.
Wenn ich die Verbindung trenne, wird der interne Zähler im CP343 (343-1XC00-0XE0) nicht zurückgesetzt.
Nach der 3. Verbindung sind keine Verbindungen mehr frei im CP, wobei ich dann keinen Connect mehr für eine bestimmte Zeit bekomme.

Jetzt meine Frage:
Trennt LibNoDave die Verbindung nicht richtig oder muss ich wirklich die TimeOut-Zeit abwarten bis ich eine neue Verbindung aufbauen kann ?
(Wäre ja unlogisch. Wenn ich das Programm 3 * starte, muss ich dann die TimeOut-Zeit abwarten (3-6 Min.) bis die Verbindung wieder steht.

noeppkes ...
 
(Wäre ja unlogisch. Wenn ich das Programm 3 * starte, muss ich dann die TimeOut-Zeit abwarten (3-6 Min.) bis die Verbindung wieder steht.
[Scherzmode on]
Wäre ja auch wirklich unlogisch, wenn du dass programm wirklich andauernd neustartest, könnte man ja auch offen lassen :rolleyes:
[Scherzmode off]

Beendest du die Verbindung auch korrekt (ohne Fehler) ?? ggf. mal deinen Code abschnitt mit den "Disconnect" Anweisungen posten.


Also ich hab dass jetzt noch nicht drauf geachtet, aber ich möchte meinen, dass das bei mir immer funktioniert.
 
Zuletzt bearbeitet:
Verbindung richtig trennen. LibNoDave

Hallo,

hier der Auszug aus dem Beispiel.

Verbindung aufbauen:
Code:
Private Sub cmdConnect_Click()
  ' Verbindung herstellen
  Dim RetCode As Long
  lblConnect.Caption = "connected to " & S7_IP & " ... failed!"   ' ... von Natur aus pessimistisch ;-)
  hSocket = openSocket(102, S7_IP)                               ' for ISO over TCP, siehe Doku zu libnodave
 
  If hSocket > 0 Then
    hInterface = daveNewInterface(hSocket, hSocket, "DEMO", 0, daveProtoISOTCP, 0)
    RetCode = daveInitAdapter(hInterface)
    If RetCode = daveResOK Then
      hConnection = daveNewConnection(hInterface, 0, 0, 2)
      RetCode = daveConnectPLC(hConnection)
      If RetCode = daveResOK Then
         lblConnect.Caption = "connected to " & S7_IP
      End If
      cmdConnect.Enabled = (RetCode <> 0)
      cmdDisconnect.Enabled = (RetCode = 0)
      cmdRead.Enabled = (RetCode = 0)
      cmdWrite.Enabled = (RetCode = 0)
    End If
  End If
End Sub

Verbindung abbauen:
Code:
Private Sub cmdDisconnect_Click()
  ' Verbindung abbauen
  Dim RetCode As Long
  If hConnection <> 0 Then
    RetCode = daveDisconnectPLC(hConnection)
    MsgBox ("1: " & RetCode)
    daveFree hConnection
    hConnection = 0
  End If
 
  If hInterface <> 0 Then
    RetCode = daveDisconnectAdapter(hInterface)
    MsgBox ("2: " & RetCode)
    daveFree hInterface
    hInterface = 0
  End If
 
  If hSocket <> 0 Then
    RetCode = closePort(hSocket)
    MsgBox ("3: " & RetCode)
    hSocket = 0
  End If
 
  cmdConnect.Enabled = True
  cmdDisconnect.Enabled = False
  cmdRead.Enabled = False
  cmdWrite.Enabled = False
  lblConnect.Caption = ""
End Sub

Msgbox ("1: "...) gibt 0 zurück.
Msgbox ("2: "...) gibt 0 zurück.
Msgbox ("3: "...) gibt 1 zurück.

Kann hier jemand was erkennen ?

Auf jeden Fall bleibt der Verbindungszähler im CP343 stehen und geht nicht zurück.

noeppkes ...
 
Hallo Noeppkes,

ich hab ein kleines Tool welches über Libnodave und TCP/IP auch mit ner Speed7 kommuniziert. Die Verbindung kann beliebig oft auf- und abgebaut werden. Im Baugruppenzustand unter Kommunikation gibt es einen Verbb.-Zähler, der hoch und runter zählt, je nach Anzahl offener Verbindungen. Mit Wireshark hab ich mal mitgesniffert was beim Verbindungsabbau eigentlich passiert. Beim Abbau wird nur die nackte TCP-Verbindung mit FIN ACK, ACK geschlossen, woraufhin der Ver.-Zähler "sofort" dekrementiert wird. Wird hingegen nur das Netzwerkkabel abgezogen, dann merkt die CPU dies über den Timeout (KeepAlieve).

Bei Siemens CPs muß dass natürlich genauso funktionieren.

Hier mein Code, der dem dem original Libnodave Beispiel entspricht.
Code:
'
' Disconnect from PLC, disconnect from Adapter, close the serial interface or TCP/IP socket
'
Sub cleanUp(ByRef ph As Long, ByRef di As Long, ByRef dc As Long)
'V.cbRead.Enabled = False
  If dc <> 0 Then
    res = daveDisconnectPLC(dc)
    Call daveFree(dc)
    dc = 0
  End If
  If di <> 0 Then
    res = daveDisconnectAdapter(di)
    Call daveFree(di)
    di = 0
  End If
  If ph <> 0 Then
    res = closePort(ph)
    ph = 0
  End If
End Sub
Am besten du nimmst auch mal den Wireshark her und zeichnest die TCP/IP Session auf.

mfG. klaly
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Antwort,

Mein Programm sieht genauso aus.

Es werden anscheinend beide Verbindungen (daveDisconnectPLC + daveDisconnectAdapter) richtig getrennt.

Nur ClosePort funktioniert nicht richtig, da ich dort eine 1 zurückbekomme.

noeppkes ...
 
Zurück
Oben