TCP/IP Telegrammaustausch mit PC variable Telegrammlänge

3DA

Level-1
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ihr, die Ahnung habt,


hab schon mehrmals eine Kommunikation realisiert, bei der meine SPS (CPU315-2DP mit CP343-1 Lean) mit einem PC über TCP-Verbindung Telegramme austauscht. Da waren die Telegramme aber immer gleich lang und ich konnt sie schön nacheinander in den gleichen Datenbereich im DB kopieren.

Jetzt stellt sich aber der PC Fuzie quer und will die Telegrammlängen nicht mehr anpassen. D.h. es kommen jetzt Telegramme mit Längen zwischen 10 Byte und 37 Byte bei mir an.

Prinzipiell ist das Telegramm so aufgebaut: Header mit 8 Byte--> Seperator--> Information--> CR LF (Jedes Zeichen 1 Byte)

Bsp.:

I N H E A D E R > 1 - 0 0 - 1 1 CR LF (insg. 18 Byte)

Mein Problem ist jetzt, dass der Receive-Baustein FC6 einen gewissen Datenbereich für die empfangenen Daten verlangt, der ja logischer Weise so groß sein muss, dass das längste Telegramm darin gespeichert werden kann. Kommt aber ein Telegramm, dass kürzer ist, verschiebt es die Zeichen um die Bytes im DB wie das Telegramm kürzer ist. D.h. meine Bytes im DB in denen ich die Informationen erwarte sind nicht mehr da, wo ich sie erwarte.

Gibt es eine Möglichkeit (so ne Art Schieberegister) die Zeichen des Telegramms vom Header an zu lesen und dann in einen weiteren DB zu kopieren, indem die Telegrammzeichen dann wieder an der Stelle sind, wo ich sie erwarte?


Vielen Dank im Voraus für Eure Bemühungen!!


Gruß

3DA
 
Prinzipiell ist es möglich Telegramme mit variabler Länge zu empfangen, wenn in dem Telegramm vom PC (am Besten im Header), die Anzahl der noch folgenden Bytes stehen.
In der S7 machst du 2 AG-Recieve aufrufe die du gegeneinander verriegelst. Mit dem ersten empfängst du den Header mit fester Länger, mit der Längeninformation baust du dir einen Any-Pointer zusammen den du dann an den zweiten AG-Recieve anlegst. So kannst du dann den Rest des Telegramms empfangen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

mir würden da spontan zwei Dinge einfallen.

1. Die Zahl die die Anzahl der Bytes angibt, als Variable anlegen (wenn möglich und wenn die Anzahl der Bytes, die kommen bekannt ist).

2. Den Bereich mit 37 Bytes anlegen. Dann alle Bytes abfragen, ob sie ungleich 0 sind (geht nur, wenn kein Zeichen 0000 0000 hat), ist das erste Byte = 0, dann "schiebe" alle Bytes um ein Byte (auf die Reihenfolge achten, damit man sich nicht seine Bytes überschreibt). Ist das erste und das zweite Byte = 0, dann schiebe alle Bytes um zwei Byte, u.s.w..

Ich hoffe Du kannst etwas mit dem Ansatz anfangen.

Gruß Jan
 
Geb ich dir vollkommen recht.

Aber leider ist das Telegramm schon fest vorgegeben und der PC Progger ändert nichts mehr an seiner Version mit der Begründung das schon andere SPS Programmierer dieses Problem gelöst haben, die ich natürlich auch nicht fragen kann, weil die von der Konkurrenz sind.

Gibt's ne Möglichkeit den Speicherbereich anhand der "LEN" Telegrammlängen Information variabel zu verändern? oder kommt die Längen Info erst nachdem das Telegramm schon gespeichert ist?

Könnte man vielleicht auch eventuell nach den 8 Zeichen (die ja bekannt sind) im DB suchen und ab da im neuen DB von Adresse 0 an speichern?
 
Sorry... die 8 Zeichen des Headers meine ich...

