Example #1
0
 def connect_to_vna(self, address):
     self.disconnect_from_vna()
     try:
         vna = Vna()
         vna.open_tcp(address)
         if not vna.connected():
             raise self.command_error(f"cannot connect to '{address}'")
     except (error, herror, gaierror, timeout):
         raise self.command_error(
             f"socket error while connecting to '{address}'")
     except ConnectionError:
         raise self.command_error(
             f"connection error while connecting to '{address}'.")
     self.vna = vna
    def test_source_power_cal(self, data):
        reads     = data['reads']
        ch        = data['channel']
        port      = data['port']
        sweeps    = data['sweeps']
        tolerance = data['tolerance']

        vna = Vna()
        vna.bus = FifoBus(reads)
        vna.channel(ch).source_power_cal(port, sweeps, tolerance)
        for write in data['writes']:
            if 'position' in write:
                pos = write['position']
                self.assertEqual(write['command'], vna.bus.writes[pos])
            else:
                self.assertIn   (write['command'], vna.bus.writes)
 def test_save_measurement_locally(self):
     vna = Vna()
     vna.open_tcp('rsa22471.local')
     vna.preset()
     ports = [1, 2]
     ch = vna.channel()
     try:
         success = ch.save_measurement_locally('test', ports)
     except:
         print(sys.exc_info()[0])
         print(vna.errors)
         raise
     if not success:
         print(vna.errors)
         vna.clear_status()
     self.assertTrue(success)
Example #4
0
 def setUp(self):
     self.serial_no = "123"
     self.settings = default_settings.copy()
     path = get_root_path() / "test_measure"
     self.settings['save']['directory'] = path
     vna = Vna()
     vna.open_tcp()
     vna.clear_status()
     self.vna = vna
Example #5
0
def connect_to_vna(address):
	vna = Vna()
	try:
		vna.open_tcp(address)
	except:
		print("\n\n* Error!\n*  Problem connecting to VNA at ip {0}".format(address))
		return None
	try:
		if not vna.connected():
			print("\n\n* Error!\n*  Problem connecting to VNA at ip {0}".format(address))
			return None
		if not vna.properties.is_known_model():
			print("\n\n* Error!\n*  Could not find R&S VNA at ip {0}".format(address))
			print("*   *IDN? response: {0}".format(vna.id_string()))
			return None;
	except:
		print("\n\n* Error!\n*  Problem connecting to VNA at ip {0}".format(address))
		return None
	# set long timeout,
	vna.timeout_ms = 60000
	return vna
Example #6
0
def main():
    parser = argparse.ArgumentParser(
        description='Connect to a Rohde & Schwarz VNA')
    parser.add_argument('--visa',
                        metavar='bus',
                        default=False,
                        help="use VISA with 'bus'")
    parser.add_argument('--address',
                        default='127.0.0.1',
                        help='instrument address')
    parser.add_argument('--port',
                        default=5025,
                        type=int,
                        help='port (TCP only)')
    parser.add_argument('--timeout',
                        default=5000,
                        type=int,
                        help='default instrument timeout (ms)')
    parser.add_argument('--log', default='', help='SCPI command log filename')
    parser.add_argument('--log-to-stdout',
                        action='store_true',
                        help='print all SCPI IO to stdout')
    args = parser.parse_args()

    if args.log and args.log_to_stdout:
        print('error: cannot use both --log and --log-to-stdout')
        parser.print_help()

    vna = Vna()
    try:
        if args.visa:
            vna.open(args.visa, args.address)
        else:
            vna.open_tcp(args.address, args.port)
        if args.timeout:
            vna.timeout_ms = args.timeout

        if vna.connected():
            print("connected: {0}".format(vna.id_string()))
            if args.log:
                vna.open_log(args.log)
                vna.log.write('{0}\n'.format(datetime.datetime.now()))
                vna.log.write('--------------------------\n\n')
                vna.print_info()
            elif args.log_to_stdout:
                vna.log = sys.stdout
            sys.path.insert(0, os.getcwd())
            code.interact('', local=locals())
            sys.exit(0)
        else:
            raise Exception('Could not connect to instrument')
    except SystemExit:
        pass
    except:
        print('Error connecting to instrument\n')
        parser.print_help()
    finally:
        if vna.log:
            vna.close_log()
        if vna.connected():
            vna.close()
Example #7
0
from rohdeschwarz.instruments.vna import Vna

# Connect
vna = Vna()
vna.open_tcp()

temp_filename = 'temp.png'
local_filename = 'screenshot.png'

# Set temporary file name to
# save to (on vna)
scpi = ":MMEM:NAME '{0}'"
scpi = scpi.format(temp_filename)
vna.write(scpi)

