An Libnodave eigenen Socket aus .NET übergeben?

Manni01

Level-2
Beiträge
32
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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:
Code:
[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
 
...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!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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)
 
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?
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
 
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....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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...
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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...
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
 
Zurück
Oben