Kann es sein, dass es so funktioniert?
Python-Programm ---> TCP/IP-Server auf deinem PC ----> IEEE 488 ---> Messgeraet
Irgendwie sind die Informationen ueber das Messgeraet ueberaus duerftig. Wie waere es, wenn du uns sagst, was das fuer ein Ding ist?
Probleme mit der IP Adresse
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
HWK hat eine Portnummer nie erwähnt Aber egal ...
Du musst die des Messgerätes natürlich kennen! Ohne die kann natürlich nichts klappen. Und Dein Client kann sich die natürlich nicht aussuchen; er muss schon den Port ansprechen, auf dem der Server läuft!
Und nur mal so am Rande: Ignorierst Du meine Fragen eigentlich?
Du musst die des Messgerätes natürlich kennen! Ohne die kann natürlich nichts klappen. Und Dein Client kann sich die natürlich nicht aussuchen; er muss schon den Port ansprechen, auf dem der Server läuft!
Und nur mal so am Rande: Ignorierst Du meine Fragen eigentlich?
Nein ich ignoriere nicht deine Fragen, habe nur vergessen sie zu beantworten.
Also ich bin jetzt soweit das ich erfolgreich was wegschicken kann aber ich bekomme eine merkwürdige antwort
und zwar diese hier:
\x80\x00\x00\tusername: kann jemand damit was anfangen?
Also ich bin jetzt soweit das ich erfolgreich was wegschicken kann aber ich bekomme eine merkwürdige antwort
und zwar diese hier:
\x80\x00\x00\tusername: kann jemand damit was anfangen?
Code: Alles auswählen
# Echo client program
import socket
HOST= '172.28.12.150'
PORT = 10001 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send ("Hold on")
antwort = s.recv(1024)
s.close()
print 'Received', `antwort`
PythonWin 2.2.1 (#34, Feb 25 2003, 11:29:09) [MSC 32 bit (Intel)] on win32.
Portions Copyright 1994-2001 Mark Hammond (mhammond@skippinet.com.au) - see 'Help/About PythonWin' for further copyright information.
>>> Received '\x80\x00\x00\tusername:'
In meinem Messgerät befindet sich ein FTP Server
@Ingo: Wenn sich im Gerät ein FTP-Server befindet, dann sprich den doch auch über das FT-Protokoll an. In der Standardbibliothek gibt's dafür das Modul `ftplib`.
Die Information hättest Du übrigens auch schon etwas früher mal geben können.
Die Information hättest Du übrigens auch schon etwas früher mal geben können.
Damit ist das `ctypes`-Modul aus der Standardbibliothek gemeint. Zusätzlich zur DLL brauchst Du eine Beschreibung der API der DLL, am besten (auch) als C-Header-Dateien, und grundlegende C-Kenntnisse, zumindest was Datentypen angeht.
Hier ein kurzes ctypes Beispiel (Windows DLL):Ingo hat geschrieben:was meinst du damit ctypes? wie soll das aussehen?
Code: Alles auswählen
from ctypes import *
# kernel32 = windll.kernel32
# msvcrt = cdll.msvcrt
user32 = windll.user32
MessageBoxW = user32.MessageBoxW
MessageBoxW(0, u'A Unicode Message: ÄÖÜäöüß', u'A Unicode Greeter', 0)
http://docs.python.org/library/ctypes.html
Du solltest das `ctypes`-Tutorial aus der Dokumentation mal durcharbeiten.
Und wie gesagt, es sind bis zu einem gewissen Grad C-Kenntnisse nötig, um zu verstehen was da passiert. Man muss die Datentypen kennen und mindestens Struktur- und Funktionsdeklarationen lesen können.
Ist das hier zufällig die Doku zu Deiner DLL: http://www.yokogawa.com/tm/dl/dlsoft/tmctl.txt ?
Und auf Pythonseite sollte man objektorientierte Programmierung drauf haben, um das ordentlich zu kapseln.
Und wie gesagt, es sind bis zu einem gewissen Grad C-Kenntnisse nötig, um zu verstehen was da passiert. Man muss die Datentypen kennen und mindestens Struktur- und Funktionsdeklarationen lesen können.
Ist das hier zufällig die Doku zu Deiner DLL: http://www.yokogawa.com/tm/dl/dlsoft/tmctl.txt ?
Und auf Pythonseite sollte man objektorientierte Programmierung drauf haben, um das ordentlich zu kapseln.
Das kommt darauf an, welche Aufrufkonvention (cdecl oder stdcall) die DLL verwendet. Entweder steht das in der Dokumentation, in der Header-Datei, oder Du musst es einfach ausprobieren. Unter Windows gibt's einen ValueError, wenn man die falsche Variante oder eine falsche Anzahl von Argumenten verwendet. Siehe den Abschnitt über Funktionsaufrufe in der `ctypes`-Dokumenatation.
Das ist beispielhaft der Aufruf von TmcInitialize (ungetestet):Das ließe sich natürlich noch mit argtypes verbessern.
MfG
HWK
Code: Alles auswählen
import ctypes
tmctl = ctypes.windll.tmctl
tmc_initialize = tmctl.TmcInitialize
# Ethernet
wire = ctypes.c_int(4)
adr = ctypes.c_char_p('server name, user name, password')
id_ = ctypes.c_int()
ret = tmc_initialize(wire, adr, ctypes.byref(id_))
print ret, id_.value
MfG
HWK
Oder etwas ausführlicher und mit einer Klasse (natürlich auch ungetestet):
Wenn man das in einer `tmc.py` speichert, sollte man es so benutzen können:
Code: Alles auswählen
from ctypes import byref, cdll, c_char_p, c_int, POINTER
OK = 0
ERROR = 1
WIRE_ETHERNET = 4
TMC_DLL = cdll.tmctl
initialize = TMC_DLL.TmcInitialize
initialize.argtypes = [c_int, c_char_p, POINTER(c_int)]
initialize.restype = c_int
class TMCException(Exception):
pass
class Ethernet(object):
def __init__(self, ip_address, user_name='anonymous', password=''):
self._id = c_int()
address = ','.join([ip_address, user_name, password])
if initialize(WIRE_ETHERNET, address, byref(self._id)) == ERROR:
raise TMCException('cannot initialize.')
@property
def id(self):
return self._id.value
Code: Alles auswählen
import tmc
device = tmc.Ethernet('1.2.3.4', 'guido', 'geheim')
print device.id