FlexPLL Scalar Measurements
This script demonstrates how to return the current measured scalar values from FlexPLL's measurement result table for Response 1. A valid Response1 must be displayed with valid measurement results displayed before running this script.
Example Script
Copy
FlexPLL-scalar-measurements.py
# -*- coding: utf-8 -*-
""" This script returns the current measured values that are displayed in FlexPLL's
measurement result table for Response 1. Response1 must be displayed
before running this script. """
import time
import pyvisa as visa # import VISA library
ADDRESS = 'TCPIP0::localhost::hislip1,4880::INSTR'
#ADDRESS = 'TCPIP0::K-N1000A-00003::hislip0,4880::INSTR'
def open_flexpll_connection(address):
""" Opens visa connection to FlexFlexDCA. """
print('Connecting to Flexdca ...')
try:
rm = visa.ResourceManager()
connection = rm.open_resource(address)
connection.timeout = 10000
connection.read_termination = '\n'
connection.write_termination = '\n'
inst_id = connection.query('*IDN?')
print('\nFlexPLL connection established to:\n' + inst_id, flush=True)
except (visa.VisaIOError, visa.InvalidSession):
print('\nVISA ERROR: Cannot open instrument address.\n', flush=True)
return None
except Exception as other:
print('\nVISA ERROR: Cannot connect to instrument:', other, flush=True)
print('\n')
return None
return connection
def return_scalar(flexpll, query):
class ScalarMeasQuestionableException(Exception):
""" A scalar measurement result is questionable. """
pass
class ScalarMeasTimeOutException(Exception):
""" A scalar measurement has timed out. """
pass
timeout = flexpll.timeout / 1000 # convert ms to s
query = query.strip('?')
start_time = time.time() # time in seconds
while(True):
time.sleep(0.2)
status = flexpll.query(query + ':STATus?')
if 'CORR' in status: # valid measurement result
return flexpll.query(query + '?')
elif 'QUES' in status:
s = query + '\nReason: ' + flexpll.query(query + ':STATus:REASon?')
raise ScalarMeasQuestionableException(s)
elif (int(time.time() - start_time)) > timeout:
s = query + '\nReason: ' + flexpll.query(query + ':STATus:REASon?')
raise ScalarMeasTimeOutException(s)
def make_measurements(flexpll):
""" """
measurements = {'Average': ':MEAS:RESP1:AVER?',
'Bandwidth': ':MEAS:RESP1:BAND?',
'Maximum': ':MEAS:RESP1:MAX?',
'Minimum': ':MEAS:RESP1:MIN?',
'Peaking': ':MEAS:RESP1:PEAK?',
'Transition-Density': ':MEAS:RESP1:TDEN?',
'FGAin': ':MEAS:RESP1:PLLM:FGAin?',
'FZERo': ':MEAS:RESP1:PLLM:FZERo?',
'FPOLe': ':MEAS:RESP1:PLLM:FPOLe?',
}
flexpll.write(':RESP1:PLLModel:ALOop:ENABle ON')
flexpll.write(':RESP1:PLLModel:JTF:DISP ON')
flexpll.write('RESP1:PLLModel:OJTF:DISP OFF')
flexpll.write('RESP1:PLLModel:MEAS:DISP ON')
meas_list = list(measurements.items())
print('\nMeasurements (current values):')
for name, command in meas_list:
flexpll.query(command) # Bandwidth measurement
print('\t' + name + ': ', return_scalar(flexpll, command))
FlexPLL = open_flexpll_connection(ADDRESS)
make_measurements(FlexPLL)
FlexPLL.write(':SYSTem:GTLocal')
FlexPLL.close()