# String ueber TCP verbindung senden



## Snoopy123123 (12 März 2010)

Hallo,

Ich will via CP343-Lean einen String an eine PC Anwendung (integrierter TCP Server) senden. Ich habe einen in Netpro eine TCP Verbindung projektiert und IP und Portadressen angegeben. Im DB6 habe ich eine Stringvariable der laenge 20 deklariert. Samt Header also eine Gesamtlaenge von 22Byte. Wenn ich nun mit M21.5 das senden anstosse sehe ich das sich die Anwendung verbindet, aber der String kommt nicht an. Wenn ich mich mit Telnet mit der PC Anwendung verbinde kommen meine gendeten Strings an, also liegts nicht an der Verbindung oder Firewall oder aehnlichem. Muss ich in der SPS noch irgendwas beachten um wie z.b. mit Telnet einen String an einen TCP Server zu schicken?

Folgenden code nutze ich um den String zu senden:
      CALL  "AG_SEND"
       ACT   :=M21.5
       ID    :=1
       LADDR :=W#16#100            
       SEND  :=DB6.Stringvariable
       LEN   :=22
       DONE  :=M15.0
       ERROR :=M15.1
       STATUS:=MW16

      U     M     15.0
      R     M     21.5


----------



## S7_Programmer (12 März 2010)

Hallo,

mit welchem Programm empfängst Du den String?

Ich hab das schon mit VB mit "Winsock" erledigt.
In jüngster Zeit mit PHP (auch mit winsock) auf Kommandozeile.

Gruß

S7_Programmer


----------



## Snoopy123123 (12 März 2010)

Hallo, es handelt sich um einen Beschriftungslaser, der fakt das ich mit Telnet die Kommandos verschicken kann zeigt mir halt das ich irgendwas auf der Siemens Seite falsch mache. Habe gestern noch mit Wireshark versucht die Kommunikation mitzulesen aber der Zeigt mir nur an das ein "malformed Package" versendet wurde. Aber das zeigt Wiresahrk auch bei Telnet an und da funktioniert es trotzdem. 

GRUEBEL..........


----------



## Question_mark (13 März 2010)

*Malformed packed kann man meist ignorieren*

Hallo,



			
				Snoopy123123 schrieb:
			
		

> Aber das zeigt Wiresahrk auch bei Telnet an und da funktioniert es trotzdem.



Das zeigt Wireshark auch öfters bei S7 Telegrammen an. Das liegt aber meist daran, das eben noch kein perfekter Filter für Wireshark zum entsprechenden Protokoll existiert. Das "malformed package" kann man meist getrost ignorieren.

Gruß

Question_mark


----------



## Snoopy123123 (13 März 2010)

Hallo QM,
Im Netpro ist aber ganz klar eine TCP-Verbindung eingestellt, und die sollte Wireshark doch kennen oder etwa nicht ? Obwohl Wireshark scheint ja auch das Telnet Protokoll nicht zu kennen und das ist doch ganz klar TCP. Zumindest hoert die Anwendung auf Telnet und nicht auf die S7. Jemand ne Idee was bei der S7 anders ist, oder ob ich vielleicht irgendwas an der Konfiguration falsch gemacht haben koennte ?


----------



## S7_Programmer (15 März 2010)

Hallo,

soweit ich mitbekommen habe, kommen Zeichen am Laser an.
Dieser weigert sich aber.

Ich hatte schon mit Haas/Trumph Laser zu tun, jedoch mit V24; da war aber im Protokoll ein BCC-Zeichen (Block-Check-Character) zu brücksichtigen. Könnte es daran liegen?

Weiterhin viel Erfolg!

S7_Programmer


----------



## Snoopy123123 (15 März 2010)

S7_Programmer schrieb:


> Hallo,
> 
> soweit ich mitbekommen habe, kommen Zeichen am Laser an.
> Dieser weigert sich aber.
> ...



Nicht ganz am Laser kommt halt nur was an wenn es mit Telnet gesendet wird. 
Habe am WE mal ein bissjen rumprobiert und mir nen TCP Server mit den INDY Komponenten zusammengebaut. HIer verhaelt es sich genau so. Wenn der String von Telnet kommt dann empfaengt ihn der Indy Server, wenn der String von der S7 kommt dann verbindet der Server sich zwar mit dem client, aber empfaengt leider kein String. Bin jezt mit meinem Latein am ende. Werde wohl mal den Siemens Support bemuehen muessen


----------



## Grubba (15 März 2010)

Was sagt denn der Status von AG_SEND ?


