# WAGO CodeSys 2.3 - UDP_Client



## philipp75 (30 Dezember 2021)

Hi,

ich versuche über UDP_Client ein UDP Paket an einen Raspberry zu schicken. Leider sehe ich nicht einmal auf WireShark irgendeinen Transfer.
Im Raspberry scheint auch nichts anzukommen (DoorPI, Raspbian)


Auf der Wago nutze ich WagoLibEthernet und den Funktionsbaustein UDP_Client. Das ganze geht über Port 8111 an  den Raspberry, der auf diesem Port einen Listener hat.

Auf der Wago waren bereits einige Programme, die das genau so machen vom intialen Entwickler - hier werden UDP Pakete an einen Audioverstärker gesendet. Das funktioniert auch (wenn gleich ich diese UDP Pakete auch nicht in Wireshark sehe).

Andersherum funktioniert es, der UDP_Server auf der Wago empfängt das Paket so wie geplant....
Nur mit dem Versand haperts.

Ich bin für alle Ideen dankbar, so sieht der Versand aus.
	

		
			
		

		
	




und so im eingeloggten Zustand:



Viele Grüße,
Phil


----------



## philipp75 (30 Dezember 2021)

ich habe auch noch einen listener auf meinem Laptop testweise genutzt, auch hier kommt nichts von der Wago an.



```
import socket
import sys

#Initialisierung der benötigten Variablen
host = ""                       #Adresse des Servers
port = 8111                     #Portan welchem Daten empfangen werden
buf = 4096                      #Maximale Groesse der Daten
data = ""                       #Zum Speichern der zu empfangenden Daten

def main():
    #Initialisierung und binden des Sockets     
    addr = (host, port)             #Adresse an welche Daten geschickt werden
    UDPSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    UDPSock.bind(addr)
    print('UDP Server gestartet. Empfangsbereit')
    i = j = 0
    #Daten empfangen
    while (1):
        data = ""
        print('Warte auf Daten')
        data, addr = UDPSock.recvfrom(buf)
        if data == "":
                print('Keine Daten empfangen')
        else:
            Datatype = type(data)
            print(data)
        #Nach 10000 empfangenen Datenpaketen Abbruch.   
        if j > 10000:
            break 
        print("Durchlaufnummer: ", j)
        j += 1
    #Socket schließen
    UDPSock.Close()
    
if __name__ == '__main__':
    main()
```


----------



## KLM (30 Dezember 2021)

Moin, setzt der Client den xStartSend zurück, wenn Du ihn setzt?
Wo läuft der Wirreshark Mitschnitt? Wenn Du einen PFC200 hast, kannst Du dort direkt einen tcpdump machen. Wenn Wireshark auf dem PC läuft und Du einen 8xx Controller hast, musst Du im WBM erst einen Miror-Port definieren.


----------



## philipp75 (30 Dezember 2021)

Hi!

Danke für Deine Antwort.  Ja der Client setzt das zurück.
Der Wireshark läuft auf meinem Laptop. Ich habe auch mal eine Broadcast IP versucht (192.168.50.255) - auch hier sehe ich nichts aber einige andere Broadcasts schon.

Ich habe eine Wago 750-820 - für den tcpdump muss ich vermutlich per SSH drauf?


----------



## philipp75 (30 Dezember 2021)

ein root passwort habe ich nicht


----------



## KLM (30 Dezember 2021)

wago


----------



## KLM (30 Dezember 2021)

Entweder Du schiebst den gesamten Mitschnitt in eine Datei und schaust sie Dir nachträglich am PC in Wireshark an und filterst dort, oder Du filterst gleich beim dump.
z.B. _tcpdump -eti br0 \( port 8111 \)_
Häng hinten noch ein _-w /tmp/snifferlog.pcap_ dran, wenn Du es in eine Datei loggen willst, um es Dir mit Wireshark anzusehen. Hol Dir die Datei einfach per FTP (mit root User) aus dem Verzeichnis /tmp/


----------



## philipp75 (30 Dezember 2021)

