TCP/IP Verbindung zwischen Simatic und Simotion

fab

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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 :)
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.


 
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 ... ?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Zuletzt bearbeitet:
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
 
Zuletzt bearbeitet:
Ja, das geschieht mit dem Neustart der Simatic automatisch. Dieser zeigt mir sogar nach dem Hochfahren Status 16#0000 (Verbindung erfolgreich hergestellt) an.
:confused::confused:
Du meisnt die LCOM Funktionen, oder? Diese lese ich gerade durch.

Grüße fab
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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).
 
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
 
Zurück
Oben