UDP Telegrammaufbau - was muss alles übertragen werden?

Martschen

Level-2
Beiträge
13
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich versuche eine UDP-Verbindung aufzubauen und habe dazu das angehängte Beispielprogramm von Siemens als Grundlage. Die Verbindung ist soweit projektiert und scheint auch zu funktionieren (Habe mich dazu an dem angehängten PDF, Seite 18-21 entlang gehangelt).

Die Frage ist nun, was muss ich alles übertragen, damit ein vollständiges Telegramm entsteht? Das ist leider in dem Beispielprojekt nicht vorgegeben.

Hatte zunächst versucht nur die eigentlichen ASCII-Befehlszeichen zu übertragen. Dann kommt vom Kommunikationspartner jedoch die Antwort "ASCII Format Error". Zu einem kompletten Telegramm gehören ja wie ich mittlerweile erfahren hab noch so Sachen wie Ziel-IP, Zielport, Quellport, usw. Nur muss ich das alles von Hand voran setzen? Oder nur zum Teil? Oder macht das der FC5 AG_SEND von selbst?

Ich verwende eine S7-315 2-DP und für die UDP-Geschichte einen CP343-1 Lean.

Das sind meine ersten Gehversuche im Bereich UDP-Kommunikation, daher wär ich für anschauliche Erklärungen oder am besten ein kleines Beispielprogramm sehr dankbar!
 

Anhänge

  • S7_300_SEND_RCV.zip
    46 KB · Aufrufe: 18
  • PROFINET - Anleitung zur Projektierung einer UDP-Verbindung.pdf
    2,3 MB · Aufrufe: 33
Hallo !
Wenn du schon mal eine Antwort vom Komm.-Partner erhältst, dann steht doch die Komm. ! :)

Offenbar kann dein Komm.-Partner nichts mit den ASCII- Zeichen anfangen, also schau auf den Tel.-Inhalt !

gruss
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, die Kommunikation steht soweit, aber der Empfänger ist mit dem Inhalt des Telegramms nicht zufrieden. Eigentlich müsste der aber stimmen. In der Anleitung des Kommunikationspartners steht, dass zunächst der String "ASCI" übertragen werden muss um die UDP-Verbindung bei ihm zu aktivieren. Schicke ich aber dieses "ASCI", kommt eben "ASCII Format Error" zurück.

Daher die Frage, ob ich grundsätzlich bei jedem Telegramm noch irgendwas vorweg schicken muss, wie Zielport, Ziel-IP und so, oder ob das der FC5 automatisch hinzufügt und ich nur die eigentlichen Daten zu senden brauche.
 
Offenbar musst du nichts vorwegschicken, du erhältst doch eine Antwort !
Und die Antwort kannst du nur erhalten, wenn auch IP/Port usw. auf beiden Seiten bereits bekannt sind.

Es geht hier wohl um den INHALT des Telegramms, den dein Komm.-Partner nicht verarbeiten kann:
- sendest du wirklich in ASCII-Code (-->ASCII-Tabelle) ?
- musst du einen String mit Inhalt "ASCI" oder "ASCII" senden ?
- oder soll das ein String mit einem anderen Inhalt sein, der in ASCII codiert sein soll (--> Anleitung) ?
- Strings haben in der Regel einen Header, in dem die Länge bzw. die max. Länge enthalten ist
 
Ah, ok das war mir schon mal nicht klar, dass die zurückkommende Antwort bedeutet, dass das Telegramm vom Aufbau her ok ist. Leuchtet aber irgendwo auch ein.

Zu den vier Punkten:
1.
Also probeweise arbeite ich noch mit ner Variablentabelle, in der die ersten paar Bytes des Sende-Datenbereichs und die ersten paar des Empfangs-Datenbereichs drin stehen. Ich schreibe dann in die ersten vier Sendebytes 'A' 'S' 'C' 'I' und schicke das ganze dann los. Müsste also so passen.
2.
Das hat sich mittlerweile geklärt mit dem ASCI(I). ASCI mit einem I war schon richtig, allerdings ist dies nur bei TCP-Verbindungen erforderlich. Bei UDP führt es zum Fehler. Schicke ich aber einen normalen Befehl, kommt der Fehler ebenfalls. Also ist noch was anderes im Unargen.
3.
Es war in der Tat das Wort "ASCI" aber wie gesagt hat sich eh erledigt.
4.
Sowas meinte ich. Ein solcher Header fehlt bei mir bisher. Wie muss der genau aussehen? Oder variiert das je nach Kommunikationspartner?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi !

S7-Hilfe mit F1: Format des Datentyps STRING

Byte 0: max. Länge
Byte 1: Ist-Länge (Anzahl Bytes von Byte 2 bis zum letzten Byte)
Byte 2: 1.ASCII-Wert
Byte 3: 2. ASCII-Wert
...usw.
Byte x: letzter ASCII-Wert

Byte 0 + 1 bilden den Header

Am besten, du legt mal einen String in einem DB an, dann kannst du ihn in der VAT anschauen/verändern und erkennst auch den AUfbau ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So, der Tipp mit dem String hat mich schon mal einen Schritt weiter gebracht, aber leider noch nicht ans Ziel...

Wenn ich den Befehl als String schicke, also mit Telegramm-Gesamtlänge im ersten Byte und tatsächlicher Länge im zweiten sagt er zumindest schonmal nicht mehr "ASCII Format Error". Dafür tut sich aber auch sonst nichts. Keine Reaktion auf das, was ich schicke. Da hilft wohl jetzt nur noch probieren, bis es klappt... :confused:

Trotzdem vielen Dank an SoftMachine, dass ich erstmal soweit gekommen bin!
 
Der Komm.-Partner ist eine IRTrans Lan DB. Das ist ein Modul, mit dem Infrarot-Befehle eingelernt und in einer Datenbank hinterlegt werden können.
Über ASCII-Befehle via UDP können die hinterlegten IR-Codes aufgerufen werden und das Modul gibt diese über IR-LEDs aus.
Andersrum sendet das Modul einen ASCII-String, wenn es einen IR-Code empfängt, der in der Datenbank hinterlegt ist.
Ich beschränke mich aber zunächst erstmal nur aufs senden.

Ein Befehl ist folgendermaßen aufgebaut:
Asnd <Name der Fernbedienung>,<Name des Befehls><CR>

A dient als Signal, dass ein ASCII-Befehl kommt, snd steht für senden, dann kommt der hinterlegte Befehl und CR (ASCII 13dez) als Abschluss

Mein Testbefehl lautet:
Asnd comag,ein/ausCF
 
Es läuft!

Hallo,

ich hab es endlich hin bekommen!

Es waren noch so einige Dinge im Unargen:

1. Der Befehl braucht doch keinen Header. Habe mir das Telegramm mal mit Wireshark angeschaut und festgestellt, dass da ohnehin Telegrammlänge und so enthalten sind. Das macht also der FC5 scheinbar von selbst.

2. Der Befehl zum Senden heißt nicht Asnd (der ist für TCP), sondern bei UDP heißt er nur snd. CR oder LF muss man nicht mit senden. Mein Beispielbefehl lautet also:

snd comag,ein/aus


3. Auch bei Senden des korrekten Befehls kam "Error ASCII Format" zurück. Dies lag an der Konfiguration des IRTrans Lan DB, bzw. dessen Datenbank. Ich hatte nämlich folgendes nicht beachtet:


1. Im Fenster Device Datenbank des GUI Client müssen vorm Flashen zunächst alle Fernbedienungen ausgewählt werden, die in der Datenbank hinterlegt werden sollen.
2. Im selben Fenster muss unter IP/Port die Adresse und Port des Kommunikationspartners, also des CP343-1 angegeben werden.

Nach einigen Irrtümern läuft die Sache nun genau so, wie es wollte.

Vielen Dank für die Hilfe bei der Fehlersuche!!
 
Zurück
Oben