wago ist es leider nicht :-(


----------



## KLM (30 Dezember 2021)

Hmmm, da hilft nur Firmware mittels SD Image neu einzuspielen. Geht zwar an Deiner eigentlichen Problemstellung vorbei, aber schaden kann es nicht und root Rechte sollte man auf seinem System schon haben.


----------



## philipp75 (31 Dezember 2021)

ok, root passwort habe ich herausgefunden.

über das kommando: tcpdump -i eth0 udp port 8111  -XAvvv
sehe ich leider gar nichts...

ich habe das FUP noch etwas umgebaut, ich vermute einen logikfehler meinerseits, da ich zwischendrin mal Pakete mit "ring" und "stop"  gesehen habe im TCPdump als das FUP noch anders aussah. Allerdings wurde ich da von UDP Paketen "überflutet". Mir würde exakt eines schon reichen 



Die Variablen V_DOORPI_SEND_STOP und _RING  setze ich über einen Taster in der Visu zu Debugzwecken. Am Port liegts auhc nicht, habs mit anderen auch versucht


----------



## KLM (31 Dezember 2021)

Sehe ich jetzt erst, Du verwendest die gleiche Insatanz des Clients für beide Befehle mit unterschiedlichen Kommandos. Nimm zu Testzwecken mal nur eine Instanz, ich vermute das beharkt sich. Wenn das geht würde ich den Client nur einmal aufrufen und je nach Aktion nur den Tx-Buffer String tauschen.


----------



## philipp75 (31 Dezember 2021)

die Vermutung hatte ich auch. Es gibt nun nur noch eine Instanz. Ich habe nochmal die Reihenfolge verändert, aber leider gleiches Problem.


----------



## KLM (31 Dezember 2021)

Willst Du 200ms lang immer das gleiche Telegramm senden? Ich gehe davon aus, dass Du einmalig 'start' und einmalig 'stop' senden willst. Dann würde ich einen xStart verwenden und mit z.B. einem SEL den jeweiligen String wählen und mit den jeweiligen Events flankengesteuert (R_TRIG) den xStart setzen (RS). Der Client setzt den xStart automatisch zurück, wenn das Telegramm einmalig versendet wurde.


----------



## philipp75 (31 Dezember 2021)

ich wollte nur sichergehen, dass es auch rausgeht, bringt aber wohl auch nix. 

Seltsamerweise kamen gerade ein paar Pakete, aber nicht reproduzierbar.



Aktuell sieht es so aus. Der Konfig bastein ist simpel, er setzt quasi das StartSend auf True und den String, der gesendet werden soll.


----------



## KLM (31 Dezember 2021)

Hier mal mein Ansatz. Ich hasse FUP, daher im CFC. 
Anm.: Ich verstehe gar nicht warum Du nicht in ST schreibst. Beim Erstellen des Beispiels habe ich mir fast die Finger gebrochen.


Wenn der Client FB den xSend zurücksetzt, musst Du auch ein Telegramm im tcpdump sehen.


----------



## KLM (31 Dezember 2021)

In was für einem Task läuft der Client?


----------



## philipp75 (31 Dezember 2021)

ich habe nur einen Main Task auf der ganzen Steuerung. Danke für Dein Beispiel, ich schaue mir das morgen an!

Guten Rutsch!


----------



## philipp75 (31 Dezember 2021)

ok, ich war neugierig - und heureka! Es geht - die Pakete fließen. Den unterschied zu obigem kapiere ich leider nicht und bin - falls Du die Muße hast - dankbar für eine Erläuterung.


----------



## KLM (31 Dezember 2021)

Dein Hauptproblem war der doppelte Aufruf der gleichen Instanz mit unterschiedlichen Befehlen. Dann hast Du den xSend nicht einmalig sondern 200ms lang immer wieder gesetzt. Wo jetzt der Unterschied zu Deinem letzten Code liegt kann ich nicht genau sagen, weil Du da wesentliche Teile in einem FB versteckst.
Aber wenn es jetzt läuft ist das super. 
Und als Vorsatz für's neue Jahr könntest Dir mal das Tasksystem vornehmen.
Guten Rutsch!


----------



## philipp75 (31 Dezember 2021)

Werd ich machen  hatte ich schonmal versucht, dort Änderungen durchzuführen - scheiterte aber immer an einer Meldung dass ich UDP Netvars verwende (2 weitere Steuerungen) - aber ich werde mir das nochmal ansehen!

1000 Dank nochmal-


----------