----------



## Snoopy123123 (15 März 2010)

Wechselt beim ersten verbinden zwischen 8181 (Auftrag laeuft) und 8183 (Die Projektierung fehlt oder der Dienst im Ethernet-CP ist noch nicht gestartet), und sobald der client verbindet auf 0000 (Auftrag fertig).


----------



## Grubba (15 März 2010)

8183 hört sich erst mal nicht gerade gut an.

Prinzipiell ist ja eigentlich so, das sich dein CP automatisch mit dem Server verbindet, und nicht erst, wenn du ein Telegramm versenden willst. 


Mit diesem Tool (....und wahrscheinlich 1000 anderen)

http://www.sps-forum.de/showpost.php?p=246121&postcount=18

kannst du sehen, was empfangen wurde. Ausserdem wird angezeigt, ob eine Verbindung aufgebaut wurde. Das müsste eigentlich schon passieren, bevor du ein Telegramm versendest.

Vielleicht passt doch noch was in der Parametrierung des CP nicht.


----------



## S7_Programmer (15 März 2010)

Hallo,

kannst Du anstatt des Lasers einen PC mit entsprechender IP-Adresse
reinhängen? Oder IP in Konfig umstellen, dann kannst Du eventuell auch Dein PG nutzen.
Dann kannst Du mit Netcat die empfangenen Daten auffangen.
nc -l -pnnnn (nc für netcat, -L für Listening Mode. -Pnnnn für PortNummer)

Info netcat siehe auch:http://de.wikipedia.org/wiki/Netcat
Ich habe die Windowsversion nach ins attachment gestellt.

Vielleicht kommst Du hiermit der Sache auf den Grund.

Viel Erfolg!
S7_Programmer


----------



## Snoopy123123 (16 März 2010)

Hallo,

Danke erst mal fuer das connect Tool. Bin eben dazu gekommen das ganze mal auszuprobieren. Also das sich der CP erst verbindet wenn das senden Bit aktiviert wird scheint normal zu sein. Das verhaelt sich alles genau so wie mit dem anderen TCP Server. Aber, das connect tool zeigt die die anzahl der empfangenen Telegramme und die Laenge sowie alle bytes auch an. Soweit ist das ja schonmal ganz gut und die Simatic seite scheint ja auch zu funktionieren. Dann hab ich versucht mich mit via Telnet mit dem Connect Tool zu verbinden aber das geht nicht (Telnet ging ja mit der Laser anwendung und auch mit den Indys). 
Koennte es sein das hier ein Problem mit den Protokollen vorliegen kann ? Eigentlich handelt es sich ja bei allen Tools um das TCP Protokoll !

@S7Programmer: Werde das jezt auch mit deinem Tool ausprobieren.


----------



## argv_user (17 März 2010)

Snoopy123123 schrieb:


> Hallo,
> 
> Ich will via CP343-Lean einen String an eine PC Anwendung (integrierter TCP Server) senden. Ich habe einen in Netpro eine TCP Verbindung projektiert und IP und Portadressen angegeben.
> ...



Das ist vermutlich der Fehler.
Der CP arbeitet dann als TCP-Server und wartet auf reinkommende Verbindungen???
Probier doch einfach mal die Verbindung in Netpro zu löschen.

Eine Alternative (so machen es gängige Visualisierungen): Verbindung lassen, und den PC die Daten abholen lassen.
Der FB-Aufruf fiele dann weg.


----------



## S7_Programmer (17 März 2010)

Hallo,

du kannst auch NetCat sowohl als Server als auch als Client betreiben.
Du kannst auch auf einer Seite das Telnet, auf der anderen Seite Netcat
(-l option) auch einem einzigen  Windows-PC ausführen (2x cmd öffnen).
Probiers erst mal rein PC, dann mit SPS.

Ich hoffe Dir weitergeholfen zu haben.

Viele Grüße
S7_Programmer


----------



## Snoopy123123 (17 März 2010)

argv_user schrieb:


> Das ist vermutlich der Fehler.
> Der CP arbeitet dann als TCP-Server und wartet auf reinkommende Verbindungen???
> Probier doch einfach mal die Verbindung in Netpro zu löschen.
> 
> ...



Also der CP sollte eigentlich als TCP-Client arbeiten. Das Haeckchen fuer Aktiver Verbindungsaufbau ist gesetzt und so wie ich das kenne baut immer der Client die Verbindung auf. Aber das der CP die Verbindung aufbaut sehe ich auch also denke ich im moment nicht das es daran liegt. Und Telnet verbindet sich ja auch mit meinem TCP Server was die Aussage bekraeftigt.

