UDP-Datenfeld mit TwinCAT3 verarbeiten

tobor

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
Hat jemand Erfahrung damit UDP-Daten auszulesen und in TwinCAT3 als Variablen zur Verfügung zu stellen?

Für die TwinCAT3 gibt es eine Funktion "TF6311 TCP/UDP Realtime". Sie soll es ermöglichen mit der TwinCAT3 Daten zu empfangen, die per UDP versandt werden.
http://infosys.beckhoff.com/content...8014399586322955.html?id=51671222292382391104
Dazu liefert Beckhoff auch ein kleines, anschauliches Beispiel in dem die von einem UDP Client gesendete Pakete gezählt werden können.
Angeblich kann man auch den Inhalt der gesendeten "Message: Beckhoff TCP-UDP RT" verändern. Wie bekomme ich diese Message auf der Seite der TwinCAT3 als Variable o.ä. angezeigt, so dass ich sie in der TwinCATweiterverwenden kann?
In dem Beispiel wird das Datenfeld "pData" als PVIOD-Type genutzt. Somit dachte ich, dass mir die Funktion "PVOID_TO_STRING" die Variable wieder in ein menschenlesbares Format übersetzt. Hierfür habe ich die passende Library "Tc2_Utilities" bei References hinzugefügt.
https://infosys.beckhoff.com/conten...8014398544585739.html?id=23020270114159107251
--> Der Versuch in der MAIN:
Deklaration: pDataString: T_MaxString;
Im Programm: pDataString := PVOID_TO_STRING(UdpReceiver.ReceiveData.pData);
Führt zu den Fehlermeldungen:
Fehler 3 Funktionsblock 'UdpReceiver' muss für den Zugriff instanziert werden
Fehler 5 Auf Eingang 'pData' von 'ReceiveData' kann nicht außerhalb des Aufrufs zugegriffen werden
Fehler 6 'pData' ist kein Eingang von 'ReceiveData'
...
Zu Fehler 3: Das Instanziieren erfolgt doch erst beim Funktionsaufruf, darum kann ich das doch garnicht vorher erzwingen.
Zu Fehler 5: Ich will ja
gar nicht auf den Eingang sondern den Wert zugreifen, aber mit ".Value" wird direkt im Tooltip angezeigt " Bezeichner 'Value' nicht gefunden".

--> Die Verwendung direkt in der Methode "ReceiveData" des Funktionsbausteins (FB) "UdpReceiver" in dieser Form:
pDataString := PVOID_TO_STRING(pData);
Führt zwar nicht zu Fehlermeldungen, zeigt mir im Eingeloggten Zustand im Programm hinter der Variable nur "???" an und in der Variablen-Liste steht "<Haltepnkt setzten um Wert zu lesen.>". Das Erstellen eines Haltepunktes über "Debuggen", "Neuer Haltepunkt..." bewirkt aber auch keine Änderung.

Ich bin völlig neu in diesem Thema und freue mich
über jeden Hinweis und/oder Code-(Abschnitt) den ich bekommen kann. Andere Lösungswege freuen mich natürlich auch.

(Das Ziel ist es, ein XML, das über UDP eintrifft, auszuwerten und später mit veränderten Einträgen zurück zusenden.)
Vielen Dank im Voraus.
 
Meinst Du das Beispiel S02 Udp Client Server (UdpDemoPlc)?

Die Funktion PVOID_TO_STRING kenne ich nicht. Ich würde da eher die MEMCPY Funktion verwenden.

Deine Programm-Erweiterungen musst Du direkt in der Methode "ReceiveData" machen. Dort kannst Du
mit der MEMCPY Funktion die Daten mit der Länge "nData" zum Beispiel in einen String kopieren.
Dabei einfach aufpassen, dass nur so viele Byte kopiert werden wie im String auch Platz haben....
 
Hallo, und danke für die Hinweise.
Ja, ich meinte das Beispiel „S02 Udp Client Server“. Das mit dem MEMCPY klingt irgendwie sehr kompliziert.
Das TF6310 sieht wirklich gut aus, das muss ich mir am Dienstag nochmal weiter anschauen. Leider habe ich gestern die Peer-to-Peer-Kommunikation auf dem Rechner nicht direkt hinbekommen, obwohl ich ihnen unterschiedliche Tasks sowie IPs (passend zu den zwei verbauten Netzwerkkarten) vergeben hatte. Die Netzwerkkarten sind mit einem Loop-Kabel verbunden und sehen sich auch, weil über sie das UDP-Sample funktioniert hatte.
Muss ich sonst noch etwas für das Peer-to-Peer verstellen?

Das bSendOnceToItself mit „Hello itself“ hat funktioniert an beiden PLCs.
Einen zweiten Rechner habe ich nicht zur Verfügung und das Zielsystem ist aktuell auch nicht verfügbar.
 
Zurück
Oben