Daten empfangen über TCP/IP mit TwinCAT

blubb89

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin Neu-Einsteiger in der SPS-Programmierung und bin gerade dabei eine Anbindung zu einer Auswerteeinheit zu programmieren. Dabei bin ich auf folgendes Problem gestoßen: Beim Empfangen der Daten werden diese alle in ein 1 Array hintereinander geschrieben, obwohl es sich bei den Daten um 3 einzelne Telegramme der Auswerteeinheit handelt. Ich möchte aber diese drei Telegramme irgendwie voneinander trennen. Ich weiß, dass es bei Siemens einen Modus (Adhoc-Modus) gibt bei dem direkt nach Empfang eines Telegrammes ein Flag gesetzt wird und nicht erst wenn das Array voll ist. Weiß jemand, ob es so etwas auch in der TwinCAT-Programmierung gibt oder wie man das Problem anderst lösen könnte?
Ich hoffe, irgendjemand kann mir helfen. Freue mich über jede Hilfe.
 
Hallo,

ich denke mal du ließt die Daten als String in der SPS ein, oder? Wenn ja, hast Du am Ende eines jeden Strings eine Null-Terminierung. Auf diese Kannst Du dann reagieren, und den nächsten String einlesen. Dafür gibt es auch fertige Bausteine bei Beckhoff.

Gruß Scrat
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
danke für deine Antwort Scrat. Das Beispiel, wie man das beim Einlesen eines Strings macht, hab ich auch schon gesehen. Allerdings lese ich die Daten in einem Array Of Byte ein. Und da kann ich nicht mehr nach der Null-Terminierung suchen. Gibt es hierfür eine andere Möglichkeit?

Gruß blubb89
 
Allerdings lese ich die Daten in einem Array Of Byte ein. Und da kann ich nicht mehr nach der Null-Terminierung suchen. Gibt es hierfür eine andere Möglichkeit?

Na, daran solls nicht scheitern....
Wenn das Byte den Wert 0 hat, hast Du die Nullterminierung doch schon gefunden.
 
Bei mir ist nicht das ganze Array mit sinnvollen Bytes gefüllt, sondern nur 6 Stück und der Rest habe ich mit 0 gefüllt. Nach diesen könnte ich suchen, wenn nicht in dem ersten Byte aus der Antwort der Auswerteeinheit eine 0 empfangen würde (und das ist der Fall). Er würde dann schon nach dem ersten Byte die Nullterminierung finden und das wäre falsch.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kannst Du für jeden Datensatz eine bestimmte Länge definieren oder variieren diese in der Länge?

Wenn nicht, könntest Du immer einen Zeiger im Array verschieben und den nächsten Datensatz einlesen.

Ansonsten könnte man sich selbst eine entsprechende Sequenz programmieren, nach der gesucht wird. Doof ist dann natürlich, das die Messwerte zufällig diese Sequenz ergeben. Würdest Du z.B. dafür aber 4 Byte verwenden, wäre diese Wahrscheinlichkeit aber schon bei 2^32. Sprich 4 Milliarden und ein paar kaputte.
 
Protokolle

Genau dafür hat man Protokolle erfunden, einfachstes Beispiel:

Das erste Zeichen ist das Startzeichen (STX), das darf nie in einem Text vorkommen.

Nach dem STX wird gesucht im Stream, danach kommen weitere Zeichen bis zu einem besonderen Zeichen, das markiert das Ende der Nutzdaten (ETX).

Die Daten zwischen Start und Ende Zeichen sind dann die Nutzdaten.

Verfeinert werden kann dann das Protokoll mit einer CheckSumme, das ist in der Regel das Zeichen vor dem Ende Zeichen, auch bietet sich an, hinter dem Startzeichen zu senden, wie lang das Telegramm sein wird. etc etc.

Einfache Übertragungen machen auch Pausen zwischen 2 Datenströmen, die man auswerten kann etc...

Mal ein paar Beispiele für simpel Protokolle:

Einfacher Text, gefolgt von einem Zeilenvorschub Zeichen (Bosch Rexroth auf der Diagnose Schnittstelle)

Einfacher Text, Zeilenvorschub + Pause (WTW Messgeräte, KLM PS 3 im SIO Betrieb)

STX, ... ETX im Prinzip alle aktuellen Netzwerke in beliebigen weiteren Verfeinerungen

Anscheinend ist im Datenstrom des Themenstarters die Null das Startzeichen STX, ggf identisch mit den Endezeichen ETX oder es gibt eine Pauseninformation.

Die Protokolle werden leider oft von den Lieferanten der Geräte wie ein Geheimnis gehandelt, da sie ihre speziellen Diagnose Systeme oder Programmier Software gegen Kohle an den Mann bringen wollen.
 
Zurück
Oben