我正在尝试从PLC(AutomationDirect P2000)检索数据。我已经将PLC与他们的软件程序一起设置为服务器(我也可以通过以太网与他们的软件连接到该服务器,并使用Wireshark看到它实际上大约每200毫秒就向我的机器发送UDP数据包)。我正在尝试建立一个非常简单的Python脚本来检索所说的数据,而不必费心对其进行编码或对其进行任何处理,但是我的程序挂在socket.recv()上。每当我尝试运行它时,都会显示“ Got here”,但不会打印“ Now here”。从我读到的事实来看,它挂起意味着没有数据要接收,但是从我(有限)对我在Wireshark上看到的内容的了解(有限)来看,情况并非如此。我对这一切都很陌生,希望对您有所帮助。
我尝试使用socket.recvfrom()产生相同的结果。我也尝试使用socket.bind()而不是socket.connect(),但出现“请求的地址在其上下文中无效”异常。另外,我尝试使用各种IP和端口。例如,我尝试使用IP =''代替实际IP,并且尝试将Wireshark的源/目标信息作为我试图绑定或连接的内容,但到目前为止没有任何效果。
import socket
IP = '192.168.3.1'
PORT = 9999
BUFFER_SIZE = 4096
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((IP, PORT))
while True:
print("Got here")
data = s.recv(BUFFER_SIZE)
print("Now here")
print(f"Received {data}")
我希望从数据包中以字节格式打印出来,但是程序挂起了。如果我尝试使用socket.bind()而不是socket.connect(),则会收到一条错误消息,内容为“ ...第8行 s.bind((IP,PORT))
OSError:[WinError 10049]所请求的地址在其上下文中无效”
答案 0 :(得分:0)
您不能像这样使用bind
,因为IP地址不属于您的PC。
connect
到服务器时,它(服务器)没有发送任何内容,但是您尝试从服务器获取数据,因此套接字等待直到它获取数据,然后才会继续执行(这称为阻塞函数,因为它阻塞执行直到完成)。
答案 1 :(得分:0)
问题在于如何将PLC设置为服务器。我在端口9999上看到的UDP数据不是我想的通讯,而是PLC和网络之间通过其专有程序进行的固有通讯。对于好奇的人,我使用的是AutomationDirect的P2000 PLC,最初我按照他们的视频之一将其设置为EtherNet / IP适配器,但是我必须使用“通信”部分中提供的“以太网自定义协议”功能。 / p>