# Modbus Tcp Verbindung zwischen PC (VB.NET) und Wago 750-342



## StefanK (3 Juli 2013)

Hi allerseits,

ich habe eine VB.NET - Anwendung, welche per Modbus Tcp mit einem Wago Ethernet - Koppler (750-342) Kommuniziert. Die Anwendung liest lediglich ein Byte digitale Eingänge und ein Byte digitale Ausgänge. Genutzt habe ich bisher immer die kostenpflichtige DLL: MTB.dll von Wago. Die Ethernetverbindung ist ein Cross-Over Kabel. Genau hier gibt es bei Windows 7 ein Problem: Der Koppler gibt nach einigen Sekunden (das Programm aktualisiert den Status alle 150ms) beim lesen der Eingänge oder beim schreiben der Ausgänge (fertige Prozeduren von Wago) einen Fehler aus. Trennen/Verbinden - und es geht weiter (für ein paar Sekunden). Bislang war das kein Problem, es wurde nur eine Signalampel angesteuert und eine allgemeine Freigabe, jetzt kommt allerdings noch mehr dazu...
Das interessante dabei ist, frühere Programme liefen auf Windows XP, da gab es kein Problem. Weiter ist interessant, das bei Verwendung eines Netzwerkswitch auch unter Windows 7 kein Problem auftritt.
Ich habe mittlerweile auch eine Modbus - Opensource-Lib getestet, die Probleme sind unter Windows 7 (ich habe kein XP-Rechner mehr) die gleichen.
Hat jemand eine Idee was unter W7 so "anders" läuft im "Netzwerk" .. ??

Gruß
Danke


----------



## Thomas_v2.1 (4 Juli 2013)

So wie du schreibst muss das ja etwas mit dem Cross-Over Kabel zu tun haben.
Bei Windows 7 wirst du wohl einen anderen Treiber für die Netzwerkkarte als bei XP haben. Außerdem unterstützt Windows 7 auch IPv6, das wäre auch mal ein Versuch wert IPv6 zu deaktivieren.

Wenn die Verbindung weg ist, würde ich mal einen Blick in die Verbindungseigenschaften der LAN-Schnittstelle werfen. Z.B. ob die Schnittstelle noch aktiv ist, welche Übertragungsrate eingestellt ist usw.
Mal Wireshark mitlaufen zu lassen könnte auch hilfreich sein.


----------



## penner (20 Juni 2016)

Hi StefanK,

ich weiss der Beitrag ist schon etwas älter. Ich versuche hier auch mein vb.NET Programm mit der WAGO zu verbinden. Habe auch schon die MBT.dll.
Doch wenn cih auf verbinden klicke, sagt er ist verbunden auch wenn ich die WAGO nicht angeschlossen habe. Ist das normal?
Dann weiss ich immer noch nicht, wie ich auf das Signal zugreifen kann, dass von der WAGO kommt.
Kannst du mir vielleicht, dein Programm zur verfügung stellen? ODer mir ein paar Tipps geben. Vielen Dank.

Mfg


----------



## holgermaik (20 Juni 2016)

> Doch wenn cih auf verbinden klicke, sagt er ist verbunden auch wenn ich die WAGO nicht angeschlossen habe. Ist das normal?


Nein
Der Aufruf: 
	
	



```
HRESULT = MBT.MBTConnect(Server_IP, ModBusPort, TCP_UDP, TimeOut, ModBus_Socket)
```
sollte Fehler 
	
	



```
&H8007274C  - 'Timeout während des Verbindungsaufbaus
```
 zurückgeben.



