TIA Passive TCP-Verbindung herstellen?

Geisterkarle

Level-2
Beiträge
135
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich muss mit meiner SPS (CPU 1516) mit einem anderen Rechner per TCP ein Protokoll für Daten austauschen.
Zum testen des anderen Teilnehmers benutze ich gerade Hercules Setup Utility auf meinem eigenem Rechner.
Und prinzipiell funktioniert alles und ich kann Daten erfolgreich austauschen.
Allerdings benutze ich dafür in meiner SPS-Verbindungskonfiguration "Aktiver Verbindungsaufbau" und - korrigiert mich - entsprechend bin ich also der Client und der Partner ist ein Server. Muss im Hercules Tool auch "TCP Server" anwählen.

Nun hat der Hersteller des eigentlichen Partners gefragt, warum die SPS eigentlich nicht der Server ist. Das wären sie eigentlich mehr gewohnt.
Dieser jetzt hat das jetzt halt "andersherum" programmiert. Da das Protokoll aber auch noch bei anderen Kunden eingesetzt werden soll, versuche ich das jetzt "Konfigurierbar" zu machen, ob ich Aktiv oder Passiv die Verbindung aufbaue - was Server-Client Wechsel entsprechen sollte.
Allerdings bekomme ich es nicht hin, die Verbindung aufzubauen, wenn ich passiv bin. Mein "CONNECT"-Baustein ist auf BUSY und Status 7002. Wie ich es erwarten würde. Aber wenn ich jetzt in meinem Test-Tool TCP-Client eine Verbindung aufbauen möchte bekomme ich als Ergebnis:
Code:
Connecting to 192.168.178.2 ...
Connected to 192.168.178.2
Connection refused by remote host
Connection closed
Die IP stimmt, auch der angegebene Port. Letzteres sehe ich auch dadurch, dass ich bei falschem Port ein
Code:
TCP connection error :10061
angezeigt bekomme (was interessanterweise auch "Connection refused" bedeutet, wenn ich das richtig sehe)
In meiner SPS sehe ich nicht, dass sich irgendwas getan hätte. Kein ERROR oder sonstwas.
Wonach könnte ich schauen, was hier das Problem ist? Muss ich noch irgendwas speziell beachten?
Würde mich über Tipps freuen!

grüßle
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es ist grundsätzlich möglich, dies parametrierbar zu gestalten, habe ich auch schonmal gemacht. Aber sicher nicht on the fly, gehe aber davon aus das Du zwischendurch sicher schon mal einen CPU-Neustart getestet hast.
Mein "CONNECT"-Baustein ist auf BUSY und Status 7002.
Aktuell verwende ich gerne den "T_RCV_C" Baustein statt das von Hand zu Fuß zu bauen.
 
Allerdings bekomme ich es nicht hin, die Verbindung aufzubauen, wenn ich passiv bin.
Das ist ja gerade der Sinn von "passiv", dass der Server keine Verbindung aufbaut, sondern wartet, bis ein Client die Verbindung aufbaut.
Du musst lediglich die Verbindung als "passiv" projektieren oder mit TCON die passive Verbindung für das Betriebssystem registrieren.

Sehr verbreiteter Irrglaube: TCON baut keine Verbindung auf, sondern registriert lediglich dynamisch die Verbindung (den Kommunikationszugangspunkt) für das Betriebssystem. Wenn in der Verbindungsbeschreibung "aktiver Verbindungsaufbau" angegeben ist, dann versucht anschließend das Betriebssystem automatisch den Verbindungsaufbau (und ggf. Wieder-Aufbau, falls die Verbindung mal unterbrochen wird). Wenn "aktiver Verbindungsaufbau" deaktiviert ist, dann passiert nichts weiter, als dass das Betriebssystem auf den Verbindungsaufbau eines Clients wartet.

PS: für die Parametrierbarkeit aktiv/passiv "on the fly" braucht lediglich vor dem Aufruf von TCON in der Verbindungsbeschreibung das "aktiver Verbindungsaufbau" aktiviert oder deaktiviert werden: ActiveEstablished = True/False. Will man das zur Laufzeit ändern (mal aktiv, dann wieder passiv, dann wieder aktiv...), dann mit TDISCON die Verbindungsbeschreibung für das Betriebssystem deregistrieren und dann wieder mit TCON mit den gewünschten Verbindungseinstellungen registrieren. Aus der TIA-Hilfe: "Die Anweisung "TDISCON" löst den lokalen Kommunikationszugangspunkt auf"
 
Zuletzt bearbeitet:
Um eine Verbindung anzunehmen muss auch "rem_tsap_id_len" auf 0 sein.
Auch "rem_staddr_len" solltest du auf 0 setzen, sonst akzeptierst du nur Verbindungen von dem Partner, der in "rem_staddr" angegeben ist...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, zu den Antworten:
@DCDCDC:
Hach, irgendwann in den nächsten 5 Jahren finde ich endlich heraus, wie ich die Siemens Webseite in Opera aufmachen kann... *Edge starte*
(leichte Offtopic Frage...)
Aber kann mir diese Bibliothek mal angucken. Sieht aber auch erstmal nur nach einer Kombination aus TCON, TRCV, TSEND in einem aus... macht das sonst was spezielles?

