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()