```
Private Sub btn_ReadRegister_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_ReadRegister.Click
   
        Dim inpVal() As Short
        Dim adr As Short
        Dim Anzahl As Short
        Dim ZWE As Short
        Dim i As Integer
        Anzahl = 10 
        ReDim inpVal(Anzahl - 1)
        adr = 1 
        HRESULT = MBT.MBTReadRegisters(ModBus_Socket, MODBUSTCP_TABLE_OUTPUT_REGISTER, adr, Anzahl, inpVal(0), 0, 0)
        If HRESULT <> 0 Then
             Ausgabe_Fehlercode(HRESULT, "Register lesen")
             Exit Sub
             End If
      
                For i = 0 To inpVal.GetUpperBound(0)
                    ZWE = MBT.MBTSwapWord(inpVal(i))
                    lb_read.Items.Add("Word " & CStr(adr + i) & " : " & ZWE.ToString)
                Next

   End Sub
```
liest 10 Register ab Adresse 1 und schreib diese in eine Listbox.


Unter DokuNr. m931200 findest du bei Wago die Beschreibung der DLL oder im Verzeichnis "Doc" auf der CD.

Holger


----------



## penner (21 Juni 2016)

Ist vielleicht meine Funktion falsch?

```
<DllImport("MBT.dll", SetLastError:=True)>
Public Shared Function MBTConnect(ByVal szHostAddress As String, ByVal port As Integer, ByVal useTCPorUDP As Long, ByVal requestTimeout As Long, hSocket As Long) As Long
End Function
```

Und was muss ich bei Modbus_Socket setzen?
Das Doc habe ich auch, aber werde nicht richtig schlau daraus.

Vielleicht bin ich auch zu doof für diese Verbindung xD


----------



## holgermaik (21 Juni 2016)

> Ist vielleicht meine Funktion falsch?


 Ja.

Deine Übergabeparameter haben das falsche Datenformat. Die MBT.DLL ist eine C++ DLL, Bei C ist ein Integer 16Bit groß und bei VB.Net ist ein Integer 32 Bit groß. (Long: 32Bit /64Bit)
Die richtige Funktion würde lauten:

```
<DllImport("MBT.dll", CharSet:=CharSet.Unicode)> _
   Public Shared Function MBTConnect(<MarshalAs(UnmanagedType.LPStr)> ByVal szHostAddress As String, ByVal port As Short, ByVal useTCPorUDP As Boolean, ByVal requestTimeout As Integer, ByRef hSocket As Integer) As Integer
    End Function
```



> Und was muss ich bei Modbus_Socket setzen?



Modbus_Socket ist der Rückgabewert der MBTConnect Funktion und ein Zeiger auf die ID der Socketverbindung.

Ich hänge dir mal die Class MBT mit an.
Anhang anzeigen MBT.txt


Holger


----------



## penner (21 Juni 2016)

Ok, mein Fehler war noch, dass ich nicht vor jede Funktion den DLLImport Befehl gesetzt hatte.
Schon mal großes Lob und Danke an dieer Stelle. Bin auf jeden Fall schon weiter. Kriege jetzt eine richtige Verbindung aufgebaut.

Das mit dem Lesen habe ich aber auch noch nicht ganz verstanden.
Ich bräuchte eig eine Signalüberwachung. Und zwar kriegen wir hier von der Maschine ein Siganl (Impuls) an die Wago übertragen. Meißtens auf Zählereingang 1.
Dieses ist aber kein Dauersignal, sondern ein zyklisches. Damit werden bei uns die Teile im BDE System gezählt.
Jetzt will ich ein Befehl ausführen lassen, wenn kein Signal mehr kommt.

Das wäre die Ideallösung


----------



## penner (4 Juli 2016)

Hallo,

hat keiner eine Lösung? Oder eine Idee, wie man es lösen könnte?

Das mit dem Lesen hat jetzt geklappt, wenn ich ein Dauersignal habe.

Könnt ihr mir noch ein paar Tipps geben, wie ich korrekt ein Signal von vb aus übergeben kann.
Welchen Wert muss ich z.B. übergeben, wenn ich dem Zähler 2 ein Signal geben will? Ist das der selbe, wie wenn ich den auslese?
Und sehe ich das Lämpchen blicnken, wenn ich ein Signal übergebe? Wüsste sonst nicht, wie ich das prüfen kann.

Vielen Dank.

mfg


----------



## wolfi_by (4 Juli 2016)

Hallo!

guckst Du hier: https://github.com/NModbus4/NModbus4

Gruß


----------

