Modul laden für Leistungsmessgerät

Probleme bei der Installation?
Antworten
Michael_K
User
Beiträge: 7
Registriert: Dienstag 14. Juli 2015, 17:42

Guten Tag,

ich möchte mit Python auf ein Leistungsmessgerät zugreifen und zwar mittels SCPI-Befehlen Messwerte loggen. Auf meinen System befindet sich Python 2.7.
http://www.zes.com/de/content/download/ ... _1.0_e.zip
Ich habe den Programmer's Guide entpackt (C:\Users\xxx\Desktop\ZES\Programmierung) Wenn ich versuche das zes Modul zu laden, kommt immer eine Fehlermeldung. Es ist ein Treiber für die RS232 Schnittstelle von ZES Zimmer, damit ich sofort drauf loslegen kann.
Ich habe schon versucht die path variable zu erweitern.

Code: Alles auswählen

import sys
sys.path.append('C:\\Users\\Michael\\Desktop\\Projekt\\Programmierung\\bin')
print sys.path
['', 'C:\\Python27\\Lib\\idlelib', 'C:\\Windows\\SYSTEM32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages', 'C:\\Users\\Michael\\Desktop\\Projekt\\Programmierung\\bin']
Aber wenn ich ein Programm starten will kommt trotzdem die Fehlermeldung

Code: Alles auswählen

>>> 
Traceback (most recent call last):
  File "C:\Users\Michael\Desktop\Projekt\Programmierung\hello.py", line 6, in <module>
    import zes
ImportError: No module named zes
Hier ist das Script, welches ich verusche zu starten. Ich konnte aufgrund dessen das Programm nicht testen.

Code: Alles auswählen

#
# HELLO.PY
#
 
# load ZES RS232 functions
import zes                 
 
# Open the serial interface:
LMG=zes.Open("COM3", "BAUD=38400 EOS=LF PROTO=RTS/CTS")
 
# Write command to instrument
zes.Write(LMG, "*IDN?")    
 
# Read answer from instrument
answer=zes.Read(LMG)       
 
# Place answer on screen
print "The connected instrument is:\n"+answer
 
# Write command to instrument
zes.Write(LMG, "GTL")      
 
# Close connection
zes.Close(LMG)             
print "\nProgramm finished"
Benutzeravatar
__LC__
User
Beiträge: 32
Registriert: Dienstag 1. März 2011, 14:08
Wohnort: 127.0.0.1
Kontaktdaten:

Hallo Michael_K.

Wenn ich es eben richtig gesehen habe, dann gibt es gar kein Modul zes.py, lediglich eine gleichnamige dll.

Schöne Grüße
Falk
Michael_K
User
Beiträge: 7
Registriert: Dienstag 14. Juli 2015, 17:42

Ich bin noch nicht ganz so fit, was Python angeht und dachte ich könnte es mit import laden. Ich habe jetzt versucht mit ctypes die DLL einzubinden, aber es funktioniert noch immer nicht. Ich habe auch PyDLL, CDLL versucht. Ich werde mich, wenn nichts hilft, an das Unternehmen wenden und mal fragen, wie man es benutzten kann.

Code: Alles auswählen

import ctypes
zes = ctypes.WinDLL("C:\\Users\\Michael\\Desktop\\Projekt\\Programmierung\\bin\\zes.dll")

Traceback (most recent call last):
  File "C:/Python27/Workspace/ctypestest.py", line 4, in <module>
    zes = ctypes.WinDLL("C:\\Users\\Michael\\Desktop\\Projekt\\Programmierung\\bin\\zes.dll")
  File "C:\Python27\lib\ctypes\__init__.py", line 365, in __init__
    self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126] Das angegebene Modul wurde nicht gefunden
In den Programmer's Guide befindet sich ein Python.exe, womit dann import zes funktioniert. Leider kann ich jetzt das Script nicht testen, weil ich nicht im Labor bin.
Zuletzt geändert von Michael_K am Dienstag 14. Juli 2015, 22:24, insgesamt 1-mal geändert.
BlackJack

@Michael_K: In dem Archiv ist ein Python 2.2 für das diese DLL kompiliert wurde. Die funktioniert also nicht mit Deinem Python 2.7 zusammen. Und auch nicht mit `ctypes` weil das keine ”normale” DLL ist, sondern eine die als Python-Modul importiert werden muss.
Michael_K
User
Beiträge: 7
Registriert: Dienstag 14. Juli 2015, 17:42

Danke BlackJack :) Ich werde es morgen dann versuchen zu testen. Eventuell schaue ich mir noch vielleicht PyVISA an.

Mit freundlichen Grüßen
Michael
Michael_K
User
Beiträge: 7
Registriert: Dienstag 14. Juli 2015, 17:42

Hey leute,
ich versuche jetzt mit python 3.4 und pyserial auf mein Leistungsmessgerät zu zugreifen. Nach zes.read() kommt nichts mehr. Er hängt sich auf und wartet bestimmt auf ein Zeichen oder so. Das gleiche passiert auch, wenn ich zes.ctsrts =1 setze. Keine Fehlermeldung oder sonst was und ich muss die IDLE schließen. Ich verzweifle voll an der Sache. Ich kann ja nicht mal die Beispeile in den Dokumentationen versuchen, weil es schon daran scheitert, einen einfachen SCPI zu senden und zu lesen.

Code: Alles auswählen

>>> import serial
>>> zes = serial.Serial(2)
>>> zes.baudrate = 38400
>>> zes.open()
>>> zes.write(bytes("*IDN?", encoding = "ascii"))
5
>>> a = zes.read()
#Das gehört eigentlich auch dazu, wird aber nicht mehr ausgeführt
a = a.decode("ascii")
print(a)
zes.close()
Ich bin mit einen USB Kabel verbunden, welches einen virutellen COM-Port erstellt.

