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)
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
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
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()
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
def tearDownClass(self): vna = Vna() vna.open_tcp() vna.close()
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()
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
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()
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()
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()
#!/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
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}";
#!/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)
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
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]]
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()
def test_power_sensors(self, data): vna = Vna() vna.bus = FifoBus([data['read']]) self.assertEqual(vna.power_sensors, data['result'])
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
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")
#################################### ### 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
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)
#!/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)