LabVIEWForum.de
LabView und Python via UDP - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: LabView und Python via UDP (/Thread-LabView-und-Python-via-UDP)



LabView und Python via UDP - bluesaturn - 12.09.2011 07:36

Guten Morgen, Labviewforum.

Ich versuche gerade, LabView und Python miteinander reden zu lassen via UDP und localhost als Testumgebung. Ich würde das auch an für sich so beibehalten :-)

Bei LabView gibt es ja die UDP Sender und UPD Receiver.vi zum Testen.
Mit meinem Code habe ich es schon einmal geschafft, LabView einen String zu senden, aber gleichzeitig Empfangen von Strings von LabView in Python klappt nicht.
Entweder das geht nicht oder ich mache etwas in Python falsch. Habe ich beide vi's laufen + Python, gibt es eine Fehlermeldung in LabView, daß die Adresse schon gerade benutzt wird.
Muß man Senden und Empfangen über verschiedene Ports laufen lassen?
Oder kann es sein, daß die Sender.vi einen UDP port öffnet und mein Python-code macht das aus, und es deswegen Probleme gibt?

Da ich die Example vi's aus LabView für Sender und Receiver benutze, stelle ich mal den Python-Code hier rein. Vielleicht könnte ihr ihn einmal anschauen. Könnte ihn sich vielleicht jemand bitte anschauen?
Er sollte einfach mit der Sender und Receiver.vi aus Labview laufen.
Vielen Dank fürs Anschauen.
Gruß
blue

Python-Code:

Code:
#---- cut here

# To change this template, choose Tools | Templates
# and open the template in the editor.

__author__="User"
__date__ ="$11.09.2011 19:34:03$"

if __name__ == "__main__":
    print "Das ist ein Test"

import socket
import time

#Define global variables for UDP_IP and UDP_Port, needs to be changed for PETRA-3
global UDP_IP
UDP_IP="127.0.0.1"
print "UDP_IP is", UDP_IP

global UDP_PORT
UDP_PORT=21311
print "UDP_PORT is", UDP_PORT


def openUDPSocket(UDP_IP,UDP_PORT):
    #UDP_IP="127.0.0.1"
    #UDP_PORT=21311
    sock=socket.socket( socket.AF_INET, # Internet
                        socket.SOCK_DGRAM ) # UDP
    return sock

def fastPump(sock):
    # Start pumping and return
    MESSAGE="pumpfast"

   # print "UDP target IP:", UDP_IP
   # print "UDP target port:", UDP_PORT
   # print "message:", MESSAGE

    sock.sendto( MESSAGE, (UDP_IP, UDP_PORT) )

def slowPump(sock):
    MESSAGE="pumpslow"
    sock.sendto( MESSAGE, (UDP_IP, UDP_PORT) )


#def receiveUDPpump(sock):



pumpsocketUDP=openUDPSocket(UDP_IP,UDP_PORT)
pumpsocketUDP.bind((UDP_IP,UDP_PORT)) #bind to UDP IP

data,addr = pumpsocketUDP.recvfrom(1024)
print data



counter_while_loop=0

while counter_while_loop < 3:
    fastPump(pumpsocketUDP)
    time.sleep(5)
    slowPump(pumpsocketUDP)
    time.sleep(3)

    counter_while_loop=counter_while_loop+1
    print "Counter_while_loop", counter_while_loop



RE: LabView und Python via UDP - jochen_k - 13.09.2011 14:15

... Python kann ich nicht aber ja die portnummer müssen verschiedene sein, sprich wenn ein Programm
einen port belegt dann ist der eben belegt. Also z.B. LabVIEW senden-port auto.(0) auf port 8002, empfang-port 8001
... Python senden port auto.(0), auf port 8001, empfang-port 8002


RE: LabView und Python via UDP - GerdW - 13.09.2011 14:18

Hallo blue,

hast du dir mal die Beispiel-VIs zum UDP-Port angeschaut?


RE: LabView und Python via UDP - Falk - 17.09.2011 09:24

Hallo Blue!

Bist du mit deiner Fragestellung schon weiter gekommen? Falls nicht angehängt mal ein ganz einfaches Beispiel wie man es in Python machen kann. Ich möchte aber betonen, dass ich mit Python auch noch in den Kinderschuhen stecke. Die beschriebene Lösung ist demnach nicht die Beste. Auch wirst du schnell sehen, welche großen Nachteil mein "Entwurf" hat. Das Lesen auf dem UDP Stream erfolgt nämlich nur dann, wenn du auch Daten versendest. Da du aber statt auf TCP auf UDP setzt, willst du sicherlich dass das Lesen unabhängig und parallel in einem eigenen Prozess läuft, oder?
Aber vielleicht hilft es dir ja trotzdem irgendwie weiter.

Schöne Grüße und ein schönes Wochenende
Falk

Code:
import time
import socket

global UDP_IP, UDP_PORT_REMOTE, UDP_PORT_LOCAL

UDP_IP = "127.0.0.1"
UDP_PORT_REMOTE = 61557
UDP_PORT_LOCAL = 61555

class UDPSender(object):

    def __init__(self):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    def send(self, msg):
        self.sock.sendto(msg, (UDP_IP, UDP_PORT_REMOTE))

    def close(self):
        self.sock.close()

class UDPListener(object):

    def __init__(self):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.settimeout(0.5)
        self.sock.bind((UDP_IP, UDP_PORT_LOCAL))

    def read(self):
        msg, remote = self.sock.recvfrom(548)
        return msg

    def close(self):
        self.sock.close()
  
if __name__ == "__main__":
  
    listener = UDPListener()
    sender = UDPSender()

    for i in range(0, 100):
        try:
            print listener.read()
        except:
            print "timed out"
        msg = "Hallo Welt"
        print msg

        sender.send(msg)

    listener.close()
    sender.close()
[/code]