# Set format
# Options include:
# - BMP
# - PNG
# - JPG
# - PDF
# - SVG
vna.write(":HCOP:DEV:LANG PNG")

# Set contents of screenshot
# to entire screen
vna.write(":HCOP:PAGE:WIND HARD")

# - OR -------------------------
# Set active diagram
# Unfortunately there isn't an
Example #8
0
 def tearDownClass(self):
     vna = Vna()
     vna.open_tcp()
     vna.close()
Example #9
0
 def setUp(self):
     # Path
     root_path = get_root_path() / "test_vna"
     serial_no = "123"
     by_serial_no = True
     self.path = SavePath(root_path, serial_no, by_serial_no)
     # Vna
     vna = Vna()
     vna.open_tcp()
     vna.clear_status()
     vna.manual_sweep = True
     timeout_ms = 2 * vna.sweep_time_ms + 5000
     vna.start_sweeps()
     vna.pause(timeout_ms)
     self.vna = vna
     self.settings = default_settings.copy()
Example #10
0
from rohdeschwarz.instruments.vna import Vna

# Connect
vna = Vna()
vna.open_tcp()

# For the purposes of demonstration:
# - create set file (.znx) on vna
# - wait for save to complete
vna.save_active_set('read.znx')
vna.query("*IDN?")

# define filenames
source = "C:\\Users\\Public\\Documents\\Rohde-Schwarz\\Vna\\RecallSets\\read.znx"
local_dest = "read.znx"

# Query contents of source
scpi = "MMEM:DATA? '{0}'"
scpi = scpi.format(source)
vna.write(scpi)
block_data = vna.read_raw_no_end()

# Start parsing IEEE 388.2 block data transfer format
# Header: #<header_size-2><file_size>
header_size = int(block_data[1])
file_start = 2 + header_size
file_size = int(block_data[2:file_start])

# Sometimes the contents of the entire file
# may not transfer at once. Keep reading
# until everything is transferred
Example #11
0
from rohdeschwarz.instruments.vna import Vna

# Connect
vna = Vna()
vna.open_tcp('127.0.0.1')

# Calibrate channel 1 ports 1, 2
# using automatic cal unit
index = 1
ports = [1, 2]
vna.channel(index).auto_calibrate(ports)
def main():
    parser = argparse.ArgumentParser(
        description='Connect to a Rohde & Schwarz VNA')
    parser.add_argument('--visa',
                        metavar='bus',
                        default=False,
                        help="use VISA with 'bus'")
    parser.add_argument('--address',
                        default='127.0.0.1',
                        help='instrument address')
    parser.add_argument('--port',
                        default=5025,
                        type=int,
                        help='port (TCP only)')
    parser.add_argument('--timeout',
                        default=5000,
                        type=int,
                        help='default instrument timeout (ms)')
    parser.add_argument('--log', help='SCPI command log filename')
    parser.add_argument(
        '--export-cal-data',
        action='store_true',
        help='Save corrections to numpy `savez` (*.pyz) data file')
    parser.add_argument('--outer-channel',
                        type=int,
                        help='channel with outer corrections')
    parser.add_argument('--outer-cal-group',
                        help='cal group containing outer corrections')
    parser.add_argument('--inner-channel',
                        type=int,
                        help='channel with inner corrections')
    parser.add_argument('--inner-cal-group',
                        help='cal group containing inner corrections')
    parser.add_argument('--filename',
                        default='Port {port}.s2p',
                        help="default: 'Port {port}.s2p'")
    parser.add_argument('ports',
                        type=int,
                        nargs='+',
                        help='VNA ports to extract DUTs from')
    args = parser.parse_args()

    if not args.inner_channel and not args.inner_cal_group:
        print('error: must include inner source, either channel or cal group')
        parser.print_help()
        sys.exit(-1)
    if not args.outer_channel and not args.outer_cal_group:
        print('error: must include outer source, either channel or cal group')
        parser.print_help()
        sys.exit(-1)

    vna = Vna()
    try:
        if args.visa:
            vna.open(args.visa, args.address)
        else:
            vna.open_tcp(args.address, args.port)
        if args.timeout:
            vna.timeout_ms = args.timeout

        if vna.connected():
            if args.log:
                vna.open_log(args.log)
                print_header(vna.log, 'R&S S2P Extractor', '1.0')
                vna.print_info()
        else:
            raise Exception('Could not connect to instrument')

        if args.outer_channel:
            outer_source = Source(Type.CHANNEL, args.outer_channel)
        else:
            outer_source = Source(Type.CAL_GROUP, args.outer_cal_group)
        if args.inner_channel:
            inner_source = Source(Type.CHANNEL, args.inner_channel)
        else:
            inner_source = Source(Type.CAL_GROUP, args.inner_cal_group)
        print(f"ports: {args.ports}")
        for port in args.ports:
            filename = args.filename.format(port=port)
            print(f'  {filename}')
            calculate(vna, outer_source, inner_source, port, filename,
                      args.export_cal_data)
    except Exception as err:
        parser.print_help()
        raise
    finally:
        if vna.connected():
            vna.errors
            vna.clear_status()
        if vna.log:
            vna.close_log()
        if vna.connected():
            vna.close()
