Probleme mit TCP/IP

Begonnen von Juergen Maier, 24. Februar 2010, 07:38:23

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

Juergen Maier

Hallo,
ich habe ein Problem mit der TCPIP übertragung. Ich habe ein Programm dass mir
als Server dient. Mit meiner Steuerung möchte ich mich mit diesem Server
verbinden, und anmelden. Mit meinem Testprogramm funktioniert das auch teilweise.
Ich bekomme beim Serverprogramm angezeigt das ich mich als Client verbunden habe.
Die Meldung am Server als Client verbunden wird angezeigt, sobald ich die Schleife
"Login an Server senden" ausführe. Normalerweise sollte der Server mir anzeigen,
als Client verbunden und Login empfangen. Die Meldung Login empfangen bekomme ich
aber nicht. Leider kann ich vom Server auch nichts empfangen, absolute Funkstille.

Was ich an dem IP_CONTROL Baustein nicht verstehe ist das C_MODE. Muss ich
bei jedem senden C_MODE "belegen", oder bleibt C_MODE immer auf 0, in meinem Fall.
Der Server erwartet für den Login im 1.Byte=1, im 2.Byte=0 und im 3.Byte=0. Wie
"lege" ich diese Wertigkeiten in den SendeBuffer?

Da ich nicht genügend bewandert bin mit TCPIP, hoffe ich mir kann bei meinem Problem
jemand weiterhelfen.

CoDeSys 2.3.9.13; RTE 2.3.7.6; WinXp Professional V2002 SP3
___________________________________________________________________________________________________________
PROGRAM PLC_PRG
VAR
   IP_CONTROL1:IP_CONTROL;
   IP_C1:IP_C;
   S_BUF1: NETWORK_BUFFER;
   R_BUF1: NETWORK_BUFFER;
   IPServer_Adr:DWORD;
   IPClient_Adr:DWORD;
   gbyLogin_CS: ARRAY[1..3] OF BYTE:= 1,0,0;   (* Login Server *)
   gabyPing_CS_Echo: ARRAY[1..1] OF BYTE:= 6;   (* Echo Lifesign, Ping vom Server *)
   send : BOOL;
   xsendEcho: BOOL;
END_VAR


IPServer_Adr:=IP4_DECODE('192.168.001.11');
IPClient_Adr:=IP4_DECODE('192.168.001.10');

(* Login an Server senden *)
IF send THEN
   IP_C1.C_MODE := 0;
   IP_C1.C_ENABLE:= TRUE; (* Verbindungsaufbau freigeben *)
   IP_C1.R_OBSERVE:= TRUE; (* Datenempfang überwachen *)
   IP_C1.TIME_RESET:= TRUE;
   S_BUF1.BUFFER[0] := BYTE#16#01;
   S_BUF1.BUFFER[1] := BYTE#16#00;
   S_BUF1.BUFFER[2] := BYTE#16#00;
   S_BUF1.SIZE :=3;
   send := FALSE;
END_IF;

(* Lifesign an Server senden *)
IF xsendEcho THEN
   IP_C1.C_MODE := 0;
   IP_C1.C_ENABLE:= TRUE; (* Verbindungsaufbau freigeben *)
   IP_C1.R_OBSERVE:= TRUE; (* Datenempfang überwachen *)
   IP_C1.TIME_RESET:= TRUE;
   S_BUF1.BUFFER[0] := gabyPing_CS_Echo[1];
   S_BUF1.SIZE :=1;
   xsendEcho := FALSE;
END_IF;

IP_C1.C_STATE;
IP_C1.C_ENABLE;
IP_C1.C_IP:= IPServer_Adr;
IP_C1.C_MODE;
IP_C1.C_PORT:= 1000;
IP_C1.ERROR;
IP_C1.FIFO;
IP_C1.R_OBSERVE;
IP_C1.TIME_RESET;


