TCP/IP-Kommunikation zwischen SPS und Server

Begonnen von mr hapflinger, 20. Juni 2014, 20:45:15

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 2 Gäste betrachten dieses Thema.

mr hapflinger

Hallo zusammen,

mein Beitrag betrifft Codesys V3.5, falls das also in einer anderen Kategorie besser aufgehoben ist, würde ich einen Moderator bitten, den Beitrag zu verschieben.

Zum Problem:

Ich möchte eine TCP-IP-Verbindung von der CoDeSys-Soft-SPS (Control Win V3 Version 3.5.4.30) zu einem TCP-Server herstellen. Der PC, auf dem die Soft-SPS läuft, ist über ein LAN-Kabel mit einem Router verbunden, der wiederum die Verbindung zum Server herstellt.

Ich habe schon erfolglos einige TCP-Funktionsbausteine ausprobiert, unter anderem auch IP_Control aus der OSCAT-Network-Bibliothek. Eine Verbindung konnte nie hergestellt werden.

1. Ist es vom Prinzip her überhaupt möglich, mit diesem Setup eine TCP-Kommunikation aufzubauen?
2. Muss ich in der Hardwarekonfiguration in CoDeSys irgendwelche Geräte hinzufügen, wie z.B. Ethernetanschlüsse oder ähnliches? Irgendwie muss ich CoDeSys ja mitteilen, dass es den Netzwerkanschluss zum Router gibt, oder?
3. Welche Bibliotheken/Funktionsbausteine würdet ihr empfehlen?

Vielen Dank schonmal.

peewit

Die einfachste basis um informationen auszutauschen ist modbus tcp
Dazu gibt es in oscat bausteine und fuer fast jedecplattform auch fertige loesungen

Du musst mal herausfinden ob du von beiden seiten eine funktionierende kommunikation aufbauen kannst
Um den problem naeher zu kommen

mr hapflinger

#2
Das heißt, dass das Setup prinzipiell schonmal in Ordnung ist und dass ich auch keine zusätzliche Hardwarekonfiguration brauche.

Serverseitig sollte es keine Probleme geben, das habe ich schon anderweitig getestet. Nur von der SPS aus kann ich keine Verbindung aufbauen.

Gibt es irgendwo ein Beispiel, wie der MB_Client-FB angewendet wird?
Wie muss ich die SYSLIBSOCKETS_OPTION setzen?
Welchen Funktionscode sollte ich bei MB_Client wählen und wie muss ich die R_xxx- bzw. W_xxx-Parameter befüllen?
Muss mein Server auch irgendwie Modbus verstehen oder kommen bei ihm ganz normale TCP-IP-Pakete an?

mr hapflinger

Ich habe jetzt mal folgendes Testprogramm entworfen (ohne Modbus):


IF bstart THEN
IP_C.C_PORT := 3306;
IP_C.C_IP := OSCAT_NETWORK.IP4_DECODE('192.168.100.100');
IP_C.C_MODE := 0;
IP_C.TIME_RESET := TRUE;
IP_C.C_ENABLE := TRUE;
IP_C.R_OBSERVE := TRUE;
S_BUF.BUFFER[0] := 1;
S_BUF.SIZE := 1;
OSCAT_NETWORK.SYSLIBSOCKETS_OPTION := BYTE#2#0000_0001;
bstart := FALSE;
END_IF
IP_FIFO(FIFO:=IP_C.FIFO,STATE:=IP_STATE,ID:=IP_ID);



Was habe ich falsch gemacht? Es kann nach wie vor keine Verbindung hergestellt werden, IP_STATE bleibt auf 0.

peewit

wenn etwas nicht funktioniert musst du den "error" parameter ansehen, der sagt dir dann genauer was nicht funktionierte.

eine verbindung kann natürlich auch nur ausgebaut werden wenn die gegenseite dazu passend reagiert !.

ist den der teilnehmer 192.168.100.100 im server-mode und bereit um eine verbindung auf port 3306.

warum rufst du ip_fifo auf
was du auf jedenfall aufrufen musst ist eine instanz von ip_control !!!
sonst passiert gar nichts, nicht einmal eine fehlermeldung wird kommen


mr hapflinger

#5
Der Server funktioniert einwandfrei, den habe ich schon anderweitig getestet.

Ich habe das Programm jetzt folgendermaßen verändert:

IF bstart THEN
IP_C.C_PORT := 3306;
IP_C.C_IP := OSCAT_NETWORK.IP4_DECODE('192.168.100.100');
IP_C.C_MODE := 0;
IP_C.TIME_RESET := TRUE;
IP_C.C_ENABLE := TRUE;
IP_C.R_OBSERVE := TRUE;
S_BUF.BUFFER[0] := 1;
S_BUF.SIZE := 1;
OSCAT_NETWORK.SYSLIBSOCKETS_OPTION := BYTE#2#0000_0001;
bstart := FALSE;
END_IF

IP_Control(IP_C := IP_C, S_BUF := S_BUF, R_BUF := R_BUF, IP := IP_C.C_IP, PORT := 3306, TIME_OUT := T#0S);


Der ERROR-Parameter wechselt nun zwischen 0 und 4244635648. Ein seltsamer Wert, oder?
C_STATE wechselt zwischen 0, 1 und 254.

EDIT: In der Doku gibt ein Beispiel für IP_CONTROL. Da wird auch IP_FIFO aufgerufen und nicht IP_CONTROL. Deswegen bin ich darauf gekommen.

EDIT2: Der Fehlercode besagt anscheinend, dass die Verbindung vom Remote beendet wurde. Das deutet darauf hin, dass es wohl doch am Server liegt, oder?
Das wäre allerdings seltsam, weil der Server problemlos mit anderen Clients zusammenarbeitet, die in C und Visual Basic implementiert wurden.

EDIT3: Bekomme den Fehler aber auch noch, wenn ich das Netzwerkkabel rausziehe.

mr hapflinger

Okay, es lag daran, dass ich immer im Simulationsmodus getestet habe. Jetzt geht es!

Danke für die Hilfe.