Example #13
0
from rohdeschwarz.instruments.vna import Vna
import os

# Connect
vna = Vna()
vna.open_tcp()

channel  = 1
ports    = range(1, 5) # Ports 1-4
filename = "test.s2p"
# s2p file must exist locally on VNA

for port in ports:
	# Set deembed model to touchstone file
	scpi     = "CALC{0}:TRAN:VNET:SEND:DEEM{1}:TND FIMP"
	scpi     = scpi.format(channel, port)
	vna.write(scpi)

	## Option a:
	## Set via touchstone file on VNA
	# scpi     = "MMEM:LOAD:VNET{0}:SEND:DEEM{1} '{2}'"
	# scpi     = scpi.format(channel, port, filename)
	# vna.write(scpi)

	# Option b:
	# Set via data transfer
	data     = open(filename, 'rb').read()
	size_str = str(len(data))
	header   = "#{0}{1}".format(len(size_str), size_str)
	scpi     = "CALC{0}:TRAN:VNET:SEND:DEEM{1}:PAR:DATA FPOR,{2}{3}"
	scpi     = scpi.format(channel, port, header, data)
from pathlib import Path
from rohdeschwarz.instruments.vna import Vna

root_path = Path(__file__).parent
log_file = str(root_path / 'vna log.txt')

vna = Vna()
vna.open_tcp()
vna.open_log(log_file)

# Do the work

assert not vna.errors
vna.clear_status()
Example #15
0
 def setUp(self):
     source_root = os.path.dirname(os.path.realpath(__file__))
     self.source_root = Path(source_root)
     root_path = get_root_path() / "test_html"
     serial_no = self.serial_no = "123"
     by_serial_no = True
     self.path = SavePath(root_path, serial_no, by_serial_no)
     vna = Vna()
     vna.open_tcp()
     vna.clear_status()
     vna.manual_sweep = True
     timeout_ms = 2 * vna.sweep_time_ms + 5000
     vna.start_sweeps()
     vna.pause(timeout_ms)
     self.vna = vna
     self.settings = default_settings.copy()
Example #16
0
#!/usr/bin/env python
import csv
from   trace_history.command_line import parse_args
from   trace_history.default_time import default_time_s
from   trace_history.timestamp    import timestamp
import os
from   rohdeschwarz.instruments.vna import Vna
from   si_prefix                  import si_format
import sys


# parse cli
args = parse_args()

# init connection
vna = Vna()
vna.open_tcp(args.ip_address)
vna.open_log(args.log_file)

vna.timeout_ms = args.timeout_ms

# clear previous scpi errors
vna.clear_status()

# current date and time?
now = timestamp()

# set file
args.set_file = args.set_file or vna.active_set
vna.open_set(args.set_file)
vna.active_set = args.set_file
Example #17
0
from rohdeschwarz.instruments.vna import Vna

# Connect
vna = Vna()
vna.open_tcp()

# Parse ID String
# Example:
#     "Rohde-Schwarz,ZNBT8-16Port,1318700624100104,2.70"
#     Manufacturer [0]: Rohde-Schwarz
#     Model        [1]: ZNBT8-16Port
#     Serial No    [2]: 1318700624100104
#     Firmware Ver [3]: 2.70
[manufacturer, model, serial_no, firmware_ver] = vna.query("*IDN?").split(",")

# Query number of physical ports
scpi  = ":INST:PORT:COUN?"
ports = int(vna.query(scpi)) # => 16
print("Ports:    {0}".format(ports))

# Query max frequency
scpi        = ":SYST:FREQ? MAX"
max_freq_Hz = float(vna.query(scpi)) # => 8.5E9 (8.5 GHz)
print("Max Freq: {0:.3e} Hz".format(max_freq_Hz))

# Query min frequency
scpi        = ":SYST:FREQ? MIN"
min_freq_Hz = float(vna.query(scpi)) # => 9.0E3 (300 KHz)
print("Min Freq: {0:.3e} Hz".format(min_freq_Hz))