IP_CONTROL1(IP:=IPClient_Adr ,PORT:=1000 ,TIME_OUT:=T#10s,IP_C:= IP_C1,S_BUF:=S_BUF1, R_BUF:=R_BUF1 );
IP_CONTROL1.c_enable;

peewit

#1
hallo

die network.lib für codesys ist auf einer wago 750-841 sps entwickelt und getestet worden, und verwendet die SysLibSockets.lib

bei deinem System "CoDeSys 2.3.9.13; RTE 2.3.7.6; WinXp Professional V2002 SP3" sind theoretisch alle vorraussetzungen gegeben,
jedoch gibt es von system zu system leider immer kleiner funktionelle abweichungen.

Soweit ich es bisher feststellen konnte:

TCP Client (geht nicht, problem beim verbindungdaufbau)
TCP Server (geht)
UDP Client (geht)
UDP Server (geht)

------------

mit dem parameter c_mode gibst du den verbindungsmodus vor

0 = TCP Client (Aktiv)
1 = UDP Client (Aktiv)
2 = TCP Server (Passiv)
3 = UDP Server (Passiv)
somit ist c_mode = 0 für deine Anwendung richtig

c_mode musst du nur einmal beschreiben.
die wertigkeiten im sendbuffer sind auch so richtig , so wie du es angenommen hast,

--------------

in der network_lib sind diverse demo-programme enthalten (zum testen)

problem ist, das es viele diverse ethernet-bibliotheken gibt , die aber immer nur für eine plattform funktionieren, und so muss
man für jedes system immer eine adaptierung machen.

so wie es aussieht liegt es primär bei unserer network.lib am tcp_client problem auf Windows-Plattformen



hast du irgendwelche Demoprogramme für dein system , wo eine tcp kommunikation benutzt wird, und dies auch eindeutig funktioniert
wenn ja, bitte mit schicken....


sowie es aussieht musst du dich leider noch gedulden, bis die gründe gefunden sind....

---------------
noch ein paar tips

du schreibst... du hast einen tcp_server und deine sps soll als tcp_client sich mit diesem verbinden
das heisst dein kommunikationspartner (server) hat die ip-adresse '192.168.001.11'
du hast beim ip_control die adresse des tcp_clients angeben ?
bitte überprüfen

du hast in deinem sps-programm zwei ip-adressen in verwendung ?
es ist nur die ip-adresse des kommunikationspartners relevant, nur die sollte angegeben werden

die portnummer und ip-adresse kannst du über die IP_CONTROL Datenstruktur vorgeben, als auch über den IP_CONTROL direkt.
ich würde es aber so machen....

weiters gibt es in deinem testprogramm kein auswertung auf Datenempfang , kann solltest du auch dies vorgeben
IP_C1.R_OBSERVE:= FALSE; (* Datenempfang überwachen *)

------
IPServer_Adr:=IP4_DECODE('192.168.001.11');
IPClient_Adr:=IP4_DECODE('192.168.001.10');

es reicht wenn du die adresse einmal vor dem senden/empfangen konvertierst und übergibst


(* Login an Server senden *)
IF send THEN
  IP_C1.C_MODE := 0; (* auf SPS den TCP-Client Modus verwenden *)
  IP_C1.C_IP := IP4_DECODE('192.168.001.11'); (* Adresse des kommunikationspartners , in dem fall die des TCP-Servers *)
  IP_C1.C_PORT := 1000;
  IP_C1.C_ENABLE:= TRUE; (* Verbindungsaufbau freigeben *)
  IP_C1.R_OBSERVE:= FALSE; (* Datenempfang überwachen *)
  IP_C1.TIME_RESET:= TRUE;
  S_BUF1.BUFFER[0] := BYTE#16#01;
  S_BUF1.BUFFER[1] := BYTE#16#00;
  S_BUF1.BUFFER[2] := BYTE#16#00;
  S_BUF1.SIZE :=3;
  send := FALSE;
END_IF;

IP_CONTROL1(IP:=0 ,PORT:=0 ,TIME_OUT:=T#10s,IP_C:= IP_C1,S_BUF:=S_BUF1, R_BUF:=R_BUF1 );

und in deinem demo-programm kann ich mit folgenden zeilen nichts anfangen

IP_C1.C_STATE;
IP_C1.C_ENABLE;
IP_C1.C_MODE;
IP_C1.ERROR;
IP_C1.FIFO;
IP_C1.R_OBSERVE;
IP_C1.TIME_RESET;


IP_CONTROL1(IP:=IPClient_Adr ,PORT:=1000 ,TIME_OUT:=T#10s,IP_C:= IP_C1,S_BUF:=S_BUF1, R_BUF:=R_BUF1 );
IP_CONTROL1.c_enable;

Juergen Maier

Hallo,
Danke für die schnelle Antwort.

Ich hatte zuerst das Demoprogramm von 3S heruntergeladen und getestet. Bei meinen test
hat alles super funktioniert, ohne Slaves. Als ich die Anlage dann in Betrieb genommen habe
hatte ich das Problem, dass sich meine Profibusslaves immer "abgemeldet" und dan wieder "angemeldet" haben.
Dieses Spiel ging ständig. Nach mehreren Aktionen, wie Programm neu übersetzten, neu laden
ging plötzlich alles wieder, warum auch immer. Jetzt habe ich wieder das Problem, und da wollte
ich nun die TCPIP Verbindung mit den OSCAT Funktionen testen.


und in deinem demo-programm kann ich mit folgenden zeilen nichts anfangen

IP_C1.C_STATE;
IP_C1.C_ENABLE;
IP_C1.C_IP:= IPServer_Adr;
IP_C1.C_MODE;
IP_C1.C_PORT:= 1000;
IP_C1.ERROR;
IP_C1.FIFO;
IP_C1.R_OBSERVE;
IP_C1.TIME_RESET;


War nur zur Ansicht für mich !

Werde einmal die Demoprogramme in der network_lib testen.

peewit

1. welches demoprogramm von 3S
2. was hat funktioniert ohne slaves ?
3. was hat die tcp-verbindung mit den profibus-slaves zu tun

ich verstehe noch nicht ganz, was du da machst .....

Juergen Maier

1. welches demoprogramm von 3S => Habe von 3S ein Beispielprogramm über TCPIP
2. was hat funktioniert ohne slaves ? => Der Verbindungsaufbau Client/Server, und das senden/empfangen von Befehlen über TCP/IP
3. was hat die tcp-verbindung mit den profibus-slaves zu tun => Eigentlich nichts, das ist ja das komische. Es ist nur so, dass wenn ich das Programm
im Büro ohne Hardware (Profibus Slaves) teste funktioniert die TCP/IP Kommunikation. Bin ich an der Anlage mit Hardware, stoppen und starten sich
die Profibus Slaves von alleine. Nehme ich den TCP/IP Baustein wieder aus dem Programm raus, funktioniert alles wie es soll.

peewit

hallo

ein kleiner tip

wenn du die tcp-bausteine von 3s verwendest musst du drauf aufpassen, das diese bausteine in einem eigenständigen task ausgerufen werden.
dein anwenderprogramm (zyklisches programm) muss in einem anderen task aufgerufen werden.

die 3s-tcp-bausteine arbeiten im block-mode das heisst es werden bestimmten systemfunktionen aufgerufen, und das anwenderprogramm
kann dann unbestimmte zeit in diesem baustein hängen bleiben (das was man bei einer sps überhaupt nicht braucht !)

vielleicht ist das dein problem, wenn du die bausteine benutzt.

das ist momentan auch mein problem mit der network.lib auf der windows-plattform das ich das im "non-block" modus momentan nicht gebacken bekomme....
 

Juergen Maier

Hallo,

stimmt genau, das war das Problem. Vielen Dank für die professionelle Hilfe !!