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()
PyVisa / Remote Steuerung Messgerät
- __blackjack__
- User
- Beiträge: 13071
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Jaco: Könnte es sein das Du auch Antworten lesen *musst* und das das durch das logging automatisch passiert? Ist jetzt nur geraten.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
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.
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.
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.
Hab schon Delay eingegeben, ebenso diverse Termination Characters - leider ohne ERflg.
- __blackjack__
- User
- Beiträge: 13071
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
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.
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.
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.
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.
- __blackjack__
- User
- Beiträge: 13071
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@__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):
@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()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
@ 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
@ 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