Bin jetzt noch auf eine andere sache aufmerksam geworden. Kann es sein das der CP keinen TCP-String sondern einen String Stream sendet ?


----------



## Snoopy123123 (17 März 2010)

argv_user schrieb:


> Probier doch einfach mal die Verbindung in Netpro zu löschen.



Wie soll ich mit AG_Send Daten verschicken ohne vorher eine Verbindung zu Projektieren ????


----------



## Snoopy123123 (17 März 2010)

S7_Programmer schrieb:


> Hallo,
> 
> du kannst auch NetCat sowohl als Server als auch als Client betreiben.
> Du kannst auch auf einer Seite das Telnet, auf der anderen Seite Netcat
> ...




NC wirft mir einen fehler wenn ich es wie folgt starte

nc -l -p2000    // Sprich listening mode auf Port 2000, damit sollte nc als TCP Server laufen, richtig ?

Nach ca 5 sekunden bekomme ich die Meldung: forward host lookup failed: H_errno 11004: No Data


----------



## argv_user (17 März 2010)

Ich lass mal Kommentare zu nc weg, super Programm von Hobbit.

Vielleicht hast Du ja auch nur in Netpro das falsche TCP-Protokoll angeklickt (TCP-native, ISO-ON-TCP).

Rührt die Fehlermeldung von nc etwa daher, dass auf dem selben PC schon der erwähnte "TCP-Server" auf dem gleichen Port läuft?


----------



## Snoopy123123 (17 März 2010)

argv_user schrieb:


> Ich lass mal Kommentare zu nc weg, super Programm von Hobbit.
> 
> Vielleicht hast Du ja auch nur in Netpro das falsche TCP-Protokoll angeklickt (TCP-native, ISO-ON-TCP).
> 
> Rührt die Fehlermeldung von nc etwa daher, dass auf dem selben PC schon der erwähnte "TCP-Server" auf dem gleichen Port läuft?



Protokolltyp ist TCP-Verbindung. Mit dem Connect Tool von Grubba funktioniert es auch und ich sehe die Daten von der S7. Ich denke es liegt nun wirklich am Format der gesendeten Daten.


----------



## Grubba (17 März 2010)

Sende doch mal mit der S7 das Telegramm an das Connect Tool,
dann mit Telnet. 

Kannst du dann evtl. Unterschiede erkennen?


----------



## S7_Programmer (17 März 2010)

Hallo,

nochmals der Aufruf von Netcat:

nc -l -p nnnn (nach nc/-l/-P ein Space-Zeichen).

Kann sein, dass ich den Aufruf schlampig ins Forum geschrieben habe.
Bitte um Entschuldigung, beim Schreiben übersieht man doch dann etwas.

Falls nochmals Probleme gibt, nochmals melden, diese einfache Verbindung mit Netcat muß doch zu schaffen sein... Wenn das geht kann man schrittweise zur geplanten Verbindung übergehen.


Gruß
S7_Programmer


----------



## Snoopy123123 (17 März 2010)

Grubba schrieb:


> Sende doch mal mit der S7 das Telegramm an das Connect Tool,
> dann mit Telnet.
> 
> Kannst du dann evtl. Unterschiede erkennen?




Ja ein unterschiied der mir aufgefallen ist das wenn ich bei Telnet das "Test" sende das das connect Tool dies als 4 Telegramme ansieht. Sprich jeder char wird als eigener String empfangen, daher die bin ich im I-net auf den StringStream gestossen, bin mir aber noch nicht ganz sicher ob ich da auf dem richtigen weg bin.


----------



## S7_Programmer (17 März 2010)

Hallo,

Wenn Du "Test" in Telnet hackst, dann ist doch der Ablauf so:
Du drückst "T", dann Zeit, dann "e", dann Zeit ....

Kann da ein Time-Out mitspielen?

Gruß
S7_Programmer


----------



## Snoopy123123 (17 März 2010)

S7_Programmer schrieb:


> Hallo,
> 
> Wenn Du "Test" in Telnet hackst, dann ist doch der Ablauf so:
> Du drückst "T", dann Zeit, dann "e", dann Zeit ....
> ...



Fuer mich verhalten sich die Server auch unterschiedlich.

Wenn ich Telnet mit dem Connect Tool verbinde, dann ist der Ablauf so wie du ihn oben geschildert hast. Wenn ich telnet mit nem Indy TCP-Server verbinde dann kann ich test ein geben und es kommt noch gar nichts beim server an bis ich mit Enter bestaetige, erst dann wird der komplette String gesendet. Woher dieser unterschied kommt weiss ich leider nicht, ihr ?


