Simulated Instrument Install

This example shows an Infiniium Offline connection which is ideal for developing your scripts because it does not require an instrument. This script installs a simulated electrical instrument in connection 2, displays an eye diagram, and returns an eye height measurement. Notice that the address uses localhost instead of a real-time oscilloscope's computer name.

Example Script

basic-infiniium-offline.py

#!python3

"""This program shows how to install a simulated instrument."""

# Import modules.
import pyvisa
import sys

# Global variables.
oscilloscope_visa_address = "TCPIP0::localhost::hislip0,4880::INSTR"
timeout = 60000  # 60 seconds.
connection = "2"
channel = "8"


def exit_program():
    """Exit program."""

    # Close connection to oscilloscope.
    sys.stdout.write("Closing oscilloscope connection.\n")
    Infiniium.write(":SYSTem:GTLocal")  # Unlock GUI.
    Infiniium.clear()  # Clear oscilloscope communications interface.
    Infiniium.close()  # Close communications interface to oscilloscope.
    rm.close()  # Close resource manager.
    print("End of program.")
    sys.exit()


def check_error_queue(when):
    """Check error queue."""

    num_errors = int(Infiniium.query(":SYSTem:ERRor:COUNt?"))
    if num_errors:
        for _ in range(num_errors):
            error_string = Infiniium.query(":SYSTem:ERRor:NEXT? DIAGnostic").strip()
            print(f"ERROR: {error_string}")

        print(f"Exited because error(s) found when: '{when}'")
        exit_program()


def install_simulated_instrument(connection, type, channel, signal="NRZ"):
    """Simplified installation of a simulated Infiniium instrument.
    type
        Type of simulated instrument. "VECHannel" is a Virtual 8 Channel
        oscilloscope.
    signal
        Format of signal. NRZ or PAM4.
    """

    Infiniium.write(f":INSTrument:CONNection{connection}:SELection {type}")
    full_ch_name = f"{connection}_{channel}"
    if signal in "NRZ":
        Infiniium.write(f":SOURce{full_ch_name}:FORMat NRZ")
    else:
        Infiniium.write(f":SOURce{full_ch_name}:FORMat PAM4")
    Infiniium.write(f":SOURce{full_ch_name}:SRATe 9.95328E+9")
    Infiniium.write(f":SOURce{full_ch_name}:FILTer:TYPE GAUSsian")
    Infiniium.write(f":SOURce{full_ch_name}:FILTer:CUToff 12.0E+9")
    Infiniium.write(f":SOURce{full_ch_name}:WTYPe DATA")
    Infiniium.write(f":SOURce{full_ch_name}:PLENgth 127")
    Infiniium.write(f":SOURce{full_ch_name}:AMPLitude 90E-3")
    Infiniium.write(f":SOURce{full_ch_name}:NOISe:RN 3.0E-3")
    Infiniium.write(f":SOURce{full_ch_name}:JITTer:RJ 2.0E-12")
    Infiniium.write(f":CHANnel{full_ch_name}:DISPlay ON")
    Infiniium.query(f":CHANnel{full_ch_name}:EYE:DISPlay ON;*OPC?")


def connections_channels_off(connections_channels_list):
    """Turns off the specified connections_channels."""

    for connection, channels_list in connections_channels_list:
        for channel in channels_list:
            full_ch_name = f"{connection}_{channel}"
            Infiniium.write(f":CHANnel{full_ch_name}:DISPlay OFF")


# ==========================================================
# Main program:
# ==========================================================

# Connect and initialize oscilloscope.
rm = pyvisa.ResourceManager("C:\\Windows\\System32\\visa64.dll")
try:
    Infiniium = rm.open_resource(oscilloscope_visa_address)
except Exception:
    print(
        f"Unable to connect to oscilloscope at {oscilloscope_visa_address}. Aborting program."
    )
    sys.exit()

Infiniium.timeout = timeout  # Set global timeout.
Infiniium.clear()  # Clear the instrument bus.
# Lock GUI happens automatically.

# Default setup.
Infiniium.write(":SYSTem:DEFault")

# Install simulated instrument at "connection" and set up "channel".
install_simulated_instrument(connection, "VECHannel", channel)

# Autoscale and turn off channnels that haven't been set up.
Infiniium.query(":SYSTem:AUToscale;*OPC?")
connections_channels_off([["1", ["1", "2", "3", "4"]]])
connections_channels_off([["2", ["1", "2", "3", "4", "5", "6", "7"]]])

# Stop acquisitions and clear the display.
Infiniium.write(":ACQuire:STOP")
Infiniium.write(":ACQuire:CDISplay")  # Clear display.

# Turn on eye height measurement.
eye_source = f"ECHannel{connection}_{channel}"
Infiniium.write(f":MEASure:EYE:EHEight:SOURce {eye_source}")
Infiniium.write(":MEASure:EYE:EHEight")

# Make 100 acquisitions.
Infiniium.write(":LTESt:ACQuire:CTYPe:WAVeforms 100")
Infiniium.write(":LTESt:ACQuire:STATe ON")
Infiniium.query(":ACQuire:RUN;*OPC?")  # *OPC? required when limit testing.
Infiniium.write(":LTESt:ACQuire:STATe OFF")

# Measure eye width and display results (including statistics).
print("Eye Height values:")
print(f"Source waveform: {Infiniium.query(':MEASure:EYE:EHEight:SOURce?').strip()}")
print(f"Current value: {Infiniium.query(':MEASure:EYE:EHEight?').strip()}")
print(f"Mean value: {Infiniium.query(':MEASure:EYE:EHEight:MEAN?').strip()}")
print(f"Std Dev value: {Infiniium.query(':MEASure:EYE:EHEight:SDEViation?').strip()}")
print(f"Minimum value: {Infiniium.query(':MEASure:EYE:EHEight:MIN?').strip()}")
print(f"Maximum value: {Infiniium.query(':MEASure:EYE:EHEight:MAX?').strip()}")
print(f"Count: {Infiniium.query(':MEASure:EYE:EHEight:COUNt?').strip()}")

# Check error count.
check_error_queue("End of program")

# Exit program.
exit_program()