vna.close()
#!/usr/bin/env python
from rohdeschwarz.instruments.vna import Vna

# Connect
vna = Vna()
vna.open_tcp()

channel      = 1;
ports_string = "1,2,3,4"
direct_comp  = "OFF"  # ON | OFF
include_loss = "ON"   # ON | OFF
standard     = "SHOR" # SHORt | OPEN

# Start fixture compensation
#   This clears previous offsets
scpi = "SENS{0}:CORR:COLL:FIXT:STAR"
scpi = scpi.format(channel)
vna.write(scpi)

# Direct compensation
#   corrections generated per frequency point
#   rather than with an overall electrical
#   length estimate.
scpi = "SENS{0}:CORR:COLL:FIXT:LMP {1}";
scpi = scpi.format(channel, direct_comp)
vna.write(scpi)

# include loss compensation
#   This setting is overridden if direct compensation
#   is on
scpi = "SENS{0}:CORR:COLL:FIXT:LMP:LOSS {1}";
Example #19
0
#!/usr/bin/env python

from   lib.homepath import expand_home_path
from   lib.save     import create_save_action
from   lib          import schedule
from   pathlib      import Path
from   rohdeschwarz.instruments.vna import Vna
from   ruamel       import yaml

settings = {}
with open('settings.yaml', 'r') as f:
    settings = yaml.safe_load(f.read())

# Connect to VNA
vna = Vna()
vna.open_tcp(settings['vna address'])
vna.timeout_ms = 10*60*1000 # 10 mins

# Create lamdba function.
# Function will be called on interval
path   = expand_home_path(settings['path'])
action = create_save_action(vna, path)

# run
interval = settings['interval (mins)']
duration = settings['duration (hrs)']
schedule.run(interval, duration, action)
Example #20
0
from pathlib                      import Path
from rohdeschwarz.instruments.vna import Vna


# paths
root_path = Path(__file__).parent.resolve()
log_file  = str(root_path / 'vna.log')
set_file  = str(root_path / 'sets' / 'set.znxml')


# IP address
address = '192.168.86.192'


# create Vna instance
vna = Vna()

# log
vna.open_log(log_file)
vna.print_info()

# connect to instrument (no visa)
vna.open_tcp(address)

# alternatively, using pyvisa:
# vna.open('gpib', 20)

# preset and clear errors
vna.clear_status()
vna.preset()
vna.pause()
 def setUp(self):
     vna = Vna()
     vna.open_tcp()
     vna.clear_status()
     vna.manual_sweep = True
     timeout_ms = 2 * vna.sweep_time_ms + 5000
     vna.start_sweeps()
     vna.pause(timeout_ms)
     self.vna = vna
Example #22
0
from cal_functions import connections
from cal_functions import get_cal_steps
from rohdeschwarz.instruments.vna import Vna

# Provide this information:
ip_address = '127.0.0.1'
timeout_ms = 5 * 60 * 1000  # 5 mins
ports = range(1, 21)  # VNA Ports 1-20
cal_size = 8  # Cal unit is 8 ports

# Assuming channel 1 ('SENS1')
# for simplicity's sake

# Connect to VNA
vna = Vna()
vna.open_tcp(ip_address)

# Delete any previously defined cal steps
vna.write("SENS1:CORR:COLL:AUTO:ASS:DEL:ALL")

# Setup for full N-Port calibration with cal unit
vna.write("SENS1:CORR:COLL:AUTO:CONF FNPort,''")

# get cal steps
steps = get_cal_steps(ports, cal_size)
num_steps = len(steps)

# Define each cal step via SCPI
for i in range(1, num_steps + 1):
    step = [str(n) for n in steps[i]]
Example #23
0
def main():
    parser = argparse.ArgumentParser(description='Connect to a Rohde & Schwarz VNA')
    parser.add_argument('--visa', metavar='bus', default=False,
                        help="use VISA with 'bus'")
    parser.add_argument('--address', default='127.0.0.1',
                        help='instrument address')
    parser.add_argument('--log', default='',
                        help='SCPI command log filename')
    args = parser.parse_args()

    vna = Vna()
    try:
        if args.visa:
            vna.open(args.visa, args.address)
        else:
            vna.open_tcp(args.address)

        if vna.connected():
            print("connected: {0}".format(vna.id_string()))
            if args.log:
                vna.open_log(args.log)
                vna.log.write('{0}\n'.format(datetime.datetime.now()))
                vna.log.write('--------------------------\n\n')
                vna.print_info()
            code.interact('', local=locals())
        else:
            print('Could not connect to instrument\n')
            parser.print_help()
    except SystemExit:
        pass
    except:
        print('Error connecting to instrument\n')
        parser.print_help()
    finally:
        if vna.log:
            vna.close_log()
        if vna.connected():
            vna.close()
