PyVisa / Remote Steuerung Messgerät

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.
Antworten
Jaco
User
Beiträge: 7
Registriert: Donnerstag 13. September 2018, 15:37
Wohnort: München

Donnerstag 13. September 2018, 16:07

Hallo an alle,

ich möchte einen Funktionsgenerator (Rigol DG1022) über Python ansteuern.
Das sollte über PyVisa funktionieren.

In dem Programm wird aber ein Timout ausgegeben, sobald ich die log Funktion (visa.log_to_screen()) ausschalte.
Wenn die Funktion aktiviert ist funktioniert alles wunderbar.
Hat jemend hierfür eine Erklärung?

Grüße


# Ansteuerung Funktionsgenerator Rigol DG1022
#
# HS / Stand 2018-09-11
# USB0::0x0400::0x09C4::DG1D200300337::INSTR

import tkinter as tk
import visa
visa.log_to_screen()


rm = visa.ResourceManager('C:\\Windows\\SYSTEM32\\visa32.dll')
print (rm.list_resources())
DG1022 = rm.open_resource('USB0::0x0400::0x09C4::DG1D200300337::INSTR')
DG1022.timeout = 1000

print(DG1022.query('*IDN?')) # Query device information
# print(DG1022.write('SYST:LOC'))
print(DG1022.write('VOLT:UNIT VPP')) # Set voltage to peak-peak
print(DG1022.write('APPL:SIN 16000,2.5,0.5')) # set sinus
print(DG1022.write('OUTP ON')) # Turn output off / on
print(DG1022.write('SYST:RWL')) # Lock front buttons
DG1022.close()
Benutzeravatar
__blackjack__
User
Beiträge: 1218
Registriert: Samstag 2. Juni 2018, 10:21

Donnerstag 13. September 2018, 18:22

@Jaco: Könnte es sein das Du auch Antworten lesen *musst* und das das durch das logging automatisch passiert? Ist jetzt nur geraten.
“Pets are always a great help in times of stress. And in times of starvation too, o'course.” — Terry Pratchett, Small Gods
Jaco
User
Beiträge: 7
Registriert: Donnerstag 13. September 2018, 15:37
Wohnort: München

Freitag 14. September 2018, 14:07

Hallo Blckjack,

guter Tipp; wenn ich die query Funktionen auskommentiere dann funktioniert es.
Vielen Dank
Jaco
User
Beiträge: 7
Registriert: Donnerstag 13. September 2018, 15:37
Wohnort: München

Freitag 14. September 2018, 14:16

Alles zurück; hatte leider die falsche Zeile auskommentiert.
Funktioniert leider immer noch nicht.

Falls noch jemand eine Idee hatt ....

Grüße
Jaco
User
Beiträge: 7
Registriert: Donnerstag 13. September 2018, 15:37
Wohnort: München

Freitag 14. September 2018, 15:05

Nochmal zur Klärung: es liegt definitv an den query oder read Befehlen; auch read_raw funktioniert nicht.
Die reinen write Befehele funktionieren auch ohne aktivierter Log-Funktion
__deets__
User
Beiträge: 3471
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 14. September 2018, 16:24

Und warum kannst du die log-Funktion nicht einfach aktivieren? Oder ist die blockierend?
__deets__
User
Beiträge: 3471
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 14. September 2018, 16:32

Also ich hab' mir die mal angeschaut:

https://github.com/pyvisa/pyvisa/blob/6 ... t__.py#L25

Abfragen tut das nix. Aber das logging verlangsamt ggf. das ganze System, und dadurch klappt dann das Query. Siehe hier:

https://github.com/pyvisa/pyvisa/blob/1 ... ed.py#L552

Da kann man augenscheinlich ein delay angeben. Probier das doch mal.
Jaco
User
Beiträge: 7
Registriert: Donnerstag 13. September 2018, 15:37
Wohnort: München

Dienstag 18. September 2018, 12:36

Das ganze soll über eine GUI ein Messgerät steuern und Daten erfasssen, idealerweise ohne das IDLE Fenster. Daher würde ich das Logging gerne deaktivieren.

