Skip to content
Extraits de code Groupes Projets
Valider ec351b13 rédigé par Nicolas Roisin's avatar Nicolas Roisin
Parcourir les fichiers

equipment_control script and classes

parent fa52a2f2
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
Aucun aperçu pour ce type de fichier
...@@ -2,10 +2,42 @@ import equipment ...@@ -2,10 +2,42 @@ import equipment
import pyvisa import pyvisa
import time import time
import numpy as np import numpy as np
import serial
class CM110(equipment.Equipment): class cm110(equipment.equipment):
"""Class to control CM110 monochromator""" """Class to control CM110 monochromator"""
model="CM110" model="CM110"
company="Spectral Product" company="Spectral Product"
link="https://www.spectralproducts.com/CM110" link="https://www.spectralproducts.com/CM110"
def __init__(self,port):
self.serial_resource = serial.Serial(
port='COM5',
baudrate=9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
def initialize(self,grating_number=1,waiting_time=30):
reset=[255,255,255]
self.serial_resource.write(serial.to_bytes([26,grating_number]))
time.sleep(waiting_time)
self.serial_resource.write(serial.to_bytes(reset))
time.sleep(waiting_time)
def set_wavelength(self, wavelength,waiting_time=10):
set_position = [16,int((wavelength-wavelength%256)/256),wavelength%256] # Goto Position : 1000 -> 0x3E8 -> 3 and 232
self.serial_resource.write(serial.to_bytes(set_position))
time.sleep(waiting_time)
def close_connection(self):
self.serial_resource.close()
\ No newline at end of file
import equipment import equipment
import pyvisa
import time
import numpy as np
class DMM(equipment.Equipment): class dmm(equipment.equipment):
"""Class to control DMM multimeter""" """Class to control DMM multimeter"""
model="DMM7510, DMM6500 or K2000" model="DMM7510, DMM6500 or K2000"
company="Keithley" company="Keithley"
link="https://www.tek.com/en/products/keithley/benchtop-digital-multimeter" url="https://www.tek.com/en/products/keithley/benchtop-digital-multimeter"
def initialize(self, mode, autozero=True, offset_compensation=True, nplc=1):
"""
mode:
- "voltage": voltage measurement
- "current": current measurement
- "resistance": resistance measurement
- "4 wires": 4 wires measurement
"""
self.pyvisa_resource.write("*RST")
if mode=="voltage":
self.pyvisa_resource.write(":SENS:FUNC 'VOLT'")
elif mode=="current":
self.pyvisa_resource.write(":SENS:FUNC 'CURR'")
elif mode=="resistance":
self.pyvisa_resource.write(":SENS:FUNC 'RES'")
elif mode=="4 wires":
self.pyvisa_resource.write(":SENS:FUNC 'FRES'")
self.pyvisa_resource.write(":SENS:FRES:RANG:AUTO ON") # set automatic range
self.pyvisa_resource.write(":DISP:DIG MAX") # Query largest allowable display resolutio
self.pyvisa_resource.write(":DISP:ENAB ON") # This command is used to enable and disable the front panel display circuitry. When disabled, the instrument operates at a higher speed.
self.pyvisa_resource.write("INIT:CONT ON") # able continuous triggering
if offset_compensation:
self.pyvisa_resource.write(":SENS:FRES:OCOM ON") # enable offset compensation
else:
self.pyvisa_resource.write(":SENS:FRES:OCOM OFF")
if autozero:
self.pyvisa_resource.write(":SENS:FRES:AZER ON") # enable auto-zero
else:
self.pyvisa_resource.write(":SENS:FRES:AZER OFF")
self.pyvisa_resource.write(":SENS:FRES:NPLC %d"%nplc) # set NPLC. For a PLC of 1, the integration period would be 1/50 (for 50Hz line power) which is 20 msec
def read_single(self):
data=self.pyvisa_resource.query("READ?")
return float(data)
import pyvisa import pyvisa
import datetime import datetime
import numpy as np import numpy as np
class Equipment(pyvisa.ResourceManager):
def available_connections():
rm = pyvisa.ResourceManager()
return rm.list_resources()
def resource_manager():
rm = pyvisa.ResourceManager()
return rm
class equipment(pyvisa.ResourceManager):
"""Base for Equipment classes.""" """Base for Equipment classes."""
model = "" model = ""
company = "" company = ""
link = "" url = ""
def __init__(self,rm,address): def __init__(self,address,rm=None):
if rm==None:
rm = pyvisa.ResourceManager()
self.pyvisa_resource = rm.open_resource(address) self.pyvisa_resource = rm.open_resource(address)
......
...@@ -3,14 +3,14 @@ import pyvisa ...@@ -3,14 +3,14 @@ import pyvisa
import time import time
import numpy as np import numpy as np
class HP4145(equipment.Equipment): class hp4145(equipment.equipment):
"""Class to control HP4145 semiconductor analyzer""" """Class to control HP4145 semiconductor analyzer"""
model="HP4145" model="HP4145"
company="Keysight" company="Keysight"
link="https://www.keysight.com/dk/en/assets/9018-07935/service-manuals/9018-07935.pdf" url="https://www.keysight.com/dk/en/assets/9018-07935/service-manuals/9018-07935.pdf"
def initialize_sweep(self, mode="voltage sweep",number_channel=4,smu_bias={"SMU2":0,"SMU3":0,"SMU4":0}, def initialize(self, mode="voltage sweep",number_channel=4,smu_bias={"SMU2":0,"SMU3":0,"SMU4":0},
smu_compliance={"SMU1":1e-6,"SMU2":1e-6,"SMU3":1e-6,"SMU4":1e-6},sweep_param={"start":0,"stop":0,"step":0}, smu_compliance={"SMU1":1e-6,"SMU2":1e-6,"SMU3":1e-6,"SMU4":1e-6},sweep_param={"start":0,"stop":0,"step":0},
integration_mode="IT1",delay_time=0,hold_time=0): integration_mode="IT1",delay_time=0,hold_time=0):
......
import equipment import equipment
import pyvisa
import time
import numpy as np
class K24XX(equipment.Equipment): class k24XX(equipment.equipment):
"""Class to control K2400 or k2450 SMU""" """Class to control K2400 or k2450 SMU"""
model="K2400 or K2450" model="K2400 or K2450"
company="Keithley" company="Keithley"
link="https://www.tek.com/en/products/keithley/digital-multimeter/dmm7510" url="https://www.tek.com/en/products/keithley/digital-multimeter/dmm7510"
def initialize(self, source_mode,measurement_mode, compliance, autozero=True, offset_compensation=True, nplc=1):
"""
source_mode:
- "voltage": voltage source
- "current": current source
measurement_mode:
- "voltage": voltage measurement
- "current": current measurement
- "resistance": resistance measurement
- "4 wires": 4 wires measurement
"""
self.pyvisa_resource.write("*RST")
self.source_mode=source_mode
if source_mode=="voltage":
self.pyvisa_resource.write(":SOUR:FUNC 'VOLT'")
self.pyvisa_resource.write(":SOUR:CURR:VLIM %f"%compliance) # set automatic range
if source_mode=="current":
self.pyvisa_resource.write(":SOUR:FUNC 'CURR'")
self.pyvisa_resource.write(":SOUR:VOLT:CLIM %f"%compliance) # set automatic range
if measurement_mode=="voltage":
self.pyvisa_resource.write(":SENS:FUNC 'VOLT'")
self.pyvisa_resource.write(":SENS:VOLT:RANG:AUTO ON") # set automatic range
elif measurement_mode=="current":
self.pyvisa_resource.write(":SENS:FUNC 'CURR'")
self.pyvisa_resource.write(":SENS:CURR:RANG:AUTO ON") # set automatic range
elif measurement_mode=="resistance":
self.pyvisa_resource.write(":SENS:FUNC 'RES'")
self.pyvisa_resource.write(":SENS:RES:RANG:AUTO ON") # set automatic range
elif measurement_mode=="4 wires":
self.pyvisa_resource.write(":SENS:FUNC 'FRES'")
self.pyvisa_resource.write(":SENS:FRES:RANG:AUTO ON") # set automatic range
self.pyvisa_resource.write(":DISP:DIG MAX") # Query largest allowable display resolutio
self.pyvisa_resource.write(":DISP:ENAB ON") # This command is used to enable and disable the front panel display circuitry. When disabled, the instrument operates at a higher speed.
self.pyvisa_resource.write("INIT:CONT ON") # able continuous triggering
if offset_compensation:
self.pyvisa_resource.write(":SENS:FRES:OCOM ON") # enable offset compensation
else:
self.pyvisa_resource.write(":SENS:FRES:OCOM OFF")
if autozero:
self.pyvisa_resource.write(":SENS:FRES:AZER ON") # enable auto-zero
else:
self.pyvisa_resource.write(":SENS:FRES:AZER OFF")
self.pyvisa_resource.write(":SENS:FRES:NPLC %.1f"%nplc) # set NPLC. For a PLC of 1, the integration period would be 1/50 (for 50Hz line power) which is 20 msec
def read_single(self):
data=self.pyvisa_resource.query("READ?")
return float(data)
def set_source(self,value):
if self.source_mode=="current":
self.pyvisa_resource.write(":SOUR:CURR %.2E"%value) #set output voltage
elif self.source_mode=="voltage":
self.pyvisa_resource.write(":SOUR:VOLT %.2E"%value) #set output voltage
def set_output(self,output_state="ON"):
self.pyvisa_resource.write(":OUTP %s"%output_state)
...@@ -3,14 +3,14 @@ import pyvisa ...@@ -3,14 +3,14 @@ import pyvisa
import time import time
import numpy as np import numpy as np
class K4200(equipment.Equipment): class k4200(equipment.equipment):
"""Class to control HP4145 semiconductor analyzer""" """Class to control HP4145 semiconductor analyzer"""
model="K4200" model="K4200"
company="Keysight" company="Keysight"
link="https://www.tek.com/en/products/keithley/4200a-scs-parameter-analyzer" url="https://www.tek.com/en/products/keithley/4200a-scs-parameter-analyzer"
def initialize_sweep(self, mode="voltage sweep",number_channel=4,smu_bias={"SMU2":0,"SMU3":0,"SMU4":0}, def initialize(self, mode="voltage sweep",number_channel=4,smu_bias={"SMU2":0,"SMU3":0,"SMU4":0},
smu_compliance={"SMU1":1e-6,"SMU2":1e-6,"SMU3":1e-6,"SMU4":1e-6},sweep_param={"start":0,"stop":0,"step":0}, smu_compliance={"SMU1":1e-6,"SMU2":1e-6,"SMU3":1e-6,"SMU4":1e-6},sweep_param={"start":0,"stop":0,"step":0},
integration_mode="IT1",delay_time=0,hold_time=0): integration_mode="IT1",delay_time=0,hold_time=0):
......
# =============================================================================
# 1. Import classes and modules
# =============================================================================
import sys
#sys.path.insert(1, '/path/to/application/app/folder')
sys.path.insert(1, 'D:/Roisin/Documents/chopes')
import equipment_control.equipment as eq
import equipment_control.EQUIPMENT_TYPE as EQ_TYPE
# =============================================================================
# 2. List available connections (chopes use pyvisa package for communicate with most equipments)
# =============================================================================
rm=eq.resource_manager()
list_connections= eq.available_connections()
print("Available connections: %s"%str(list_connections))
# =============================================================================
# 3. Connection to the equipments
# =============================================================================
myEQUIPMENT=EQ_TYPE.EQUIPMENT_TYPE()
# =============================================================================
# 4. Measurement parameters
# =============================================================================
FILE_PATH='/path/to/data/folder'
PARAM_INIT=???
PARAM_OPERATION=???
# =============================================================================
# 5. Initialization of the equipments
# =============================================================================
myEQUIPMENT.initialize(PARAM_INIT)
# =============================================================================
# 6. Measurement script
# =============================================================================
myEQUIPMENT.set_PARAM(PARAM_OPERATION)
DATA=myEQUIPMENT.read_data()
# =============================================================================
# 7. Close connection
# =============================================================================
myEQUIPMENT.close_connection()
# =============================================================================
# 8. Save data
# =============================================================================
myEQUIPMENT.write_in_file(FILE_PATH,DATA)
import equipment
import time
import numpy as np
class sh242(equipment.equipment):
"""Class to control SH242 climatic chamber"""
model="SH242"
company="ESPEC"
url="https://espec.com/na/products/model/sh_242"
# =============================================================================
# mysh242.read_termination = ';'
# mysh242.write_termination = ';'
# mysh242.timeout=300*1000
# =============================================================================
def initialize(self,temperature=True, humidity=False,temperature_dic={"upper":125,"lower":-45,"set":20},humidity_dic={"upper":100,"lower":0,"set":55}):
self.pyvisa_resource.write('POWER, ON')
time.sleep(1)
self.pyvisa_resource.read()
self.pyvisa_resource.write('POWER, CONSTANT')
time.sleep(10)
self.pyvisa_resource.read()
if temperature:
self.pyvisa_resource.write("TEMP, L%.2f"%temperature_dic["upper"]) #Changes the temperature lower absolute alarm value in constant setup
time.sleep(1)
self.pyvisa_resource.read()
self.pyvisa_resource.write("TEMP, H%.2f"%temperature_dic["lower"]) #Changes the temperature upper absolute alarm value in constant setup
time.sleep(1)
self.pyvisa_resource.read()
self.pyvisa_resource.write("TEMP, S%.2f"%temperature_dic["set"]) #Changes the temperature set point in constant setup
time.sleep(1)
self.pyvisa_resource.read()
else:
self.pyvisa_resource.write("TEMP, SOFF") # disable temperature
time.sleep(1)
self.pyvisa_resource.read()
if humidity:
self.pyvisa_resource.write("HUMI, L%.2f"%humidity_dic["upper"]) #Changes the temperature lower absolute alarm value in constant setup
time.sleep(1)
self.pyvisa_resource.read()
self.pyvisa_resource.write("HUMI, H%.2f"%humidity_dic["lower"]) #Changes the temperature upper absolute alarm value in constant setup
time.sleep(1)
self.pyvisa_resource.read()
self.pyvisa_resource.write("HUMI, S%.2f"%humidity_dic["set"]) #Changes the temperature set point in constant setup
time.sleep(1)
self.pyvisa_resource.read()
else:
self.pyvisa_resource.write("HUMI, SOFF") # disable temperature
time.sleep(1)
self.pyvisa_resource.read()
def read_temperature(self):
self.pyvisa_resource.write('TEMP?')
time.sleep(0.5)
temperature=self.pyvisa_resource.read()
return temperature
def read_humidity(self):
self.pyvisa_resource.write('HUMI?')
time.sleep(0.5)
humidity=self.pyvisa_resource.read()
return humidity
def set_temperature(self,temperature,waiting_time=0,wait_for_stabilization=False,stabilization_tolerance=0.1,stabilization_number=10):
self.pyvisa_resource.write("TEMP, S%.2f"%temperature) #Changes the temperature set point in constant setup
time.sleep(1)
self.pyvisa_resource.read()
time.sleep(waiting_time)
if wait_for_stabilization:
temperature_stabilized=False
stabilization_count=0
while temperature_stabilized==False:
self.pyvisa_resource.write("TEMP?")
time.sleep(5)
temperature_read=np.round(float(self.pyvisa_resource.read().split(",")[0]),1)
if abs(temperature_read-temperature)<stabilization_tolerance:
stabilization_count+=1
if stabilization_count==stabilization_number:
temperature_stabilized=True
else:
stabilization_count=0
def set_humidity(self,humidity,waiting_time=0,wait_for_stabilization=False,stabilization_tolerance=0.5,stabilization_number=1):
self.pyvisa_resource.write("HUMI, S%.2f"%humidity) #Changes the temperature set point in constant setup
time.sleep(1)
self.pyvisa_resource.read()
time.sleep(waiting_time)
if wait_for_stabilization:
humidity_stabilized=False
stabilization_count=0
while humidity_stabilized==False:
self.pyvisa_resource.write("HUMI?")
time.sleep(5)
humidity_read=np.round(float(self.pyvisa_resource.read().split(",")[0]),1)
if abs(humidity_read-humidity)<stabilization_tolerance:
stabilization_count+=1
if stabilization_count==stabilization_number:
humidity_stabilized=True
else:
stabilization_count=0
\ No newline at end of file
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter