Cours:Oscillogbf : Différence entre versions
(→commandes génériques) |
(→commandes génériques) |
||
| Ligne 136 : | Ligne 136 : | ||
| *IDN? || || retourne l'identifiant de l'appareil | | *IDN? || || retourne l'identifiant de l'appareil | ||
|- | |- | ||
| − | | *OPC || || operation complete : indique si l'opération précédente est terminée (1 ou 0) | + | | *OPC? || || operation complete : indique si l'opération précédente est terminée (1 ou 0) |
|- | |- | ||
| || || | | || || | ||
Version du 5 février 2025 à 11:15
Sommaire
python et Qt
Mise en place avec QtCreator
- créer un nouveau projet :
- Application (Qt for Python) Window UI
- pas d'importance pour PySide2 ou PySide6, on va remplacer après
- choisir la version Python 3.x.x sans Virtual Environnement
- ouvrir le fichier widget.py
- remplacer par :
import sys
# communication avec le matériel de mesure
import pyvisa
# modules QT que l'on souhaite utiliser
# à compléter en fonction des besoins
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtWidgets import QApplication, QWidget, QFileDialog, QPushButton, QDial, QAbstractSlider
from PySide2.QtUiTools import QUiLoader
if __name__ == "__main__":
# chargement du fichier form.ui
# qui correspond à l'interface graphique
loader = QUiLoader()
app = QtWidgets.QApplication(sys.argv)
window = loader.load("form.ui", None)
window.show()
# initialisation de la librairie pyVisa
materiel=pyvisa.ResourceManager()
# print(materiel.list_resources())
# exemple pour se connecter sur un appareil par IP
# gbf=materiel.open_resource('TCPIP::192.168.0.236::INSTR')
sys.exit(app.exec_())
Signal/Slot avec PySide2
- dans un 1er temps il faut "récupérer" le widget graphique dans le code python :
window.leBouton = window.findChild(QPushButton, "monWidgetBouton")
- ensuite on connect le signal du widget sur la fonction que l'on souhaite :
window.leBouton.clicked.connect(maFonction)
- Ce qui donne :
import sys
# communication avec le matériel de mesure
import pyvisa
# modules QT que l'on souhaite utiliser
# à compléter en fonction des besoins
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtWidgets import QApplication, QWidget, QFileDialog, QPushButton, QDial, QAbstractSlider
from PySide2.QtUiTools import QUiLoader
# fonction qui sera exécutée lors d'un clic
def maFonction():
print("clic !")
if __name__ == "__main__":
# chargement du fichier form.ui
# qui correspond à l'interface graphique
loader = QUiLoader()
app = QtWidgets.QApplication(sys.argv)
window = loader.load("form.ui", None)
window.show()
# associer une action à un QPushButton
window.leBouton = window.findChild(QPushButton, "monWidgetBouton")
window.leBouton.clicked.connect(maFonction)
# initialisation de la librairie pyVisa
materiel=pyvisa.ResourceManager()
# print(materiel.list_resources())
# exemple pour se connecter sur un appareil par IP
# gbf=materiel.open_resource('TCPIP::192.168.0.236::INSTR')
sys.exit(app.exec_())
exemple pour différents widgets
- QPushButton
- window.leBouton = window.findChild(QPushButton, "monWidgetBouton")
- window.leBouton.clicked.connect(maFonction)
- QDial/QScrollBar/QSlider (hérite de QAbstractSlider)
- window.leSlider = window.findChild(QAbstractSlider, "monWidgetDial")
- window.leSlider.valueChanged.connect(getValue)
- fonction :
def getValue(value):
print(f"position du slider : {value}")
dialoguer avec les appareils
initialisation
- il faut initialiser la librairie
materiel=pyvisa.ResourceManager()
- se connecter sur un équipement
gbf=materiel.open_resource('TCPIP::192.168.0.236::INSTR')
- on peut ensuite :
- envoyer des commandes à l'équipement :
gbf.write(":OUTP1 ON")
- demander une valeur à l'équipement :
gbf.query("*IDN?")
- envoyer des commandes à l'équipement :
- Exemple :
materiel=pyvisa.ResourceManager() gbf =materiel.open_resource('TCPIP::192.168.0.236::INSTR') oscillo =materiel.open_resource('TCPIP::192.168.0.73::INSTR') print(gbf.query("*IDN?")) print(oscillo.query("*IDN?"))
commandes génériques
Les commandes suivantes devraient être valables pour tous les équipements :
| commande | paramètre | description |
|---|---|---|
| *CLS | clear : initialise la communication | |
| *IDN? | retourne l'identifiant de l'appareil | |
| *OPC? | operation complete : indique si l'opération précédente est terminée (1 ou 0) | |
oscillo DS1104Z
Media:MSO_DS1000Z_ProgrammingGuide_EN.pdf
gbf DG822
liens
- Media:Dg822_programming.pdf
- Media:MSO_DS1000Z_ProgrammingGuide_EN.pdf
- https://pyvisa.readthedocs.io/en/latest/introduction/communication.html
- https://connect.ed-diamond.com/GNU-Linux-Magazine/glmf-124/controle-d-instruments-scientifiques-les-protocoles-gpib-vxi11-et-usbtmc
- https://iosignal.fi/wp-content/uploads/DG800_ProgrammingGuide_EN.pdf
- https://github.com/lxi-tools/lxi-tools
Tests
banc de mesure : 1 scope DS1074 + 1 gbf DG822
le script (basique ...) qui gère le tout :
#!/bin/bash
IPSCOPE=192.168.1.111
freq=100
while true; do
# 1 sinus ampl=5V, offset nul, dephasage nul
./dg822_write.py ":sour1:appl:harm $freq,5,0,0"
sleep 2
# demande un AUTo mode au scope
lxi scpi -a $IPSCOPE "AUT"
sleep 5
let "freq += 100"
done
les commandes python :
#!/usr/bin/python3
import sys
import pyvisa
rm=pyvisa.ResourceManager()
inst=rm.open_resource('USB0::6833::1603::DG8A231301537::0::INSTR')
print("commande = ",sys.argv[1])
commande=sys.argv[1]
inst.write(commande)