Hab schon Delay eingegeben, ebenso diverse Termination Characters - leider ohne ERflg.
Benutzeravatar
__blackjack__
User
Beiträge: 1218
Registriert: Samstag 2. Juni 2018, 10:21

Dienstag 18. September 2018, 12:50

Ich würde das dann mal ohne IDE/IDLE probieren, und wenn das da genau so klappt/nicht klappt, je nachdem ob man `log_to_screen()` aufruft oder nicht, einen Bugreport absetzen.
“Pets are always a great help in times of stress. And in times of starvation too, o'course.” — Terry Pratchett, Small Gods
__deets__
User
Beiträge: 3471
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 18. September 2018, 12:50

IDLE hat damit doch nix zu tun. Du kannst logging an haben, und trotzdem das Skript zb direkt in der Konsole ausführen. Oder über Doppelklick.

Aber zu deinem eigentlichen Problem: ich denke nicht, dass dir hier geholfen werden kann. Ohne Zugriff auf ein solches Gerät kann man selbst den Code nicht laufen lassen. Offensichtliche Anregungen wie die von BlackJack sind ausgeschlossen worden, uA durch Blick in den Code.

Ich würde versuchen mich an den Paketmaintainer zu wenden. Oder wen bezahlen, der das Problem vor Ort untersucht.
Jaco
User
Beiträge: 7
Registriert: Donnerstag 13. September 2018, 15:37
Wohnort: München

Mittwoch 19. September 2018, 10:47

Habe jetzt die Lösung gefunden, Hurra. Scheint sich um ein Timing Problem zu handeln.
Nach Einfügen von time.sleep(0.3) nach jedem write Befehl funktioniert jetzt alles.
Die Log Funktion verlangsamt offensichtlich die Ausführung, so dass es damit ebenfalls funktioniert hat.

Vielen Dank für eure Hinweise.
__deets__
User
Beiträge: 3471
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 19. September 2018, 11:01

Dann hast du das Delay nicht richtig benutzt. Denn das mach genau das ;)
Benutzeravatar
__blackjack__
User
Beiträge: 1218
Registriert: Samstag 2. Juni 2018, 10:21

Mittwoch 19. September 2018, 11:24

@__deets__: Ich sehe da bei `write()` keine Möglichkeit. Nur bei den `query_*()`-Methoden gibt's dieses Argument bzw. das Attribut `query_delay`.

@Jaco: Ich würde noch *sicher* dafür sorgen das die entsprechenden `close()`-Methoden aufgerufen werden (ungetestet):

Code: Alles auswählen

from contextlib import closing
from time import sleep

from visa import ResourceManager

VISA_DLL_FILENAME = r'C:\Windows\SYSTEM32\visa32.dll'
DG1022_RESOURCE_NAME = 'USB0::0x0400::0x09C4::DG1D200300337::INSTR'
DELAY = 0.3

def main():
    with closing(ResourceManager(VISA_DLL_FILENAME)) as resource_manager:
        print(resource_manager.list_resources())
        with closing(rm.open_resource(DG1022_RESOURCE_NAME)) as dg1022:
            dg1022.timeout = 1000
            dg1022.query_delay = DELAY

            print(dg1022.query('*IDN?'))  # Query device information.
            sleep(DELAY)
            
            for command in [
                # 'SYST:LOC', 
                'VOLT:UNIT VPP',  # Set voltage to peak-peak.
                'APPL:SIN 16000,2.5,0.5',  # Set sinus.
                'OUTP ON',  # Turn output on.
                'SYST:RWL',  # Lock front buttons.
            ]:
                print(dg1022.write(command))
                sleep(DELAY)


if __name__ == '__main__':
    main()
“Pets are always a great help in times of stress. And in times of starvation too, o'course.” — Terry Pratchett, Small Gods
Jaco
User
Beiträge: 7
Registriert: Donnerstag 13. September 2018, 15:37
Wohnort: München

Donnerstag 20. September 2018, 11:19

@ Blackjack - danke für den Hinweis, werde ich noch einbauen.
@ Wie blackjack schreibt, ist das bei reinen write Kommandos ohne Effekt. Da muss man das "zu Fuß" machen. Wobei die Lösung von blackjack natürlich elegant ist :-)
Antworten