Hallo,
ich habe eine Software, die verschiedene Modbus/TCP-Server im Netzwerk finden kann. Diese Funktionalität hätte ich gerne in AutoIt nachgebaut, nur eben bisher ohne Erfolg.
Ich habe Wireshark benutzt um zu sehen wie das Programm das macht. Und zwar wird via UDP-Broadcast eine 8-Byte Meldung an 255.255.255.255 geschickt. Danach melden sich die einzelnen Geräte nacheinander und schicken ihre Konfiguration (IP, Subnet, Gateway) und ihre Produktnummer zurück. Der PC hat den Port 17009, das Modbus-Gerät 17008.
Wenn ich nun das ganze mit AutoIt versuche, dann ist der ausgehende Port immer ein anderer, deswegen vermute ich, dass ich nichts von den Geräten zurückerhalte. Kann ich irgendwie den ausgehenden Port bestimmen? Mit UDPBind scheint es nicht zu funktionieren.
Hier noch eines meiner Test-Versuchsskripte:
Spoiler anzeigen
UDPStartup()
[/autoit] [autoit][/autoit] [autoit]Global $ThisPCIP = @IPAddress1
[/autoit] [autoit][/autoit] [autoit]Global $aSocket2 = UDPBind($ThisPCIP, 17009)
If @error <> 0 Then
ConsoleWrite("error opening $aSocket2, @error = " & @error & @CRLF)
Exit
EndIf
Global $ThatPCIP = "255.255.255.255" ;broadcast
[/autoit] [autoit][/autoit] [autoit]Global $aSocket = UDPOpen($ThatPCIP, 17008, 1)
If @error <> 0 Then
ConsoleWrite("error opening $socket" & @CRLF)
Exit
EndIf
If UDPSend($aSocket, Binary("0x3101FFFFFFFFFFFF")) = 0 Then
MsgBox(0, "ERROR", "Error while sending UDP message: " & @error)
Exit
EndIf
$data = UDPRecv($aSocket2, 512)
If $data <> "" Then
MsgBox(0, "UDP DATA", $data, 1)
EndIf
UDPCloseSocket($aSocket)
UDPCloseSocket($aSocket2)
UDPShutdown()
Hat irgendwer eine Idee, oder zumindest mehr Erfahrung damit? Muss ich die Funktionen aus Ws2_32.dll wrappen, um zum Ziel zu gelangen?
Danke für eure Hilfe!