# TCP/IP Verbindung zwischen Simatic und Simotion



## fab (14 November 2012)

Hallo,
 bin noch ziemlich neu auf dem Gebiet, darum einige teilweise wahrscheinlich simple Fragen.
Meine Aufgabe besteht darin, eine TCP/IP Verbindung zwischen einer CPU317-2PN/DP und einer Simotion D435 herzustellen.

Ich komme vom PC über Ethernet auf den ersten Ethernet-Eingang der CPU317. Dort von der zweiten Ethernet Schnittstelle auf die D435.

Laut den Siemens Dokumentationen enfällt die Projektierung in Netpro, da die diese auf der Anwendungsseite (mit TCON,...)realisiert wird. Darum steht die D435 auch unvernetzt im Netpro, also weder eine Verbindung zum PG noch zur CPU317.

Nun folgende Verständnisfragen:
- Vom Pc habe ich keine dirkete Verbindung auf die D435, nur über die CPU317. Ist denn das so überhaupt richtig? Anpingen kann ich sie problemlos. Wenn ich im Simatic Manager alles markier und auf Upload drücke, werden dann die Programmdaten über die 317 auf die D435 weitergegeben? Im Simotion Scout kann ich mich auf jeden Fall mich weder mit dem Zeilsystem verbinden noch die Station auf run schalten
- Wie kann ich dann Daten von der D435 über den PC auslesen?

Und noch eine weitere Frage:
Beim Baustein "TCON" muss die Portnummer angegeben werden. Wo kann ich denn diese auslesen/einstellen wenn ich die Stationen nicht über Netpro vernetzt habe?

Danke schonmal


----------



## fab (21 November 2012)

Ok, dieses Problem hat sich erledigt.
Mit "entfällt die Verbindungsprojektierung in NetPro" laut Siemens Doku meint man nur, dass die genauen Spezifikationen in NetPro nicht angegeben werden müssen. Jedoch müssen alle Stationen miteinander vernetzt werden.


----------



## fab (26 November 2012)

Der Datenaustausch funktioniert nun. Jetzt habe ich noch folgendes Problem:

in der Simotion wird im StartUp-Task die Funktion tcpOpenServer aufgerufen. Im Backgroundtask dann die Funktionen tcpSend/tcpReceive.
Wenn ich nun bei laufender Verbindung mit der Simotion in "STOP" gehe und anschließend wieder auf RUN läuft die Datenübertragung weiter.
Geh ich nun mit der Simatic in "STOP" und anschließend wieder in "RUN" steht die Datenübertragung, da ja tcpOpenServer nicht wieder aufgerufen wird.

Ich wollte nun den Rückgabewert der Send/Recv Funktionen der Simotion verwenden um den Server erneut zu öffnen. Beim Rückgabewert "16#FFFF8FFD Verbindung wurde geschlossen" sollte die tcpOpenServer Funktion wieder gestartet werden:

 IF test =  1 OR sRetValueTcpSend = 36861 THEN

             sRetValueTcpOpenServer := _tcpOpenServer( //StructRetTcpOpenServer
                                                  port          := 2222,                //UINT, 1024-65535
                                                  backLog       := 3,                   //DINT
                                                  nextCommand   := IMMEDIATELY //IMMEDIATELY , EnumTcpNextCommandMode
                                                );  


Allerdings Funktioniert dies nichteinmal wenn ich die test-Variable auf "1" steuere. tcpOpenServer gibt mit nun "16#FFFFFFFC" zurück, was nicht in der Hilfe beschrieben ist.

Hatte denn schon einmal jemand ein ähnliches Problem oder kennt eine Alternative. Die Verbindung soll automatisch hergestellt werden, sobald die Stationen im Zustand "Run" sind.


----------



## ChristophD (26 November 2012)

Hi,

16#FFFFFFFC bedeutet " Funktion ist in einer anderen Task bereits aktiv"

Gruß
Christoph


----------



## dennisbz (26 November 2012)

generell zur Kommunikation zwischen Simatic und Simotion:
ich stand kürzlich vor einem ähnlichen Problem und habe mich dann für die Kommunikation über "IO-Devices" gelöst. Die Kommunikation findet dann einfach über schreiben in den Peripherie-Bereich der jeweiligen Steuerung statt. 
Hat sicherlich seine Nachteile, die mir jedoch nicht bekannt sind ... ?


