0
我遇到了一個問題:我創建了一個小型Python腳本來從局域網上的歐姆龍PLC內存中讀取數據。 Delphi程序運行批處理文件,定期運行Python腳本(每6秒)。UDP套接字無法接收數據
該腳本運行在2臺Win 7個人電腦和1臺Win XP個人電腦上。
我的問題是:在隨機時間段內(大約1分鐘,有時更多),Win XP PC和PLC之間沒有數據傳輸,但Win 7 PC與同一臺PLC通信沒有問題。
我使用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似乎「陷入睡眠」。這是LOG文件:(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
可能是什麼問題?
這是不可能的,因爲我可以ping Win XP pc並用ultraVNC和其他軟件觀看它。 – Supremenerd88 2013-03-28 11:50:55
@ Supremenerd88 - ping和VNC通過TCP工作,而不是UDP。 UDP更容易受到錯誤和丟包的影響,特別是在擁塞的網絡和電子噪聲環境中。 UDP不保證數據包得到傳遞或者它們得到正確傳遞。使用UDP時,如果通信不成功,您必須檢查並重新請求自己。請參閱:http://en.wikipedia.org/wiki/User_Datagram_Protocol#Reliability_and_congestion_control_solutions – 2013-03-28 14:25:26