# -*- coding: utf-8 -*-
"""
Created on Thu Dec 2 08:27:01 2021
@author: MartinMihaylov
"""
import time
import numpy as np
import pyvisa as visa
Serien_Nummer = ['P0024970','P0033858']
[docs]
class PM100D:
'''
This Class is using pyvisa to connect to instruments. Please install PyVisa before using it.
'''
def __init__(self, resource_str):
self._resource = visa.ResourceManager().open_resource('USB0::0x1313::0x8078::' + str(resource_str) + '::INSTR')
print(self._resource.query('*IDN?'))
[docs]
def query(self, message):
return self._resource.query(message)
[docs]
def write(self, message):
return self._resource.write(message)
[docs]
def Close(self):
self._resource.close()
print('Instrument PM100D is closed!')
# =============================================================================
# Self Test
# =============================================================================
[docs]
def self_test(self):
'''
Returns
-------
TYPE
Use this query command to perform the instrument self-test routine. The command
places the coded result in the Output Queue. A returned value of zero (0) indicates
that the test passed, other values indicate that the test failed.
'''
print('A returned value of zero (0) indicates that the test passed, other \
values indicate that the test failed.')
return self.query('*TST?')
# =============================================================================
# Configuration
# =============================================================================
[docs]
def ReadConfig(self):
'''
Returns
-------
None
Query the current measurement configuration
'''
return self.query('CONFigure?')
# =============================================================================
# Fetch last meassure Data
# =============================================================================
[docs]
def fetchData(self):
'''
Returns
-------
TYPE float
Read last measurement data. WILL NOT START THE MEASUREMENT
'''
return float(self.query(':FETCh?').split('\n')[0])
# =============================================================================
# OPC Register
# =============================================================================
[docs]
def OPC(self):
'''
Returns
-------
TYPE str
Query the OPC value
'''
return self.query('*OPC?').split('\n')[0]
# =============================================================================
# Initialize Commando
# =============================================================================
[docs]
def Init(self):
'''
Returns
-------
None.
Start measurement
'''
self.write(':INITiate:IMMediate')
# =============================================================================
# Abort Measurement
# =============================================================================
[docs]
def Abort(self):
'''
Returns
-------
None.
Abort measurement
'''
self.write('ABORt')
# =============================================================================
# Adapter Settings
# =============================================================================
[docs]
def ask_AdapterType(self):
'''
Returns
-------
TYPE str
Queries default sensor adapter type
'''
return self.query('INPut:ADAPter:TYPE?')
[docs]
def set_AdapterType(self,state):
'''
Parameters
----------
state : str
Sets default sensor adapter type:
Allow senor types are: ['PHOTodiode','THERmal','PYRo']
Raises
------
ValueError
Error message.
Returns
-------
None.
'''
stState = ['PHOTodiode','THERmal','PYRo']
if state in stState:
self.write('INPut:ADAPter:TYPE ' + state)
else:
raise ValueError('Unknown input! See function description for more info.')
# =============================================================================
# Photodiode parameters
# =============================================================================
[docs]
def set_PD(self,state):
'''
Parameters
----------
state : str/int
Sets the bandwidth of the photodiode input stage.
Can be ['ON','OFF',1,0]
Raises
------
ValueError
Error message.
Returns
-------
TYPE
DESCRIPTION.
'''
stState = ['ON','OFF',1,0]
if state in stState:
self.write('INPut:PDIode:FILTer:LPASs:STATe ' + str(state))
else:
return ValueError('Unknown input! See function description for more info.')
# =============================================================================
# Ask Instrument
# =============================================================================
[docs]
def ask_beeper(self):
'''
Returns
-------
Type print str
Return the state of the beeper
'''
status = self.query('SYSTem:BEEPer:STATe?').split('\n')[0]
if status == '1':
print('Beeper is ON')
else:
print('Beeper is OFF')
[docs]
def ask_calibration(self):
'''
Returns
-------
TYPE str
Returns a human readable calibration string. This is a query
only command. The response is formatted as string response
data.
'''
return self.query('CALibration:STRing?').split('\n')[0]
[docs]
def ask_PDPower(self):
'''
Returns
-------
TYPE str
Queries the photodiode response value.
'''
return self.query('CORRection:POWer:PDIOde:RESPonse?').split('\n')[0]
[docs]
def ask_Thermopile(self):
'''
Returns
-------
TYPE str
Queries the thermopile response value
'''
return self.query('POWer:THERmopile:RESPonse?').split('\n')[0]
[docs]
def ask_Pyro(self):
'''
Returns
-------
TYPE str
Queries the pyro-detectr response value
'''
return self.query('ENERgy:PYRO:RESPonse?').split('\n')[0]
[docs]
def ask_energyRange(self):
'''
Returns
-------
TYPE str
Queries the energy range
'''
return self.query('ENERgy:RANGe:UPPer?').split('\n')[0]
[docs]
def ask_currentRange(self):
'''
Returns
-------
TYPE str
Queries the actual current range
'''
return self.query('CURRent:DC:UPPer?').split('\n')[0]
[docs]
def ask_AutoCurrentRange(self):
'''
Returns
-------
TYPE str
Queries the auto-ranging function state
'''
return self.query('CURRent:DC:AUTO?').split('\n')[0]
[docs]
def ask_freqRange(self,state):
'''
Parameters
----------
state : str
Queries the frequency range.
Can be ['MAX','MIN']
Raises
------
ValueError
Error message.
Returns
-------
TYPE
Queries the frequency range
'''
stState = ['MAX','MIN']
if state in stState:
if state == 'MAX':
state = 'UPPer?'
return self.query('SENSe:FREQuency:Range:' + state).split('\n')[0]
else:
state = 'LOWer?'
return self.query('SENSe:FREQuency:Range:' + state).split('\n')[0]
else:
raise ValueError('Unknown input! See function description for more info.')
[docs]
def ask_PowerUnits(self):
'''
Returns
-------
TYPE str
Queries the power unit
'''
return self.query('SENSe:POWer:DC:UNIT?').split('\n')[0]
[docs]
def ask_AutoPowerRange(self):
'''
Returns
-------
status : print massage str
Queries the auto-ranging function state
'''
status = self.query('POWer:DC:RANGe:AUTO?').split('\n')[0]
if status == '1':
print('Auto Range is ON')
else:
print('Auto Range is OFF')
return status
[docs]
def ask_PowerRange(self):
'''
Returns
-------
TYPE str
Queries the power range.
'''
return self.query('POWer:DC:RANGe:UPPer?').split('\n')[0]
[docs]
def ask_voltRange(self):
'''
Returns
-------
TYPE str
Queries the current voltage range
'''
return self.query('VOLTage:DC:UPPer?').split('\n')[0]
[docs]
def ask_AutoVoltageRange(self):
'''
Returns
-------
TYPE str
Queries the auto-ranging function state
'''
return self.query('VOLTage:DC:AUTO?').split('\n')[0]
[docs]
def ask_Wavelength(self):
'''
Returns
-------
TYPE str
Queries the operation wavelength
'''
return self.query('CORRection:WAVelength?').split('\n')[0]
[docs]
def ask_BeamDiameter(self):
'''
Returns
-------
TYPE str
Queries the beam diameter
'''
return self.query('CORRection:BEAMdiameter?').split('\n')[0]
[docs]
def ask_Average(self):
'''
Returns
-------
TYPE str
Queries the averaging rate
'''
return self.query('SENSe:AVERage:COUNt?').split('\n')[0]
# =============================================================================
# Set Power,Energy,Current,Voltage Measurment Values aand Wavelength
# =============================================================================
[docs]
def set_PowerUnits(self,state):
'''
Parameters
----------
state : str
Sets the power unit W or dBm. Can be ['W','dBm'].
Raises
------
ValueError
Error message.
Returns
-------
None.
'''
stState = ['W','dBm']
if state in stState:
self.write('POWer:DC:UNIT ' + str(state))
else:
raise ValueError('Unknown input! See function description for more info.')
[docs]
def set_AutoPowerRange(self,state):
'''
Parameters
----------
state : float/int
Switches the auto-ranging function on and off. Can be set to ['ON','OFF',1,0].
Raises
------
ValueError
Error message.
Returns
-------
None.
'''
stState = ['ON','OFF',1,0]
if state in stState:
self.write('POWer:DC:RANGe:AUTO ' + str(state))
else:
raise ValueError('Unknown input! See function description for more info.')
[docs]
def set_PowerRange(self,value):
'''
Parameters
----------
value : float
Sets the current range in W
Raises
------
ValueError
Error message.
Returns
-------
None.
'''
#unit = str(input('Give a power unit Value [W|dBm]: '))
#self.set_PowerUnits(unit)
if type(value) == int or type(value) == float:
value = str(value)
self.write('POWer:DC:RANGe:UPPer ' + value + ' W')
else:
raise ValueError('Unknown input! See function description for more info.')
[docs]
def set_AutoCurrentRange(self,state):
'''
Parameters
----------
state : str
Switches the auto-ranging function on and off. Can be set to ['ON','OFF',1,0].
Raises
------
ValueError
Error message.
Returns
-------
None.
'''
stState = ['ON','OFF',1,0]
if state in stState:
self.write('SENSe:CURRent:DC:RANGe:AUTO ' + str(state))
else:
raise ValueError('Unknown input! See function description for more info.')
[docs]
def set_currentRange(self,value):
'''
Parameters
----------
value : float
Sets the current range in A.
Raises
------
ValueError
Error message.
Returns
-------
None.
'''
if type(value) == int or type(value) == float:
value = str(value)
self.write('SENSe:CURRent:DC:RANGe:UPPer ' + value + ' A')
else:
raise ValueError('Unknown input! See function description for more info.')
[docs]
def set_AutoVoltageRange(self,state):
'''
Parameters
----------
state : str/int
witches the auto-ranging function on and off. Can be ['ON','OFF',1,0]
Raises
------
ValueError
Error message.
Returns
-------
None.
'''
stState = ['ON','OFF',1,0]
if state in stState:
self.write('SENSe:VOLTage:DC:RANGe:AUTO ' + str(state))
else:
raise ValueError('Unknown input! See function description for more info.')
[docs]
def set_voltageRange(self,value):
'''
Parameters
----------
value : float
Sets the voltage range in V
Raises
------
ValueError
Error message.
Returns
-------
None.
'''
if type(value) == int or type(value) == float:
value = str(value)
self.write('SENSe:VOLTage:DC:RANGe:UPPer ' + value + ' V')
else:
raise ValueError('Unknown input! See function description for more info.')
[docs]
def set_energyRange(self,value):
'''
Parameters
----------
value : float
Sets the voltage range in J
Raises
------
ValueError
Error message.
Returns
-------
None.
'''
if type(value) == int or type(value) == float:
value = str(value)
self.write('SENSe:ENERgy:DC:RANGe:UPPer ' + value + ' J')
else:
raise ValueError('Unknown input! See function description for more info.')
[docs]
def set_WaveLength(self,value):
'''
Parameters
----------
value : float
Sets the operation wavelength in nm.
Returns
-------
None.
'''
self.write('SENSe:CORRection:WAVelength ' + str(value) + ' nm')
[docs]
def set_Average(self,value):
'''
Parameters
----------
value : float
Sets the averaging rate (1 sample takes approx. 3ms)
Returns
-------
None.
'''
self.write('SENSe:AVERage:COUNt ' + value)
# =============================================================================
# Configure
# =============================================================================
[docs]
def ConfigPower(self):
'''
Returns
-------
None.
Configure for power measurement
'''
self.write(':CONFigure:POWer')
[docs]
def ConfigCurrent(self):
'''
Returns
-------
None.
Configure for current measurement
'''
self.write(':CONFigure:CURRent:DC')
[docs]
def ConfigVoltage(self):
'''
Returns
-------
None.
Configure for voltage measurement
'''
self.write(':CONFigure::VOLTage:DC')
[docs]
def ConfigEnergy(self):
'''
Returns
-------
None.
Configure for energy measurement
'''
self.write(':CONFigure:ENERgy')
[docs]
def ConfigFreq(self):
'''
Returns
-------
None.
Configure for frequency measurement
'''
self.write(':CONFigure:FREQuency')
[docs]
def ConfigPowerDensity(self):
'''
Returns
-------
None.
Configure for power density measurement
'''
self.write(':CONFigure:PDENsity')
[docs]
def ConfigEnergyDensity(self):
'''
Returns
-------
None.
Configure for energy density measurement
'''
self.write(':CONFigure:EDENsity')
[docs]
def ConfigResistance(self):
'''
Returns
-------
None.
Configure for sensor presence resistance measurement
'''
self.write(':CONFigure:RESistance')
[docs]
def ConfigTemp(self):
'''
Returns
-------
None.
Configure for sensor temperature measurement
'''
self.write(':CONFigure:TEMPerature')
# =============================================================================
# Perform Measurment
# =============================================================================
[docs]
def MeasPower(self):
'''
Returns
-------
None.
Perform Power meas
'''
self.write('MEASure:POWer')
[docs]
def MeasCurrent(self):
'''
Returns
-------
None.
Performs a current measurement
'''
self.write('MEASure:CURRent:DC ')
[docs]
def MeasVoltage(self):
'''
Returns
-------
None.
Performs a voltage measurement
'''
self.write('MEASure:VOLTage:DC')
[docs]
def MeasEnergy(self):
'''
Returns
-------
None.
Performs a energy measurement
'''
self.write('MEASure:ENERgy')
[docs]
def MeasPowerDensity(self):
'''
Returns
-------
None.
Performs a power density measurement
'''
self.write('MEASure:PDENsity')
[docs]
def MeasEnergyDensity(self):
'''
Returns
-------
None.
Performs a energy density measurement
'''
self.write('MEASure:EDENsity')
[docs]
def MeasResistance(self):
'''
Returns
-------
None.
Performs a sensor presence resistance measurement
'''
self.write('MEASure:RESistance')
[docs]
def MeasTemp(self):
'''
Returns
-------
None.
Performs a sensor temperature measurement
'''
self.write('MEASure:TEMPerature')
[docs]
def MeasFreq(self):
'''
Returns
-------
None.
Performs a frequency measurement
'''
self.write('MEASure:FREQuency')
# =============================================================================
# Measurment Test
# =============================================================================
[docs]
def adjustPowerMeas(self):
'''
Returns
-------
None.
Adjust the power measurement
'''
un = input('Set Power unit W/dBm: ')
self.set_PowerUnits(un)
dis = input('Set Power Measurement Range auto/manual: ')
disList = ['auto','manual']
if dis in disList:
if dis == 'auto':
self.set_AutoPowerRange('ON')
else:
self.set_AutoPowerRange('OFF')
val = float(input('Sets the upper Power range in W to: '))
self.set_PowerRange(val)
else:
print('Invalid input! adjustPowerMeas() is stopped!')
[docs]
def adjustEnergyMeas(self):
'''
Returns
-------
None.
Adjust the Energy Measurement
'''
print('Energy is measured in J')
value = float(input('Set Energy range in J: '))
self.set_energyRange(value)
[docs]
def adjustVoltageRange(self):
'''
Returns
-------
None.
Adjust the Voltage Measurement
'''
dis = input('Set Voltage Measurement Range auto/manual: ')
disList = ['auto','manual']
if dis in disList:
if dis == 'auto':
self.set_AutoVoltageRange('ON')
else:
self.set_AutoVoltageRange('OFF')
value = float(input('Sets the upper range to: '))
self.set_voltageRange(value)
else:
print('Invalid input! adjustVoltageRange() is stopped!')
[docs]
def adjustCurrentRange(self):
'''
Returns
-------
None.
Adjust the Voltage Measurement
'''
dis = input('Set Current Measurement Range auto/manual: ')
disList = ['auto','manual']
if dis in disList:
if dis == 'auto':
self.set_AutoCurrentRange('ON')
else:
self.set_AutoVoltageRange('OFF')
value = float(input('Sets the upper range to: '))
self.set_currentRange(value)
else:
print('Invalid input! adjustVoltageRange() is stopped!')
[docs]
def set_Parameters(self,Type):
'''
Parameters
----------
Type : str
This function will set the measurement parameters.
Can be set to Type = ['Power','Energy','Current','Voltage']
Returns
-------
None.
'''
waveL = float(input('Sets the operation wavelength in nm: '))
self.set_WaveLength(waveL)
diss = Type
dissList = ['Power','Energy','Current','Voltage']
if diss in dissList:
if diss == 'Power':
self.adjustPowerMeas()
elif diss == 'Energy':
self.adjustEnergyMeas()
elif diss == 'Voltage':
self.adjustVoltageRange()
else:
self.adjustCurrentRange()
else:
print('Invalid input! Function will be stopped!')
[docs]
def DisplayParam(self,Type):
'''
Parameters
----------
Type : str
This function will print all the adjusted parameters.
Can be set to Type = ['Power','Energy','Current','Voltage']
Returns
-------
None.
'''
print('Adapter Type: ',self.ask_AdapterType())
print('Max Frequency range: ',self.ask_freqRange('MAX'))
print('Min Frequency range: ',self.ask_freqRange('MIN'))
print('Wavelength: ',self.ask_Wavelength())
meas = Type
measList = ['Power','Energy','Current','Voltage']
if meas in measList:
if meas == 'Power':
print('Power Unit set: ',self.ask_PowerUnits())
print('Power range auto: ',self.ask_AutoPowerRange())
print('Power Range set: ',self.ask_PowerRange())
elif meas == 'Energy':
print('Energy range auto: ',self.ask_energyRange())
elif meas == 'Voltage':
print('Voltage range auto: ',self.ask_AutoVoltageRange())
print('Voltage range: ',self.ask_voltRange())
elif meas == 'Current':
print('Current range auto: ',self.ask_AutoCurrentRange())
print('Current range: ',self.ask_currentRange())
else:
print('Invalid Value! Function will be terminated.')
[docs]
def DisplayParamDict(self,Type):
'''
Parameters
----------
Type : str
This function will print all the adjusted parameters.
Can be set to Type = ['Power','Energy','Current','Voltage']
Returns
-------
Headers : str
String with ['Power','Energy','Current','Voltage']
Data : list
Data from the instrument.
Params : list
List with str for different data that are extracted from the instrument.
'''
'''
This function will print all the adjusted parameters.
'''
Headers = ['Power','Energy','Current','Voltage']
Params = ['Adapter Type','Max Frequency range','Min Frequency range','Wavelength']
Data = [self.ask_AdapterType(),self.ask_freqRange('MAX'),self.ask_freqRange('MIN'),self.ask_Wavelength()]
meas = Type
measList = ['Power','Energy','Current','Voltage']
if meas in measList:
if meas == 'Power':
Params.append('Power Unit set')
Data.append(self.ask_PowerUnits())
Params.append('Power range auto')
Data.append(self.ask_AutoPowerRange())
Params.append('Power Range set')
Data.append(self.ask_PowerRange())
elif meas == 'Energy':
Params.append('Energy range auto')
Data.append(self.ask_energyRange())
elif meas == 'Voltage':
Params.append('Voltage range auto')
Data.append(self.ask_AutoVoltageRange())
Params.append('Voltage range')
Data.append(self.ask_voltRange())
elif meas == 'Current':
Params.append('Current range auto')
Data.append(self.ask_AutoCurrentRange())
Params.append('Current range')
Data.append(self.ask_currentRange())
else:
print('Invalid Value! Function will be terminated.')
return Headers,Data,Params
[docs]
def PowerMeas(self):
'''
Returns
-------
data : Data from the Measurement
Performs a power measurement
'''
'''
Performs a power measurement
'''
print('This Function performs Power measurements.')
#print('To go on whit the measurments please check again the parameters set!')
self.set_Parameters('Power')
print('#####################################')
self.DisplayParam('Power')
print('#####################################')
com = input('Should the measurement proceed yes/no: ')
if com == 'yes':
self.Init()
complite = 0
while complite == '1':
complite = self.OPC()
self.timeout = 0.1
self.ConfigPower()
self.MeasPower()
data = self.fetchData()
return data
else:
print('Measurement is canceled!')
[docs]
def DefaultPowerMeas(self, WaveLength):
'''
Returns
-------
TYPE Data from the measurement
Performs a power measurement whit hard codded parameter!.
'''
self.set_PowerUnits('dBm')
self.set_WaveLength(WaveLength)
self.set_AutoPowerRange('ON')
#print('#####################################')
#self.DisplayParam('Power')
#print('#####################################')
self.Init()
complite = 0
while complite == '1':
complite = self.OPC()
self.timeout = 0.1
self.ConfigPower()
self.MeasPower()
return self.fetchData()
[docs]
def DefaultPowerMeas_W(self, WaveLength):
'''
Returns
-------
TYPE Data from the measurement
Performs a power measurement whit hard codded parameter!.
'''
self.set_PowerUnits('W')
self.set_WaveLength(WaveLength)
self.set_AutoPowerRange('ON')
#print('#####################################')
#self.DisplayParam('Power')
#print('#####################################')
self.Init()
complite = 0
while complite == '1':
complite = self.OPC()
self.timeout = 0.1
self.ConfigPower()
self.MeasPower()
return self.fetchData()
[docs]
def PowerSpecifications(self):
'''
Returns
-------
None.
Return Instrument parameters
'''
self.DisplayParam('Power')