Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1216to1220
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Kann mit VBA ein Gerät über LAN gesteuert werden?

Kann mit VBA ein Gerät über LAN gesteuert werden?
Martin
Hallo,
mir ist bekannt, dass mit Excel VBA die serielle Schnittstelle (RS232) angesteuert werden kann (mit "rsapi.dll" und "port.dll"). Ist es aber auch möglich über das Netzwerk (RJ45) mittels TCP/IP Daten an ein Gerät zu senden und zu empfangen? Die IP "meines" Gerätes ist von mir frei wählbar (derzeit 192.168.1.3), der Port 23 ist feststehend.
Das Datenprotokoll des Gerätes liegt mir vor. Es wäre für mich sehr schön, wenn die Messdaten des Gerätes zur weiteren Verarbeitung in Excel direkt über VBA ausgelesen werden könnten.
Viele Grüße
Martin
AW: Kann mit VBA ein Gerät über LAN gesteuert werden?
08.06.2011 15:37:50
Armin
Hallo Martin,
da Du den Port 23 erwähnt hast, gehe ich von von FTP aus? Das muss das Gerät welches Du ansprechen willst aber auch können! Für FTP habe ich eine Routine und die benutze ich auch schon einige Jahre.
Also bitte noch einmal melden.
LG
Armin
AW: Kann mit VBA ein Gerät über LAN gesteuert werden?
08.06.2011 16:13:30
Martin
Hallo Armin,
ich freue mich über eine Antwort. Allerdings hat es nichts mit FTP zu tun. Ich muss nur Buchstaben an das Messgerät senden und erhalte Messwerte zurück. Es werden keine Dateien übertragen.
Viele Grüße
Martin
AW: Kann mit VBA ein Gerät über LAN gesteuert werden?
08.06.2011 17:06:54
Armin
Hallo Martin,
so ganz verstehe ich das nicht, irgend ein Protokoll muss jede Kommunikation haben. Wenn Du über LAN auf ein Messgerät zugreifen willst brauchst Du das zwingend. Also muss das als erstes bekannt sein.
LG
Armin
Anzeige
AW: Kann mit VBA ein Gerät über LAN gesteuert werden?
08.06.2011 17:49:58
Martin
Hallo Armin,
ich sende und empfange nur Buchstaben/Zeichenfolgen. Also wenn ich über die Terminal-Software "Hercules" unter "TCP Client" unter Angabe von IP und Port eine Verbindung zum Messgerät herstelle und die Steuerbefehle (das sind meist nur einzelne Buchstaben) sende, erhalte ich vom Messgerät die entsprechenden Antworten (als Zeichenketten). Ich bin mir zumindest nicht bewusst, dass ich ein bestimmtes Protokoll verwende.
Viele Grüße
Martin
AW: Kann mit VBA ein Gerät über LAN gesteuert werden?
08.06.2011 18:50:28
Armin
Hallo Martin,
ok da ich das Meßgerät usw. nicht kenne kann ich Dir leider nicht helfen.
LG
Armin
AW: Kann mit VBA ein Gerät über LAN gesteuert werden?
08.06.2011 19:03:13
Martin
Hallo Armin,
schade, aber trotzdem danke. Ich markiere den Thread wieder als unbeantwortet.
Viele Grüße
Martin
Anzeige
Bin ein Stück weiter, aber noch nicht am Ziel
09.06.2011 00:36:16
Martin
Hallo alle zusammen!
nach langen Recherchen im Internet bin ich ein Stück weiter. Über Winsock API kann über das Netzwerk kommuniziert werden. Dazu muss folgende Datei im Windows-Verzeichnis enthalten sein: https://www.herber.de/bbs/user/75228.zip
Mit folgendem Code ist es mir gelungen die Netzwerkverbindung zu meinem Messgerät aufzubauen und Steuerbefehle zu senden (Messvorgang ein- und ausschalten), aber leider konnte ich noch keine Daten empfangen. Wer kann helfen?
'This is the Winsock API definition file for Visual Basic
'Setup the variable type 'hostent' for the WSAStartup command
Type Hostent
h_name As Long
h_aliases As Long
h_addrtype As String * 2
h_length As String * 2
h_addr_list As Long
End Type
Public Const SZHOSTENT = 16
'Set the Internet address type to a long integer (32-bit)
Type in_addr
s_addr As Long
End Type
'A note to those familiar with the C header file for Winsock
'Visual Basic does not permit a user-defined variable type
'to be used as a return structure. In the case of the
'variable definition below, sin_addr must
'be declared as a long integer rather than the user-defined
'variable type of in_addr.
Type sockaddr_in
sin_family As Integer
sin_port As Integer
sin_addr As Long
sin_zero As String * 8
End Type
Public Const WSADESCRIPTION_LEN = 256
Public Const WSASYS_STATUS_LEN = 128
Public Const WSA_DescriptionSize = WSADESCRIPTION_LEN + 1
Public Const WSA_SysStatusSize = WSASYS_STATUS_LEN + 1
'Setup the structure for the information returned from
'the WSAStartup() function.
Type WSAData
wVersion As Integer
wHighVersion As Integer
szDescription As String * WSA_DescriptionSize
szSystemStatus As String * WSA_SysStatusSize
iMaxSockets As Integer
iMaxUdpDg As Integer
lpVendorInfo As String * 200
End Type
'Define socket return codes
Public Const INVALID_SOCKET = &HFFFF
Public Const SOCKET_ERROR = -1
'Define socket types
Public Const SOCK_STREAM = 1 'Stream socket
Public Const SOCK_DGRAM = 2 'Datagram socket
Public Const SOCK_RAW = 3 'Raw data socket
Public Const SOCK_RDM = 4 'Reliable Delivery socket
Public Const SOCK_SEQPACKET = 5 'Sequenced Packet socket
'Define address families
Public Const AF_UNSPEC = 0 'unspecified
Public Const AF_UNIX = 1 'local to host (pipes, portals)
Public Const AF_INET = 2 'internetwork: UDP, TCP, etc.
Public Const AF_IMPLINK = 3 'arpanet imp addresses
Public Const AF_PUP = 4 'pup protocols: e.g. BSP
Public Const AF_CHAOS = 5 'mit CHAOS protocols
Public Const AF_NS = 6 'XEROX NS protocols
Public Const AF_ISO = 7 'ISO protocols
Public Const AF_OSI = AF_ISO 'OSI is ISO
Public Const AF_ECMA = 8 'european computer manufacturers
Public Const AF_DATAKIT = 9 'datakit protocols
Public Const AF_CCITT = 10 'CCITT protocols, X.25 etc
Public Const AF_SNA = 11 'IBM SNA
Public Const AF_DECnet = 12 'DECnet
Public Const AF_DLI = 13 'Direct data link interface
Public Const AF_LAT = 14 'LAT
Public Const AF_HYLINK = 15 'NSC Hyperchannel
Public Const AF_APPLETALK = 16 'AppleTalk
Public Const AF_NETBIOS = 17 'NetBios-style addresses
Public Const AF_MAX = 18 'Maximum # of address families
'Setup sockaddr data type to store Internet addresses
Type sockaddr
sa_family As Integer
sa_data As String * 14
End Type
Public Const SADDRLEN = 16
'Declare Socket functions
Public Declare Function closesocket Lib "wsock32.dll" (ByVal s As Long) As Long
Public Declare Function Connect Lib "wsock32.dll" Alias "connect" (ByVal s As Long, addr As  _
sockaddr_in, ByVal namelen As Long) As Long
Public Declare Function htons Lib "wsock32.dll" (ByVal hostshort As Long) As Integer
Public Declare Function inet_addr Lib "wsock32.dll" (ByVal cp As String) As Long
Public Declare Function recv Lib "wsock32.dll" (ByVal s As Long, ByVal buf As Any, ByVal buflen  _
As Long, ByVal flags As Long) As Long
Public Declare Function recvB Lib "wsock32.dll" Alias "recv" (ByVal s As Long, buf As Any,  _
ByVal buflen As Long, ByVal flags As Long) As Long
Public Declare Function Send Lib "wsock32.dll" Alias "send" (ByVal s As Long, buf As Any, ByVal  _
buflen As Long, ByVal flags As Long) As Long
Public Declare Function socket Lib "wsock32.dll" (ByVal af As Long, ByVal socktype As Long,  _
ByVal protocol As Long) As Long
Public Declare Function WSAStartup Lib "wsock32.dll" (ByVal wVersionRequired As Long, lpWSAData  _
As WSAData) As Long
Public Declare Function WSACleanup Lib "wsock32.dll" () As Long
Public Declare Function WSAUnhookBlockingHook Lib "wsock32.dll" () As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource  _
As Any, ByVal cbCopy As Long)
Public socketId
Public Function ConnectServer(ByVal Hostname As String, ByVal PortNumber As Integer) As Integer
Dim StartUpInfo As WSAData
'Version 1.1 (1*256 + 1) = 257
'version 2.0 (2*256 + 0) = 512
'Get WinSock version
'Initialize Winsock DLL
x = WSAStartup(257, StartUpInfo)
Dim I_SocketAddress As sockaddr_in
Dim ipAddress As Long
ipAddress = inet_addr(Hostname) '...........(1)
'Create a new socket
socketId = socket(AF_INET, SOCK_STREAM, 0) '
If socketId = SOCKET_ERROR Then '
MsgBox ("ERROR: socket = " + Str$(socketId)) '...........(2)
OpenSocket = COMMAND_ERROR '
GoTo end1
End If '
'Open a connection to a server
I_SocketAddress.sin_family = AF_INET '
I_SocketAddress.sin_port = htons(PortNumber) '...........(3)
I_SocketAddress.sin_addr = ipAddress '
I_SocketAddress.sin_zero = String$(8, 0) '
x = Connect(socketId, I_SocketAddress, Len(I_SocketAddress)) '
If socketId = SOCKET_ERROR Then '
MsgBox ("ERROR: connect = " + Str$(x)) '..(4)
OpenSocket = COMMAND_ERROR '
Else
OpenSocket = socketId
End If
end1:
End Function
Public Function RecData(dataBuf As String, ByVal maxLength As Integer) As Integer
Dim c As String * 1
Dim length As Integer
dataBuf = ""
While length 
Folgende interessante Seiten habe ich zu Excel und Lan gefunden:
http://cp.literature.agilent.com/litweb/pdf/16000-95012.pdf
http://www.vbarchiv.net/api/api_connect.html
http://www.ostrosoft.com/oswinsck/oswinsck_vba.asp
Anzeige
nicht FTP, sondern Telnet
10.06.2011 22:14:37
Christian
Hallo Martin,
@ Armin: Port 23 ist Telnet, nicht FTP. FTP spricht über Port 21 und 20.
@ Martin:
wenn du eine Connection aufbaust und ein "send" schickst, musst du ja auch erst mal auf 'ne Antort warten. Die Zeile "Call TCP_Client.Disconnect" ist zwar auskommentiert, aber wahrscheinlich nur zum Testen.
Was mir bei "Receive" auffällt:
Du hast den Namen der Funktion "RecvAscii" geändert zu "RecData". Den Rückgabewert von RecData schreibst du aber in eine Variable "RecvAscii", die nicht deklariert ist. Scheinbar nutzt du kein "Option Explicit", sonst wär dir das schon längst aufgefallen. Wenn man mit Sockets arbeitet sollte man schon sehr genau wissen was man tut, und nicht erst dann ist "Option Explicit" obligatorisch.
Für die Entwicklung empfehle ich, den originalen Datenverkehr auf der Schnittstelle mitzuschneiden (z.B. mit Wireshark - ist OpenSource und imho der weltweit beste Tracer) und dies mit dem Trace, den dein Code erzeugt, zu vergleichen. Wenn du jetzt noch die RFC von TCP und Telnet kennst, wirst du sehen, wo die Connection abbricht oder was da schief läuft. Für tiefere Analyse ist von Vorteil, den HexCode lesen zu können.
Grüße
Christian
Anzeige
AW: nicht FTP, sondern Telnet
12.06.2011 09:28:55
Martin
Hallo Christian,
vielen Dank für deine Antwort. Ich habe den Code (bis auf das Makro "Senden") nicht geändert, sondern so aus dem Internet. Also stammt die Änderung der Function "RecvAscii" zu "RecData" nicht von mir. Eigentlich arbeite ich mir Option Explicit, aber scheinbar habe ich es beim Hineinkopieren des Codes versehentlich überschrieben. (Hatte vorher schon anderen Code im Modul, mit dem es aber nicht geklappt hatte.)
Abgesehen davon, dass mir das Datenprotokoll vom Gerätehersteller vorliegt, überwache ich den Datenaustausch bereits mit "Accurate Network Monitor". Das klappt auch alles sehr gut, ist aber leider nur eine 14-tägig frei nutzbare Sharware aus den USA. Daher bin ich dir für den Tipp mit "Wireshark" schon einmal sehr dankbar. Kannst du mit bitte schreiben was du mit "RFC von TCP und Telnet" meinst?
Viele Grüße
Martin
Anzeige
RFC = die Spezifikation, der Standard ...
12.06.2011 15:38:37
Christian
der Protokolle, Martin.
RFC heißt eigentlich Requests for Comments. Der Name bleibt jedoch bestehen, auch wenn der erste Vorschlag / Entwurf sich in der Zwischenzeit zum allg. Standard entwickelt hat.
So ist z.B. das TCP-Protokoll in RFC 793 und weiteren spezifiziert. Hier wird u.a. beschrieben, wie eine Verbindung zwischen Client und Server aufgebaut und abgebaut wird (Three-Way-Handshake, etc.). Telnet basiert auf TCP. Du baust also zuerst eine TCP-Verbindung über Port 23 auf, um dann Telnet zu "sprechen". Bei der Fehleranalyse ist es daher hilfreich, auch die beteiligten tieferen Schichten (Layer) zu kennen.
Infos zu den Protollen findest du bei Wiki.
Die Spec's findest du unter:
http://www.ietf.org/rfc.html
So wie du schreibst, baust du ja eine Verbindung zum Server auf und kannst auch senden nur empfangen kannst du nichts. In solchen Fällen hat mir 'ne Paket-Analyse (mit Wireshark) immer weitergeholfen. Mit WinSock bin ich nicht allzu vertraut, ich mach so was mit Linux. Im Vergleich zu Windows kann man hier sicher sein, dass die Protokolle kornform zur Spec implementiert sind.
Der Screenshot (IP- und Mac sind ausgegraut) zeigt einen Wireshark-Trace einer Telnet-Verbindung zwischen Client (IP: x.y.z.36) und Server (IP: x.y.z.20). Die ersten 3 Pakete zeigen den TCP Three-Way-Handshake. Bei dem markierten Paket (28) siehst du auf TCP-Level beim 18. Byte die 0017 in hex. Das entspricht dem TCP-Port 23. Auf Telnet-Level erfährt der Client vom Server bestimmte Authentication Options.
Userbild
Spannend für dich wäre z.B., wenn du vom Server eine Telnet-Antwort siehst und im nächsten Paket der Client auf TCP-Level einen Reset schickt. Das würde heißen, der Server antwortet aber der Client hört nicht mehr zu, da dieser die Verbindung schließen will.
Gruß
Christian
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige