Forum: Projekte & Code Python SCPI - Keithley DMM6500 u.ä.


von Veit D. (devil-elec)


Angehängte Dateien:

Lesenswert?

Hallo,

ich denke, ich kann mein Pythonprogramm, für Keithley DMM6500 u.ä. 
Messgeräte, auf die Menschheit loslassen. Ich habe mich bemüht es C++ 
ähnlich mit Klasse (Modul) aufzubauen, damit es leicht erweiterbar ist 
bzw. für verwandte Messgeräte mit ähnlichen SCPI Syntax anpassbar 
bleibt.

Das Modul 'KeithleyDMM6500SCPI.py' stellt die SCPI Klasse für Keithley 
mit den nutzbaren Methoden dar .

Die '_FUNCTION_LIST' enthält derzeit Einträge die ich für mich aktuell 
für wichtig halte um irgendwas messen zu können. Das wird sich je nach 
Bedarf mit der Zeit erweitern. Die erste Spalte 'name' darin enthält den 
Namen um an den eigentlich SCPI Syntax zu kommen ohne kryptische 
Indexnummern verwenden zu müssen. Die 2. Spalte 'command' enthält den 
eigentlichen SCPI Syntax laut Manual. Die Einträge kann man jederzeit 
erweitern.

Derzeit am Ende des Moduls sind Methoden die diese Einträge in lesbarer 
Form verwenden bzw. dem eigentlichen Programmaufruf außerhalb der Klasse 
zur Verfügung stellen.

Die Methode '_getMode' übersetzt nur die Funktionsauswahl wie im Display 
sichtbar was man messen möchte in einen Teil des SCPI Syntax, mit der 
bei Notwendigkeit der Syntax zur Übertragung ans Messgerät 
zusammengebaut wird.

Im Hauptprogramm 'SCPI Keithley DMM6500.py' beginnt es mit den üblichen 
Zeilen. Ressourcen anlegen und Verbindung zum Messgerät herstellen.

2 Objekte anlegen in einer Struktur. Jeweils für den SCPI Syntax (obiges 
Modul) Objekt-Member 'scpi' und einmal für die Verbindung zum Messgeräte 
Objekt-Member 'line'. Beide sind über die Instanz 'keithley' definiert. 
Hätte ich mehrere SCPI Messgeräte würden hiermit mehrere Instanzen der 
Klasse Device angelegt werden.

Nach Start erfolgt zu Beginn ein Uhrenvergleich. Ist die Differenz 
größer 1s wird das Messgerät frisch auf Systemzeit gesetzt. Theoretisch 
müsste keine Batterie mehr gewechselt werden. Ich hatte festgestellt das 
die interne RTC schon nach paar Wochen um sehr viele Sekunden falsch 
geht.

Danach wird ein String zusammengebaut der aus dem aktuellen Datum und 
Uhrzeit besteht um damit einen Dateinamen anzulegen der das Logfile ist. 
Das heißt mit jedem Start des Programms wird, sofern eingestellt, ein 
neues Logfile geschrieben mit aktuellen Zeitstempel im Dateinamen.

Danach folgen benötige Methoden die mittels SCPI Objekt Methoden 
funktionieren.

Das eigentliche Programm beginnt mit:
- Logdatei anlegen
if SAVE_DATA:

Oder noch paar Systeminfos wenn gewünscht Zeilen darüber.

Danach folgen verschiedene Kombinationsbeispiele der Funktionen.

- 403 - Buffer im Messgerät löschen,
- 404 - Messungfunktion auf normale Widerstandsfunktion vorauswählen,
- 405 - Vorauswahl auch ans Messgerät übertragen und damit endgültig 
einstellen