man könnte vllt. nach den 8 zusammenhängenden Zeichen suchen und dann von da an 37 Bytes in einen neuen DB von Adresse 0 an Speichern. Dann hätte ich alle Zeichen an der richtigen Stelle und was dann hinten raus steht... who cares...

Noch ne Frage:

Wie kann ich 37 Bytes byteweise verschieben? mit SHL_L gehen doch nur 4 oder?


Danke schon mal..
 
Ich würde dem Heini eine Reinhauen, ehrlich! Wenn Dummheit und Ignoranz quitschen würden ... :confused: Hatten "Die Anderen" das auch mit einer S7 gelöst, da kenn ich erstmal keinen anderen Weg, als den von Lars.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schieben würde ich step by step mit MOVE.
Über den genauen Programmaufbau müste man sich dann mal genauer gedanken machen.
Aber ich denke, wenn deine Idee funktioniert, ist das wesentlich einfacher, schneller und weniger aufwendig als das schieben.
 
Hm, wie wäre es denn mit zwei mal AG-Recieve die sich beim empfangen abwechseln ? Jeweils mit verschiedenen Empfangsbereichen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hm, wie wäre es denn mit zwei mal AG-Recieve die sich beim empfangen abwechseln ? Jeweils mit verschiedenen Empfangsbereichen.

Aber was genau soll das bringen, über die Längenangabe leert man doch eigentlich erst den Buffer korrekt, oder? Also braucht man die vorher, beim Aufruf!
 
Aber was genau soll das bringen, über die Längenangabe leert man doch eigentlich erst den Buffer korrekt, oder? Also braucht man die vorher, beim Aufruf!

Ich denke mal laut: 2 mal AG-Recieve mit Empfangspuffer a 100Byte. Ein Telegramm mit 10 Byte wird empfangen. Mit NDR schalte ich auf den zweiten AG-Recieve um. Ein neues Telegramm kommt. Wo wird dieses im Empdangspuffer hingeschrieben. An den Anfang ? Oder ab Byte 11 ?
 
Naja mit dem PC Progger, dass hat politische Gründe warum der sich so quer stellt...

Aber die Move geschichte wird halt extrem aufwendig und vorallem zeitaufwändig!!

@Lars: Was meist du mit zwei AG_RECV mit verschd. Speicherbereich?

Was hätte das für einen Vorteil?

Danke schon mal...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ahhh... jetzt kapier ich was du meinst...


Quasi 2 AG die abwechselnd die Telegramme empfangen in 2 verschd. DB z.B. und das nächste Telegramm kommt in den AG nr. 2.

Wenn AG nr. 1 ausgewertet mach ich dessen DB wieder platt und das 3. Telegramm kommt wieder von Adresse 0 an im AG Nr.1.

Meinst du das so?

Geniale Idee...
 
Ich werd's gleich morgen mal versuchen, ob das so funktioniert.

Genial wär's. Dann würde die Ganze Register-Schieberei einfach wegfallen.

Respekt... wirklich genial Kombiniert ;-)

Ich geb euch Bescheid morgen, ob's funzt...


Danke mal...

Schönen abend wünsch ich...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin...

also hab das mal mit den 2 AG_RECV Bausteinen probiert. Jeder Baustein hat seinen eigenen DB mit 40 Byte. Sobald ich NDR -> neues Telegramm erhalten habe, sperr ich den AG_RECV und lösch den DB des anderen AG_RECV. So geht es jetzt immer von Telegramm hin und her. Aber
trotzdem sind die Telegramme immer verschoben. Jedesmal anders und ich weiß nicht warum?

Hat da jemand eine Lösung??


Danke schon mal...
 
Weiß es jetzt zwar nicht genau (und kanns jetzt auch gerade nicht testen), aber ich denke das NDR erst dann kommt, wenn der Empfangspuffer komplett gefüllt ist. Lege ich also einen Puffer von 100 Byte an, würde NDR erst dann True werden, wenn mind. 100 Byte empfangen worden sind.

EDIT:

hier stand mal was, was garantiert nicht funktioniert hätte :(
 
Zuletzt bearbeitet:
Zurück
Oben