TIA OUC S7 <> PC mit S7 als Server

Schievel

Level-1
Beiträge
79
Reaktionspunkte
24
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Freunde der Sonne,

mich treibt momentan die Open User Communication zwischen PC und SPS um. Zu allem Überfluss ist die SPS auch noch der Server und der PC der Client.
Irgendwie ist das alles etwas undurchsichtig und nicht besonders intuitiv.

Genauer gesagt möchte ich folgendes umsetzen:
Die SPS agiert als Server und horcht bei Port 2021.
Der PC verbindet sich mit der SPS an Port 2021, sendet ein paar Daten, empfängt ein paar Daten und schließt die Verbindung wieder.
So weit so einfach, eigentlich.

Ich habe es zwar auch hingekriegt, dass das so klappt wie gedacht, aber auch nur mit viel Rumprobieren und Trial and Error, dementsprechend sieht der Code aus.
Auch verstehe ich manche Dinge nicht, warum muss ich beispielsweise eine IP-Adresse des Verbindungspartners angeben, wenn die SPS doch der Server ist? Was ist dann, wenn ich zwei PCs habe, die sich mit der SPS verbinden wollen? Braucht man dann zwingend zwei OUC-Verbindungen?
Warum muss ich als Server die Verbindung aktiv mit dem TDISCON Baustein trennen, auch wenn sich der PC schon lange getrennt hat? Wenn ich das nicht mache, wird die Verbindung nicht wieder freigegeben und der PC kann sich nicht wieder verbinden.

ich habe leider keine vernünftige Doku zu dem Fall gefunden. Bei Siemens geht es immer nur um S7-S7 Kommunikation, vermutlich weil sie ihr OPC UA verkaufen wollen.
vielleicht habt ihr da was?
 
Mit der IP-Adressangabe am Server kannst du festlegen, dass nur ein einziger bestimmter Client mit dieser IP sich verbinden darf. Da du vermutlich nur eine Verbindung zur Zeit annimmst, könnte sonst ein mutwilliger Störer deine Kommunikation lahmlegen in dem er sich mit deiner SPS immer wieder verbindet und so die Ressourcen beansprucht. Die IP Adresse ist zwar keine Sicherheit, aber hilft ggf. gegen unbeabsichtigte Verbindungen oder Portscans.. Bei einigen Versionen des FBs lässt sich aber wenn ich mich richtig erinnere mit Angabe von 0.0.0.0 die Verbindung von einer beliebigen IP-Adresse annehmen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, 0.0.0.0 frisst er nicht. (TIA 16) Ich dachte mir schon, dass da das Sicherheitsargument kommt, aber ich habe gedacht, der Sicherheitsgewinn dadurch ist schon etwas fragwuerdig.
 
Hm, kann auch sein, dass es die 0 beim Partner-Port war. Diese musst du sonst auch noch fest angeben, was bei einem PC als Client schwieriger wird, weil dort der Quellport üblicherweise dynamisch aus einem Pool entnommen wird.

Wie trennt denn dein PC die Verbindung? Und wie erkennst du, dass du die Verbindung mit TDISON trennen musst?
Wenn es robust sein soll, ist TCP schwieriger als man denkt. Z.B. ist ein aktives Trennen eines Clients etwas anderes als wenn du beim Client bei bestehender Verbindung einfach das Netzwerkkabel ziehst, da dann kein Reset bei dir ankommt. Dann dauert es Prinzipbedingt relativ lange bis du eine nicht vorhandene Verbindung erkennst. Wenn du das Protokoll selber entwickeln darfst, dann könntest du auch eigene Keep-Alive Telegramme vorsehen wenn dir die Erkennung von Abbrüchen in kurzem Zeitraum wichtiger erscheint.
 
Wie trennt denn dein PC die Verbindung? Und wie erkennst du, dass du die Verbindung mit TDISON trennen musst?
Naja mit der close() Methode des Socket-Objekts halt.
Da das nicht funktionieren wollte, schliesst die SPS die Verbindung, sobald ein Datentelegramm an den PC zurueckgeschickt wurde. Da ich in diesem Fall genaus weiss, dass der PC nicht noch mehr haben will, geht das in diesem Fall. Allzu sauber ist es natuerlich nicht, wenn der Server die Verbindung einfach mal schliesst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit dem TCP-Baustein von hier https://support.industry.siemens.co...-open-user-communication-(ouc)?dti=0&lc=de-DE geht es einigermassen.
Der Baustein geht zwar immernoch in einen Fehler, wenn man den Socket des Client schliesst und man muss ihn resetten, das geht aber einfach mit dem Error-Ausgang negiert am Enable des Bausteins. So ganz sauber ist das wohl nicht, aber es ist schonmal sehr viel besser als das gewurstel wenn man es selber macht.
Also zusammenfassend kann man sagen, man nimmt am besten den TCP-Baustein aus LOpenUserCom und belegt die Verbindungsdaten haendisch mit Active Connection = false, IP und Port des Partners 0.0.0.0 bzw. Port 0, dann muss man auf der Clientseite nichts machen.
0.0.0.0 als IP kann man nur festlegen, wenn man das haendisch macht. Bei der grafischen Bearbeitung der Verbindungsdaten in TIA laesst er das nicht zu.
 
Zurück
Oben