Mit pyvisa gehts auch nicht.

Code: Alles auswählen

>>> import visa
>>> rm = visa.ResourceManager()
>>> rm.list_resources()
('ASRL3::INSTR', 'ASRL10::INSTR')
>>> zes = rm.open_resource('ASRL3::INSTR')
>>> zes.write("*IDN*")
(7, <StatusCode.success: 0>)
>>> zes.read()
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    zes.read()
  File "C:\Python34\lib\site-packages\pyvisa\resources\messagebased.py", line 312, in read
    message = self.read_raw().decode(enco)
  File "C:\Python34\lib\site-packages\pyvisa\resources\messagebased.py", line 286, in read_raw
    chunk, status = self.visalib.read(self.session, size)
  File "C:\Python34\lib\site-packages\pyvisa\ctwrapper\functions.py", line 1582, in read
    ret = library.viRead(session, buffer, count, byref(return_count))
  File "C:\Python34\lib\site-packages\pyvisa\ctwrapper\highlevel.py", line 188, in _return_handler
    raise errors.VisaIOError(ret_value)
pyvisa.errors.VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Michael_K: Ich kenne Dein Leistungsmessgerät nicht, daher nur ganz allgemein: oft erwarten die Geräte, dass Kommandos mit einem bestimmten Zeichen abgeschlossen werden, z.B. Newline '\n'. Literale Bytestrings gibt man mit b"*IDN?" an.
BlackJack

@Michael_K: Kann es sein das mindestens im ersten Fall ein Zeilenendezeichen von der Gegenseite erwartet wird? Und `flush()`\en sollte man den Schreibvorgang vielleicht noch.

Im zweiten Fall sendest Du leicht andere Daten ('*' anstatt '?') und eventuell muss man da auch die Zeile mit einem Zeichen abschliessen‽

`read()` liest *alles* von der Gegenseite, hört also erst auf zu lesen wenn die Gegenseite die Verbindung abbaut.

Funktioniert das ganze denn wenn Du ein Terminalprogramm verwendest und die Daten manuell eingibst?
Michael_K
User
Beiträge: 7
Registriert: Dienstag 14. Juli 2015, 17:42

Danke, ich versuche es morgen. Es handelt sich um ein ZES LMG500 und ich benutze einen laptop mit windows 8.1. Das mit den literalen bytestring habe ich von hier http://www.mikrocontroller.net/topic/342185 Ich habe es auch mit b"*IDN?" versucht. Ich glaube es wird daran liegen, dass ich noch ein \n einfügen muss.
Im Handbuch steht auch "Eine Nachricht zum Gerät muß mit dem Endezeichen EOS abgeschlossen werden." Schande über mein Haupt... Hoffentlich funktioniert es dann auch.
Ein Terminal habe ich noch nicht benutzt. Ich versuche es auch morgen. btw. beim versuch mit pyvisa sollte es natürlich auch "*IDN?" und nicht "*IDN*" heißen. :)

Viele Grüße
Michael
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Ein End-Of-String-Zeichen gibt es offiziell nicht, ist damit jetzt das NUL-Zeichen gemeint?
Michael_K
User
Beiträge: 7
Registriert: Dienstag 14. Juli 2015, 17:42

Ja, ich gehe davon aus.
Im Programmer´s Guide steht "The LMG instruments use only ASCII data as input. So no zero character is necessary" und außerdem
RS232
RS232 can use several types of EOS:
• <lf> (linefeed, 0Ah)
• <cr> (carriage return, 0Dh)
• <cr><lf> (0Dh 0Ah)
https://docs.python.org/2.0/ref/strings.html
\n ASCII Linefeed (LF)
\r ASCII Carriage Return (CR)
Und am Gerät kann ich einstellen, ob lf, cr oder terminal bei EOS.
Dann war es auch der Grund, warum nichts nach read() mehr gekommen ist, weil er schon den write() befehl eigentlich nicht abgeschlossen hat. Er hat ja noch ein NUL-Zeichen gebraucht hat.
Ich gebe morgen neue Infos.

viele grüße
micha
Michael_K
User
Beiträge: 7
Registriert: Dienstag 14. Juli 2015, 17:42

Es funktioniert heute. Hier mein Beispiel Code.... ist nicht wirklich schön, aber zum probieren reicht es. Mit zes.read() habe ich immer nur immer ein Byte ausgelesen und mit readline() die ganze Zeile.

Code: Alles auswählen

import serial #Importiert das Modul für die serielle Schnittstelle
# öffnet einen Port mit COM3, baud=38400 und den Protokoll RTS/CTS
zes = serial.Serial()
zes.baudrate = 38400
zes.port = 2
zes.rtscts = 1
zes
#Serial<id=0x2c49510, open=True>(port='COM3', baudrate=38400, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=1, dsrdtr=False)
#öffnet den seriellen Port
zes.open()
zes.isOpen()
#Resettet das LMG, Löscht den Buffer
zes.write(b"*RST\n")
zes.flushInput()
zes.flushOutput()
zes.write(b"*CLS\n")
#Erzeugt einen kurzen BEEP Ton 
zes.write(b":SYSTem:BEEPer:IMMediate\n")
zes.write(b"*IDN?\n")
a = zes.readline()
a = a.decode("ascii")
print(a)
#Schließt das Interface wieder
zes.write(b"*RST\n")
zes.flushInput()
zes.flushOutput()
zes.write(b"*CLS\n")
zes.write(b"GTL\n")
print("Programm beendet")

Code: Alles auswählen

>>> ================================ RESTART ================================
>>> 
ZES ZIMMER Electronic Systems GmbH,LMG500,043xxxx,4.151

Programm beendet
>>> 
Antworten