----------



## rumpelz (8 April 2010)

Snoopy123123 schrieb:


> Hallo,
> 
> Ich will via CP343-Lean einen String an eine PC Anwendung (integrierter TCP Server) senden. Ich habe einen in Netpro eine TCP Verbindung projektiert und IP und Portadressen angegeben. Im DB6 habe ich eine Stringvariable der laenge 20 deklariert. Samt Header also eine Gesamtlaenge von 22Byte. Wenn ich nun mit M21.5 das senden anstosse sehe ich das sich die Anwendung verbindet, aber der String kommt nicht an. Wenn ich mich mit Telnet mit der PC Anwendung verbinde kommen meine gendeten Strings an, also liegts nicht an der Verbindung oder Firewall oder aehnlichem. Muss ich in der SPS noch irgendwas beachten um wie z.b. mit Telnet einen String an einen TCP Server zu schicken?
> 
> ...




Hallo,
ich hatte vor kurzem ein Projekt, bei dem wir Strings an einen PC versenden und empfangen. Hier ebenfalls über TCP und die AG_SEND / AG_RECV Bausteine und Stringvariablen aus einem DB.
Vielleicht hilft es, wenn du bei SEND: nicht direkt die String-Variable eingibst, sondern als Zeiger mit Datenlänge übergibst:
z.B.

```
CALL  "AG_SEND"
       ACT   :=M21.5
       ID    :=1
       LADDR :=W#16#100            
       SEND  :=P#DB6.DBX2.0 BYTE 20                      // DB6.Stringvariable [Edit: ohne die zwei Header-Bytes (Startadresse im DB + 2Byte) ]
       LEN   :=20                                                   // Länge des Strings ohne Headerbytes
       DONE  :=M15.0
       ERROR :=M15.1
       STATUS:=MW16
```
Die Zeigeradresse musst du natürlich aus deinem DB entnehmen.

PS:
Wir mussten außerdem darauf achten, dass die Zeichenketten immer exakt die selbe Länge haben (in deinem Fall wären das 20Byte). Dazu wurden sie bis zum Ende mit best. Zeichen aufgefüllt.

Hier noch ein Link zu Siemens (AG_SEND/AG_RECV):
http://support.automation.siemens.com/WW/llisapi.dll/8707570?func=ll&objId=8707570&objAction=csView&nodeid4=20229805&lang=de&siteid=cseus&aktprim=4&extranet=standard&viewreg=WW&load=content&csSort=-DOCBETREFF&subtype=136000

Viele Grüße


----------



## Snoopy123123 (8 April 2010)

rumpelz schrieb:


> Hallo,
> ich hatte vor kurzem ein Projekt, bei dem wir Strings an einen PC versenden und empfangen. Hier ebenfalls über TCP und die AG_SEND / AG_RECV Bausteine und Stringvariablen aus einem DB.
> Vielleicht hilft es, wenn du bei SEND: nicht direkt die String-Variable eingibst, sondern als Zeiger mit Datenlänge übergibst:
> z.B.
> ...




Ich hatte den Zeiger schon so P#DB6.DBX2.0 BYTE 20 angegeben, jedoch macht Step7 daraus automatisch DB6.Stringvariable. 
hab das Problem mitlerweile gefunden. Es lag daran das der CP einen String Stream sendet.


----------



## heino b (12 Mai 2011)

*und wie wurde das Problem gelöst ?*

Habe ein ähnliches Problem und wäre an der Lösung interessiert.


----------



## Asab (31 Mai 2011)

*... und wie wurde das Problem gelöst ?*

Hey 

ich hatte eine ähnliche Aufgabenstellung und schicke die Daten in einem Array of Char über TCP/IP an einen Drucker weiter. Dazu schreibe ich die Strings ohne Header in das Array. Das Array habe ich vorher mit FILL (SFC21)  mit dem Wert #32 (Leerzeichen) gefüllt. Somit habe ich eine ByteStream erzeugt. Um Strings in das Array zu kopieren kann man die Funktion "_STRING_TO_BUFFER" aus der OSCAT311 Lib nutzen (oder selber etwas in AWL schreiben, da SCL bei uns nicht erlaubt ist) und danach mit TSEND schicken. 

 und kaum habe ich es sogemacht hat der Drucker gedruckt.:-D

mfg ASAB


----------

