String ueber TCP verbindung senden

Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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.
 
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

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 ?
 
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


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.
Code:
       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
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
Code:
       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.c...oad=content&csSort=-DOCBETREFF&subtype=136000

Viele Grüße


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.
 
... 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
 
Zurück
Oben