# An Libnodave eigenen Socket aus .NET übergeben?



## Manni01 (17 Juni 2009)

Hallo,

ich müsste mehr Kontrolle über den Socket, mit dem libnodave mit der S7 kommuniziert, haben. Z.B. muss ich die lokale IP-Adresse angeben können, da es öfter mal vorkommt, dass im PC 2 Netzwerkkarten gesteckt sind. Evtl. ließe sich damit auch mein Problem mit dem Schließen des Sockets lösen:

http://www.spsforum.de/showthread.php?t=27801&highlight=libnodave+socket

Frage also: Ist es möglich einen in .NET erzeugten Socket an libnodave zu übergeben? Wenn ja, wie muss dieser parametriert werden?

Ich hatte es so schon mal probiert, hat aber leider nicht funktioniert:

```
[COLOR=#0000ff][COLOR=#0000ff]Me[/COLOR][/COLOR].Socket = [COLOR=#0000ff][COLOR=#0000ff]New[/COLOR][/COLOR] Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP)
[COLOR=#0000ff][COLOR=#0000ff]Dim[/COLOR][/COLOR] Ep [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] IPEndPoint = [COLOR=#0000ff][COLOR=#0000ff]New[/COLOR][/COLOR] IPEndPoint(IPAddress.Parse([COLOR=#0000ff][COLOR=#0000ff]Me[/COLOR][/COLOR].LocalIpAddress), [COLOR=#0000ff][COLOR=#0000ff]Me[/COLOR][/COLOR].LocalPort)
[COLOR=#0000ff][COLOR=#0000ff]Me[/COLOR][/COLOR].Socket.Bind(Ep)
[COLOR=#0000ff][COLOR=#0000ff]Me[/COLOR][/COLOR].Socket.Connect(IPAddress.Parse([COLOR=#0000ff][COLOR=#0000ff]Me[/COLOR][/COLOR].PlcIpAddress), 102)
[COLOR=#0000ff][COLOR=#0000ff]Me[/COLOR][/COLOR].daveFds.rfd = [COLOR=#0000ff][COLOR=#0000ff]Me[/COLOR][/COLOR][SIZE=3][SIZE=2].Socket.Handle.ToInt32[/SIZE]
[/SIZE]
```
Leider kommt die Funktion 'ConnectPlc' dann nicht mehr zurück.

Vielen Dank für Eure Hinweise,

Manni


----------



## Human (18 Juni 2009)

Manni01 schrieb:


> ...Z.B. muss ich die lokale IP-Adresse angeben können, da es öfter mal vorkommt, dass im PC 2 Netzwerkkarten gesteckt sind. Evtl. ließe sich damit auch mein Problem mit dem Schließen des Sockets lösen...


 
Ich verstehe dein Problem nicht ganz. Windows sucht doch von sich selbst die Karte aus, an der die SPS dran ist. Wenn du einen Ping von Windows losschickst musst du ja auch keine Karte, lokale IP oder sonst was einstellen!

Ich selbst habe auch Programme, die libnodave verwenden, auf Rechnern laufen, die 2 oder mehr Netzwerkkarten haben!


----------



## Rainer Hönle (18 Juni 2009)

Human schrieb:


> Ich verstehe dein Problem nicht ganz. Windows sucht doch von sich selbst die Karte aus, an der die SPS dran ist. Wenn du einen Ping von Windows losschickst musst du ja auch keine Karte, lokale IP oder sonst was einstellen!
> 
> Ich selbst habe auch Programme, die libnodave verwenden, auf Rechnern laufen, die 2 oder mehr Netzwerkkarten haben!



Im Normalfall ja. Wenn alles korrekt parametriert ist. Aber was, wenn an den Karten unterschiedliche Default-Gateways eingestellt sind, die nicht alles erreichen? Dann hängt es davon ab, wer als erstes vom System bedient wird. Und wenn der gewünschte Teilnehmer darüber nicht erreichbar ist => PG (Kurzform für: Pech gehabt)


----------



## Human (18 Juni 2009)

Rainer Hönle schrieb:


> Im Normalfall ja. Wenn alles korrekt parametriert ist. Aber was, wenn an den Karten unterschiedliche Default-Gateways eingestellt sind, die nicht alles erreichen? Dann hängt es davon ab, wer als erstes vom System bedient wird. Und wenn der gewünschte Teilnehmer darüber nicht erreichbar ist => PG (Kurzform für: Pech gehabt)


 
Wieso ist das ein Problem wenn er nicht erreichbar ist, ist es nicht ehr ein Problem, wenn dann 2 erreichbar sind?


----------



## Rainer Hönle (18 Juni 2009)

Human schrieb:


> Wieso ist das ein Problem wenn er nicht erreichbar ist, ist es nicht ehr ein Problem, wenn dann 2 erreichbar sind?


Zwei sind definitiv nicht erreichbar, da das System eine Karte auswählt (nach welchen Kriterien auch immer).
Wenn beide Gateways Zugriff auf alle Netzteilnehmer haben dann ist das ja in Ordnung. Dann spielt es auch keine Rolle, welche Karte verwendet wird. Wenn aber eine nur am LAN hängt und die andere am WAN. Dann macht es schon einen Unterschied, wen ich frage bzw. wohin die Telegramme geschickt werden. Kommt bei zusätzlichen WLAN-Sticks gerne vor.


----------



## Manni01 (18 Juni 2009)

Human schrieb:


> Ich selbst habe auch Programme, die libnodave verwenden, auf Rechnern laufen, die 2 oder mehr Netzwerkkarten haben!


 
Dann ist das reiner Zufall (!) das es funktioniert oder die Netzwerkkarten befinden sich physikalisch alle im gleichen Netz. Dann machen allerdings mehrere Netzwerkkarten wenig Sinn.