- 407 - da vorher nichts anderes eingestellt wurde, erfolgen mit 
Sampling 30 Einzelmessungen nacheinander mit einer Pause von 0s.
- 408 - die erfolgten Messung werden aus dem Buffer gelesen und ins 
Logfile geschrieben.
Erfolgt danach keine Löschung des Buffers, verbleiben diese im Buffer. 
Es wird intern ein Index mitgeführt, damit immer nur die noch nicht 
ausgelesenen Buffereinträge im Logfile landen und es damit keine 
doppelte Auslesung gibt. Sieht man im Logfile wenn man das auslesen 
zwischen den Messung macht oder erst am Ende von allen.

- 410 - der Average Mode 'Repeat' wird eingestellt mit Filterfaktor 20. 
20 interne Messungen werden gemacht, um daraus einen gefilterten Wert 
auszugeben bzw. in den Buffer zu schreiben.
- 411 - es werden 10 Average Messungen gemacht mit je 1s Pause 
dazwischen
- 412 - Average Mode wird deaktiviert
- 413 - die bis dahin noch nicht gespeicherten Einträge werden aus dem 
Buffer ins Logfile geschrieben

- 415 - Buffer wird noch nicht gelöscht
- 416 bis 418 - es werden wieder 3 normale Einzelmessungen gemacht
- 419 - die bis dahin noch nicht gespeicherten Einträge werden aus dem 
Buffer ins Logfile geschrieben

- 422 - Änderung der Messfunktion auf 4 Draht Widerstandsmessung
- 423 - Übertragung der neuen Einstellung ans Messgerät

- 425 - Average Mode mit Filterfaktor 15 wird aktiviert
- 426 bis 428 - erneut 3 Einzelmessungen im Average Mode
- 429 - Average Mode wird abgeschalten
- 430 - die bis dahin noch nicht gespeicherten Einträge werden aus dem 
Buffer ins Logfile geschrieben

Am Ende sauberen Endzustand herstellen. Vorsorglich Average Mode 
ausschalten, falls man es vergisst und bei Bedarf Buffer löschen. Datei 
vorsorglich nochmal schließen falls noch nicht automatisch geschehen. 
Warten bis alle restlichen Kommandos verarbeitet sind, lokalen 
kontinuierlichen Messmodus herstellen und Verbindung trennen.

Die Formatierungen für das Logfile war eine größere Baustelle, damit 
Excel den Datenimport machen kann. Etwas Nachhilfe bleibt erhalten. 
Bspw. erkennt Excel nicht das Datumsformat automatisch. Warum auch 
immer. Beim Zeitstempel werden die Millisekunden abgeschnitten aber 
bleiben zum Glück nur unsichtbar erhalten. Die ersten 10 Dummyeinträge 
dienen dazu damit Excel die generelle Datenformatierung mit allen 
Spalten erkennt. Die Dummyzeilen sind schnell gelöscht, wer mit Excel 
die Messwerte weiter verarbeiten möchte. Im Logfile stehen auch weitere 
Informationen drin. Damit kann man auch nachträglich herauslesen was wie 
in welcher Reihenfolge gemessen wurde, auch wenn man den Buffer erst am 
Ende nach allen Messungen ausliest.

Ob man die Funktionen changeFunction() und setFunction() zusammenführen 
sollte, da bin ich mir bis heute unschlüssig.

Was man im Excel während und nach dem Import machen?

Daten > Daten abrufen > Aus Datei > Aus Text/CSV importieren,
'65001:Unicode UTF-8' kontrollieren/auswählen,
Trennzeichen Tabstopp auswählen,
Daten transformieren auswählen (nicht sofort laden),
im sich öffnenden Power Query Editor die Datumsspalte auswählen,
Datentyp 'Datum' statt 'Ganze Zahl' auswählen und 'Aktuelle ersetzen'
anschließend 'schließen & laden'
zu guter Letzt Spalte vom Zeitstempel auswählen
und das Zellformat Benutzerdefiniert auf hh:mm:ss,000 ändern,
mehr als 3 Nachkommastellen funktioniert nicht,
die Messwertspalte je nach Bedarf einheitlich auf 2 oder 3 Kommastellen

Dürft ihr gern ausprobieren und Verbesserungen vorschlagen.
Danke.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.