@zotos:
"on the fly" soll das gar nicht sein, sondern ein festes Konfigurationsbit. Soll von Anfang an definiert sein, mit CPU Start sozusagen.
TRCV_C ist TCON und TRCV Kombiniert. Mehr macht das Ding auch nicht anders. Oder?

@PN/DP:
Genau das mache ich doch: SPS läuft und das Betriebssystem wartet auf Verbindung. Dann nehme ich meinen eigenen PC mit dem TCP-Tool als Client, der die Verbindung aufbauen will. Und ich bekomme ein connected-refused-closed zurück! Das soll doch nicht so sein, hätte gern ein "connected"! Sonst kann ich auch nix senden! Oder verstehe ich was falsch?

@Windoze:
Ich habe eigentlich eine TCP Verbindung und keine ISO-on_TCP, wo ich TSAPs kenne. oder wo finde ich diesen Wert ansonsten?
Mein TCON benutzt für die Verbindung einen TCON_IP_v4.
 
Um eine Verbindung anzunehmen muss auch "rem_tsap_id_len" auf 0 sein.
Auch "rem_staddr_len" solltest du auf 0 setzen, sonst akzeptierst du nur Verbindungen von dem Partner, der in "rem_staddr" angegeben ist...
Das kann ja so gewollt sein, dass nur ein bestimmter Client oder jeder beliebige Client die Verbindung aufbauen darf.
 
@PN/DP:
Genau das mache ich doch: SPS läuft und das Betriebssystem wartet auf Verbindung. Dann nehme ich meinen eigenen PC mit dem TCP-Tool als Client, der die Verbindung aufbauen will. Und ich bekomme ein connected-refused-closed zurück! Das soll doch nicht so sein, hätte gern ein "connected"! Sonst kann ich auch nix senden! Oder verstehe ich was falsch?
Da kommt jetzt das ins Spiel, was Windoze schrieb: trage einfach keine remote IP in die Verbindung ein: "rem_tsap_id_len" = 0, dann wird die Verbindung von jedem beliebigen Client akzeptiert.
Um eine Verbindung anzunehmen muss auch "rem_tsap_id_len" auf 0 sein.
Auch "rem_staddr_len" solltest du auf 0 setzen, sonst akzeptierst du nur Verbindungen von dem Partner, der in "rem_staddr" angegeben ist...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Windoze:
Ich habe eigentlich eine TCP Verbindung und keine ISO-on_TCP, wo ich TSAPs kenne. oder wo finde ich diesen Wert ansonsten?
Mein TCON benutzt für die Verbindung einen TCON_IP_v4.
Bei TCON_IP_v4 solltest du "RemotePort" und die Bytes in "RemoteAddress" auf 0 setzen.
TCON_Param funktioniert zwar auch bei TCP-Verbindungen aber TCON_IP_v4 ist die "modernere" Variante, hatte ich falsch nachgeschaut.
 
Ich habe eigentlich eine TCP Verbindung und keine ISO-on_TCP, wo ich TSAPs kenne. oder wo finde ich diesen Wert ansonsten?
Mein TCON benutzt für die Verbindung einen TCON_IP_v4.
Da musst du in der Struktur TCON_IP_v4 eintragen:
ConnectionType = 16#0B
ActiveEstablished = TRUE Edit: FALSE
RemoteAddress = 0 0 0 0
RemotePort = 0

wie Windoze auch schon schrieb.

Wenn du die Verbindung schon mit anderen Werten mit TCON registriert hast (kann man vermutlich mit dem Webserver der CPU sehen oder mit TIA "Online"), dann müsstest du die Verbindung erst mit TDISCON deregistrieren oder die CPU in STOP und wieder in RUN schalten, oder die Verbindung mit einer anderen ID mit TCON registrieren (LocalPort muss da vermutlich eine andere/bisher nicht registrierte Portnummer sein).
 
Zuletzt bearbeitet:
ActiveEstablished = TRUE
Genau das wollte ich ja nicht machen ;) Sondern FALSE

Aber tatsächlich hat Port und IP 0 geholfen!
Was eigentlich komisch ist, denn der Partner hat ja genau die IP und korrekten Port... aber egal. Funktioniert.
Hab noch bisle rumbasteln müssen für schein-on-the-fly wechseln, aber passt jetzt!

Danke für eure Unterstützung!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dein Hauptproblem wird der Port gewesen sein. Wenn man es nicht explizit programmiert sucht sich das Betriebssystem den Client-Port zufällig aus.
Den in der SPS zu treffen ist Glückssache und der ändert sich bei jeder Verbindung...
 
Genau das wollte ich ja nicht machen ;) Sondern FALSE
Sorry, Kopierfehler. Ich meinte natürlich FALSE. Ich habe es korrigiert.

Aber tatsächlich hat Port und IP 0 geholfen!
Was eigentlich komisch ist, denn der Partner hat ja genau die IP und korrekten Port... aber egal. Funktioniert.
Meinst du den LocalPort oder den RemotePort? Den LocalPort muss der Client zur Verbindungsaufnahme als Zielport angeben. Seinen eigenen Absender-Port (den RemotePort der SPS) kann ein PC Client in der Regel nicht festlegen (oder macht es nur nicht). Normal bekommt er vom Betriebssystem einen zufälligen Port zugeteilt.
 
Zurück
Oben