Woher soll Windows wissen, an welchem Netz die SPS hängt, bzw. über welche Netzwerkkarte kommuniziert werden soll? Windows verwaltet intern eine Listen der gesteckten Netzwerkkarten. Wenn man einen Socket nicht explizit an einen IP-Endpoint (also an eine Karte) bindet, wird immer die erste in der Liste stehende Karte genommen. Das funktioniert solange bis jemand eine Karte wechselt, tauscht o.ä. dann kann sich die Reihenfolge in dieser Liste ändern und Du hast plötzlich keine Verbindung mehr zur SPS.

Wenn ich meine Socket selbst erzeugen und an libnodave übergebe, dann habe ich volle Kontrolle darüber (auch was das korrekte Zerstören angeht).

Hat jemand einen Vorschlag diesbezüglich?

Danke, und viele Grüße,

Manni


----------



## Rainer Hönle (18 Juni 2009)

Zufall würde ich das nicht unbedingt nennen. Wenn die eine Karte am LAN hängt (nur ein Segment, ohne Gateway) und die andere am WAN dann geht das problemlos. Problematisch wird es, wenn das interne Netzwerk aus mehreren Segmenten besteht und ein Gateway benötigt.


----------



## Manni01 (18 Juni 2009)

Dann tausch mal die beiden Karten von den Steckplätzen her, und schon geht's nicht mehr. Habe ich alles schon gehabt. Zufall ist vielleicht ein bisschen übertrieben, aber sicher ist es nicht....


----------



## Rainer Hönle (18 Juni 2009)

Manni01 schrieb:


> Dann tausch mal die beiden Karten von den Steckplätzen her, und schon geht's nicht mehr.


Und wie waren danach die Einstellungen der Karten? Wer hatte dann das Gateway und war mit welchem Strang verbunden? Oder hat das System neue Karten (da anderer Slot) erkannt und selbst Werte vergeben?


----------



## Manni01 (18 Juni 2009)

Das weiß ich leider nicht mehr. Ich habe den Fall bei einem Kunden gehabt, die ein Maschinennetzwerk und ein Büronetzwerk hatten. Um diese beiden Netzwerke nicht zu vermischen, hat man 2 Netzwerkkarten in den PC eingebaut. Nachdem eine Karte defekt war, hat man die ausgebaut, den Rechner zwischendurch nochmal neu gestartet, dann die neue Karte eingebaut und den Rechner nochmal gestartet. Danach ging es nicht mehr, weil in der internen Liste von Windows die Karten den Platz getauscht hatten.

Da sowas natürlich immer am Wochenende Samstagnacht passiert, versuche ich solche Situationen zu vermeiden...


----------



## Thomas_v2.1 (18 Juni 2009)

Ich habe das Problem mit mehreren Netzwerkkarten schonmal durch eine statische Route im Windows gelöst. Gerade bei Software die nicht auf mehrere Netzwerkkarten ausgelegt ist.
Also über eine Eingabeaufforderung mit
C:\>route add .....
Mit der Option -p wird diese auch dauerhaft in der Registry gespeichert.


----------



## Rainer Hönle (18 Juni 2009)

Damit sind wir wieder am Anfang: bei der korrekten Parametrierung der Karten. Wenn diese stimmt, dann sollte es auch nach Kartentausch funktionieren. Aber da kann Windows einem schon ein Ei legen ;-) mit seinem "ich mache alles selber weil ich es sowieso besser weiß". Dies kann funktionieren, muss aber nicht.


----------



## Manni01 (18 Juni 2009)

Ok, kriegt man alles irgendwie wieder hingebogen; sozusagen die Symtomatik behandeln; nur der Kunde leider nicht. Ich halte es für besser, wenn dieses Problem erst gar nicht auftaucht; aber das ist natürlich meine persönliche Ansicht.

Deshalb, um zum Thema zurückzukommen, weiss jemand wie ich in .NET einen eigenen Socket an libnodave übergeben kann?

Danke, nochmal...


----------



## Rainer Hönle (18 Juni 2009)

Manni01 schrieb:


> Ok, kriegt man alles irgendwie wieder hingebogen; sozusagen die Symtomatik behandeln; nur der Kunde leider nicht. Ich halte es für besser, wenn dieses Problem erst gar nicht auftaucht; aber das ist natürlich meine persönliche Ansicht.


Ganz meine Meinung. Denn die Ursache ist die jetzt falsche Parametrierung der Netzwerkkarten. Und die muss behoben werden. Das andere sind Folgeprobleme.


----------



## Thomas_v2.1 (18 Juni 2009)

Das Problem ist dass ein .Net Socket nicht mit dem Winsock kompatibel ist.
Laut Google scheint es auch keine Möglichkeit geben diesen irgendwie zu konvertieren.

Man könnte aber
1. die openSocket Funktion um ein bind und zusätzlichem Parameter erweitern, und dann die Schnittstelle entsprechend anpassen
2. eine weitere dll schreiben die einen entsprechenden (nicht .Net) Socket erzeugt, den man dann an libnodave weitergeben kann


----------



## Manni01 (18 Juni 2009)

Das erscheint mir dann doch recht aufwändig. Der Königsweg wäre eine komplette .NET-Implementierung von libnodave ;-) Hätte ich genügend Zeit, würde ich's angehen.

Also definitiv keine Möglichkeit einen Socket von .NET an libnodave zu übergeben? Muß m.E. irgendwie möglich sein, denn sonst wäre .NET inkompatibel zu existierenden, herkömmlichen Bibliotheken, die WinSockets verwenden. Kann ich mir nicht vorstellen.


----------