----------



## fab (27 November 2012)

Okay, aber ich muss laut Aufgabe bei TCP/IP bleiben. Also fallen alle Alternativen weg...

Bin immer noch am rumtesten wie ich den automatischen Wiederaufbau der Verbindung programmieren kann. AUch folgender Versuch liefert nicht das gewünschte Ergebnis. Als Result von tcpOpenServer bekomm ich nun 16#7001 Funktion gestartet. Allerdings wars das dann auch^^
IF test = 1 THEN

sRetValueTcpCloseConnection := _tcpCloseConnection(connectionId := sRetValueTcpOpenServer.ConnectionId);

sRetValueTcpCloseServer := _tcpCloseServer(port := 2222); //1024 - 65535
sRetValueTcpOpenServer := _tcpOpenServer(
port := 2222, //UINT, 1024-65535
backLog := 3, //DINT
nextCommand := IMMEDIATELY //IMMEDIATELY
);

END_IF;

Ich will also im Fehlerfall (hier test=1) den Server schließen, und dann neu starten. Funktionieren tut dies bereits wenn ich manuell in STOP, dann wieder in START gehe. Dann wird der StartUp-Task ausgeführt wo tcpOpenServer gestartet wird und die Verbindung läuft wieder.


----------



## ChristophD (27 November 2012)

Hallo,

hast du auch auf S7 Seite auch wieder open Client aufgerufen? 16#7001 ist ja erstmal nicht verkehrt, der Server wartet jetzt auf die Verbindungsaufnahme der Gegenseite.
Auf der SIMOTION Utilities & Applications CD ist auch eine FAQ dazu abgelegt inkl. Beispielprojekt.

Gruß
Christoph


----------



## fab (27 November 2012)

Ja, das geschieht mit dem Neustart der Simatic automatisch. Dieser zeigt mir sogar nach dem Hochfahren Status 16#0000 (Verbindung erfolgreich hergestellt) an. 

Du meisnt die LCOM Funktionen, oder? Diese lese ich gerade durch.

Grüße fab


----------



## fab (28 November 2012)

Da das Porgramm Teil einer Bachelor-Arbeit ist fällt die Verwendung von LCOM wohl flach. Die ganzen Bausteine haben Know-how Schutz und darum kann ich diese kaum in meiner Arbeit verwenden.

Das Problem besteht weiterhin wobei die Konstellation egal (Simatic oder Simotion Server/Client) ist. Jedes Mal erfolgt die Datenübertragung nach Ausschalten der Simatic erst nach Neustart der Simotion(Stop-Run).

Weiterhin komisch ist, dass wenn ich einen Stecker ziehe und ihn kurz danach wieder einstecke Die Datenübertragung weiterläuft. Ist er jedoch längere Zeit ausgesteck (ca. 30s) muss man erst wieder die Simotion neu starten um die Übertragung fortzusetzen...

Scheinbar bin ich nicht der Einzige mit diesem Problem:
http://www.automation.siemens.com/W...ow.aspx?PageIndex=1&PostID=373482&Language=de 

mfg fab


----------



## fab (3 Dezember 2012)

Okay hab nun eine Lösung gefunden. Scheinbar hatte es mit den Parametern nextCommand Immediately und When_command_done zu tun.
Man muss im Fehlerfall einen Motion Task restarten:

      IF sRetValueTcpSend = -28675  THEN        //Neustarten der OpenServer-Funktion im Fehlerfall

          restartTask_Stat := _restartTaskId (
          _task.motionTask_1      );

      END_IF;

Im neu gestarteten MotionTask wird dann der Server erneut geöffnet (nextCommand := WHEN_COMMAND_DONE).


----------



## maccswell (14 Juni 2018)

Hallo Christoph, 

ich finde kein Beispielprojekt zu TCP Kommunikation auf der Utilities&Applications.
Weißt du, unter welchem Namen, beziehungsweise wo man es noch finden kann?

Gruß Max


----------



## ChristophD (14 Juni 2018)

auf der CD im Verzeichnis DE -> FAQ_COMMUNICATION_TCPIP.html


----------

