2013-03-28 2 views
0

У меня проблема: я создал небольшой скрипт Python для чтения данных из памяти ПЛК Omron в локальной сети. Delphi запускает пакетный файл, периодически запускающий скрипт Python (каждые 6 секунд).UDP-сокет не может получить данные

Этот сценарий работает на 2 компьютерах Win 7 и 1 Win XP PC.

Моя проблема: нет передачи данных между ПК Win XP и ПЛК в течение произвольного периода времени (около 1 минуты, а иногда и больше), но у Win 7 ПК нет проблем с общением с одним и тем же ПЛК.

Я использую протокол UDP.

def main(): 
    udpSock = util_socket.utilSocket() 
    command = udpSock.read_from_file("udpCommand") 
    command = int(command) 
    messaggio = mex() 
    if command==1: 
     msg = messaggio.get_messaggio_lettura() 
     udpSock.send_command(msg) 
     ricevi_risposta(udpSock) 
    if command==2: 
     msg = messaggio.get_messaggio_azzeramento() 
     udpSock.send_command(msg) 
     msg = messaggio.get_messaggio_lettura() 
     udpSock.send_command(msg) 
     ricevi_risposta(udpSock) 
    if command<1 or command>2: 
     udpSock.write_to_file("ERROR !!!", "numPezzi") 

def ricevi_risposta(udpSock):   
    data, addr = udpSock.recv_socket() 
    contaPezzi = udpSock.get_dato_pulito(data) 
    udpSock.write_to_file(contaPezzi, "numPezzi") 
    stringa = str(datetime.datetime.now().strftime("%d/%m/%Y %H:%M")) + " - dato ricevuto: " + str(data) + " // dato convertito: " + str(contaPezzi) + "\n" 
    udpSock.append_to_file(stringa, "numPezzi_Log_" + str(datetime.datetime.now().strftime("%d/%m/%Y"))) 

def recv_socket(self): 

    # the public network interface 
    #HOST = socket.gethostbyname(socket.gethostname()) 

    # create a raw socket and bind it to the public interface 
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) 
    self.get_parametri() 
    s.bind((self.ipAddressPc, 0)) 
    # Include IP headers 
    s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) 
    data, addr = s.recvfrom(65536) 

    return data, addr 

def send_command(self, msg): 
    self.get_parametri() 
    udp_ip = self.ipAddressPlc 
    udp_port=9600 #5575 

    #print "UDP target IP:", udp_ip 
    #print "UDP target port:", udp_port 
    #print "message:", msg 

    sock = socket.socket(socket.AF_INET, # Internet 
          socket.SOCK_DGRAM) # UDP 
    sock.sendto(msg, (udp_ip, udp_port)) 

LAN кажется «спать». Это файл журнала: (08:41:13 -> 08:42:30. Ожидание 08:41:13 -> 08:41:19, 08:41:25, 08:41:31, ...)

27/03/2013 08:41:13 - dato ricevuto (dati non riportabili) dato convertito: 252 
27/03/2013 08:42:30 - dato ricevuto (dati non riportabili) dato convertito: 260 
27/03/2013 08:42:30 - dato ricevuto (dati non riportabili) dato convertito: 260 
27/03/2013 08:42:30 - dato ricevuto (dati non riportabili) dato convertito: 260 
27/03/2013 08:42:30 - dato ricevuto (dati non riportabili) dato convertito: 260 
27/03/2013 08:42:30 - dato ricevuto (dati non riportabili) dato convertito: 260 
27/03/2013 08:42:30 - dato ricevuto (dati non riportabili) dato convertito: 260 
27/03/2013 08:42:30 - dato ricevuto (dati non riportabili) dato convertito: 260 
27/03/2013 08:42:30 - dato ricevuto (dati non riportabili) dato convertito: 260 
27/03/2013 08:42:30 - dato ricevuto (dati non riportabili) dato convertito: 260 
27/03/2013 08:42:30 - dato ricevuto (dati non riportabili) dato convertito: 260 
27/03/2013 08:42:30 - dato ricevuto (dati non riportabili) dato convertito: 260 
27/03/2013 08:42:30 - dato ricevuto (dati non riportabili) dato convertito: 260 
27/03/2013 08:42:36 - dato ricevuto (dati non riportabili) dato convertito: 261 

В чем может быть проблема?

ответ

0

Это может быть связано с перегрузкой сети в локальной сети. Если это происходит совсем немного, как 1 минута.

+0

это невозможно, потому что я могу ping Win XP pc и смотреть его с помощью ultraVNC и других программ. – Supremenerd88

+1

@ Supremenerd88 - ping и VNC работают через TCP, а не UDP. UDP гораздо более уязвим для ошибок и пакетов, особенно в перегруженных сетях и в электрически шумных средах. UDP не гарантирует, что пакеты будут доставлены или что они будут доставлены правильно. При использовании UDP вы должны проверить и повторно запросить себя, если связь не удалась. см .: http://en.wikipedia.org/wiki/User_Datagram_Protocol#Reliability_and_congestion_control_solutions –