Probleme mit der IP Adresse

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
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?
Ingo
User
Beiträge: 59
Registriert: Dienstag 21. Oktober 2008, 09:51

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?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das Gerät fragt wohl nach einem Usernamen...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ein print '\x80\x00\x00\tusername:' würde es noch deutlicher machen. ;)
Ingo
User
Beiträge: 59
Registriert: Dienstag 21. Oktober 2008, 09:51

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
[/img]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hast Du es mal mit Telnet probiert? Da könntest Du nämlich auch sofort eine Antwort schicken ...
BlackJack

@Ingo: Wenn sich im Gerät ein FTP-Server befindet, dann sprich den doch auch über das FT-Protokoll an. :roll: 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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ooops ... das hab ich wohl übersehen ;-) (Steht aber auch sehr exponiert :-D )
Ingo
User
Beiträge: 59
Registriert: Dienstag 21. Oktober 2008, 09:51

Hallo zusammen,
ich habe erfahren, dass ich eine .dll in meinem Code einbinden muss. weiß jemand wie ich das mache. die dll ist für die kommunikation zuständig.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

ctypes
Ingo
User
Beiträge: 59
Registriert: Dienstag 21. Oktober 2008, 09:51

was meinst du damit ctypes? wie soll das aussehen?
BlackJack

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.
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

Ingo hat geschrieben:was meinst du damit ctypes? wie soll das aussehen?
Hier ein kurzes ctypes Beispiel (Windows DLL):

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)
Bei einigen C-Funktionen muss man aber ctypes mitteilen, was fuer Argumente erwartet und zurueckgegeben werden (Stichwort .argtypes, .restype). Dazu benoetigt man C-types Wrapper, d.h. die c_* Typen aus ctypes. Die Doku ist da sehr hilfreich:

http://docs.python.org/library/ctypes.html
Ingo
User
Beiträge: 59
Registriert: Dienstag 21. Oktober 2008, 09:51

Tut mir Leid aber ich verstehe dass nicht ganz meine dll die ich ansprechen muss heißt tmctl.dll
kann ich das so wie in dem beispiel machen?
BlackJack

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.
Ingo
User
Beiträge: 59
Registriert: Dienstag 21. Oktober 2008, 09:51

Leider habe ich das mit dem objektorientierten programmierung nicht so drauf. es gibt drei arten von dlls win dll py dll und cdll soll ich win dll nehmen?
BlackJack

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.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Das ist beispielhaft der Aufruf von TmcInitialize (ungetestet):

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
Das ließe sich natürlich noch mit argtypes verbessern.
MfG
HWK
BlackJack

Oder etwas ausführlicher und mit einer Klasse (natürlich auch ungetestet):

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
Wenn man das in einer `tmc.py` speichert, sollte man es so benutzen können:

Code: Alles auswählen

import tmc

device = tmc.Ethernet('1.2.3.4', 'guido', 'geheim')
print device.id
Antworten