Example #24
0
 def test_power_sensors(self, data):
     vna = Vna()
     vna.bus = FifoBus([data['read']])
     self.assertEqual(vna.power_sensors, data['result'])
Example #25
0
from rohdeschwarz.instruments.vna import Vna

# Connect
vna = Vna()
vna.open_tcp('localhost')

# Preset instrument (optional)
vna.clear_status()
vna.preset()
vna.pause()

# Settings for ch1 calibration
ch1 = vna.channel(1)
ch1.sweep_type = 'lin' # linear freq sweep
ch1.start_frequency_Hz =   1,'GHz'
ch1.stop_frequency_Hz  =   2,'GHz'
ch1.points             = 101
ch1.if_bandwidth_Hz    =   1,'KHz'
ch1.power_dBm          = -10 # dBm

# check for cal unit(s)
assert vna.cal_units

# Calibrate
ports = [1, 2]
ch1.auto_calibrate(ports)
assert not vna.errors
Example #26
0
from rohdeschwarz.instruments.vna import Vna

# Connect
vna = Vna()
vna.open_tcp()

# For touchstone file:
channel = 1
ports_string = "1,2,3,4"
touchstone_filename = "ch1_data.s4p"

# For trace data:
trace_name = "Trc1"
trace_filename = "Trc1.csv"

# Indicate which ports you want to
# capture data for before starting sweep
# Note: This must be done for each channel
# Using channel 1 for illustrative purposes:
channel = 1
scpi = ":CALC{0}:PAR:DEF:SGR {1}"
scpi = scpi.format(channel, ports_string)
vna.write(scpi)

# Enable manual sweep mode
# (i.e. control timing)
vna.write("INIT:CONT:ALL 0")

# Start all sweeps
vna.write("INIT:SCOP ALL")
vna.write("INIT")
Example #27
0
####################################
### NASM 2016 VNA Power Cal      ###
### Example 1:                   ###
### Commanded vs measured power  ###
####################################


from rohdeschwarz.general         import print_header
from rohdeschwarz.instruments.vna import Vna
from rohdeschwarz.instruments.vna import SweepType
import matplotlib.pyplot as plt
import numpy             as np

# Open instrument connection
vna = Vna()
vna.open('TCPIP', '127.0.0.1')

# SCPI command log
vna.open_log("SCPI Command Log.txt")
print_header(vna.log, "Measure with a1", "0.0.1")
vna.print_info()

# Preset
vna.preset()
vna.pause()
vna.clear_status()

# Setup channel 1
ch1                 = vna.channel(1)
ch1.sweep_type      = SweepType.power
ch1.start_power_dBm = -20.0
Example #28
0
from pathlib import Path
from power_deembed import read_s21
from rohdeschwarz.instruments.vna import Vna

# patch rohdeschwarz vna
import power_deembed.patch.vna.channel.power_cal

root_path = Path(__file__).parent
filename = str(root_path / 'test' / 'fixtures' / '3 dB attenuator.s2p')

channel = 1
wave = 'b1'
vna = Vna()
vna.open_tcp()

# offsets
ch = vna.channel(channel)
freq_Hz, offsets_dB = read_s21(filename)
assert not False in freq_Hz == ch.cal_freq_Hz

# interpolate
# offsets_dB = np.interp(ch.cal_freq_Hz, freq_Hz, offsets_dB)

# deembed, apply
power_cal_dB = ch.get_power_cal(wave) - offsets_dB
ch.set_power_cal(power_cal_dB)
Example #29
0
#!/usr/bin/env python

from pathlib import Path, PureWindowsPath
from rohdeschwarz.instruments.vna import Vna, Directory
from skrf import Network
import sys

if __name__ != '__main__':
    print('Not a library')
    sys.exit(1)

vna = Vna()
vna.open_tcp('127.0.0.1')
vna.open_log('scpi log.txt')

if not vna.cal_units:
    print('No cal unit found')
    sys.exit(1)

# Control cal unit
cal_unit = vna.cal_unit()
cal_unit.setOpen(1)
cal_unit.setShort(1)
cal_unit.setMatch(1)
cal_unit.setThru(1, 2)

# Temp dir for cal data
vna.file.cd(Directory.default)
temp_dir = PureWindowsPath(vna.file.directory()) / 'CAL_UNIT_DATA'
if vna.file.is_directory(temp_dir):
    vna.file.delete_all(temp_dir)